diff options
Diffstat (limited to 'fs/nfs/pnfs.c')
| -rw-r--r-- | fs/nfs/pnfs.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index b8323aa7b54..bbc49caa7a8 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -70,6 +70,10 @@ find_pnfs_driver(u32 id)  	spin_lock(&pnfs_spinlock);  	local = find_pnfs_driver_locked(id); +	if (local != NULL && !try_module_get(local->owner)) { +		dprintk("%s: Could not grab reference on module\n", __func__); +		local = NULL; +	}  	spin_unlock(&pnfs_spinlock);  	return local;  } @@ -80,6 +84,9 @@ unset_pnfs_layoutdriver(struct nfs_server *nfss)  	if (nfss->pnfs_curr_ld) {  		if (nfss->pnfs_curr_ld->clear_layoutdriver)  			nfss->pnfs_curr_ld->clear_layoutdriver(nfss); +		/* Decrement the MDS count. Purge the deviceid cache if zero */ +		if (atomic_dec_and_test(&nfss->nfs_client->cl_mds_count)) +			nfs4_deviceid_purge_client(nfss->nfs_client);  		module_put(nfss->pnfs_curr_ld->owner);  	}  	nfss->pnfs_curr_ld = NULL; @@ -115,10 +122,6 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,  			goto out_no_driver;  		}  	} -	if (!try_module_get(ld_type->owner)) { -		dprintk("%s: Could not grab reference on module\n", __func__); -		goto out_no_driver; -	}  	server->pnfs_curr_ld = ld_type;  	if (ld_type->set_layoutdriver  	    && ld_type->set_layoutdriver(server, mntfh)) { @@ -127,6 +130,8 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,  		module_put(ld_type->owner);  		goto out_no_driver;  	} +	/* Bump the MDS count */ +	atomic_inc(&server->nfs_client->cl_mds_count);  	dprintk("%s: pNFS module for %u set\n", __func__, id);  	return;  |