aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/rgrp.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 9809156e3d04..69317435faa7 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1288,13 +1288,15 @@ int gfs2_fitrim(struct file *filp, void __user *argp)
1288 minlen = max_t(u64, r.minlen, 1288 minlen = max_t(u64, r.minlen,
1289 q->limits.discard_granularity) >> bs_shift; 1289 q->limits.discard_granularity) >> bs_shift;
1290 1290
1291 if (end <= start || minlen > sdp->sd_max_rg_data)
1292 return -EINVAL;
1293
1291 rgd = gfs2_blk2rgrpd(sdp, start, 0); 1294 rgd = gfs2_blk2rgrpd(sdp, start, 0);
1292 rgd_end = gfs2_blk2rgrpd(sdp, end - 1, 0); 1295 rgd_end = gfs2_blk2rgrpd(sdp, end, 0);
1293 1296
1294 if (end <= start || 1297 if ((gfs2_rgrpd_get_first(sdp) == gfs2_rgrpd_get_next(rgd_end))
1295 minlen > sdp->sd_max_rg_data || 1298 && (start > rgd_end->rd_data0 + rgd_end->rd_data))
1296 start > rgd_end->rd_data0 + rgd_end->rd_data) 1299 return -EINVAL; /* start is beyond the end of the fs */
1297 return -EINVAL;
1298 1300
1299 while (1) { 1301 while (1) {
1300 1302
@@ -1336,7 +1338,7 @@ int gfs2_fitrim(struct file *filp, void __user *argp)
1336 } 1338 }
1337 1339
1338out: 1340out:
1339 r.len = trimmed << 9; 1341 r.len = trimmed << bs_shift;
1340 if (copy_to_user(argp, &r, sizeof(r))) 1342 if (copy_to_user(argp, &r, sizeof(r)))
1341 return -EFAULT; 1343 return -EFAULT;
1342 1344