diff options
| author | Takashi Iwai <tiwai@suse.de> | 2015-11-27 13:40:20 +0100 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2015-11-27 13:40:20 +0100 | 
| commit | 06a691e64b11323a735db3c3bd909d3c0712698f (patch) | |
| tree | e60b5a230fc2ea6e0f514d878d322a1f8e101c57 /fs/nfs/nfs42proc.c | |
| parent | 0c25ad80408e95e0a4fbaf0056950206e95f726f (diff) | |
| parent | 923f1cbf2e45f6292a01de959031a8efeabede78 (diff) | |
Merge tag 'asoc-fix-v4.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Fixes for v4.4
Quite a large batch of fixes have come in since the merge window, mainly
driver specific ones but there's a couple of core ones:
 - A fix for DAPM resume on active streams to ensure everything ends up
   cleanly in the right state.
 - Reset the DAPM cache when freeing widgets to fix a crash on driver
   remove and reload.
The PM functions for nau8825 are new code which fix crashes on resume.
Diffstat (limited to 'fs/nfs/nfs42proc.c')
| -rw-r--r-- | fs/nfs/nfs42proc.c | 71 | 
1 files changed, 71 insertions, 0 deletions
| diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 0f020e4d8421..3e92a3cde15d 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -271,3 +271,74 @@ int nfs42_proc_layoutstats_generic(struct nfs_server *server,  		return PTR_ERR(task);  	return 0;  } + +static int _nfs42_proc_clone(struct rpc_message *msg, struct file *src_f, +			     struct file *dst_f, loff_t src_offset, +			     loff_t dst_offset, loff_t count) +{ +	struct inode *src_inode = file_inode(src_f); +	struct inode *dst_inode = file_inode(dst_f); +	struct nfs_server *server = NFS_SERVER(dst_inode); +	struct nfs42_clone_args args = { +		.src_fh = NFS_FH(src_inode), +		.dst_fh = NFS_FH(dst_inode), +		.src_offset = src_offset, +		.dst_offset = dst_offset, +		.dst_bitmask = server->cache_consistency_bitmask, +	}; +	struct nfs42_clone_res res = { +		.server	= server, +	}; +	int status; + +	msg->rpc_argp = &args; +	msg->rpc_resp = &res; + +	status = nfs42_set_rw_stateid(&args.src_stateid, src_f, FMODE_READ); +	if (status) +		return status; + +	status = nfs42_set_rw_stateid(&args.dst_stateid, dst_f, FMODE_WRITE); +	if (status) +		return status; + +	res.dst_fattr = nfs_alloc_fattr(); +	if (!res.dst_fattr) +		return -ENOMEM; + +	status = nfs4_call_sync(server->client, server, msg, +				&args.seq_args, &res.seq_res, 0); +	if (status == 0) +		status = nfs_post_op_update_inode(dst_inode, res.dst_fattr); + +	kfree(res.dst_fattr); +	return status; +} + +int nfs42_proc_clone(struct file *src_f, struct file *dst_f, +		     loff_t src_offset, loff_t dst_offset, loff_t count) +{ +	struct rpc_message msg = { +		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLONE], +	}; +	struct inode *inode = file_inode(src_f); +	struct nfs_server *server = NFS_SERVER(file_inode(src_f)); +	struct nfs4_exception exception = { }; +	int err; + +	if (!nfs_server_capable(inode, NFS_CAP_CLONE)) +		return -EOPNOTSUPP; + +	do { +		err = _nfs42_proc_clone(&msg, src_f, dst_f, src_offset, +					dst_offset, count); +		if (err == -ENOTSUPP || err == -EOPNOTSUPP) { +			NFS_SERVER(inode)->caps &= ~NFS_CAP_CLONE; +			return -EOPNOTSUPP; +		} +		err = nfs4_handle_exception(server, err, &exception); +	} while (exception.retry); + +	return err; + +} | 
