From: David Sterba Date: Thu, 22 Jun 2017 01:22:58 +0000 (+0200) Subject: btrfs: defrag: make readahead state allocation failure non-fatal X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=0a52d108089f337ce20d74bf53f2e574c8ee43f2;p=openwrt%2Fstaging%2Fblogic.git btrfs: defrag: make readahead state allocation failure non-fatal All sorts of readahead errors are not considered fatal. We can continue defragmentation without it, with some potential slow down, which will last only for the current inode. Signed-off-by: David Sterba --- diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 4d1b07b81549..496e873b14de 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1273,14 +1273,14 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, extent_thresh = SZ_256K; /* - * if we were not given a file, allocate a readahead - * context + * If we were not given a file, allocate a readahead context. As + * readahead is just an optimization, defrag will work without it so + * we don't error out. */ if (!file) { ra = kzalloc(sizeof(*ra), GFP_KERNEL); - if (!ra) - return -ENOMEM; - file_ra_state_init(ra, inode->i_mapping); + if (ra) + file_ra_state_init(ra, inode->i_mapping); } else { ra = &file->f_ra; } @@ -1363,8 +1363,9 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, if (i + cluster > ra_index) { ra_index = max(i, ra_index); - btrfs_force_ra(inode->i_mapping, ra, file, ra_index, - cluster); + if (ra) + btrfs_force_ra(inode->i_mapping, ra, file, + ra_index, cluster); ra_index += cluster; }