Lines Matching refs:copy

58 		 "Enable inter server to server copy offload. Default: false");
408 * field isn't set for some reason, throw warning and just copy
966 * If we do a zero copy read, then a client will see read data
970 * To ensure proper ordering, we therefore turn off zero copy if
1287 static void nfs4_put_copy(struct nfsd4_copy *copy)
1289 if (!refcount_dec_and_test(&copy->refcount))
1291 kfree(copy->cp_src);
1292 kfree(copy);
1295 static void nfsd4_stop_copy(struct nfsd4_copy *copy)
1297 if (!test_and_set_bit(NFSD4_COPY_F_STOPPED, &copy->cp_flags))
1298 kthread_stop(copy->copy_task);
1299 nfs4_put_copy(copy);
1304 struct nfsd4_copy *copy = NULL;
1308 copy = list_first_entry(&clp->async_copies, struct nfsd4_copy,
1310 refcount_inc(&copy->refcount);
1313 return copy;
1318 struct nfsd4_copy *copy;
1320 while ((copy = nfsd4_get_copy(clp)) != NULL)
1321 nfsd4_stop_copy(copy);
1412 * Support one copy source server for now.
1517 struct nfsd4_copy *copy)
1520 stateid_t *s_stid = &copy->cp_src_stateid;
1525 &copy->cp_dst_stateid,
1526 WR_STATE, &copy->nf_dst, NULL);
1530 status = nfsd4_interssc_connect(copy->cp_src, rqstp, &copy->ss_nsui);
1536 copy->c_fh.size = s_fh->fh_handle.fh_size;
1537 memcpy(copy->c_fh.data, &s_fh->fh_handle.fh_raw, copy->c_fh.size);
1538 copy->stateid.seqid = cpu_to_be32(s_stid->si_generation);
1539 memcpy(copy->stateid.other, (void *)&s_stid->si_opaque,
1575 struct nfsd4_copy *copy)
1597 struct nfsd4_copy *copy)
1599 return nfsd4_verify_copy(rqstp, cstate, &copy->cp_src_stateid,
1600 &copy->nf_src, &copy->cp_dst_stateid,
1601 &copy->nf_dst);
1627 static void nfsd4_init_copy_res(struct nfsd4_copy *copy, bool sync)
1629 copy->cp_res.wr_stable_how =
1630 test_bit(NFSD4_COPY_F_COMMITTED, &copy->cp_flags) ?
1632 nfsd4_copy_set_sync(copy, sync);
1633 gen_boot_verifier(&copy->cp_res.wr_verifier, copy->cp_clp->net);
1636 static ssize_t _nfsd_copy_file_range(struct nfsd4_copy *copy,
1642 u64 bytes_total = copy->cp_count;
1643 u64 src_pos = copy->cp_src_pos;
1644 u64 dst_pos = copy->cp_dst_pos;
1660 copy->cp_res.wr_bytes_written += bytes_copied;
1663 } while (bytes_total > 0 && nfsd4_copy_is_async(copy));
1664 /* for a non-zero asynchronous copy do a commit of data */
1665 if (nfsd4_copy_is_async(copy) && copy->cp_res.wr_bytes_written > 0) {
1667 end = copy->cp_dst_pos + copy->cp_res.wr_bytes_written - 1;
1668 status = vfs_fsync_range(dst, copy->cp_dst_pos, end, 0);
1672 set_bit(NFSD4_COPY_F_COMMITTED, &copy->cp_flags);
1677 static __be32 nfsd4_do_copy(struct nfsd4_copy *copy,
1684 bytes = _nfsd_copy_file_range(copy, dst, src);
1686 /* for async copy, we ignore the error, client can always retry
1689 if (bytes < 0 && !copy->cp_res.wr_bytes_written)
1692 nfsd4_init_copy_res(copy, sync);
1719 static void release_copy_files(struct nfsd4_copy *copy)
1721 if (copy->nf_src)
1722 nfsd_file_put(copy->nf_src);
1723 if (copy->nf_dst)
1724 nfsd_file_put(copy->nf_dst);
1727 static void cleanup_async_copy(struct nfsd4_copy *copy)
1729 nfs4_free_copy_state(copy);
1730 release_copy_files(copy);
1731 if (copy->cp_clp) {
1732 spin_lock(&copy->cp_clp->async_lock);
1733 if (!list_empty(&copy->copies))
1734 list_del_init(&copy->copies);
1735 spin_unlock(&copy->cp_clp->async_lock);
1737 nfs4_put_copy(copy);
1740 static void nfsd4_send_cb_offload(struct nfsd4_copy *copy, __be32 nfserr)
1748 memcpy(&cbo->co_res, &copy->cp_res, sizeof(copy->cp_res));
1749 memcpy(&cbo->co_fh, &copy->fh, sizeof(copy->fh));
1752 nfsd4_init_cb(&cbo->co_cb, copy->cp_clp, &nfsd4_cb_offload_ops,
1754 trace_nfsd_cb_offload(copy->cp_clp, &cbo->co_res.cb_stateid,
1755 &cbo->co_fh, copy->cp_count, nfserr);
1768 struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
1771 trace_nfsd_copy_do_async(copy);
1772 if (nfsd4_ssc_is_inter(copy)) {
1775 filp = nfs42_ssc_open(copy->ss_nsui->nsui_vfsmount,
1776 &copy->c_fh, &copy->stateid);
1788 nfserr = nfsd4_do_copy(copy, filp, copy->nf_dst->nf_file,
1790 nfsd4_cleanup_inter_ssc(copy->ss_nsui, filp, copy->nf_dst);
1792 nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
1793 copy->nf_dst->nf_file, false);
1797 nfsd4_send_cb_offload(copy, nfserr);
1798 cleanup_async_copy(copy);
1806 struct nfsd4_copy *copy = &u->copy;
1810 copy->cp_clp = cstate->clp;
1811 if (nfsd4_ssc_is_inter(copy)) {
1812 trace_nfsd_copy_inter(copy);
1813 if (!inter_copy_offload_enable || nfsd4_copy_is_sync(copy)) {
1817 status = nfsd4_setup_inter_ssc(rqstp, cstate, copy);
1819 trace_nfsd_copy_done(copy, status);
1823 trace_nfsd_copy_intra(copy);
1824 status = nfsd4_setup_intra_ssc(rqstp, cstate, copy);
1826 trace_nfsd_copy_done(copy, status);
1831 memcpy(&copy->fh, &cstate->current_fh.fh_handle,
1833 if (nfsd4_copy_is_async(copy)) {
1845 if (!nfs4_init_copy_state(nn, copy))
1847 memcpy(&copy->cp_res.cb_stateid, &copy->cp_stateid.cs_stid,
1848 sizeof(copy->cp_res.cb_stateid));
1849 dup_copy_fields(copy, async_copy);
1851 async_copy, "%s", "copy thread");
1861 status = nfsd4_do_copy(copy, copy->nf_src->nf_file,
1862 copy->nf_dst->nf_file, true);
1865 trace_nfsd_copy_done(copy, status);
1866 release_copy_files(copy);
1869 if (nfsd4_ssc_is_inter(copy)) {
1871 * Source's vfsmount of inter-copy will be unmounted
1872 * by the laundromat. Use copy instead of async_copy
1875 refcount_dec(&copy->ss_nsui->nsui_refcnt);
1886 struct nfsd4_copy *copy;
1890 list_for_each_entry(copy, &clp->async_copies, copies) {
1891 if (memcmp(&copy->cp_stateid.cs_stid, stateid, NFS4_STATEID_SIZE))
1893 return copy;
1901 struct nfsd4_copy *copy;
1904 copy = find_async_copy_locked(clp, stateid);
1905 if (copy)
1906 refcount_inc(&copy->refcount);
1908 return copy;
1917 struct nfsd4_copy *copy;
1920 copy = find_async_copy(clp, &os->stateid);
1921 if (!copy) {
1926 nfsd4_stop_copy(copy);
2003 struct nfsd4_copy *copy;
2007 copy = find_async_copy_locked(clp, &os->stateid);
2008 if (copy)
2009 os->count = copy->cp_res.wr_bytes_written;
2461 * Get the entire list, then copy out only the user attributes
2594 struct nfsd4_copy *copy;
2610 copy = (struct nfsd4_copy *)&op->u;
2616 if (nfsd4_ssc_is_inter(copy))