Skip to content

Commit

Permalink
nfs: generic_write_checks() shouldn't be done on swapout...
Browse files Browse the repository at this point in the history
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Apr 15, 2015
1 parent 7da839c commit 65a4a1c
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 15 deletions.
12 changes: 3 additions & 9 deletions fs/nfs/direct.c
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)

if (iov_iter_rw(iter) == READ)
return nfs_file_direct_read(iocb, iter, pos);
return nfs_file_direct_write(iocb, iter, pos);
return nfs_file_direct_write(iocb, iter);
#endif /* CONFIG_NFS_SWAP */
}

Expand Down Expand Up @@ -959,24 +959,19 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
* Note that O_APPEND is not supported for NFS direct writes, as there
* is no atomic O_APPEND write facility in the NFS protocol.
*/
ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter,
loff_t pos)
ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
{
ssize_t result = -EINVAL;
struct file *file = iocb->ki_filp;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
struct nfs_direct_req *dreq;
struct nfs_lock_context *l_ctx;
loff_t end;
loff_t pos, end;

dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
file, iov_iter_count(iter), (long long) iocb->ki_pos);

result = generic_write_checks(iocb, iter);
if (result <= 0)
goto out;

nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES,
iov_iter_count(iter));

Expand Down Expand Up @@ -1044,7 +1039,6 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter,
nfs_direct_req_release(dreq);
out_unlock:
mutex_unlock(&inode->i_mutex);
out:
return result;
}

Expand Down
11 changes: 7 additions & 4 deletions fs/nfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -674,17 +674,20 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
unsigned long written = 0;
ssize_t result;
size_t count = iov_iter_count(from);
loff_t pos = iocb->ki_pos;

result = nfs_key_timeout_notify(file, inode);
if (result)
return result;

if (iocb->ki_flags & IOCB_DIRECT)
return nfs_file_direct_write(iocb, from, pos);
if (iocb->ki_flags & IOCB_DIRECT) {
result = generic_write_checks(iocb, from);
if (result <= 0)
return result;
return nfs_file_direct_write(iocb, from);
}

dprintk("NFS: write(%pD2, %zu@%Ld)\n",
file, count, (long long) pos);
file, count, (long long) iocb->ki_pos);

result = -EBUSY;
if (IS_SWAPFILE(inode))
Expand Down
3 changes: 1 addition & 2 deletions include/linux/nfs_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -452,8 +452,7 @@ extern ssize_t nfs_file_direct_read(struct kiocb *iocb,
struct iov_iter *iter,
loff_t pos);
extern ssize_t nfs_file_direct_write(struct kiocb *iocb,
struct iov_iter *iter,
loff_t pos);
struct iov_iter *iter);

/*
* linux/fs/nfs/dir.c
Expand Down

0 comments on commit 65a4a1c

Please sign in to comment.