Commit dc617f29dbe5 ("vfs: don't allow writes to swap files") broke swap-over-NFS as it introduced an ETXTBSY error when NFS tries to swap-out using ->direct_IO(). There is no sound justification for this error. File permissions are sufficient to stop non-root users from writing to a swap file, and root must always be cautious not to do anything dangerous. These checks effectively provide a mandatory write lock on swap, and mandatory locks are not supported in Linux. So remove all the checks that return ETXTBSY when attempts are made to write to swap. Fixes: dc617f29dbe5 ("vfs: don't allow writes to swap files") Signed-off-by: NeilBrown <neilb@xxxxxxx> --- fs/block_dev.c | 3 --- fs/read_write.c | 6 ------ 2 files changed, 9 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 9ef4f1fc2cb0..e5605c88e6e9 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1623,9 +1623,6 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) if (bdev_read_only(I_BDEV(bd_inode))) return -EPERM; - if (IS_SWAPFILE(bd_inode) && !is_hibernate_resume_dev(bd_inode->i_rdev)) - return -ETXTBSY; - if (!iov_iter_count(from)) return 0; diff --git a/fs/read_write.c b/fs/read_write.c index 9db7adf160d2..14f1c622a066 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1442,9 +1442,6 @@ static int generic_copy_file_checks(struct file *file_in, loff_t pos_in, if (IS_IMMUTABLE(inode_out)) return -EPERM; - if (IS_SWAPFILE(inode_in) || IS_SWAPFILE(inode_out)) - return -ETXTBSY; - /* Ensure offsets don't wrap. */ if (pos_in + count < pos_in || pos_out + count < pos_out) return -EOVERFLOW; @@ -1646,9 +1643,6 @@ ssize_t generic_write_checks(struct kiocb *iocb, struct iov_iter *from) loff_t count; int ret; - if (IS_SWAPFILE(inode)) - return -ETXTBSY; - if (!iov_iter_count(from)) return 0; -- 2.32.0