Skip to content

Commit

Permalink
NFS: Fix two bugs in the O_DIRECT write code
Browse files Browse the repository at this point in the history
Do not flag an error if the COMMIT call fails and we decide to resend the
writes. Let the resend flag the error if it fails.

If a write has failed, then nfs_direct_write_result should not attempt to
send a commit. It should just exit asap and return the error to the user.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Trond Myklebust authored and Linus Torvalds committed Apr 15, 2007
1 parent e1552e1 commit 60fa3f7
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions fs/nfs/direct.c
Original file line number Diff line number Diff line change
Expand Up @@ -432,10 +432,10 @@ static void nfs_direct_commit_result(struct rpc_task *task, void *calldata)
if (NFS_PROTO(data->inode)->commit_done(task, data) != 0)
return;
if (unlikely(task->tk_status < 0)) {
dreq->error = task->tk_status;
dprintk("NFS: %5u commit failed with error %d.\n",
task->tk_pid, task->tk_status);
dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
}
if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
} else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
dprintk("NFS: %5u commit verify failed\n", task->tk_pid);
dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
}
Expand Down Expand Up @@ -531,9 +531,12 @@ static void nfs_direct_write_result(struct rpc_task *task, void *calldata)

spin_lock(&dreq->lock);

if (unlikely(dreq->error != 0))
goto out_unlock;
if (unlikely(status < 0)) {
/* An error has occured, so we should not commit */
dreq->flags = 0;
dreq->error = status;
goto out_unlock;
}

dreq->count += data->res.count;
Expand Down

0 comments on commit 60fa3f7

Please sign in to comment.