• Luis Henriques's avatar
    ceph: re-org copy_file_range and fix some error paths · 1b0c3b9f
    Luis Henriques authored
    This patch re-organizes copy_file_range, trying to fix a few issues in the
    error handling.  Here's the summary:
    
    - Abort copy if initial do_splice_direct() returns fewer bytes than
      requested.
    
    - Move the 'size' initialization (with i_size_read()) further down in the
      code, after the initial call to do_splice_direct().  This avoids issues
      with a possibly stale value if a manual copy is done.
    
    - Move the object copy loop into a separate function.  This makes it
      easier to handle errors (e.g, dirtying caps and updating the MDS
      metadata if only some objects have been copied before an error has
      occurred).
    
    - Added calls to ceph_oloc_destroy() to avoid leaking memory with src_oloc
      and dst_oloc
    
    - After the object copy loop, the new file size to be reported to the MDS
      (if there's file size change) is now the actual file size, and not the
      size after an eventual extra manual copy.
    
    - Added a few dout() to show the number of bytes copied in the two manual
      copies and in the object copy loop.
    Signed-off-by: default avatarLuis Henriques <lhenriques@suse.com>
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    1b0c3b9f
file.c 57.3 KB