SMB3: Rename clone_range to copychunk_range

Server side copy is one of the most important mechanisms smb2/smb3
supports and it was unintentionally disabled for most use cases.

Renaming calls to reflect the underlying smb2 ioctl called. This is
similar to the name duplicate_extents used for a similar ioctl which is
also used to duplicate files by reusing fs blocks. The name change is to
avoid confusion.

Signed-off-by: Sachin Prabhu <sprabhu@redhat.com>
CC: Stable <stable@vger.kernel.org>
Signed-off-by: Steve French <smfrench@gmail.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>

authored by Sachin Prabhu and committed by Steve French 312bbc59 38bd4906

+16 -15
+2 -1
fs/cifs/cifsglob.h
··· 408 char * (*create_lease_buf)(u8 *, u8); 409 /* parse lease context buffer and return oplock/epoch info */ 410 __u8 (*parse_lease_buf)(void *, unsigned int *); 411 - int (*clone_range)(const unsigned int, struct cifsFileInfo *src_file, 412 struct cifsFileInfo *target_file, u64 src_off, u64 len, 413 u64 dest_off); 414 int (*duplicate_extents)(const unsigned int, struct cifsFileInfo *src,
··· 408 char * (*create_lease_buf)(u8 *, u8); 409 /* parse lease context buffer and return oplock/epoch info */ 410 __u8 (*parse_lease_buf)(void *, unsigned int *); 411 + int (*copychunk_range)(const unsigned int, 412 + struct cifsFileInfo *src_file, 413 struct cifsFileInfo *target_file, u64 src_off, u64 len, 414 u64 dest_off); 415 int (*duplicate_extents)(const unsigned int, struct cifsFileInfo *src,
+8 -8
fs/cifs/ioctl.c
··· 34 #include "cifs_ioctl.h" 35 #include <linux/btrfs.h> 36 37 - static int cifs_file_clone_range(unsigned int xid, struct file *src_file, 38 struct file *dst_file) 39 { 40 struct inode *src_inode = file_inode(src_file); ··· 45 struct cifs_tcon *target_tcon; 46 int rc; 47 48 - cifs_dbg(FYI, "ioctl clone range\n"); 49 50 if (!src_file->private_data || !dst_file->private_data) { 51 rc = -EBADF; ··· 75 /* should we flush first and last page first */ 76 truncate_inode_pages(&target_inode->i_data, 0); 77 78 - if (target_tcon->ses->server->ops->clone_range) 79 - rc = target_tcon->ses->server->ops->clone_range(xid, 80 smb_file_src, smb_file_target, 0, src_inode->i_size, 0); 81 else 82 rc = -EOPNOTSUPP; ··· 91 return rc; 92 } 93 94 - static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file, 95 unsigned long srcfd) 96 { 97 int rc; 98 struct fd src_file; 99 struct inode *src_inode; 100 101 - cifs_dbg(FYI, "ioctl clone range\n"); 102 /* the destination must be opened for writing */ 103 if (!(dst_file->f_mode & FMODE_WRITE)) { 104 cifs_dbg(FYI, "file target not open for write\n"); ··· 129 if (S_ISDIR(src_inode->i_mode)) 130 goto out_fput; 131 132 - rc = cifs_file_clone_range(xid, src_file.file, dst_file); 133 134 out_fput: 135 fdput(src_file); ··· 251 } 252 break; 253 case CIFS_IOC_COPYCHUNK_FILE: 254 - rc = cifs_ioctl_clone(xid, filep, arg); 255 break; 256 case CIFS_IOC_SET_INTEGRITY: 257 if (pSMBFile == NULL)
··· 34 #include "cifs_ioctl.h" 35 #include <linux/btrfs.h> 36 37 + static int cifs_file_copychunk_range(unsigned int xid, struct file *src_file, 38 struct file *dst_file) 39 { 40 struct inode *src_inode = file_inode(src_file); ··· 45 struct cifs_tcon *target_tcon; 46 int rc; 47 48 + cifs_dbg(FYI, "ioctl copychunk range\n"); 49 50 if (!src_file->private_data || !dst_file->private_data) { 51 rc = -EBADF; ··· 75 /* should we flush first and last page first */ 76 truncate_inode_pages(&target_inode->i_data, 0); 77 78 + if (target_tcon->ses->server->ops->copychunk_range) 79 + rc = target_tcon->ses->server->ops->copychunk_range(xid, 80 smb_file_src, smb_file_target, 0, src_inode->i_size, 0); 81 else 82 rc = -EOPNOTSUPP; ··· 91 return rc; 92 } 93 94 + static long cifs_ioctl_copychunk(unsigned int xid, struct file *dst_file, 95 unsigned long srcfd) 96 { 97 int rc; 98 struct fd src_file; 99 struct inode *src_inode; 100 101 + cifs_dbg(FYI, "ioctl copychunk range\n"); 102 /* the destination must be opened for writing */ 103 if (!(dst_file->f_mode & FMODE_WRITE)) { 104 cifs_dbg(FYI, "file target not open for write\n"); ··· 129 if (S_ISDIR(src_inode->i_mode)) 130 goto out_fput; 131 132 + rc = cifs_file_copychunk_range(xid, src_file.file, dst_file); 133 134 out_fput: 135 fdput(src_file); ··· 251 } 252 break; 253 case CIFS_IOC_COPYCHUNK_FILE: 254 + rc = cifs_ioctl_copychunk(xid, filep, arg); 255 break; 256 case CIFS_IOC_SET_INTEGRITY: 257 if (pSMBFile == NULL)
+6 -6
fs/cifs/smb2ops.c
··· 593 } 594 595 static int 596 - smb2_clone_range(const unsigned int xid, 597 struct cifsFileInfo *srcfile, 598 struct cifsFileInfo *trgtfile, u64 src_off, 599 u64 len, u64 dest_off) ··· 611 if (pcchunk == NULL) 612 return -ENOMEM; 613 614 - cifs_dbg(FYI, "in smb2_clone_range - about to call request res key\n"); 615 /* Request a key from the server to identify the source of the copy */ 616 rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink), 617 srcfile->fid.persistent_fid, ··· 2378 .set_oplock_level = smb2_set_oplock_level, 2379 .create_lease_buf = smb2_create_lease_buf, 2380 .parse_lease_buf = smb2_parse_lease_buf, 2381 - .clone_range = smb2_clone_range, 2382 .wp_retry_size = smb2_wp_retry_size, 2383 .dir_needs_close = smb2_dir_needs_close, 2384 .get_dfs_refer = smb2_get_dfs_refer, ··· 2461 .set_oplock_level = smb21_set_oplock_level, 2462 .create_lease_buf = smb2_create_lease_buf, 2463 .parse_lease_buf = smb2_parse_lease_buf, 2464 - .clone_range = smb2_clone_range, 2465 .wp_retry_size = smb2_wp_retry_size, 2466 .dir_needs_close = smb2_dir_needs_close, 2467 .enum_snapshots = smb3_enum_snapshots, ··· 2548 .set_oplock_level = smb3_set_oplock_level, 2549 .create_lease_buf = smb3_create_lease_buf, 2550 .parse_lease_buf = smb3_parse_lease_buf, 2551 - .clone_range = smb2_clone_range, 2552 .duplicate_extents = smb2_duplicate_extents, 2553 .validate_negotiate = smb3_validate_negotiate, 2554 .wp_retry_size = smb2_wp_retry_size, ··· 2643 .set_oplock_level = smb3_set_oplock_level, 2644 .create_lease_buf = smb3_create_lease_buf, 2645 .parse_lease_buf = smb3_parse_lease_buf, 2646 - .clone_range = smb2_clone_range, 2647 .duplicate_extents = smb2_duplicate_extents, 2648 /* .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */ 2649 .wp_retry_size = smb2_wp_retry_size,
··· 593 } 594 595 static int 596 + smb2_copychunk_range(const unsigned int xid, 597 struct cifsFileInfo *srcfile, 598 struct cifsFileInfo *trgtfile, u64 src_off, 599 u64 len, u64 dest_off) ··· 611 if (pcchunk == NULL) 612 return -ENOMEM; 613 614 + cifs_dbg(FYI, "in smb2_copychunk_range - about to call request res key\n"); 615 /* Request a key from the server to identify the source of the copy */ 616 rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink), 617 srcfile->fid.persistent_fid, ··· 2378 .set_oplock_level = smb2_set_oplock_level, 2379 .create_lease_buf = smb2_create_lease_buf, 2380 .parse_lease_buf = smb2_parse_lease_buf, 2381 + .copychunk_range = smb2_copychunk_range, 2382 .wp_retry_size = smb2_wp_retry_size, 2383 .dir_needs_close = smb2_dir_needs_close, 2384 .get_dfs_refer = smb2_get_dfs_refer, ··· 2461 .set_oplock_level = smb21_set_oplock_level, 2462 .create_lease_buf = smb2_create_lease_buf, 2463 .parse_lease_buf = smb2_parse_lease_buf, 2464 + .copychunk_range = smb2_copychunk_range, 2465 .wp_retry_size = smb2_wp_retry_size, 2466 .dir_needs_close = smb2_dir_needs_close, 2467 .enum_snapshots = smb3_enum_snapshots, ··· 2548 .set_oplock_level = smb3_set_oplock_level, 2549 .create_lease_buf = smb3_create_lease_buf, 2550 .parse_lease_buf = smb3_parse_lease_buf, 2551 + .copychunk_range = smb2_copychunk_range, 2552 .duplicate_extents = smb2_duplicate_extents, 2553 .validate_negotiate = smb3_validate_negotiate, 2554 .wp_retry_size = smb2_wp_retry_size, ··· 2643 .set_oplock_level = smb3_set_oplock_level, 2644 .create_lease_buf = smb3_create_lease_buf, 2645 .parse_lease_buf = smb3_parse_lease_buf, 2646 + .copychunk_range = smb2_copychunk_range, 2647 .duplicate_extents = smb2_duplicate_extents, 2648 /* .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */ 2649 .wp_retry_size = smb2_wp_retry_size,