cifs: split out ses and tcon retrieval from mount_get_conns()
Introduce and export two helpers for getting session and tcon during mount(2). Those will be used by dfs when retrieving sessions and tcons separately while chasing referrals. Besides, export cifs_mount_ctx structure as it will be used by dfs code as well. No functional changes. Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
6d740164d8
commit
a73a26d97e
|
@ -1760,6 +1760,20 @@ struct file_list {
|
||||||
struct cifsFileInfo *cfile;
|
struct cifsFileInfo *cfile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct cifs_mount_ctx {
|
||||||
|
struct cifs_sb_info *cifs_sb;
|
||||||
|
struct smb3_fs_context *fs_ctx;
|
||||||
|
unsigned int xid;
|
||||||
|
struct TCP_Server_Info *server;
|
||||||
|
struct cifs_ses *ses;
|
||||||
|
struct cifs_tcon *tcon;
|
||||||
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
|
struct cifs_ses *root_ses;
|
||||||
|
uuid_t mount_id;
|
||||||
|
char *origin_fullpath, *leaf_fullpath;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
static inline void free_dfs_info_param(struct dfs_info3_param *param)
|
static inline void free_dfs_info_param(struct dfs_info3_param *param)
|
||||||
{
|
{
|
||||||
if (param) {
|
if (param) {
|
||||||
|
|
|
@ -242,6 +242,8 @@ extern int cifs_read_page_from_socket(struct TCP_Server_Info *server,
|
||||||
unsigned int page_offset,
|
unsigned int page_offset,
|
||||||
unsigned int to_read);
|
unsigned int to_read);
|
||||||
extern int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb);
|
extern int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb);
|
||||||
|
int cifs_mount_get_session(struct cifs_mount_ctx *mnt_ctx);
|
||||||
|
int cifs_mount_get_tcon(struct cifs_mount_ctx *mnt_ctx);
|
||||||
extern int cifs_match_super(struct super_block *, void *);
|
extern int cifs_match_super(struct super_block *, void *);
|
||||||
extern int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx);
|
extern int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx);
|
||||||
extern void cifs_umount(struct cifs_sb_info *);
|
extern void cifs_umount(struct cifs_sb_info *);
|
||||||
|
|
|
@ -62,20 +62,6 @@ extern bool disable_legacy_dialects;
|
||||||
/* Drop the connection to not overload the server */
|
/* Drop the connection to not overload the server */
|
||||||
#define NUM_STATUS_IO_TIMEOUT 5
|
#define NUM_STATUS_IO_TIMEOUT 5
|
||||||
|
|
||||||
struct mount_ctx {
|
|
||||||
struct cifs_sb_info *cifs_sb;
|
|
||||||
struct smb3_fs_context *fs_ctx;
|
|
||||||
unsigned int xid;
|
|
||||||
struct TCP_Server_Info *server;
|
|
||||||
struct cifs_ses *ses;
|
|
||||||
struct cifs_tcon *tcon;
|
|
||||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
|
||||||
struct cifs_ses *root_ses;
|
|
||||||
uuid_t mount_id;
|
|
||||||
char *origin_fullpath, *leaf_fullpath;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
static int ip_connect(struct TCP_Server_Info *server);
|
static int ip_connect(struct TCP_Server_Info *server);
|
||||||
static int generic_ip_connect(struct TCP_Server_Info *server);
|
static int generic_ip_connect(struct TCP_Server_Info *server);
|
||||||
static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
|
static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
|
||||||
|
@ -3191,7 +3177,7 @@ int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release all succeed connections */
|
/* Release all succeed connections */
|
||||||
static inline void mount_put_conns(struct mount_ctx *mnt_ctx)
|
static inline void mount_put_conns(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
@ -3205,19 +3191,22 @@ static inline void mount_put_conns(struct mount_ctx *mnt_ctx)
|
||||||
free_xid(mnt_ctx->xid);
|
free_xid(mnt_ctx->xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get connections for tcp, ses and tcon */
|
int cifs_mount_get_session(struct cifs_mount_ctx *mnt_ctx)
|
||||||
static int mount_get_conns(struct mount_ctx *mnt_ctx)
|
|
||||||
{
|
{
|
||||||
int rc = 0;
|
|
||||||
struct TCP_Server_Info *server = NULL;
|
struct TCP_Server_Info *server = NULL;
|
||||||
|
struct smb3_fs_context *ctx;
|
||||||
struct cifs_ses *ses = NULL;
|
struct cifs_ses *ses = NULL;
|
||||||
struct cifs_tcon *tcon = NULL;
|
|
||||||
struct smb3_fs_context *ctx = mnt_ctx->fs_ctx;
|
|
||||||
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
|
||||||
unsigned int xid;
|
unsigned int xid;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
xid = get_xid();
|
xid = get_xid();
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(!mnt_ctx || !mnt_ctx->fs_ctx)) {
|
||||||
|
rc = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ctx = mnt_ctx->fs_ctx;
|
||||||
|
|
||||||
/* get a reference to a tcp session */
|
/* get a reference to a tcp session */
|
||||||
server = cifs_get_tcp_session(ctx, NULL);
|
server = cifs_get_tcp_session(ctx, NULL);
|
||||||
if (IS_ERR(server)) {
|
if (IS_ERR(server)) {
|
||||||
|
@ -3238,11 +3227,36 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
|
||||||
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
|
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
|
||||||
cifs_server_dbg(VFS, "persistent handles not supported by server\n");
|
cifs_server_dbg(VFS, "persistent handles not supported by server\n");
|
||||||
rc = -EOPNOTSUPP;
|
rc = -EOPNOTSUPP;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
mnt_ctx->xid = xid;
|
||||||
|
mnt_ctx->server = server;
|
||||||
|
mnt_ctx->ses = ses;
|
||||||
|
mnt_ctx->tcon = NULL;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cifs_mount_get_tcon(struct cifs_mount_ctx *mnt_ctx)
|
||||||
|
{
|
||||||
|
struct TCP_Server_Info *server;
|
||||||
|
struct cifs_sb_info *cifs_sb;
|
||||||
|
struct smb3_fs_context *ctx;
|
||||||
|
struct cifs_tcon *tcon = NULL;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(!mnt_ctx || !mnt_ctx->server || !mnt_ctx->ses || !mnt_ctx->fs_ctx ||
|
||||||
|
!mnt_ctx->cifs_sb)) {
|
||||||
|
rc = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
server = mnt_ctx->server;
|
||||||
|
ctx = mnt_ctx->fs_ctx;
|
||||||
|
cifs_sb = mnt_ctx->cifs_sb;
|
||||||
|
|
||||||
/* search for existing tcon to this server share */
|
/* search for existing tcon to this server share */
|
||||||
tcon = cifs_get_tcon(ses, ctx);
|
tcon = cifs_get_tcon(mnt_ctx->ses, ctx);
|
||||||
if (IS_ERR(tcon)) {
|
if (IS_ERR(tcon)) {
|
||||||
rc = PTR_ERR(tcon);
|
rc = PTR_ERR(tcon);
|
||||||
tcon = NULL;
|
tcon = NULL;
|
||||||
|
@ -3260,7 +3274,7 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
|
||||||
* reset of caps checks mount to see if unix extensions disabled
|
* reset of caps checks mount to see if unix extensions disabled
|
||||||
* for just this mount.
|
* for just this mount.
|
||||||
*/
|
*/
|
||||||
reset_cifs_unix_caps(xid, tcon, cifs_sb, ctx);
|
reset_cifs_unix_caps(mnt_ctx->xid, tcon, cifs_sb, ctx);
|
||||||
spin_lock(&tcon->ses->server->srv_lock);
|
spin_lock(&tcon->ses->server->srv_lock);
|
||||||
if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
|
if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
|
||||||
(le64_to_cpu(tcon->fsUnixInfo.Capability) &
|
(le64_to_cpu(tcon->fsUnixInfo.Capability) &
|
||||||
|
@ -3276,7 +3290,7 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
|
||||||
|
|
||||||
/* do not care if a following call succeed - informational */
|
/* do not care if a following call succeed - informational */
|
||||||
if (!tcon->pipe && server->ops->qfs_tcon) {
|
if (!tcon->pipe && server->ops->qfs_tcon) {
|
||||||
server->ops->qfs_tcon(xid, tcon, cifs_sb);
|
server->ops->qfs_tcon(mnt_ctx->xid, tcon, cifs_sb);
|
||||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
|
||||||
if (tcon->fsDevInfo.DeviceCharacteristics &
|
if (tcon->fsDevInfo.DeviceCharacteristics &
|
||||||
cpu_to_le32(FILE_READ_ONLY_DEVICE))
|
cpu_to_le32(FILE_READ_ONLY_DEVICE))
|
||||||
|
@ -3309,14 +3323,22 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
|
||||||
cifs_fscache_get_super_cookie(tcon);
|
cifs_fscache_get_super_cookie(tcon);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mnt_ctx->server = server;
|
|
||||||
mnt_ctx->ses = ses;
|
|
||||||
mnt_ctx->tcon = tcon;
|
mnt_ctx->tcon = tcon;
|
||||||
mnt_ctx->xid = xid;
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get connections for tcp, ses and tcon */
|
||||||
|
static int mount_get_conns(struct cifs_mount_ctx *mnt_ctx)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = cifs_mount_get_session(mnt_ctx);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return cifs_mount_get_tcon(mnt_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
||||||
struct cifs_tcon *tcon)
|
struct cifs_tcon *tcon)
|
||||||
{
|
{
|
||||||
|
@ -3345,7 +3367,7 @@ static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
||||||
|
|
||||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
/* Get unique dfs connections */
|
/* Get unique dfs connections */
|
||||||
static int mount_get_dfs_conns(struct mount_ctx *mnt_ctx)
|
static int mount_get_dfs_conns(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -3448,7 +3470,7 @@ cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
|
||||||
*
|
*
|
||||||
* Return -EREMOTE if it is, otherwise 0 or -errno.
|
* Return -EREMOTE if it is, otherwise 0 or -errno.
|
||||||
*/
|
*/
|
||||||
static int is_path_remote(struct mount_ctx *mnt_ctx)
|
static int is_path_remote(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
||||||
|
@ -3492,7 +3514,7 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
static void set_root_ses(struct mount_ctx *mnt_ctx)
|
static void set_root_ses(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
if (mnt_ctx->ses) {
|
if (mnt_ctx->ses) {
|
||||||
spin_lock(&cifs_tcp_ses_lock);
|
spin_lock(&cifs_tcp_ses_lock);
|
||||||
|
@ -3503,7 +3525,8 @@ static void set_root_ses(struct mount_ctx *mnt_ctx)
|
||||||
mnt_ctx->root_ses = mnt_ctx->ses;
|
mnt_ctx->root_ses = mnt_ctx->ses;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_dfs_mount(struct mount_ctx *mnt_ctx, bool *isdfs, struct dfs_cache_tgt_list *root_tl)
|
static int is_dfs_mount(struct cifs_mount_ctx *mnt_ctx, bool *isdfs,
|
||||||
|
struct dfs_cache_tgt_list *root_tl)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
||||||
|
@ -3534,7 +3557,7 @@ static int is_dfs_mount(struct mount_ctx *mnt_ctx, bool *isdfs, struct dfs_cache
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int connect_dfs_target(struct mount_ctx *mnt_ctx, const char *full_path,
|
static int connect_dfs_target(struct cifs_mount_ctx *mnt_ctx, const char *full_path,
|
||||||
const char *ref_path, struct dfs_cache_tgt_iterator *tit)
|
const char *ref_path, struct dfs_cache_tgt_iterator *tit)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -3568,7 +3591,7 @@ out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int connect_dfs_root(struct mount_ctx *mnt_ctx, struct dfs_cache_tgt_list *root_tl)
|
static int connect_dfs_root(struct cifs_mount_ctx *mnt_ctx, struct dfs_cache_tgt_list *root_tl)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char *full_path;
|
char *full_path;
|
||||||
|
@ -3613,7 +3636,7 @@ out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __follow_dfs_link(struct mount_ctx *mnt_ctx)
|
static int __follow_dfs_link(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
||||||
|
@ -3662,7 +3685,7 @@ out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int follow_dfs_link(struct mount_ctx *mnt_ctx)
|
static int follow_dfs_link(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
struct cifs_sb_info *cifs_sb = mnt_ctx->cifs_sb;
|
||||||
|
@ -3695,7 +3718,7 @@ static int follow_dfs_link(struct mount_ctx *mnt_ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up DFS referral paths for failover */
|
/* Set up DFS referral paths for failover */
|
||||||
static void setup_server_referral_paths(struct mount_ctx *mnt_ctx)
|
static void setup_server_referral_paths(struct cifs_mount_ctx *mnt_ctx)
|
||||||
{
|
{
|
||||||
struct TCP_Server_Info *server = mnt_ctx->server;
|
struct TCP_Server_Info *server = mnt_ctx->server;
|
||||||
|
|
||||||
|
@ -3710,7 +3733,7 @@ static void setup_server_referral_paths(struct mount_ctx *mnt_ctx)
|
||||||
int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct mount_ctx mnt_ctx = { .cifs_sb = cifs_sb, .fs_ctx = ctx, };
|
struct cifs_mount_ctx mnt_ctx = { .cifs_sb = cifs_sb, .fs_ctx = ctx, };
|
||||||
struct dfs_cache_tgt_list tl = DFS_CACHE_TGT_LIST_INIT(tl);
|
struct dfs_cache_tgt_list tl = DFS_CACHE_TGT_LIST_INIT(tl);
|
||||||
bool isdfs;
|
bool isdfs;
|
||||||
|
|
||||||
|
@ -3770,7 +3793,7 @@ error:
|
||||||
int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct mount_ctx mnt_ctx = { .cifs_sb = cifs_sb, .fs_ctx = ctx, };
|
struct cifs_mount_ctx mnt_ctx = { .cifs_sb = cifs_sb, .fs_ctx = ctx, };
|
||||||
|
|
||||||
rc = mount_get_conns(&mnt_ctx);
|
rc = mount_get_conns(&mnt_ctx);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
Loading…
Reference in New Issue