On 09/28/16 17:39, Darrick J. Wong wrote:
+       if (end > isize) {
+               if (mode & FALLOC_FL_KEEP_SIZE) {
+                       len = isize - start;
+                       end = start + len - 1;
+               } else
+                       return -EINVAL;
+       }

If FALLOC_FL_KEEP_SIZE has been set and end == isize the above code won't reduce end to isize - 1. Shouldn't "end > isize" be changed into "end >= isize" ?

+       switch (mode) {
+       case FALLOC_FL_ZERO_RANGE:
+       case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE:
+               error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9,
+                                           GFP_KERNEL, false);
+               if (error)
+                       return error;
+               break;
+       case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE:
+               /* Only punch if the device can do zeroing discard. */
+               if (!blk_queue_discard(q) || !q->limits.discard_zeroes_data)
+                       return -EOPNOTSUPP;
+               error = blkdev_issue_discard(bdev, start >> 9, len >> 9,
+                                            GFP_KERNEL, 0);
+               if (error)
+                       return error;
+               break;
+       case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | 
FALLOC_FL_NO_HIDE_STALE:
+               error = blkdev_issue_discard(bdev, start >> 9, len >> 9,
+                                            GFP_KERNEL, 0);
+               if (error)
+                       return error;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }

Have you considered to move "if (error) return error" out of the switch statement?

+       /*
+        * Invalidate again; if someone wandered in and dirtied a page,
+        * the caller will be given -EBUSY;
+        */
+       return invalidate_inode_pages2_range(mapping,
+                                            start >> PAGE_SHIFT,
+                                            end >> PAGE_SHIFT);

A comment might be appropriate here that since end is inclusive and since the third argument of invalidate_inode_pages2_range() is inclusive that rounding down will yield the correct result.

Bart.

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to