diff options
Diffstat (limited to 'fs/nfs/direct.c')
| -rw-r--r-- | fs/nfs/direct.c | 34 | 
1 files changed, 20 insertions, 14 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index e6ace0d93c7..9943a75bb6d 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -407,15 +407,18 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,  		pos += vec->iov_len;  	} +	/* +	 * If no bytes were started, return the error, and let the +	 * generic layer handle the completion. +	 */ +	if (requested_bytes == 0) { +		nfs_direct_req_release(dreq); +		return result < 0 ? result : -EIO; +	} +  	if (put_dreq(dreq))  		nfs_direct_complete(dreq); - -	if (requested_bytes != 0) -		return 0; - -	if (result < 0) -		return result; -	return -EIO; +	return 0;  }  static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov, @@ -841,15 +844,18 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,  		pos += vec->iov_len;  	} +	/* +	 * If no bytes were started, return the error, and let the +	 * generic layer handle the completion. +	 */ +	if (requested_bytes == 0) { +		nfs_direct_req_release(dreq); +		return result < 0 ? result : -EIO; +	} +  	if (put_dreq(dreq))  		nfs_direct_write_complete(dreq, dreq->inode); - -	if (requested_bytes != 0) -		return 0; - -	if (result < 0) -		return result; -	return -EIO; +	return 0;  }  static ssize_t nfs_direct_write(struct kiocb *iocb, const struct iovec *iov,  |