aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2007-11-26 17:06:39 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-02-01 16:42:06 -0500
commit39325bd03fc16d903f1e0f51104436d939899c8c (patch)
treede63f3c58a3b82d26223e4dfdda1a98570c5a84a /fs
parentb7e6b86948df8d08d420558212e09eb449be9bfa (diff)
nfsd4: fix bad seqid on lock request incompatible with open mode
The failure to return a stateowner from nfs4_preprocess_seqid_op() means in the case where a lock request is of a type incompatible with an open (due to, e.g., an application attempting a write lock on a file open for read), means that fs/nfsd/nfs4xdr.c:ENCODE_SEQID_OP_TAIL() never bumps the seqid as it should. The client, attempting to close the file afterwards, then gets an (incorrect) bad sequence id error. Worse, this prevents the open file from ever being closed, so we leak state. Thanks to Benny Halevy and Trond Myklebust for analysis, and to Steven Wilton for the report and extensive data-gathering. Cc: Benny Halevy <bhalevy@panasas.com> Cc: Steven Wilton <steven.wilton@team.eftel.com.au> Cc: Trond Myklebust <trond.myklebust@fys.uio.no> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 11aa4b6b4fa2..c4b10a1e6c30 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2093,8 +2093,10 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
2093 goto check_replay; 2093 goto check_replay;
2094 } 2094 }
2095 2095
2096 *stpp = stp;
2097 *sopp = sop = stp->st_stateowner;
2098
2096 if (lock) { 2099 if (lock) {
2097 struct nfs4_stateowner *sop = stp->st_stateowner;
2098 clientid_t *lockclid = &lock->v.new.clientid; 2100 clientid_t *lockclid = &lock->v.new.clientid;
2099 struct nfs4_client *clp = sop->so_client; 2101 struct nfs4_client *clp = sop->so_client;
2100 int lkflg = 0; 2102 int lkflg = 0;
@@ -2124,9 +2126,6 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
2124 return nfserr_bad_stateid; 2126 return nfserr_bad_stateid;
2125 } 2127 }
2126 2128
2127 *stpp = stp;
2128 *sopp = sop = stp->st_stateowner;
2129
2130 /* 2129 /*
2131 * We now validate the seqid and stateid generation numbers. 2130 * We now validate the seqid and stateid generation numbers.
2132 * For the moment, we ignore the possibility of 2131 * For the moment, we ignore the possibility of