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

Commit 9224dfc2 authored by Pavel Shilovsky's avatar Pavel Shilovsky
Browse files

CIFS: Move building path to root to ops struct

parent be4cb9e3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -549,7 +549,7 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)
	char *s, *p;
	char sep;

	full_path = cifs_build_path_to_root(vol, cifs_sb,
	full_path = build_path_to_root(vol, cifs_sb,
				       cifs_sb_master_tcon(cifs_sb));
	if (full_path == NULL)
		return ERR_PTR(-ENOMEM);
+13 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ struct cifs_ses;
struct cifs_tcon;
struct dfs_info3_param;
struct cifs_fattr;
struct smb_vol;

struct smb_version_operations {
	int (*send_cancel)(struct TCP_Server_Info *, void *,
@@ -227,6 +228,9 @@ struct smb_version_operations {
	int (*get_srv_inum)(const unsigned int, struct cifs_tcon *,
			    struct cifs_sb_info *, const char *,
			    u64 *uniqueid, FILE_ALL_INFO *);
	/* 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 *);
};

struct smb_version_values {
@@ -803,6 +807,15 @@ 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

+0 −3
Original line number Diff line number Diff line
@@ -57,9 +57,6 @@ 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,
+1 −1
Original line number Diff line number Diff line
@@ -3684,7 +3684,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
			goto mount_fail_check;
		}
		/* build_path_to_root works only when we have a valid tcon */
		full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
		full_path = build_path_to_root(volume_info, cifs_sb, tcon);
		if (full_path == NULL) {
			rc = -ENOMEM;
			goto mount_fail_check;
+0 −32
Original line number Diff line number Diff line
@@ -731,38 +731,6 @@ static const struct inode_operations cifs_ipc_inode_ops = {
	.lookup = cifs_lookup,
};

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 = kmalloc(1, GFP_KERNEL);
		if (full_path)
			full_path[0] = 0;
		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 int
cifs_find_inode(struct inode *inode, void *opaque)
{
Loading