Skip to content

Commit d10a88c

Browse files
committed
Merge tag 'nilfs2-v7.0-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/vdubeyko/nilfs2
Pull nilfs2 updates from Viacheslav Dubeyko: - Fix potential block overflow that cause system hang When executing the FITRIM command, an underflow can occur in the calculation of nblocks. This ultimately leads to the block layer function __blkdev_issue_discard() taking an excessively long time to process the bio chain, and the ns_segctor_sem lock remains held for a long period. This prevents other tasks from acquiring the ns_segctor_sem lock, resulting in a hang reported by syzbot (Edward Adam Davis) - Fix missing struct keywords in nilfs2_api.h kernel-doc (Ryusuke Konishi) - Convert nilfs_super_block to kernel-doc Eliminate 40+ kernel-doc warnings in nilfs2_ondisk.h by converting all of the struct member comments to kernel-doc comments (Randy Dunlap) * tag 'nilfs2-v7.0-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/vdubeyko/nilfs2: nilfs2: fix missing struct keywords in nilfs2_api.h kernel-doc nilfs2: convert nilfs_super_block to kernel-doc nilfs2: Fix potential block overflow that cause system hang
2 parents 8912c2f + 6fd8a09 commit d10a88c

3 files changed

Lines changed: 103 additions & 68 deletions

File tree

fs/nilfs2/sufile.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,6 +1093,9 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)
10931093
else
10941094
end_block = start_block + len - 1;
10951095

1096+
if (end_block < nilfs->ns_first_data_block)
1097+
goto out;
1098+
10961099
segnum = nilfs_get_segnum_of_block(nilfs, start_block);
10971100
segnum_end = nilfs_get_segnum_of_block(nilfs, end_block);
10981101

@@ -1191,6 +1194,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)
11911194
out_sem:
11921195
up_read(&NILFS_MDT(sufile)->mi_sem);
11931196

1197+
out:
11941198
range->len = ndiscarded << nilfs->ns_blocksize_bits;
11951199
return ret;
11961200
}

include/uapi/linux/nilfs2_api.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ NILFS_CPINFO_FNS(INVALID, invalid)
5858
NILFS_CPINFO_FNS(MINOR, minor)
5959

