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
committerSteve French <stfrench@microsoft.com>2024-03-11 03:33:58 +0300
commit78e26bec4d6d3aef04276e28bed48a45fd00e116 (patch)
tree460a2bf8e0c04a82778af9eaeb79532a019f181b /fs/smb/client/reparse.h
parentea41367b2a602f602ea6594fc4a310520dcc64f4 (diff)
downloadlinux-78e26bec4d6d3aef04276e28bed48a45fd00e116.tar.xz
smb: client: parse uid, gid, mode and dev from WSL reparse points
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>
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) {