NFSD: Remove kmalloc from nfsd4_do_async_copy()
[ Upstream commit ad1e46c9b07b13659635ee5405f83ad0df143116 ] Instead of manufacturing a phony struct nfsd_file, pass the struct file returned by nfs42_ssc_open() directly to nfsd4_do_copy(). [ cel: adjusted to apply to v5.10.y ] Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
a860bd179e
commit
d87486acbd
@@ -1753,29 +1753,31 @@ static void cleanup_async_copy(struct nfsd4_copy *copy)
|
|||||||
nfs4_put_copy(copy);
|
nfs4_put_copy(copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_do_async_copy - kthread function for background server-side COPY
|
||||||
|
* @data: arguments for COPY operation
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %0: Copy operation is done.
|
||||||
|
*/
|
||||||
static int nfsd4_do_async_copy(void *data)
|
static int nfsd4_do_async_copy(void *data)
|
||||||
{
|
{
|
||||||
struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
|
struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
|
||||||
struct nfsd4_copy *cb_copy;
|
struct nfsd4_copy *cb_copy;
|
||||||
|
|
||||||
if (nfsd4_ssc_is_inter(copy)) {
|
if (nfsd4_ssc_is_inter(copy)) {
|
||||||
copy->nf_src = kzalloc(sizeof(struct nfsd_file), GFP_KERNEL);
|
struct file *filp;
|
||||||
if (!copy->nf_src) {
|
|
||||||
copy->nfserr = nfserr_serverfault;
|
filp = nfs42_ssc_open(copy->ss_mnt, ©->c_fh,
|
||||||
/* ss_mnt will be unmounted by the laundromat */
|
©->stateid);
|
||||||
goto do_callback;
|
if (IS_ERR(filp)) {
|
||||||
}
|
|
||||||
copy->nf_src->nf_file = nfs42_ssc_open(copy->ss_mnt, ©->c_fh,
|
|
||||||
©->stateid);
|
|
||||||
if (IS_ERR(copy->nf_src->nf_file)) {
|
|
||||||
copy->nfserr = nfserr_offload_denied;
|
copy->nfserr = nfserr_offload_denied;
|
||||||
/* ss_mnt will be unmounted by the laundromat */
|
/* ss_mnt will be unmounted by the laundromat */
|
||||||
goto do_callback;
|
goto do_callback;
|
||||||
}
|
}
|
||||||
copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
|
copy->nfserr = nfsd4_do_copy(copy, filp,
|
||||||
copy->nf_dst->nf_file, false);
|
copy->nf_dst->nf_file, false);
|
||||||
nfsd4_cleanup_inter_ssc(copy->ss_mnt, copy->nf_src->nf_file,
|
nfsd4_cleanup_inter_ssc(copy->ss_mnt, filp, copy->nf_dst);
|
||||||
copy->nf_dst);
|
|
||||||
} else {
|
} else {
|
||||||
copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
|
copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
|
||||||
copy->nf_dst->nf_file, false);
|
copy->nf_dst->nf_file, false);
|
||||||
@@ -1797,8 +1799,6 @@ do_callback:
|
|||||||
©->fh, copy->cp_count, copy->nfserr);
|
©->fh, copy->cp_count, copy->nfserr);
|
||||||
nfsd4_run_cb(&cb_copy->cp_cb);
|
nfsd4_run_cb(&cb_copy->cp_cb);
|
||||||
out:
|
out:
|
||||||
if (nfsd4_ssc_is_inter(copy))
|
|
||||||
kfree(copy->nf_src);
|
|
||||||
cleanup_async_copy(copy);
|
cleanup_async_copy(copy);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user