6060
/**
61-
* nilfs_suinfo - segment usage information
61+
* struct nilfs_suinfo - segment usage information
6262
* @sui_lastmod: timestamp of last modification
6363
* @sui_nblocks: number of written blocks in segment
6464
* @sui_flags: segment usage flags
@@ -93,7 +93,7 @@ static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
9393
}
9494

9595
/**
96-
* nilfs_suinfo_update - segment usage information update
96+
* struct nilfs_suinfo_update - segment usage information update
9797
* @sup_segnum: segment number
9898
* @sup_flags: flags for which fields are active in sup_sui
9999
* @sup_reserved: reserved necessary for alignment

include/uapi/linux/nilfs2_ondisk.h

Lines changed: 97 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -133,73 +133,104 @@ struct nilfs_super_root {
133133

134134
/**
135135
* struct nilfs_super_block - structure of super block on disk
136+
* @s_rev_level: Revision level
137+
* @s_minor_rev_level: minor revision level
138+
* @s_magic: Magic signature
139+
* @s_bytes: Bytes count of CRC calculation for
140+
* this structure. s_reserved is excluded.
141+
* @s_flags: flags
142+
* @s_crc_seed: Seed value of CRC calculation
143+
* @s_sum: Check sum of super block
144+
* @s_log_block_size: Block size represented as follows:
145+
* blocksize = 1 << (s_log_block_size + 10)
146+
* @s_nsegments: Number of segments in filesystem
147+
* @s_dev_size: block device size in bytes
148+
* @s_first_data_block: 1st seg disk block number
149+
* @s_blocks_per_segment: number of blocks per full segment
150+
* @s_r_segments_percentage: Reserved segments percentage
151+
* @s_last_cno: Last checkpoint number
152+
* @s_last_pseg: disk block addr pseg written last
153+
* @s_last_seq: seq. number of seg written last
154+
* @s_free_blocks_count: Free blocks count
155+
* @s_ctime: Creation time (execution time of newfs)
156+
* @s_mtime: Mount time
157+
* @s_wtime: Write time
158+
* @s_mnt_count: Mount count
159+
* @s_max_mnt_count: Maximal mount count
160+
* @s_state: File system state
161+
* @s_errors: Behaviour when detecting errors
162+
* @s_lastcheck: time of last check
163+
* @s_checkinterval: max. time between checks
164+
* @s_creator_os: OS
165+
* @s_def_resuid: Default uid for reserved blocks
166+
* @s_def_resgid: Default gid for reserved blocks
167+
* @s_first_ino: First non-reserved inode
168+
* @s_inode_size: Size of an inode
169+
* @s_dat_entry_size: Size of a dat entry
170+
* @s_checkpoint_size: Size of a checkpoint
171+
* @s_segment_usage_size: Size of a segment usage
172+
* @s_uuid: 128-bit uuid for volume
173+
* @s_volume_name: volume name
174+
* @s_c_interval: Commit interval of segment
175+
* @s_c_block_max: Threshold of data amount for the
176+
* segment construction
177+
* @s_feature_compat: Compatible feature set
178+
* @s_feature_compat_ro: Read-only compatible feature set
179+
* @s_feature_incompat: Incompatible feature set
180+
* @s_reserved: padding to the end of the block
136181
*/
137182
struct nilfs_super_block {
138-
/*00*/ __le32 s_rev_level; /* Revision level */
139-
__le16 s_minor_rev_level; /* minor revision level */
140-
__le16 s_magic; /* Magic signature */
141-
142-
__le16 s_bytes; /*
143-
* Bytes count of CRC calculation
144-
* for this structure. s_reserved
145-
* is excluded.
146-
*/
147-
__le16 s_flags; /* flags */
148-
__le32 s_crc_seed; /* Seed value of CRC calculation */
149-
/*10*/ __le32 s_sum; /* Check sum of super block */
150-
151-
__le32 s_log_block_size; /*
152-
* Block size represented as follows
153-
* blocksize =
154-
* 1 << (s_log_block_size + 10)
155-
*/
156-
__le64 s_nsegments; /* Number of segments in filesystem */
157-
/*20*/ __le64 s_dev_size; /* block device size in bytes */
158-
__le64 s_first_data_block; /* 1st seg disk block number */
159-
/*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */
160-
__le32 s_r_segments_percentage; /* Reserved segments percentage */
161-
162-
__le64 s_last_cno; /* Last checkpoint number */
163-
/*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */
164-
__le64 s_last_seq; /* seq. number of seg written last */
165-
/*50*/ __le64 s_free_blocks_count; /* Free blocks count */
166-
167-
__le64 s_ctime; /*
168-
* Creation time (execution time of
169-
* newfs)
170-
*/
171-
/*60*/ __le64 s_mtime; /* Mount time */
172-
__le64 s_wtime; /* Write time */
173-
/*70*/ __le16 s_mnt_count; /* Mount count */
174-
__le16 s_max_mnt_count; /* Maximal mount count */
175-
__le16 s_state; /* File system state */
176-
__le16 s_errors; /* Behaviour when detecting errors */
177-
__le64 s_lastcheck; /* time of last check */
178-
179-
/*80*/ __le32 s_checkinterval; /* max. time between checks */
180-
__le32 s_creator_os; /* OS */
181-
__le16 s_def_resuid; /* Default uid for reserved blocks */
182-
__le16 s_def_resgid; /* Default gid for reserved blocks */
183-
__le32 s_first_ino; /* First non-reserved inode */
184-
185-
/*90*/ __le16 s_inode_size; /* Size of an inode */
186-
__le16 s_dat_entry_size; /* Size of a dat entry */
187-
__le16 s_checkpoint_size; /* Size of a checkpoint */
188-
__le16 s_segment_usage_size; /* Size of a segment usage */
189-
190-
/*98*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */
191-
/*A8*/ char s_volume_name[80] /* volume name */
192-
__kernel_nonstring;
193-
194-
/*F8*/ __le32 s_c_interval; /* Commit interval of segment */
195-
__le32 s_c_block_max; /*
196-
* Threshold of data amount for
197-
* the segment construction
198-
*/
199-
/*100*/ __le64 s_feature_compat; /* Compatible feature set */
200-
__le64 s_feature_compat_ro; /* Read-only compatible feature set */
201-
__le64 s_feature_incompat; /* Incompatible feature set */
202-
__u32 s_reserved[186]; /* padding to the end of the block */
183+
/*00*/ __le32 s_rev_level;
184+
__le16 s_minor_rev_level;
185+
__le16 s_magic;
186+
187+
__le16 s_bytes;
188+
__le16 s_flags;
189+
__le32 s_crc_seed;
190+
/*10*/ __le32 s_sum;
191+
192+
__le32 s_log_block_size;
193+
__le64 s_nsegments;
194+
/*20*/ __le64 s_dev_size;
195+
__le64 s_first_data_block;
196+
/*30*/ __le32 s_blocks_per_segment;
197+
__le32 s_r_segments_percentage;
198+
199+
__le64 s_last_cno;
200+
/*40*/ __le64 s_last_pseg;
201+
__le64 s_last_seq;
202+
/*50*/ __le64 s_free_blocks_count;
203+
204+
__le64 s_ctime;
205+
/*60*/ __le64 s_mtime;
206+
__le64 s_wtime;
207+
/*70*/ __le16 s_mnt_count;
208+
__le16 s_max_mnt_count;
209+
__le16 s_state;
210+
__le16 s_errors;
211+
__le64 s_lastcheck;
212+
213+
/*80*/ __le32 s_checkinterval;
214+
__le32 s_creator_os;
215+
__le16 s_def_resuid;
216+
__le16 s_def_resgid;
217+
__le32 s_first_ino;
218+
219+
/*90*/ __le16 s_inode_size;
220+
__le16 s_dat_entry_size;
221+
__le16 s_checkpoint_size;
222+
__le16 s_segment_usage_size;
223+
224+
/*98*/ __u8 s_uuid[16];
225+
/*A8*/ char s_volume_name[80] __kernel_nonstring;
226+
227+
/*F8*/ __le32 s_c_interval;
228+
__le32 s_c_block_max;
229+
230+
/*100*/ __le64 s_feature_compat;
231+
__le64 s_feature_compat_ro;
232+
__le64 s_feature_incompat;
233+
__u32 s_reserved[186];
203234
};
204235

205236
/*
@@ -449,7 +480,7 @@ struct nilfs_btree_node {
449480
/**
450481
* struct nilfs_direct_node - header of built-in bmap array
451482
* @dn_flags: flags
452-
* @dn_pad: padding
483+
* @pad: padding
453484
*/
454485
struct nilfs_direct_node {
455486
__u8 dn_flags;

0 commit comments

Comments
 (0)