[SMB3] Enable checking for continuous availability and persistent handle support
Validate "persistenthandles" and "nopersistenthandles" mount options against the support the server claims in negotiate and tree connect SMB3 responses. Signed-off-by: Steve French <steve.french@primarydata.com> Reviewed-by: Pavel Shilovsky <pshilovsky@samba.org>
This commit is contained in:
parent
b2a3077414
commit
b618f001a2
3 changed files with 34 additions and 3 deletions
|
@ -897,6 +897,7 @@ struct cifs_tcon {
|
||||||
bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
|
bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
|
||||||
bool broken_sparse_sup; /* if server or share does not support sparse */
|
bool broken_sparse_sup; /* if server or share does not support sparse */
|
||||||
bool need_reconnect:1; /* connection reset, tid now invalid */
|
bool need_reconnect:1; /* connection reset, tid now invalid */
|
||||||
|
bool use_persistent:1; /* use persistent instead of durable handles */
|
||||||
#ifdef CONFIG_CIFS_SMB2
|
#ifdef CONFIG_CIFS_SMB2
|
||||||
bool print:1; /* set if connection to printer share */
|
bool print:1; /* set if connection to printer share */
|
||||||
bool bad_network_name:1; /* set if ret status STATUS_BAD_NETWORK_NAME */
|
bool bad_network_name:1; /* set if ret status STATUS_BAD_NETWORK_NAME */
|
||||||
|
|
|
@ -2673,6 +2673,30 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
|
||||||
cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
|
cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
|
||||||
}
|
}
|
||||||
tcon->seal = volume_info->seal;
|
tcon->seal = volume_info->seal;
|
||||||
|
tcon->use_persistent = false;
|
||||||
|
/* check if SMB2 or later, CIFS does not support persistent handles */
|
||||||
|
if (volume_info->persistent) {
|
||||||
|
if (ses->server->vals->protocol_id == 0) {
|
||||||
|
cifs_dbg(VFS,
|
||||||
|
"SMB3 or later required for persistent handles\n");
|
||||||
|
rc = -EOPNOTSUPP;
|
||||||
|
goto out_fail;
|
||||||
|
} else if (ses->server->capabilities &
|
||||||
|
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
|
||||||
|
tcon->use_persistent = true;
|
||||||
|
else /* persistent handles requested but not supported */ {
|
||||||
|
cifs_dbg(VFS,
|
||||||
|
"Persistent handles not supported on share\n");
|
||||||
|
rc = -EOPNOTSUPP;
|
||||||
|
goto out_fail;
|
||||||
|
}
|
||||||
|
} else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
|
||||||
|
&& (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
|
||||||
|
&& (volume_info->nopersistent == false)) {
|
||||||
|
cifs_dbg(FYI, "enabling persistent handles\n");
|
||||||
|
tcon->use_persistent = true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can have only one retry value for a connection to a share so for
|
* We can have only one retry value for a connection to a share so for
|
||||||
* resources mounted more than once to the same server share the last
|
* resources mounted more than once to the same server share the last
|
||||||
|
@ -3521,6 +3545,12 @@ try_mount_again:
|
||||||
goto mount_fail_check;
|
goto mount_fail_check;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((volume_info->persistent == true) && ((ses->server->capabilities &
|
||||||
|
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
|
||||||
|
cifs_dbg(VFS, "persistent handles not supported by server\n");
|
||||||
|
rc = -EOPNOTSUPP;
|
||||||
|
goto mount_fail_check;
|
||||||
|
}
|
||||||
/* search for existing tcon to this server share */
|
/* search for existing tcon to this server share */
|
||||||
tcon = cifs_get_tcon(ses, volume_info);
|
tcon = cifs_get_tcon(ses, volume_info);
|
||||||
if (IS_ERR(tcon)) {
|
if (IS_ERR(tcon)) {
|
||||||
|
|
|
@ -1838,7 +1838,7 @@ struct smb_version_values smb21_values = {
|
||||||
struct smb_version_values smb30_values = {
|
struct smb_version_values smb30_values = {
|
||||||
.version_string = SMB30_VERSION_STRING,
|
.version_string = SMB30_VERSION_STRING,
|
||||||
.protocol_id = SMB30_PROT_ID,
|
.protocol_id = SMB30_PROT_ID,
|
||||||
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU,
|
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES,
|
||||||
.large_lock_type = 0,
|
.large_lock_type = 0,
|
||||||
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
||||||
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
||||||
|
@ -1858,7 +1858,7 @@ struct smb_version_values smb30_values = {
|
||||||
struct smb_version_values smb302_values = {
|
struct smb_version_values smb302_values = {
|
||||||
.version_string = SMB302_VERSION_STRING,
|
.version_string = SMB302_VERSION_STRING,
|
||||||
.protocol_id = SMB302_PROT_ID,
|
.protocol_id = SMB302_PROT_ID,
|
||||||
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU,
|
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES,
|
||||||
.large_lock_type = 0,
|
.large_lock_type = 0,
|
||||||
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
||||||
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
||||||
|
@ -1879,7 +1879,7 @@ struct smb_version_values smb302_values = {
|
||||||
struct smb_version_values smb311_values = {
|
struct smb_version_values smb311_values = {
|
||||||
.version_string = SMB311_VERSION_STRING,
|
.version_string = SMB311_VERSION_STRING,
|
||||||
.protocol_id = SMB311_PROT_ID,
|
.protocol_id = SMB311_PROT_ID,
|
||||||
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU,
|
.req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES,
|
||||||
.large_lock_type = 0,
|
.large_lock_type = 0,
|
||||||
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
|
||||||
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
.shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
|
||||||
|
|
Loading…
Reference in a new issue