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>
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user