Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d3ea7e4 authored by Steve French's avatar Steve French
Browse files

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: default avatarPavel Shilovsky <piastry@etersoft.ru>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent e5e69abd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -539,7 +539,7 @@ 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,
	full_path = cifs_build_path_to_root(vol, cifs_sb,
					    cifs_sb_master_tcon(cifs_sb));
	if (full_path == NULL)
		return ERR_PTR(-ENOMEM);
+0 −12
Original line number Diff line number Diff line
@@ -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 */
@@ -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
#define cifs_stats_inc atomic_inc

+3 −0
Original line number Diff line number Diff line
@@ -60,6 +60,9 @@ extern int init_cifs_idmap(void);
extern void exit_cifs_idmap(void);
extern void cifs_destroy_idmaptrees(void);
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 *cifs_compose_mount_options(const char *sb_mountdata,
		const char *fullpath, const struct dfs_info3_param *ref,
+8 −4
Original line number Diff line number Diff line
@@ -3261,8 +3261,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)
@@ -3518,8 +3520,10 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
			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;
+31 −0
Original line number Diff line number Diff line
@@ -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)
Loading