- Fix fstrim boundary conditions
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 - Fix fstrim boundary conditions
This patch correctly distinguishes two boundary conditions:
1. When the given range is entire within the unaccounted space between two rgrps, and
2. The range begins beyond the end of the filesystem
Also fix the unit of the returned value r.len (total trimming) to be in bytes instead of the (incorrect) 512 byte blocks
With this patch, GFS2 passes multiple iterations of all the relevant xfstests (251, 260, 288) with different fs block sizes.
fs/gfs2/rgrp.c +8 -6
@@ -1288,13 +1288,15 @@ int gfs2_fitrim(struct file *filp, void __user *argp) minlen =max_t (u64, r.minlen, q->limits.discard_granularity) >> bs_shift; +if (end <= start || minlen > sdp->sd_max_rg_data) +return -EINVAL ; + rgd =gfs2_blk2rgrpd (sdp, start,0 ); - rgd_end =gfs2_blk2rgrpd (sdp, end -1 ,0 ); + rgd_end =gfs2_blk2rgrpd (sdp, end,0 ); -if (end <= start || - minlen > sdp->sd_max_rg_data || - start > rgd_end->rd_data0 + rgd_end->rd_data) -return -EINVAL ; +if ((gfs2_rgrpd_get_first (sdp) ==gfs2_rgrpd_get_next (rgd_end)) + && (start > rgd_end->rd_data0 + rgd_end->rd_data)) +return -EINVAL ;/* start is beyond the end of the fs */ while (1 ) {
@@ -1336,7 +1338,7 @@ int gfs2_fitrim(struct file *filp, void __user *argp) } out: - r.len = trimmed <<9 ; + r.len = trimmed << bs_shift;if (copy_to_user (argp, &r,sizeof (r)))return -EFAULT ;
PATCH 1/1 - Fix fstrim boundary conditions
Hi,
Now in the -nmw tree. Thanks,
Steve.
Quoted 46 lines · Abhijith Das
This patch correctly distinguishes two boundary conditions:
1. When the given range is entire within the unaccounted space between two rgrps, and
2. The range begins beyond the end of the filesystemAlso fix the unit of the returned value r.len (total trimming) to be in bytes instead of the (incorrect) 512 byte blocks
With this patch, GFS2 passes multiple iterations of all the relevant xfstests (251, 260, 288) with different fs block sizes.
Signed-off-by Abhi Das <[email protected]>fs/gfs2/rgrp.c +8
-6@@ -1288,13 +1288,15 @@ int gfs2_fitrim(struct file *filp, void __user *argp) minlen =max_t (u64, r.minlen, q->limits.discard_granularity) >> bs_shift; +if (end <= start || minlen > sdp->sd_max_rg_data) +return -EINVAL ; + rgd =gfs2_blk2rgrpd (sdp, start,0 ); - rgd_end =gfs2_blk2rgrpd (sdp, end -1 ,0 ); + rgd_end =gfs2_blk2rgrpd (sdp, end,0 ); -if (end <= start || - minlen > sdp->sd_max_rg_data || - start > rgd_end->rd_data0 + rgd_end->rd_data) -return -EINVAL ; +if ((gfs2_rgrpd_get_first (sdp) ==gfs2_rgrpd_get_next (rgd_end)) + && (start > rgd_end->rd_data0 + rgd_end->rd_data)) +return -EINVAL ;/* start is beyond the end of the fs */ while (1 ) {@@ -1336,7 +1338,7 @@ int gfs2_fitrim(struct file *filp, void __user *argp) } out: - r.len = trimmed <<9 ; + r.len = trimmed << bs_shift;if (copy_to_user (argp, &r,sizeof (r)))return -EFAULT ;