|
@@ -2781,6 +2781,24 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
|
|
|
+{
|
|
|
+ struct cifs_sb_info *old = CIFS_SB(sb);
|
|
|
+ struct cifs_sb_info *new = mnt_data->cifs_sb;
|
|
|
+
|
|
|
+ if (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) {
|
|
|
+ if (!(new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH))
|
|
|
+ return 0;
|
|
|
+ /* The prepath should be null terminated strings */
|
|
|
+ if (strcmp(new->prepath, old->prepath))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
cifs_match_super(struct super_block *sb, void *data)
|
|
|
{
|
|
@@ -2808,7 +2826,8 @@ cifs_match_super(struct super_block *sb, void *data)
|
|
|
|
|
|
if (!match_server(tcp_srv, volume_info) ||
|
|
|
!match_session(ses, volume_info) ||
|
|
|
- !match_tcon(tcon, volume_info->UNC)) {
|
|
|
+ !match_tcon(tcon, volume_info->UNC) ||
|
|
|
+ !match_prepath(sb, mnt_data)) {
|
|
|
rc = 0;
|
|
|
goto out;
|
|
|
}
|
|
@@ -3222,7 +3241,7 @@ void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
|
|
|
+int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
|
|
|
struct cifs_sb_info *cifs_sb)
|
|
|
{
|
|
|
INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
|
|
@@ -3316,6 +3335,14 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
|
|
|
|
|
|
if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
|
|
|
cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
|
|
|
+
|
|
|
+ if (pvolume_info->prepath) {
|
|
|
+ cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
|
|
|
+ if (cifs_sb->prepath == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void
|