diff options
Diffstat (limited to 'fs/cifs/smb2ops.c')
| -rw-r--r-- | fs/cifs/smb2ops.c | 73 | 
1 files changed, 67 insertions, 6 deletions
| diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index fb2934b9b97c..bdb963d0ba32 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -426,6 +426,7 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,  	return rc;  } +#ifdef CONFIG_CIFS_XATTR  static ssize_t  move_smb2_ea_to_cifs(char *dst, size_t dst_size,  		     struct smb2_file_full_ea_info *src, size_t src_size, @@ -521,6 +522,7 @@ smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon,  	struct cifs_open_parms oparms;  	struct cifs_fid fid;  	struct smb2_file_full_ea_info *smb2_data; +	int ea_buf_size = SMB2_MIN_EA_BUF;  	utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);  	if (!utf16_path) @@ -540,14 +542,32 @@ smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon,  		return rc;  	} -	smb2_data = kzalloc(SMB2_MAX_EA_BUF, GFP_KERNEL); -	if (smb2_data == NULL) { -		SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); -		return -ENOMEM; +	while (1) { +		smb2_data = kzalloc(ea_buf_size, GFP_KERNEL); +		if (smb2_data == NULL) { +			SMB2_close(xid, tcon, fid.persistent_fid, +				   fid.volatile_fid); +			return -ENOMEM; +		} + +		rc = SMB2_query_eas(xid, tcon, fid.persistent_fid, +				    fid.volatile_fid, +				    ea_buf_size, smb2_data); + +		if (rc != -E2BIG) +			break; + +		kfree(smb2_data); +		ea_buf_size <<= 1; + +		if (ea_buf_size > SMB2_MAX_EA_BUF) { +			cifs_dbg(VFS, "EA size is too large\n"); +			SMB2_close(xid, tcon, fid.persistent_fid, +				   fid.volatile_fid); +			return -ENOMEM; +		}  	} -	rc = SMB2_query_eas(xid, tcon, fid.persistent_fid, fid.volatile_fid, -			    smb2_data);  	SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);  	if (!rc) @@ -613,6 +633,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,  	return rc;  } +#endif  static bool  smb2_can_echo(struct TCP_Server_Info *server) @@ -3110,6 +3131,46 @@ struct smb_version_values smb21_values = {  	.create_lease_size = sizeof(struct create_lease),  }; +struct smb_version_values smb3any_values = { +	.version_string = SMB3ANY_VERSION_STRING, +	.protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */ +	.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION, +	.large_lock_type = 0, +	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, +	.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, +	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, +	.header_size = sizeof(struct smb2_hdr), +	.max_header_size = MAX_SMB2_HDR_SIZE, +	.read_rsp_size = sizeof(struct smb2_read_rsp) - 1, +	.lock_cmd = SMB2_LOCK, +	.cap_unix = 0, +	.cap_nt_find = SMB2_NT_FIND, +	.cap_large_files = SMB2_LARGE_FILES, +	.signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED, +	.signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED, +	.create_lease_size = sizeof(struct create_lease_v2), +}; + +struct smb_version_values smbdefault_values = { +	.version_string = SMBDEFAULT_VERSION_STRING, +	.protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */ +	.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION, +	.large_lock_type = 0, +	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK, +	.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK, +	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK, +	.header_size = sizeof(struct smb2_hdr), +	.max_header_size = MAX_SMB2_HDR_SIZE, +	.read_rsp_size = sizeof(struct smb2_read_rsp) - 1, +	.lock_cmd = SMB2_LOCK, +	.cap_unix = 0, +	.cap_nt_find = SMB2_NT_FIND, +	.cap_large_files = SMB2_LARGE_FILES, +	.signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED, +	.signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED, +	.create_lease_size = sizeof(struct create_lease_v2), +}; +  struct smb_version_values smb30_values = {  	.version_string = SMB30_VERSION_STRING,  	.protocol_id = SMB30_PROT_ID, |