d_info->name_len        = namlen;
        rc = reserve_populate_dentry(d_info, priv->info_level);
        if (rc)
 -              return rc;
 -      if (d_info->flags & SMB2_RETURN_SINGLE_ENTRY) {
 +              return false;
 +      if (d_info->flags & SMB2_RETURN_SINGLE_ENTRY)
                d_info->out_buf_len = 0;
 -              return 0;
 -      }
 -      return 0;
 +      return true;
  }
  
- static void restart_ctx(struct dir_context *ctx)
- {
-       ctx->pos = 0;
- }
- 
  static int verify_info_level(int info_level)
  {
        switch (info_level) {
 
        buf = container_of(ctx, struct ksmbd_readdir_data, ctx);
  
        if (buf->used != namlen)
 -              return 0;
 +              return true;
-       if (!strncasecmp((char *)buf->private, name, namlen)) {
+       if (IS_ENABLED(CONFIG_UNICODE) && buf->um) {
+               const struct qstr q_buf = {.name = buf->private,
+                                          .len = buf->used};
+               const struct qstr q_name = {.name = name,
+                                           .len = namlen};
+ 
+               cmp = utf8_strncasecmp(buf->um, &q_buf, &q_name);
+       }
+       if (cmp < 0)
+               cmp = strncasecmp((char *)buf->private, name, namlen);
+       if (!cmp) {
                memcpy((char *)buf->private, name, namlen);
                buf->dirent_count = 1;
 -              return -EEXIST;
 +              return false;
        }
 -      return 0;
 +      return true;
  }
  
  /**