Commit a37ec012 authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust
Browse files

NFS: fix data_update accounting in NFS direct I/O path



^C against "iozone -I" is hitting the assertion in nfs_clear_inode().

Test plan:
"iozone -i0 -I -a -c" against a slow server, then control C.  This should
not cause an oops.
Signed-off-by: default avatarChuck Lever <cel@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 15ce4a0c
...@@ -219,6 +219,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) ...@@ -219,6 +219,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq)
} else } else
wake_up(&dreq->wait); wake_up(&dreq->wait);
iput(dreq->inode);
kref_put(&dreq->kref, nfs_direct_req_release); kref_put(&dreq->kref, nfs_direct_req_release);
} }
...@@ -374,6 +375,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size ...@@ -374,6 +375,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size
dreq->pages = pages; dreq->pages = pages;
dreq->npages = nr_pages; dreq->npages = nr_pages;
igrab(inode);
dreq->inode = inode; dreq->inode = inode;
dreq->filp = iocb->ki_filp; dreq->filp = iocb->ki_filp;
if (!is_sync_kiocb(iocb)) if (!is_sync_kiocb(iocb))
...@@ -549,6 +551,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz ...@@ -549,6 +551,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz
dreq->pages = pages; dreq->pages = pages;
dreq->npages = nr_pages; dreq->npages = nr_pages;
igrab(inode);
dreq->inode = inode; dreq->inode = inode;
dreq->filp = iocb->ki_filp; dreq->filp = iocb->ki_filp;
if (!is_sync_kiocb(iocb)) if (!is_sync_kiocb(iocb))
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment