ext4: check if device support discard in FITRIM ioctl
authorLukas Czerner <lczerner@redhat.com>
Wed, 23 Feb 2011 17:42:32 +0000 (12:42 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 23 Feb 2011 17:42:32 +0000 (12:42 -0500)
For a device that does not support discard, the FITRIM ioctl returns
-EOPNOTSUPP when blkdev_issue_discard() returns this error code, which
is how the user is informed that the device does not support discard.

If there are no suitable free extents to be trimmed, then FITRIM will
return success even though the device does not support discard, which
could confuse the user.  So check explicitly if the device supports
discard and return an error code at the beginning of the FITRIM ioctl
processing.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/ioctl.c

index eb3bc2fe647e710de889f04da3afaf5821e00556..25ba7c79d2893eadde4105b20116a2a5d0acb5b4 100644 (file)
@@ -334,12 +334,16 @@ mext_out:
        case FITRIM:
        {
                struct super_block *sb = inode->i_sb;
+               struct request_queue *q = bdev_get_queue(sb->s_bdev);
                struct fstrim_range range;
                int ret = 0;
 
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
 
+               if (!blk_queue_discard(q))
+                       return -EOPNOTSUPP;
+
                if (copy_from_user(&range, (struct fstrim_range *)arg,
                    sizeof(range)))
                        return -EFAULT;