diff options
Diffstat (limited to 'fs/nfs/callback_proc.c')
| -rw-r--r-- | fs/nfs/callback_proc.c | 51 | 
1 files changed, 49 insertions, 2 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 2f41dccea18e..d4d1954e9bb9 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c @@ -139,7 +139,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,  	spin_lock(&ino->i_lock);  	if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||  	    mark_matching_lsegs_invalid(lo, &free_me_list, -					args->cbl_range.iomode)) +					&args->cbl_range))  		rv = NFS4ERR_DELAY;  	else  		rv = NFS4ERR_NOMATCHING_LAYOUT; @@ -184,7 +184,7 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,  		ino = lo->plh_inode;  		spin_lock(&ino->i_lock);  		set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags); -		if (mark_matching_lsegs_invalid(lo, &free_me_list, range.iomode)) +		if (mark_matching_lsegs_invalid(lo, &free_me_list, &range))  			rv = NFS4ERR_DELAY;  		list_del_init(&lo->plh_bulk_recall);  		spin_unlock(&ino->i_lock); @@ -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(server->pnfs_curr_ld, 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)  | 
