|
@@ -489,6 +489,37 @@ cifs_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
|
|
|
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
|
}
|
|
|
|
|
|
+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;
|
|
|
+}
|
|
|
+
|
|
|
struct smb_version_operations smb1_operations = {
|
|
|
.send_cancel = send_nt_cancel,
|
|
|
.compare_fids = cifs_compare_fids,
|
|
@@ -518,6 +549,7 @@ struct smb_version_operations smb1_operations = {
|
|
|
.is_path_accessible = cifs_is_path_accessible,
|
|
|
.query_path_info = cifs_query_path_info,
|
|
|
.get_srv_inum = cifs_get_srv_inum,
|
|
|
+ .build_path_to_root = cifs_build_path_to_root,
|
|
|
};
|
|
|
|
|
|
struct smb_version_values smb1_values = {
|