diff mbox

CIFS: Make use of common cifs_build_path_to_root for CIFS and SMB2

Message ID 1353584366-26341-1-git-send-email-piastry@etersoft.ru (mailing list archive)
State New, archived
Headers show

Commit Message

Pavel Shilovsky Nov. 22, 2012, 11:39 a.m. UTC
because the is no difference here. This also adds support of prefixpath
mount option for SMB2.

Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
---
 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(-)

Comments

Jeff Layton Nov. 23, 2012, 11:34 a.m. UTC | #1
On Thu, 22 Nov 2012 15:39:26 +0400
Pavel Shilovsky <piastry@etersoft.ru> wrote:

> because the is no difference here. This also adds support of prefixpath
> mount option for SMB2.
> 
> Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
> ---
>  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@redhat.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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,