Commit 83c9d41e authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: Remove nfs4_client->cl_sem from close() path

 We no longer need to worry about collisions between close() and the state
 recovery code, since the new close will automatically recheck the
 file state once it is done waiting on its sequence slot.

 Ditto for the nfs4_proc_locku() procedure.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent e6dfa553
...@@ -820,12 +820,10 @@ static void nfs4_free_closedata(struct nfs4_closedata *calldata) ...@@ -820,12 +820,10 @@ static void nfs4_free_closedata(struct nfs4_closedata *calldata)
{ {
struct nfs4_state *state = calldata->state; struct nfs4_state *state = calldata->state;
struct nfs4_state_owner *sp = state->owner; struct nfs4_state_owner *sp = state->owner;
struct nfs_server *server = NFS_SERVER(calldata->inode);
nfs4_put_open_state(calldata->state); nfs4_put_open_state(calldata->state);
nfs_free_seqid(calldata->arg.seqid); nfs_free_seqid(calldata->arg.seqid);
nfs4_put_state_owner(sp); nfs4_put_state_owner(sp);
up_read(&server->nfs4_state->cl_sem);
kfree(calldata); kfree(calldata);
} }
...@@ -2758,7 +2756,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock ...@@ -2758,7 +2756,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock
{ {
struct inode *inode = state->inode; struct inode *inode = state->inode;
struct nfs_server *server = NFS_SERVER(inode); struct nfs_server *server = NFS_SERVER(inode);
struct nfs4_client *clp = server->nfs4_state;
struct nfs_lockargs arg = { struct nfs_lockargs arg = {
.fh = NFS_FH(inode), .fh = NFS_FH(inode),
.type = nfs4_lck_type(cmd, request), .type = nfs4_lck_type(cmd, request),
...@@ -2778,7 +2775,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock ...@@ -2778,7 +2775,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock
struct nfs_locku_opargs luargs; struct nfs_locku_opargs luargs;
int status; int status;
down_read(&clp->cl_sem);
status = nfs4_set_lock_state(state, request); status = nfs4_set_lock_state(state, request);
if (status != 0) if (status != 0)
goto out; goto out;
...@@ -2802,7 +2798,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock ...@@ -2802,7 +2798,6 @@ static int _nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock
out: out:
if (status == 0) if (status == 0)
do_vfs_lock(request->fl_file, request); do_vfs_lock(request->fl_file, request);
up_read(&clp->cl_sem);
return status; return status;
} }
......
...@@ -481,17 +481,15 @@ void nfs4_put_open_state(struct nfs4_state *state) ...@@ -481,17 +481,15 @@ void nfs4_put_open_state(struct nfs4_state *state)
} }
/* /*
* Beware! Caller must be holding no references to clp->cl_sem! * Close the current file.
*/ */
void nfs4_close_state(struct nfs4_state *state, mode_t mode) void nfs4_close_state(struct nfs4_state *state, mode_t mode)
{ {
struct inode *inode = state->inode; struct inode *inode = state->inode;
struct nfs4_state_owner *owner = state->owner; struct nfs4_state_owner *owner = state->owner;
struct nfs4_client *clp = owner->so_client;
int newstate; int newstate;
atomic_inc(&owner->so_count); atomic_inc(&owner->so_count);
down_read(&clp->cl_sem);
/* Protect against nfs4_find_state() */ /* Protect against nfs4_find_state() */
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (mode & FMODE_READ) if (mode & FMODE_READ)
...@@ -523,7 +521,6 @@ void nfs4_close_state(struct nfs4_state *state, mode_t mode) ...@@ -523,7 +521,6 @@ void nfs4_close_state(struct nfs4_state *state, mode_t mode)
out: out:
nfs4_put_open_state(state); nfs4_put_open_state(state);
nfs4_put_state_owner(owner); nfs4_put_state_owner(owner);
up_read(&clp->cl_sem);
} }
/* /*
...@@ -704,8 +701,6 @@ void nfs_free_seqid(struct nfs_seqid *seqid) ...@@ -704,8 +701,6 @@ void nfs_free_seqid(struct nfs_seqid *seqid)
} }
/* /*
* Called with clp->cl_sem held.
*
* Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
* failed with a seqid incrementing error - * failed with a seqid incrementing error -
* see comments nfs_fs.h:seqid_mutating_error() * see comments nfs_fs.h:seqid_mutating_error()
...@@ -743,8 +738,6 @@ void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid) ...@@ -743,8 +738,6 @@ void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
} }
/* /*
* Called with clp->cl_sem held.
*
* Increment the seqid if the LOCK/LOCKU succeeded, or * Increment the seqid if the LOCK/LOCKU succeeded, or
* failed with a seqid incrementing error - * failed with a seqid incrementing error -
* see comments nfs_fs.h:seqid_mutating_error() * see comments nfs_fs.h:seqid_mutating_error()
......
Markdown is supported
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