瀏覽代碼

nfsd4: probe callback channel only once

Our callback code doesn't actually handle concurrent attempts to probe
the callback channel.  Some rethinking of the locking may be required.
However, we can also just move the callback probing to this case.  Since
this is the only time a client is "confirmed" (and since that can only
happen once in the lifetime of a client), this ensures we only probe
once.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
J. Bruce Fields 17 年之前
父節點
當前提交
46f8a64bae
共有 2 個文件被更改,包括 2 次插入4 次删除
  1. 1 2
      fs/nfsd/nfs4callback.c
  2. 1 2
      fs/nfsd/nfs4state.c

+ 1 - 2
fs/nfsd/nfs4callback.c

@@ -395,8 +395,7 @@ nfsd4_probe_callback(struct nfs4_client *clp)
 	};
 	};
 	struct task_struct *t;
 	struct task_struct *t;
 
 
-	if (atomic_read(&cb->cb_set))
-		return;
+	BUG_ON(atomic_read(&clp->cl_callback.cb_set));
 
 
 	/* Initialize address */
 	/* Initialize address */
 	memset(&addr, 0, sizeof(addr));
 	memset(&addr, 0, sizeof(addr));

+ 1 - 2
fs/nfsd/nfs4state.c

@@ -948,6 +948,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
 			}
 			}
 			move_to_confirmed(unconf);
 			move_to_confirmed(unconf);
 			conf = unconf;
 			conf = unconf;
+			nfsd4_probe_callback(conf);
 			status = nfs_ok;
 			status = nfs_ok;
 		}
 		}
 	} else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm)))
 	} else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm)))
@@ -965,8 +966,6 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
 		status = nfserr_clid_inuse;
 		status = nfserr_clid_inuse;
 	}
 	}
 out:
 out:
-	if (!status)
-		nfsd4_probe_callback(conf);
 	nfs4_unlock_state();
 	nfs4_unlock_state();
 	return status;
 	return status;
 }
 }