mirror of https://gitee.com/openkylin/linux.git
CIFS: Make use of common cifs_build_path_to_root for CIFS and SMB2
because the is no difference here. This also adds support of prefixpath mount option for SMB2. Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> Reviewed-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
e5e69abd05
commit
6d3ea7e497
|
@ -539,8 +539,8 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)
|
||||||
char *s, *p;
|
char *s, *p;
|
||||||
char sep;
|
char sep;
|
||||||
|
|
||||||
full_path = build_path_to_root(vol, cifs_sb,
|
full_path = cifs_build_path_to_root(vol, cifs_sb,
|
||||||
cifs_sb_master_tcon(cifs_sb));
|
cifs_sb_master_tcon(cifs_sb));
|
||||||
if (full_path == NULL)
|
if (full_path == NULL)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
|
|
@ -280,9 +280,6 @@ struct smb_version_operations {
|
||||||
/* set attributes */
|
/* set attributes */
|
||||||
int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *,
|
int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *,
|
||||||
const unsigned int);
|
const unsigned int);
|
||||||
/* build a full path to the root of the mount */
|
|
||||||
char * (*build_path_to_root)(struct smb_vol *, struct cifs_sb_info *,
|
|
||||||
struct cifs_tcon *);
|
|
||||||
/* check if we can send an echo or nor */
|
/* check if we can send an echo or nor */
|
||||||
bool (*can_echo)(struct TCP_Server_Info *);
|
bool (*can_echo)(struct TCP_Server_Info *);
|
||||||
/* send echo request */
|
/* send echo request */
|
||||||
|
@ -1084,15 +1081,6 @@ convert_delimiter(char *path, char delim)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char *
|
|
||||||
build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
|
||||||
struct cifs_tcon *tcon)
|
|
||||||
{
|
|
||||||
if (!vol->ops->build_path_to_root)
|
|
||||||
return NULL;
|
|
||||||
return vol->ops->build_path_to_root(vol, cifs_sb, tcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_CIFS_STATS
|
#ifdef CONFIG_CIFS_STATS
|
||||||
#define cifs_stats_inc atomic_inc
|
#define cifs_stats_inc atomic_inc
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,9 @@ extern int init_cifs_idmap(void);
|
||||||
extern void exit_cifs_idmap(void);
|
extern void exit_cifs_idmap(void);
|
||||||
extern void cifs_destroy_idmaptrees(void);
|
extern void cifs_destroy_idmaptrees(void);
|
||||||
extern char *build_path_from_dentry(struct dentry *);
|
extern char *build_path_from_dentry(struct dentry *);
|
||||||
|
extern char *cifs_build_path_to_root(struct smb_vol *vol,
|
||||||
|
struct cifs_sb_info *cifs_sb,
|
||||||
|
struct cifs_tcon *tcon);
|
||||||
extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
|
extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
|
||||||
extern char *cifs_compose_mount_options(const char *sb_mountdata,
|
extern char *cifs_compose_mount_options(const char *sb_mountdata,
|
||||||
const char *fullpath, const struct dfs_info3_param *ref,
|
const char *fullpath, const struct dfs_info3_param *ref,
|
||||||
|
|
|
@ -3261,8 +3261,10 @@ cifs_cleanup_volume_info(struct smb_vol *volume_info)
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
/* build_path_to_root returns full path to root when
|
/*
|
||||||
* we do not have an exiting connection (tcon) */
|
* cifs_build_path_to_root returns full path to root when we do not have an
|
||||||
|
* exiting connection (tcon)
|
||||||
|
*/
|
||||||
static char *
|
static char *
|
||||||
build_unc_path_to_root(const struct smb_vol *vol,
|
build_unc_path_to_root(const struct smb_vol *vol,
|
||||||
const struct cifs_sb_info *cifs_sb)
|
const struct cifs_sb_info *cifs_sb)
|
||||||
|
@ -3518,8 +3520,10 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
|
||||||
rc = -ENOSYS;
|
rc = -ENOSYS;
|
||||||
goto mount_fail_check;
|
goto mount_fail_check;
|
||||||
}
|
}
|
||||||
/* build_path_to_root works only when we have a valid tcon */
|
/*
|
||||||
full_path = build_path_to_root(volume_info, cifs_sb, tcon);
|
* cifs_build_path_to_root works only when we have a valid tcon
|
||||||
|
*/
|
||||||
|
full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
|
||||||
if (full_path == NULL) {
|
if (full_path == NULL) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto mount_fail_check;
|
goto mount_fail_check;
|
||||||
|
|
|
@ -44,6 +44,37 @@ renew_parental_timestamps(struct dentry *direntry)
|
||||||
} while (!IS_ROOT(direntry));
|
} while (!IS_ROOT(direntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
||||||
|
struct cifs_tcon *tcon)
|
||||||
|
{
|
||||||
|
int pplen = vol->prepath ? strlen(vol->prepath) : 0;
|
||||||
|
int dfsplen;
|
||||||
|
char *full_path = NULL;
|
||||||
|
|
||||||
|
/* if no prefix path, simply set path to the root of share to "" */
|
||||||
|
if (pplen == 0) {
|
||||||
|
full_path = kzalloc(1, GFP_KERNEL);
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcon->Flags & SMB_SHARE_IS_IN_DFS)
|
||||||
|
dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
|
||||||
|
else
|
||||||
|
dfsplen = 0;
|
||||||
|
|
||||||
|
full_path = kmalloc(dfsplen + pplen + 1, GFP_KERNEL);
|
||||||
|
if (full_path == NULL)
|
||||||
|
return full_path;
|
||||||
|
|
||||||
|
if (dfsplen)
|
||||||
|
strncpy(full_path, tcon->treeName, dfsplen);
|
||||||
|
strncpy(full_path + dfsplen, vol->prepath, pplen);
|
||||||
|
convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
|
||||||
|
full_path[dfsplen + pplen] = 0; /* add trailing null */
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
/* Note: caller must free return buffer */
|
/* Note: caller must free return buffer */
|
||||||
char *
|
char *
|
||||||
build_path_from_dentry(struct dentry *direntry)
|
build_path_from_dentry(struct dentry *direntry)
|
||||||
|
|
|
@ -575,37 +575,6 @@ cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||||
return CIFSSMBQFileInfo(xid, tcon, fid->netfid, data);
|
return CIFSSMBQFileInfo(xid, tcon, fid->netfid, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
|
||||||
struct cifs_tcon *tcon)
|
|
||||||
{
|
|
||||||
int pplen = vol->prepath ? strlen(vol->prepath) : 0;
|
|
||||||
int dfsplen;
|
|
||||||
char *full_path = NULL;
|
|
||||||
|
|
||||||
/* if no prefix path, simply set path to the root of share to "" */
|
|
||||||
if (pplen == 0) {
|
|
||||||
full_path = kzalloc(1, GFP_KERNEL);
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcon->Flags & SMB_SHARE_IS_IN_DFS)
|
|
||||||
dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
|
|
||||||
else
|
|
||||||
dfsplen = 0;
|
|
||||||
|
|
||||||
full_path = kmalloc(dfsplen + pplen + 1, GFP_KERNEL);
|
|
||||||
if (full_path == NULL)
|
|
||||||
return full_path;
|
|
||||||
|
|
||||||
if (dfsplen)
|
|
||||||
strncpy(full_path, tcon->treeName, dfsplen);
|
|
||||||
strncpy(full_path + dfsplen, vol->prepath, pplen);
|
|
||||||
convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
|
|
||||||
full_path[dfsplen + pplen] = 0; /* add trailing null */
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cifs_clear_stats(struct cifs_tcon *tcon)
|
cifs_clear_stats(struct cifs_tcon *tcon)
|
||||||
{
|
{
|
||||||
|
@ -943,7 +912,6 @@ struct smb_version_operations smb1_operations = {
|
||||||
.set_path_size = CIFSSMBSetEOF,
|
.set_path_size = CIFSSMBSetEOF,
|
||||||
.set_file_size = CIFSSMBSetFileSize,
|
.set_file_size = CIFSSMBSetFileSize,
|
||||||
.set_file_info = smb_set_file_info,
|
.set_file_info = smb_set_file_info,
|
||||||
.build_path_to_root = cifs_build_path_to_root,
|
|
||||||
.echo = CIFSSMBEcho,
|
.echo = CIFSSMBEcho,
|
||||||
.mkdir = CIFSSMBMkDir,
|
.mkdir = CIFSSMBMkDir,
|
||||||
.mkdir_setinfo = cifs_mkdir_setinfo,
|
.mkdir_setinfo = cifs_mkdir_setinfo,
|
||||||
|
|
|
@ -262,23 +262,6 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
smb2_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
|
||||||
struct cifs_tcon *tcon)
|
|
||||||
{
|
|
||||||
int pplen = vol->prepath ? strlen(vol->prepath) : 0;
|
|
||||||
char *full_path = NULL;
|
|
||||||
|
|
||||||
/* if no prefix path, simply set path to the root of share to "" */
|
|
||||||
if (pplen == 0) {
|
|
||||||
full_path = kzalloc(2, GFP_KERNEL);
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
cERROR(1, "prefixpath is not supported for SMB2 now");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
smb2_can_echo(struct TCP_Server_Info *server)
|
smb2_can_echo(struct TCP_Server_Info *server)
|
||||||
{
|
{
|
||||||
|
@ -613,7 +596,6 @@ struct smb_version_operations smb21_operations = {
|
||||||
.set_path_size = smb2_set_path_size,
|
.set_path_size = smb2_set_path_size,
|
||||||
.set_file_size = smb2_set_file_size,
|
.set_file_size = smb2_set_file_size,
|
||||||
.set_file_info = smb2_set_file_info,
|
.set_file_info = smb2_set_file_info,
|
||||||
.build_path_to_root = smb2_build_path_to_root,
|
|
||||||
.mkdir = smb2_mkdir,
|
.mkdir = smb2_mkdir,
|
||||||
.mkdir_setinfo = smb2_mkdir_setinfo,
|
.mkdir_setinfo = smb2_mkdir_setinfo,
|
||||||
.rmdir = smb2_rmdir,
|
.rmdir = smb2_rmdir,
|
||||||
|
|
Loading…
Reference in New Issue