diff options
Diffstat (limited to 'fs/nfs/direct.c')
| -rw-r--r-- | fs/nfs/direct.c | 31 | 
1 files changed, 15 insertions, 16 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 7a0cfd3266e5..741a92c470bb 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -250,7 +250,7 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,   * shunt off direct read and write requests before the VFS gets them,   * so this method is only ever called for swap.   */ -ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) +ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)  {  	struct inode *inode = iocb->ki_filp->f_mapping->host; @@ -261,7 +261,7 @@ ssize_t nfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)  	VM_BUG_ON(iov_iter_count(iter) != PAGE_SIZE);  	if (iov_iter_rw(iter) == READ) -		return nfs_file_direct_read(iocb, iter, pos); +		return nfs_file_direct_read(iocb, iter);  	return nfs_file_direct_write(iocb, iter);  } @@ -269,7 +269,7 @@ static void nfs_direct_release_pages(struct page **pages, unsigned int npages)  {  	unsigned int i;  	for (i = 0; i < npages; i++) -		page_cache_release(pages[i]); +		put_page(pages[i]);  }  void nfs_init_cinfo_from_dreq(struct nfs_commit_info *cinfo, @@ -396,7 +396,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq, bool write)  static void nfs_direct_readpage_release(struct nfs_page *req)  {  	dprintk("NFS: direct read done (%s/%llu %d@%lld)\n", -		d_inode(req->wb_context->dentry)->i_sb->s_id, +		req->wb_context->dentry->d_sb->s_id,  		(unsigned long long)NFS_FILEID(d_inode(req->wb_context->dentry)),  		req->wb_bytes,  		(long long)req_offset(req)); @@ -545,7 +545,6 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,   * nfs_file_direct_read - file direct read operation for NFS files   * @iocb: target I/O control block   * @iter: vector of user buffers into which to read data - * @pos: byte offset in file where reading starts   *   * We use this function for direct reads instead of calling   * generic_file_aio_read() in order to avoid gfar's check to see if @@ -561,8 +560,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,   * client must read the updated atime from the server back into its   * cache.   */ -ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter, -				loff_t pos) +ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter)  {  	struct file *file = iocb->ki_filp;  	struct address_space *mapping = file->f_mapping; @@ -574,7 +572,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,  	nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count);  	dfprintk(FILE, "NFS: direct read(%pD2, %zd@%Ld)\n", -		file, count, (long long) pos); +		file, count, (long long) iocb->ki_pos);  	result = 0;  	if (!count) @@ -594,7 +592,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,  	dreq->inode = inode;  	dreq->bytes_left = count; -	dreq->io_start = pos; +	dreq->io_start = iocb->ki_pos;  	dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));  	l_ctx = nfs_get_lock_context(dreq->ctx);  	if (IS_ERR(l_ctx)) { @@ -606,14 +604,14 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,  		dreq->iocb = iocb;  	NFS_I(inode)->read_io += count; -	result = nfs_direct_read_schedule_iovec(dreq, iter, pos); +	result = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);  	inode_unlock(inode);  	if (!result) {  		result = nfs_direct_wait(dreq);  		if (result > 0) -			iocb->ki_pos = pos + result; +			iocb->ki_pos += result;  	}  	nfs_direct_req_release(dreq); @@ -969,7 +967,6 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,   * nfs_file_direct_write - file direct write operation for NFS files   * @iocb: target I/O control block   * @iter: vector of user buffers from which to write data - * @pos: byte offset in file where writing starts   *   * We use this function for direct writes instead of calling   * generic_file_aio_write() in order to avoid taking the inode @@ -1003,7 +1000,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)  		      iov_iter_count(iter));  	pos = iocb->ki_pos; -	end = (pos + iov_iter_count(iter) - 1) >> PAGE_CACHE_SHIFT; +	end = (pos + iov_iter_count(iter) - 1) >> PAGE_SHIFT;  	inode_lock(inode); @@ -1013,7 +1010,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)  	if (mapping->nrpages) {  		result = invalidate_inode_pages2_range(mapping, -					pos >> PAGE_CACHE_SHIFT, end); +					pos >> PAGE_SHIFT, end);  		if (result)  			goto out_unlock;  	} @@ -1042,7 +1039,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)  	if (mapping->nrpages) {  		invalidate_inode_pages2_range(mapping, -					      pos >> PAGE_CACHE_SHIFT, end); +					      pos >> PAGE_SHIFT, end);  	}  	inode_unlock(inode); @@ -1057,7 +1054,9 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)  			if (i_size_read(inode) < iocb->ki_pos)  				i_size_write(inode, iocb->ki_pos);  			spin_unlock(&inode->i_lock); -			generic_write_sync(file, pos, result); + +			/* XXX: should check the generic_write_sync retval */ +			generic_write_sync(iocb, result);  		}  	}  	nfs_direct_req_release(dreq);  |