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, ©->cp_res, sizeof(copy->cp_res));
+       cb_copy->cp_clp = copy->cp_clp;
+       cb_copy->nfserr = copy->nfserr;
+       memcpy(&cb_copy->fh, ©->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, ©->cp_res.cb_stateid,
+                             ©->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
 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;
        }
 
 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, ©->cp_res, sizeof(copy->cp_res));
-       cb_copy->cp_clp = copy->cp_clp;
-       cb_copy->nfserr = copy->nfserr;
-       memcpy(&cb_copy->fh, ©->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, ©->cp_res.cb_stateid,
-                             ©->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;
 }