__u16   force_directory_mode;
        __u16   force_uid;
        __u16   force_gid;
-       __u32   reserved[128];          /* Reserved room */
+       __s8    share_name[KSMBD_REQ_MAX_SHARE_NAME];
+       __u32   reserved[112];          /* Reserved room */
        __u32   veto_list_sz;
        __s8    ____payload[];
 };
 
 #include "user_config.h"
 #include "user_session.h"
 #include "../transport_ipc.h"
+#include "../misc.h"
 
 #define SHARE_HASH_BITS                3
 static DEFINE_HASHTABLE(shares_table, SHARE_HASH_BITS);
        return 0;
 }
 
-static struct ksmbd_share_config *share_config_request(const char *name)
+static struct ksmbd_share_config *share_config_request(struct unicode_map *um,
+                                                      const char *name)
 {
        struct ksmbd_share_config_response *resp;
        struct ksmbd_share_config *share = NULL;
        if (resp->flags == KSMBD_SHARE_FLAG_INVALID)
                goto out;
 
+       if (*resp->share_name) {
+               char *cf_resp_name;
+               bool equal;
+
+               cf_resp_name = ksmbd_casefold_sharename(um, resp->share_name);
+               if (IS_ERR(cf_resp_name))
+                       goto out;
+               equal = !strcmp(cf_resp_name, name);
+               kfree(cf_resp_name);
+               if (!equal)
+                       goto out;
+       }
+
        share = kzalloc(sizeof(struct ksmbd_share_config), GFP_KERNEL);
        if (!share)
                goto out;
        return share;
 }
 
-struct ksmbd_share_config *ksmbd_share_config_get(const char *name)
+struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
+                                                 const char *name)
 {
        struct ksmbd_share_config *share;
 
 
        if (share)
                return share;
-       return share_config_request(name);
+       return share_config_request(um, name);
 }
 
 bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
 
 #include <linux/workqueue.h>
 #include <linux/hashtable.h>
 #include <linux/path.h>
+#include <linux/unicode.h>
 
 struct ksmbd_share_config {
        char                    *name;
        __ksmbd_share_config_put(share);
 }
 
-struct ksmbd_share_config *ksmbd_share_config_get(const char *name);
+struct ksmbd_share_config *ksmbd_share_config_get(struct unicode_map *um,
+                                                 const char *name);
 bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
                               const char *filename);
 #endif /* __SHARE_CONFIG_MANAGEMENT_H__ */
 
        struct sockaddr *peer_addr;
        int ret;
 
-       sc = ksmbd_share_config_get(share_name);
+       sc = ksmbd_share_config_get(conn->um, share_name);
        if (!sc)
                return status;
 
                struct ksmbd_share_config *new_sc;
 
                ksmbd_share_config_del(sc);
-               new_sc = ksmbd_share_config_get(share_name);
+               new_sc = ksmbd_share_config_get(conn->um, share_name);
                if (!new_sc) {
                        pr_err("Failed to update stale share config\n");
                        status.ret = -ESTALE;
 
        strreplace(path, '/', '\\');
 }
 
-static char *casefold_sharename(struct unicode_map *um, const char *name)
+char *ksmbd_casefold_sharename(struct unicode_map *um, const char *name)
 {
        char *cf_name;
        int cf_len;
                name = (pos + 1);
 
        /* caller has to free the memory */
-       return casefold_sharename(um, name);
+       return ksmbd_casefold_sharename(um, name);
 }
 
 /**
 
 void ksmbd_conv_path_to_unix(char *path);
 void ksmbd_strip_last_slash(char *path);
 void ksmbd_conv_path_to_windows(char *path);
+char *ksmbd_casefold_sharename(struct unicode_map *um, const char *name);
 char *ksmbd_extract_sharename(struct unicode_map *um, const char *treename);
 char *convert_to_unix_name(struct ksmbd_share_config *share, const char *name);