]> www.infradead.org Git - users/willy/xarray.git/commitdiff
btrfs: return EAGAIN if defrag is canceled
authorTian Tao <tiantao6@hisilicon.com>
Wed, 5 May 2021 01:26:28 +0000 (09:26 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jun 2021 13:19:05 +0000 (15:19 +0200)
When inode defrag is canceled, the error is set to EAGAIN but then
overwritten by number of defragmented bytes. As this would hide the
error, rather return EAGAIN. This does not harm 'btrfs fi defrag', it
will print the error and continue to next file (as it does in for any
other error).

Signed-off-by: Tian Tao <tiantao6@hisilicon.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ update changelog ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ioctl.c

index 5dc2fd843ae37727609a9e4aa5950478ea5280c9..a7739461533d33f79a84e8c908595800a945bbfd 100644 (file)
@@ -1455,7 +1455,7 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
                if (btrfs_defrag_cancelled(fs_info)) {
                        btrfs_debug(fs_info, "defrag_file cancelled");
                        ret = -EAGAIN;
-                       break;
+                       goto error;
                }
 
                if (!should_defrag_range(inode, (u64)i << PAGE_SHIFT,
@@ -1533,6 +1533,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
                }
        }
 
+       ret = defrag_count;
+error:
        if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) {
                filemap_flush(inode->i_mapping);
                if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
@@ -1546,8 +1548,6 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
                btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
        }
 
-       ret = defrag_count;
-
 out_ra:
        if (do_compress) {
                btrfs_inode_lock(inode, 0);