NFSD: Remove kmalloc from nfsd4_do_async_copy()
Instead of manufacturing a phony struct nfsd_file, pass the struct file returned by nfs42_ssc_open() directly to nfsd4_do_copy(). Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Родитель
3b7bf5933c
Коммит
ad1e46c9b0
|
@ -1763,29 +1763,31 @@ static void cleanup_async_copy(struct nfsd4_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)
|
||||
{
|
||||
struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
|
||||
struct nfsd4_copy *cb_copy;
|
||||
|
||||
if (nfsd4_ssc_is_inter(copy)) {
|
||||
copy->nf_src = kzalloc(sizeof(struct nfsd_file), GFP_KERNEL);
|
||||
if (!copy->nf_src) {
|
||||
copy->nfserr = nfserr_serverfault;
|
||||
nfsd4_interssc_disconnect(copy->ss_mnt);
|
||||
goto do_callback;
|
||||
}
|
||||
copy->nf_src->nf_file = nfs42_ssc_open(copy->ss_mnt, ©->c_fh,
|
||||
©->stateid);
|
||||
if (IS_ERR(copy->nf_src->nf_file)) {
|
||||
struct file *filp;
|
||||
|
||||
filp = nfs42_ssc_open(copy->ss_mnt, ©->c_fh,
|
||||
©->stateid);
|
||||
if (IS_ERR(filp)) {
|
||||
copy->nfserr = nfserr_offload_denied;
|
||||
nfsd4_interssc_disconnect(copy->ss_mnt);
|
||||
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);
|
||||
nfsd4_cleanup_inter_ssc(copy->ss_mnt, copy->nf_src->nf_file,
|
||||
copy->nf_dst);
|
||||
nfsd4_cleanup_inter_ssc(copy->ss_mnt, filp, copy->nf_dst);
|
||||
} else {
|
||||
copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
|
||||
copy->nf_dst->nf_file, false);
|
||||
|
@ -1807,8 +1809,6 @@ do_callback:
|
|||
©->fh, copy->cp_count, copy->nfserr);
|
||||
nfsd4_run_cb(&cb_copy->cp_cb);
|
||||
out:
|
||||
if (nfsd4_ssc_is_inter(copy))
|
||||
kfree(copy->nf_src);
|
||||
cleanup_async_copy(copy);
|
||||
return 0;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче