summaryrefslogtreecommitdiff
path: root/fs/smb/client/reparse.h
diff options
context:
space:
mode:
authorPaulo Alcantara <pc@manguebit.com>2024-01-29 03:52:03 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-05-25 17:22:48 +0300
commit97db416045554ab33533536b04398037d49e532e (patch)
tree3fe2bb69610bb3fe451a71452f70de993a774b0c /fs/smb/client/reparse.h
parent7449d736bbbd160c76b01b8fcdf72f58a8757d4b (diff)
downloadlinux-97db416045554ab33533536b04398037d49e532e.tar.xz
smb: client: parse uid, gid, mode and dev from WSL reparse points
[ Upstream commit 78e26bec4d6d3aef04276e28bed48a45fd00e116 ] Parse the extended attributes from WSL reparse points to correctly report uid, gid mode and dev from ther instantiated inodes. Signed-off-by: Paulo Alcantara <pc@manguebit.com> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs/smb/client/reparse.h')
-rw-r--r--fs/smb/client/reparse.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/fs/smb/client/reparse.h b/fs/smb/client/reparse.h
index 9816bac98552..6b55d1df9e2f 100644
--- a/fs/smb/client/reparse.h
+++ b/fs/smb/client/reparse.h
@@ -8,6 +8,8 @@
#include <linux/fs.h>
#include <linux/stat.h>
+#include <linux/uidgid.h>
+#include "fs_context.h"
#include "cifsglob.h"
static inline dev_t reparse_nfs_mkdev(struct reparse_posix_data *buf)
@@ -17,6 +19,33 @@ static inline dev_t reparse_nfs_mkdev(struct reparse_posix_data *buf)
return MKDEV(v >> 32, v & 0xffffffff);
}
+static inline dev_t wsl_mkdev(void *ptr)
+{
+ u64 v = le64_to_cpu(*(__le64 *)ptr);
+
+ return MKDEV(v & 0xffffffff, v >> 32);
+}
+
+static inline kuid_t wsl_make_kuid(struct cifs_sb_info *cifs_sb,
+ void *ptr)
+{
+ u32 uid = le32_to_cpu(*(__le32 *)ptr);
+
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
+ return cifs_sb->ctx->linux_uid;
+ return make_kuid(current_user_ns(), uid);
+}
+
+static inline kgid_t wsl_make_kgid(struct cifs_sb_info *cifs_sb,
+ void *ptr)
+{
+ u32 gid = le32_to_cpu(*(__le32 *)ptr);
+
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
+ return cifs_sb->ctx->linux_gid;
+ return make_kgid(current_user_ns(), gid);
+}
+
static inline u64 reparse_mode_nfs_type(mode_t mode)
{
switch (mode & S_IFMT) {