|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/vfs.h>
|
|
|
#include <linux/falloc.h>
|
|
|
#include <linux/scatterlist.h>
|
|
|
+#include <linux/uuid.h>
|
|
|
#include <crypto/aead.h>
|
|
|
#include "cifsglob.h"
|
|
|
#include "smb2pdu.h"
|
|
@@ -592,8 +593,8 @@ req_res_key_exit:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-smb2_clone_range(const unsigned int xid,
|
|
|
+static ssize_t
|
|
|
+smb2_copychunk_range(const unsigned int xid,
|
|
|
struct cifsFileInfo *srcfile,
|
|
|
struct cifsFileInfo *trgtfile, u64 src_off,
|
|
|
u64 len, u64 dest_off)
|
|
@@ -605,13 +606,14 @@ smb2_clone_range(const unsigned int xid,
|
|
|
struct cifs_tcon *tcon;
|
|
|
int chunks_copied = 0;
|
|
|
bool chunk_sizes_updated = false;
|
|
|
+ ssize_t bytes_written, total_bytes_written = 0;
|
|
|
|
|
|
pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL);
|
|
|
|
|
|
if (pcchunk == NULL)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- cifs_dbg(FYI, "in smb2_clone_range - about to call request res key\n");
|
|
|
+ cifs_dbg(FYI, "in smb2_copychunk_range - about to call request res key\n");
|
|
|
/* Request a key from the server to identify the source of the copy */
|
|
|
rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink),
|
|
|
srcfile->fid.persistent_fid,
|
|
@@ -669,14 +671,16 @@ smb2_clone_range(const unsigned int xid,
|
|
|
}
|
|
|
chunks_copied++;
|
|
|
|
|
|
- src_off += le32_to_cpu(retbuf->TotalBytesWritten);
|
|
|
- dest_off += le32_to_cpu(retbuf->TotalBytesWritten);
|
|
|
- len -= le32_to_cpu(retbuf->TotalBytesWritten);
|
|
|
+ bytes_written = le32_to_cpu(retbuf->TotalBytesWritten);
|
|
|
+ src_off += bytes_written;
|
|
|
+ dest_off += bytes_written;
|
|
|
+ len -= bytes_written;
|
|
|
+ total_bytes_written += bytes_written;
|
|
|
|
|
|
- cifs_dbg(FYI, "Chunks %d PartialChunk %d Total %d\n",
|
|
|
+ cifs_dbg(FYI, "Chunks %d PartialChunk %d Total %zu\n",
|
|
|
le32_to_cpu(retbuf->ChunksWritten),
|
|
|
le32_to_cpu(retbuf->ChunkBytesWritten),
|
|
|
- le32_to_cpu(retbuf->TotalBytesWritten));
|
|
|
+ bytes_written);
|
|
|
} else if (rc == -EINVAL) {
|
|
|
if (ret_data_len != sizeof(struct copychunk_ioctl_rsp))
|
|
|
goto cchunk_out;
|
|
@@ -713,7 +717,10 @@ smb2_clone_range(const unsigned int xid,
|
|
|
cchunk_out:
|
|
|
kfree(pcchunk);
|
|
|
kfree(retbuf);
|
|
|
- return rc;
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+ else
|
|
|
+ return total_bytes_written;
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -2188,7 +2195,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
|
|
|
if (rc)
|
|
|
goto free_pages;
|
|
|
|
|
|
- rc = cifs_discard_remaining_data(server);
|
|
|
+ rc = cifs_discard_remaining_data(server, buf);
|
|
|
if (rc)
|
|
|
goto free_pages;
|
|
|
|
|
@@ -2214,7 +2221,7 @@ free_pages:
|
|
|
kfree(pages);
|
|
|
return rc;
|
|
|
discard_data:
|
|
|
- cifs_discard_remaining_data(server);
|
|
|
+ cifs_discard_remaining_data(server, buf);
|
|
|
goto free_pages;
|
|
|
}
|
|
|
|
|
@@ -2322,6 +2329,7 @@ struct smb_version_operations smb20_operations = {
|
|
|
.clear_stats = smb2_clear_stats,
|
|
|
.print_stats = smb2_print_stats,
|
|
|
.is_oplock_break = smb2_is_valid_oplock_break,
|
|
|
+ .handle_cancelled_mid = smb2_handle_cancelled_mid,
|
|
|
.downgrade_oplock = smb2_downgrade_oplock,
|
|
|
.need_neg = smb2_need_neg,
|
|
|
.negotiate = smb2_negotiate,
|
|
@@ -2377,7 +2385,7 @@ struct smb_version_operations smb20_operations = {
|
|
|
.set_oplock_level = smb2_set_oplock_level,
|
|
|
.create_lease_buf = smb2_create_lease_buf,
|
|
|
.parse_lease_buf = smb2_parse_lease_buf,
|
|
|
- .clone_range = smb2_clone_range,
|
|
|
+ .copychunk_range = smb2_copychunk_range,
|
|
|
.wp_retry_size = smb2_wp_retry_size,
|
|
|
.dir_needs_close = smb2_dir_needs_close,
|
|
|
.get_dfs_refer = smb2_get_dfs_refer,
|
|
@@ -2404,6 +2412,7 @@ struct smb_version_operations smb21_operations = {
|
|
|
.clear_stats = smb2_clear_stats,
|
|
|
.print_stats = smb2_print_stats,
|
|
|
.is_oplock_break = smb2_is_valid_oplock_break,
|
|
|
+ .handle_cancelled_mid = smb2_handle_cancelled_mid,
|
|
|
.downgrade_oplock = smb2_downgrade_oplock,
|
|
|
.need_neg = smb2_need_neg,
|
|
|
.negotiate = smb2_negotiate,
|
|
@@ -2459,7 +2468,7 @@ struct smb_version_operations smb21_operations = {
|
|
|
.set_oplock_level = smb21_set_oplock_level,
|
|
|
.create_lease_buf = smb2_create_lease_buf,
|
|
|
.parse_lease_buf = smb2_parse_lease_buf,
|
|
|
- .clone_range = smb2_clone_range,
|
|
|
+ .copychunk_range = smb2_copychunk_range,
|
|
|
.wp_retry_size = smb2_wp_retry_size,
|
|
|
.dir_needs_close = smb2_dir_needs_close,
|
|
|
.enum_snapshots = smb3_enum_snapshots,
|
|
@@ -2488,6 +2497,7 @@ struct smb_version_operations smb30_operations = {
|
|
|
.print_stats = smb2_print_stats,
|
|
|
.dump_share_caps = smb2_dump_share_caps,
|
|
|
.is_oplock_break = smb2_is_valid_oplock_break,
|
|
|
+ .handle_cancelled_mid = smb2_handle_cancelled_mid,
|
|
|
.downgrade_oplock = smb2_downgrade_oplock,
|
|
|
.need_neg = smb2_need_neg,
|
|
|
.negotiate = smb2_negotiate,
|
|
@@ -2545,7 +2555,7 @@ struct smb_version_operations smb30_operations = {
|
|
|
.set_oplock_level = smb3_set_oplock_level,
|
|
|
.create_lease_buf = smb3_create_lease_buf,
|
|
|
.parse_lease_buf = smb3_parse_lease_buf,
|
|
|
- .clone_range = smb2_clone_range,
|
|
|
+ .copychunk_range = smb2_copychunk_range,
|
|
|
.duplicate_extents = smb2_duplicate_extents,
|
|
|
.validate_negotiate = smb3_validate_negotiate,
|
|
|
.wp_retry_size = smb2_wp_retry_size,
|
|
@@ -2582,6 +2592,7 @@ struct smb_version_operations smb311_operations = {
|
|
|
.print_stats = smb2_print_stats,
|
|
|
.dump_share_caps = smb2_dump_share_caps,
|
|
|
.is_oplock_break = smb2_is_valid_oplock_break,
|
|
|
+ .handle_cancelled_mid = smb2_handle_cancelled_mid,
|
|
|
.downgrade_oplock = smb2_downgrade_oplock,
|
|
|
.need_neg = smb2_need_neg,
|
|
|
.negotiate = smb2_negotiate,
|
|
@@ -2639,7 +2650,7 @@ struct smb_version_operations smb311_operations = {
|
|
|
.set_oplock_level = smb3_set_oplock_level,
|
|
|
.create_lease_buf = smb3_create_lease_buf,
|
|
|
.parse_lease_buf = smb3_parse_lease_buf,
|
|
|
- .clone_range = smb2_clone_range,
|
|
|
+ .copychunk_range = smb2_copychunk_range,
|
|
|
.duplicate_extents = smb2_duplicate_extents,
|
|
|
/* .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */
|
|
|
.wp_retry_size = smb2_wp_retry_size,
|