[PATCH 0/7] NFSv4.2: Add support for the COPY operation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



These patches add client and server support for the NFS v4.2 COPY operation.
Unlike the similar CLONE operation, COPY can support both acceleration through
and reflink and a full copy of data from one file into another.  These patches
make use of Zach Brown's vfs_copy_file_range() syscall, and the first three
patches in this series are simply a reposting of the patches that add the
syscall.

Patch 4 expands vfs_copy_file_range() to fall back on the splice interface for
copies where the filesystem does not support copy accelerations.  This behavior
is useful for NFSD, since we'll still want to copy the file even if we can't
do a reflink.  Additionally, this opens up the possibility of in-kernel copies
for all filesystems without needing to do frequent switches between kernel and
user space.  The only potential drawback I've noticed is that splice will write
out data in PAGE_SIZE chunks, even if wsize > PAGE_SIZE.  This leads to a few
more writes over the wire, but I have not noticed a significant timing
difference.  Still, I wonder if there is a better way to optimize this for NFS.

The remaining patches implement the COPY operation for both the client and the
server.  The program I used for testing is included as an RFC as the last patch
in the series.  I gathered performance information by comparing the runtime and
RPC count of this program against /usr/bin/cp for various file sizes.

/usr/bin/cp:
                      size:    513MB   1024MB   1536MB   2048MB
------------- ------------- -------- -------- -------- --------
nfs v4 client        total:     8203    16396    24588    32780
------------- ------------- -------- -------- -------- --------
nfs v4 client         read:     4096     8192    12288    16384
nfs v4 client        write:     4096     8192    12288    16384
nfs v4 client       commit:        1        1        1        1
nfs v4 client         open:        1        1        1        1
nfs v4 client    open_noat:        2        2        2        2
nfs v4 client        close:        1        1        1        1
nfs v4 client      setattr:        2        2        2        2
nfs v4 client       access:        2        3        3        3
nfs v4 client      getattr:        2        2        2        2

/usr/bin/cp /nfs/test-512  /nfs/test-copy  0.00s user 0.32s system 14% cpu 2.209 total
/usr/bin/cp /nfs/test-1024 /nfs/test-copy  0.00s user 0.66s system 18% cpu 3.651 total
/usr/bin/cp /nfs/test-1536 /nfs/test-copy  0.02s user 0.97s system 18% cpu 5.477 total
/usr/bin/cp /nfs/test-2048 /nfs/test-copy  0.00s user 1.38s system 15% cpu 9.085 total


Copy system call:
                      size:    512MB   1024MB   1536MB   2048MB
------------- ------------- -------- -------- -------- --------
nfs v4 client        total:        6        6        6        6
------------- ------------- -------- -------- -------- --------
nfs v4 client         open:        2        2        2        2
nfs v4 client        close:        2        2        2        2
nfs v4 client       access:        1        1        1        1
nfs v4 client         copy:        1        1        1        1


./nfscopy /nfs/test-512  /nfs/test-copy  0.00s user 0.00s system 0% cpu 1.148 total
./nfscopy /nfs/test-1024 /nfs/test-copy  0.00s user 0.00s system 0% cpu 2.293 total
./nfscopy /nfs/test-1536 /nfs/test-copy  0.00s user 0.00s system 0% cpu 3.037 total
./nfscopy /nfs/test-2048 /nfs/test-copy  0.00s user 0.00s system 0% cpu 4.045 total


Questions, comments, and other testing ideas would be greatly appreciated!

Thanks,
Anna


Anna Schumaker (4):
  VFS: Fall back on splice if no copy function defined
  nfsd: Pass filehandle to nfs4_preprocess_stateid_op()
  NFSD: Implement the COPY call
  NFS: Add COPY nfs operation

Zach Brown (3):
  vfs: add copy_file_range syscall and vfs helper
  x86: add sys_copy_file_range to syscall tables
  btrfs: add .copy_file_range file operation

 arch/x86/entry/syscalls/syscall_32.tbl |   1 +
 arch/x86/entry/syscalls/syscall_64.tbl |   1 +
 fs/btrfs/ctree.h                       |   3 +
 fs/btrfs/file.c                        |   1 +
 fs/btrfs/ioctl.c                       |  91 ++++++++++++----------
 fs/nfs/nfs42.h                         |   1 +
 fs/nfs/nfs42proc.c                     |  40 ++++++++++
 fs/nfs/nfs42xdr.c                      | 136 +++++++++++++++++++++++++++++++++
 fs/nfs/nfs4file.c                      |   8 ++
 fs/nfs/nfs4proc.c                      |   1 +
 fs/nfs/nfs4xdr.c                       |   1 +
 fs/nfsd/nfs4proc.c                     |  79 +++++++++++++++++--
 fs/nfsd/nfs4state.c                    |   5 +-
 fs/nfsd/nfs4xdr.c                      |  62 ++++++++++++++-
 fs/nfsd/state.h                        |   4 +-
 fs/nfsd/vfs.c                          |  13 ++++
 fs/nfsd/vfs.h                          |   1 +
 fs/nfsd/xdr4.h                         |  23 ++++++
 fs/read_write.c                        | 133 ++++++++++++++++++++++++++++++++
 include/linux/fs.h                     |   3 +
 include/linux/nfs4.h                   |   1 +
 include/linux/nfs_fs_sb.h              |   1 +
 include/linux/nfs_xdr.h                |  27 +++++++
 include/uapi/asm-generic/unistd.h      |   4 +-
 kernel/sys_ni.c                        |   1 +
 25 files changed, 587 insertions(+), 54 deletions(-)

-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux