diff options
-rw-r--r-- | fs/gfs2/rgrp.c | 14 |
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 | ||
1338 | out: | 1340 | out: |
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 | ||