From 0a52d108089f337ce20d74bf53f2e574c8ee43f2 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Thu, 22 Jun 2017 03:22:58 +0200 Subject: [PATCH] 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 --- fs/btrfs/ioctl.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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; } -- 2.20.1