On Thu, 22 Nov 2012 15:39:26 +0400 Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote: > because the is no difference here. This also adds support of prefixpath > mount option for SMB2. > > Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx> > --- > fs/cifs/cifsfs.c | 4 ++-- > fs/cifs/cifsglob.h | 12 ------------ > fs/cifs/cifsproto.h | 3 +++ > fs/cifs/connect.c | 12 ++++++++---- > fs/cifs/dir.c | 31 +++++++++++++++++++++++++++++++ > fs/cifs/smb1ops.c | 32 -------------------------------- > fs/cifs/smb2ops.c | 18 ------------------ > 7 files changed, 44 insertions(+), 68 deletions(-) > > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 5e62f44..c6e32f2 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -539,8 +539,8 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) > char *s, *p; > char sep; > > - full_path = build_path_to_root(vol, cifs_sb, > - cifs_sb_master_tcon(cifs_sb)); > + full_path = cifs_build_path_to_root(vol, cifs_sb, > + cifs_sb_master_tcon(cifs_sb)); > if (full_path == NULL) > return ERR_PTR(-ENOMEM); > > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h > index a487e34..28e0bee 100644 > --- a/fs/cifs/cifsglob.h > +++ b/fs/cifs/cifsglob.h > @@ -280,9 +280,6 @@ struct smb_version_operations { > /* set attributes */ > int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *, > 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 */ > bool (*can_echo)(struct TCP_Server_Info *); > /* send echo request */ > @@ -1093,15 +1090,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 > #define cifs_stats_inc atomic_inc > > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 36342a8..7e1562d 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -58,6 +58,9 @@ do { \ > } while (0) > extern int init_cifs_idmap(void); > extern void exit_cifs_idmap(void); > +extern char *cifs_build_path_to_root(struct smb_vol *vol, > + struct cifs_sb_info *cifs_sb, > + struct cifs_tcon *tcon); > extern char *build_path_from_dentry(struct dentry *); > extern char *build_wildcard_path_from_dentry(struct dentry *direntry); > extern char *cifs_compose_mount_options(const char *sb_mountdata, > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index 5c670b9..5563681 100644 > --- a/fs/cifs/connect.c > +++ b/fs/cifs/connect.c > @@ -3280,8 +3280,10 @@ cifs_cleanup_volume_info(struct smb_vol *volume_info) > > > #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 * > build_unc_path_to_root(const struct smb_vol *vol, > const struct cifs_sb_info *cifs_sb) > @@ -3537,8 +3539,10 @@ remote_path_check: > rc = -ENOSYS; > 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) { > rc = -ENOMEM; > goto mount_fail_check; > diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c > index 06be419..8edd950 100644 > --- a/fs/cifs/dir.c > +++ b/fs/cifs/dir.c > @@ -44,6 +44,37 @@ renew_parental_timestamps(struct dentry *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 */ > char * > build_path_from_dentry(struct dentry *direntry) > diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c > index 83c2d1e..77295f2 100644 > --- a/fs/cifs/smb1ops.c > +++ b/fs/cifs/smb1ops.c > @@ -575,37 +575,6 @@ cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, > 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 > cifs_clear_stats(struct cifs_tcon *tcon) > { > @@ -945,7 +914,6 @@ struct smb_version_operations smb1_operations = { > .set_path_size = CIFSSMBSetEOF, > .set_file_size = CIFSSMBSetFileSize, > .set_file_info = smb_set_file_info, > - .build_path_to_root = cifs_build_path_to_root, > .echo = CIFSSMBEcho, > .mkdir = CIFSSMBMkDir, > .mkdir_setinfo = cifs_mkdir_setinfo, > diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c > index 94ac152..96e2a1b 100644 > --- a/fs/cifs/smb2ops.c > +++ b/fs/cifs/smb2ops.c > @@ -263,23 +263,6 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, > 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 > smb2_can_echo(struct TCP_Server_Info *server) > { > @@ -615,7 +598,6 @@ struct smb_version_operations smb21_operations = { > .set_path_size = smb2_set_path_size, > .set_file_size = smb2_set_file_size, > .set_file_info = smb2_set_file_info, > - .build_path_to_root = smb2_build_path_to_root, > .mkdir = smb2_mkdir, > .mkdir_setinfo = smb2_mkdir_setinfo, > .rmdir = smb2_rmdir, Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html