[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:
@@ -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);
|
||||
}
|
||||
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
|
||||
* resources mounted more than once to the same server share the last
|
||||
@@ -3521,6 +3545,12 @@ try_mount_again:
|
||||
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 */
|
||||
tcon = cifs_get_tcon(ses, volume_info);
|
||||
if (IS_ERR(tcon)) {
|
||||
|
Reference in New Issue
Block a user