History

[CIFS] Do not use btrfs refcopy ioctl for SMB2 copy offload

Change cifs.ko to using CIFS_IOCTL_COPYCHUNK instead of BTRFS_IOC_CLONE to avoid confusion about whether copy-on-write is required or optional for this operation. SMB2/SMB3 copyoffload had used the BTRFS_IOC_CLONE ioctl since they both speed up copy by offloading the copy rather than passing many read and write requests back and forth and both have identical syntax (passing file handles), but for SMB2/SMB3 CopyChunk the server is not required to use copy-on-write to make a copy of the file (although some do), and Christoph has commented that since CopyChunk does not require copy-on-write we should not reuse BTRFS_IOC_CLONE. This patch renames the ioctl to use a cifs specific IOCTL CIFS_IOCTL_COPYCHUNK. This ioctl is particularly important for SMB2/SMB3 since large file copy over the network otherwise can be very slow, and with this is often more than 100 times faster putting less load on server and client. Note that if a copy syscall is ever introduced, depending on its requirements/format it could end up using one of the other three methods that CIFS/SMB2/SMB3 can do for copy offload, but this method is particularly useful for file copy and broadly supported (not just by Samba server).

Steve French committed 12 years ago

Commit f19e84d1 parent ff1c0381 file · +4 −2Browse files

Unified · Split

fs/cifs/ioctl.c+4−2
@@ -26,13 +26,15 @@ · 25 unmodified lines
2626 #include <linux/mount.h>
2727 #include <linux/mm.h>
2828 #include <linux/pagemap.h>
29−#include <linux/btrfs.h>
3029 #include "cifspdu.h"
3130 #include "cifsglob.h"
3231 #include "cifsproto.h"
3332 #include "cifs_debug.h"
3433 #include "cifsfs.h"
3534
35+#define CIFS_IOCTL_MAGIC 0xCF
36+#define CIFS_IOC_COPYCHUNK_FILE _IOW(CIFS_IOCTL_MAGIC, 3, int)
37+
3638 static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file,
3739 unsigned long srcfd, u64 off, u64 len, u64 destoff)
3840 {
@@ -213,7 +215,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg) · 174 unmodified lines
213215 cifs_dbg(FYI, "set compress flag rc %d\n", rc);
214216 }
215217 break;
216− case BTRFS_IOC_CLONE:
218+ case CIFS_IOC_COPYCHUNK_FILE:
217219 rc = cifs_ioctl_clone(xid, filep, arg, 0, 0, 0);
218220 break;
219221 default: