Commit e72f9bc0 authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Add nfsd4_send_cb_offload()



Refactor for legibility.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent ad1e46c9
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -1763,6 +1763,27 @@ static void cleanup_async_copy(struct nfsd4_copy *copy)
	nfs4_put_copy(copy);
}

static void nfsd4_send_cb_offload(struct nfsd4_copy *copy)
{
	struct nfsd4_copy *cb_copy;

	cb_copy = kzalloc(sizeof(struct nfsd4_copy), GFP_KERNEL);
	if (!cb_copy)
		return;

	refcount_set(&cb_copy->refcount, 1);
	memcpy(&cb_copy->cp_res, &copy->cp_res, sizeof(copy->cp_res));
	cb_copy->cp_clp = copy->cp_clp;
	cb_copy->nfserr = copy->nfserr;
	memcpy(&cb_copy->fh, &copy->fh, sizeof(copy->fh));

	nfsd4_init_cb(&cb_copy->cp_cb, cb_copy->cp_clp,
			&nfsd4_cb_offload_ops, NFSPROC4_CLNT_CB_OFFLOAD);
	trace_nfsd_cb_offload(copy->cp_clp, &copy->cp_res.cb_stateid,
			      &copy->fh, copy->cp_count, copy->nfserr);
	nfsd4_run_cb(&cb_copy->cp_cb);
}

/**
 * nfsd4_do_async_copy - kthread function for background server-side COPY
 * @data: arguments for COPY operation
@@ -1773,7 +1794,6 @@ static void cleanup_async_copy(struct nfsd4_copy *copy)
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)) {
		struct file *filp;
@@ -1795,20 +1815,7 @@ static int nfsd4_do_async_copy(void *data)
	}

do_callback:
	cb_copy = kzalloc(sizeof(struct nfsd4_copy), GFP_KERNEL);
	if (!cb_copy)
		goto out;
	refcount_set(&cb_copy->refcount, 1);
	memcpy(&cb_copy->cp_res, &copy->cp_res, sizeof(copy->cp_res));
	cb_copy->cp_clp = copy->cp_clp;
	cb_copy->nfserr = copy->nfserr;
	memcpy(&cb_copy->fh, &copy->fh, sizeof(copy->fh));
	nfsd4_init_cb(&cb_copy->cp_cb, cb_copy->cp_clp,
			&nfsd4_cb_offload_ops, NFSPROC4_CLNT_CB_OFFLOAD);
	trace_nfsd_cb_offload(copy->cp_clp, &copy->cp_res.cb_stateid,
			      &copy->fh, copy->cp_count, copy->nfserr);
	nfsd4_run_cb(&cb_copy->cp_cb);
out:
	nfsd4_send_cb_offload(copy);
	cleanup_async_copy(copy);
	return 0;
}