Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f3c391e89c92651105364c6645244118ec9b3952
Commit:     f3c391e89c92651105364c6645244118ec9b3952
Parent:     34f5b4662bf4b54f22b32ce76ce70eccd7ebc68a
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 15 14:17:12 2008 -0500
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 02:06:10 2008 -0500

    NFS: Optimise away the sigmask code in aio/dio reads and writes
    
    There are no interruptible waits for asynchronous RPC tasks, so we don't
    need to wrap calls to rpc_run_task() with an
    rpc_clnt_sigmask/rpc_clnt_unsigmask pair.
    
    Instead we can wrap the wait_for_completion_interruptible() in
    nfs_direct_wait(). This means that we completely optimise away sigmask
    setting for the case of non-blocking aio/dio.
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 fs/nfs/direct.c |   13 +++++--------
 1 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index eadd87f..f8e165c 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -188,12 +188,17 @@ static void nfs_direct_req_release(struct nfs_direct_req 
*dreq)
 static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
 {
        ssize_t result = -EIOCBQUEUED;
+       struct rpc_clnt *clnt;
+       sigset_t oldset;
 
        /* Async requests don't wait here */
        if (dreq->iocb)
                goto out;
 
+       clnt = NFS_CLIENT(dreq->inode);
+       rpc_clnt_sigmask(clnt, &oldset);
        result = wait_for_completion_interruptible(&dreq->completion);
+       rpc_clnt_sigunmask(clnt, &oldset);
 
        if (!result)
                result = dreq->error;
@@ -403,9 +408,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, const 
struct iovec *iov,
                               unsigned long nr_segs, loff_t pos)
 {
        ssize_t result = 0;
-       sigset_t oldset;
        struct inode *inode = iocb->ki_filp->f_mapping->host;
-       struct rpc_clnt *clnt = NFS_CLIENT(inode);
        struct nfs_direct_req *dreq;
 
        dreq = nfs_direct_req_alloc();
@@ -417,11 +420,9 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, const 
struct iovec *iov,
        if (!is_sync_kiocb(iocb))
                dreq->iocb = iocb;
 
-       rpc_clnt_sigmask(clnt, &oldset);
        result = nfs_direct_read_schedule_iovec(dreq, iov, nr_segs, pos);
        if (!result)
                result = nfs_direct_wait(dreq);
-       rpc_clnt_sigunmask(clnt, &oldset);
        nfs_direct_req_release(dreq);
 
        return result;
@@ -816,9 +817,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, const 
struct iovec *iov,
                                size_t count)
 {
        ssize_t result = 0;
-       sigset_t oldset;
        struct inode *inode = iocb->ki_filp->f_mapping->host;
-       struct rpc_clnt *clnt = NFS_CLIENT(inode);
        struct nfs_direct_req *dreq;
        size_t wsize = NFS_SERVER(inode)->wsize;
        int sync = NFS_UNSTABLE;
@@ -836,11 +835,9 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, const 
struct iovec *iov,
        if (!is_sync_kiocb(iocb))
                dreq->iocb = iocb;
 
-       rpc_clnt_sigmask(clnt, &oldset);
        result = nfs_direct_write_schedule_iovec(dreq, iov, nr_segs, pos, sync);
        if (!result)
                result = nfs_direct_wait(dreq);
-       rpc_clnt_sigunmask(clnt, &oldset);
        nfs_direct_req_release(dreq);
 
        return result;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to