NFS: Introduce iovec I/O helpers to fs/nfs/direct.c
Subsystems (2)
PATCH 1/4 NFS: Introduce iovec I/O helpers to fs/nfs/direct.c
Add helpers that iterate over multi-segment iovecs. These will be used to support multi-segment scatter/gather direct I/O in a later patch.
Signed-off-by Chuck Lever <[email protected]>
Signed-off-by Chuck Lever <[email protected]>
---
fs/nfs/direct.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 71 insertions(+), 0 deletions(-)
fs/nfs/direct.c +71 -0
@@ -355,6 +355,41 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned loreturn result <0 ? (ssize_t ) result : -EFAULT ; } +static ssize_t nfs_direct_read_schedule_iovec (struct nfs_direct_req *dreq, +const struct iovec *iov, +unsigned long nr_segs, +loff_t pos) +{ +ssize_t result = -EINVAL ; +size_t requested_bytes =0 ; +unsigned long seg; + +get_dreq (dreq); + +for (seg =0 ; seg < nr_segs; seg++) { +const struct iovec *vec = &iov[seg]; + result =nfs_direct_read_schedule (dreq, + (unsigned long )vec->iov_base, + vec->iov_len, pos); +if (result <0 ) +break ; + requested_bytes += result; +if ((size_t )result < vec->iov_len) +break ; + pos += vec->iov_len; + } + +if (put_dreq (dreq)) +nfs_direct_complete (dreq); + +if (requested_bytes !=0 ) +return 0 ; + +if (result <0 ) +return result; +return -EIO ; +} +static ssize_t nfs_direct_read (struct kiocb *iocb,unsigned long user_addr,size_t count,loff_t pos) {ssize_t result =0 ;
@@ -697,6 +732,42 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned lreturn result <0 ? (ssize_t ) result : -EFAULT ; } +static ssize_t nfs_direct_write_schedule_iovec (struct nfs_direct_req *dreq, +const struct iovec *iov, +unsigned long nr_segs, +loff_t pos,int sync) +{ +ssize_t result =0 ; +size_t requested_bytes =0 ; +unsigned long seg; + +get_dreq (dreq); + +for (seg =0 ; seg < nr_segs; seg++) { +const struct iovec *vec = &iov[seg]; + result =nfs_direct_write_schedule (dreq, + (unsigned long )vec->iov_base, + vec->iov_len, + pos, sync); +if (result <0 ) +break ; + requested_bytes += result; +if ((size_t )result < vec->iov_len) +break ; + pos += vec->iov_len; + } + +if (put_dreq (dreq)) +nfs_direct_write_complete (dreq, dreq->inode); + +if (requested_bytes !=0 ) +return 0 ; + +if (result <0 ) +return result; +return -EIO ; +} +static ssize_t nfs_direct_write (struct kiocb *iocb,unsigned long user_addr,size_t count,loff_t pos) {ssize_t result =0 ;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs