NFSv4: Remove BUG_ON() and ACCESS_ONCE() calls in the idmapper

The use of ACCESS_ONCE() is wrong, since the various routines that set/clear
idmap->idmap_key_cons should be strictly ordered w.r.t. each other, and
the idmap->idmap_mutex ensures that only one thread at a time may be in
an upcall situation.

Also replace the BUG_ON()s with WARN_ON_ONCE() where appropriate.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c
index a850079..79f6424 100644
--- a/fs/nfs/idmap.c
+++ b/fs/nfs/idmap.c
@@ -465,8 +465,6 @@
 	struct rpc_pipe *pipe;
 	int error;
 
-	BUG_ON(clp->cl_idmap != NULL);
-
 	idmap = kzalloc(sizeof(*idmap), GFP_KERNEL);
 	if (idmap == NULL)
 		return -ENOMEM;
@@ -510,7 +508,6 @@
 
 	switch (event) {
 	case RPC_PIPEFS_MOUNT:
-		BUG_ON(clp->cl_rpcclient->cl_dentry == NULL);
 		err = __nfs_idmap_register(clp->cl_rpcclient->cl_dentry,
 						clp->cl_idmap,
 						clp->cl_idmap->idmap_pipe);
@@ -689,7 +686,11 @@
 	if (ret < 0)
 		goto out2;
 
-	BUG_ON(idmap->idmap_key_cons != NULL);
+	if (idmap->idmap_key_cons != NULL) {
+		WARN_ON_ONCE(1);
+		ret = -EAGAIN;
+		goto out2;
+	}
 	idmap->idmap_key_cons = cons;
 
 	ret = rpc_queue_upcall(idmap->idmap_pipe, msg);
@@ -746,7 +747,7 @@
 	 * will have been woken up and someone else may now have used
 	 * idmap_key_cons - so after this point we may no longer touch it.
 	 */
-	cons = ACCESS_ONCE(idmap->idmap_key_cons);
+	cons = idmap->idmap_key_cons;
 	idmap->idmap_key_cons = NULL;
 
 	if (mlen != sizeof(im)) {
@@ -790,7 +791,7 @@
 	struct idmap *idmap = data->idmap;
 	struct key_construction *cons;
 	if (msg->errno) {
-		cons = ACCESS_ONCE(idmap->idmap_key_cons);
+		cons = idmap->idmap_key_cons;
 		idmap->idmap_key_cons = NULL;
 		complete_request_key(cons, msg->errno);
 	}