浏览代码

NFS: Clear up state owner lock usage

can_open_cached() reads values out of the state structure, meaning that
we need the so_lock to have a correct return value.  As a bonus, this
helps clear up some potentially confusing code.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Anna Schumaker 11 年之前
父节点
当前提交
61beef75cc
共有 1 个文件被更改,包括 4 次插入6 次删除
  1. 4 6
      fs/nfs/nfs4proc.c

+ 4 - 6
fs/nfs/nfs4proc.c

@@ -1307,15 +1307,13 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
 	int ret = -EAGAIN;
 	int ret = -EAGAIN;
 
 
 	for (;;) {
 	for (;;) {
+		spin_lock(&state->owner->so_lock);
 		if (can_open_cached(state, fmode, open_mode)) {
 		if (can_open_cached(state, fmode, open_mode)) {
-			spin_lock(&state->owner->so_lock);
-			if (can_open_cached(state, fmode, open_mode)) {
-				update_open_stateflags(state, fmode);
-				spin_unlock(&state->owner->so_lock);
-				goto out_return_state;
-			}
+			update_open_stateflags(state, fmode);
 			spin_unlock(&state->owner->so_lock);
 			spin_unlock(&state->owner->so_lock);
+			goto out_return_state;
 		}
 		}
+		spin_unlock(&state->owner->so_lock);
 		rcu_read_lock();
 		rcu_read_lock();
 		delegation = rcu_dereference(nfsi->delegation);
 		delegation = rcu_dereference(nfsi->delegation);
 		if (!can_open_delegated(delegation, fmode)) {
 		if (!can_open_delegated(delegation, fmode)) {