diff options
author | Chuck Lever <cel@netapp.com> | 2006-03-20 13:44:35 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-20 13:44:35 -0500 |
commit | a37ec012d7fd352648c8455d3396ea24001efcd3 (patch) | |
tree | 778182e20ada2cf1ce3a5507ab1eec96c16633b2 | |
parent | 15ce4a0c1ce0d5e288398cb9e5493fd4e55e2025 (diff) |
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: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/direct.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 3de7c4b07968..737990dd4dfe 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -219,6 +219,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) | |||
219 | } else | 219 | } else |
220 | wake_up(&dreq->wait); | 220 | wake_up(&dreq->wait); |
221 | 221 | ||
222 | iput(dreq->inode); | ||
222 | kref_put(&dreq->kref, nfs_direct_req_release); | 223 | kref_put(&dreq->kref, nfs_direct_req_release); |
223 | } | 224 | } |
224 | 225 | ||
@@ -374,6 +375,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size | |||
374 | 375 | ||
375 | dreq->pages = pages; | 376 | dreq->pages = pages; |
376 | dreq->npages = nr_pages; | 377 | dreq->npages = nr_pages; |
378 | igrab(inode); | ||
377 | dreq->inode = inode; | 379 | dreq->inode = inode; |
378 | dreq->filp = iocb->ki_filp; | 380 | dreq->filp = iocb->ki_filp; |
379 | if (!is_sync_kiocb(iocb)) | 381 | if (!is_sync_kiocb(iocb)) |
@@ -549,6 +551,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz | |||
549 | 551 | ||
550 | dreq->pages = pages; | 552 | dreq->pages = pages; |
551 | dreq->npages = nr_pages; | 553 | dreq->npages = nr_pages; |
554 | igrab(inode); | ||
552 | dreq->inode = inode; | 555 | dreq->inode = inode; |
553 | dreq->filp = iocb->ki_filp; | 556 | dreq->filp = iocb->ki_filp; |
554 | if (!is_sync_kiocb(iocb)) | 557 | if (!is_sync_kiocb(iocb)) |