diff options
| author | Marc Eshel <eshel@almaden.ibm.com> | 2011-05-22 19:47:09 +0300 | 
|---|---|---|
| committer | Boaz Harrosh <bharrosh@panasas.com> | 2011-05-29 20:52:31 +0300 | 
| commit | 1be5683b03a766670b3b629bf6bfeab3ca9239d8 (patch) | |
| tree | 613f4c0dea8b0d8447a3158b82b3e2046ee9dcb5 /fs/nfs/callback_proc.c | |
| parent | 1775bc342c6eacd6304493cbb2e0cda1a0182246 (diff) | |
| download | olio-linux-3.10-1be5683b03a766670b3b629bf6bfeab3ca9239d8.tar.xz olio-linux-3.10-1be5683b03a766670b3b629bf6bfeab3ca9239d8.zip  | |
pnfs: CB_NOTIFY_DEVICEID
Note: This functionlaity is incomplete as all layout segments referring to
the 'to be removed device id' need to be reaped, and all in flight I/O drained.
[use be32 res in nfs4_callback_devicenotify]
[use nfs_client to qualify deviceid for cb_notify_deviceid]
[use global deviceid cache for CB_NOTIFY_DEVICEID]
[refactor device cache _lookup_deviceid]
[refactor device cache _find_get_deviceid]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[Bug in new global-device-cache code]
[layout_driver MUST set free_deviceid_node if using dev-cache]
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Diffstat (limited to 'fs/nfs/callback_proc.c')
| -rw-r--r-- | fs/nfs/callback_proc.c | 47 | 
1 files changed, 47 insertions, 0 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 2f41dccea18..fb5e5b9a97a 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c @@ -241,6 +241,53 @@ static void pnfs_recall_all_layouts(struct nfs_client *clp)  	do_callback_layoutrecall(clp, &args);  } +__be32 nfs4_callback_devicenotify(struct cb_devicenotifyargs *args, +				  void *dummy, struct cb_process_state *cps) +{ +	int i; +	__be32 res = 0; +	struct nfs_client *clp = cps->clp; +	struct nfs_server *server = NULL; + +	dprintk("%s: -->\n", __func__); + +	if (!clp) { +		res = cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION); +		goto out; +	} + +	for (i = 0; i < args->ndevs; i++) { +		struct cb_devicenotifyitem *dev = &args->devs[i]; + +		if (!server || +		    server->pnfs_curr_ld->id != dev->cbd_layout_type) { +			rcu_read_lock(); +			list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) +				if (server->pnfs_curr_ld && +				    server->pnfs_curr_ld->id == dev->cbd_layout_type) { +					rcu_read_unlock(); +					goto found; +				} +			rcu_read_unlock(); +			dprintk("%s: layout type %u not found\n", +				__func__, dev->cbd_layout_type); +			continue; +		} + +	found: +		if (dev->cbd_notify_type == NOTIFY_DEVICEID4_CHANGE) +			dprintk("%s: NOTIFY_DEVICEID4_CHANGE not supported, " +				"deleting instead\n", __func__); +		nfs4_delete_deviceid(clp, &dev->cbd_dev_id); +	} + +out: +	kfree(args->devs); +	dprintk("%s: exit with status = %u\n", +		__func__, be32_to_cpu(res)); +	return res; +} +  int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const nfs4_stateid *stateid)  {  	if (delegation == NULL)  |