Created
May 7, 2014 16:08
-
-
Save exdeniz/6f88056edc8922c678c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/inode.c prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c | |
--- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/inode.c 2013-11-11 17:56:58.000000000 +0200 | |
+++ prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c 2013-11-29 20:41:53.689167040 +0200 | |
@@ -199,10 +199,18 @@ | |
if (attr->valid & _PATTR_MODE) | |
inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 0777); | |
if ((attr->valid & _PATTR_UID) && | |
- (sbi->plain || sbi->share || attr->uid == -1)) | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ (sbi->plain || sbi->share || __kuid_val(attr->uid) == -1)) | |
+#else | |
+ (sbi->plain || sbi->share || attr->uid == -1))) | |
+#endif | |
inode->i_uid = attr->uid; | |
if ((attr->valid & _PATTR_GID) && | |
- (sbi->plain || sbi->share || attr->gid == -1)) | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ (sbi->plain || sbi->share || __kgid_val(attr->gid) == -1)) | |
+#else | |
+ (sbi->plain || sbi->share || attr->gid == -1))) | |
+#endif | |
inode->i_gid = attr->gid; | |
return; | |
} | |
@@ -521,13 +529,21 @@ | |
generic_fillattr(dentry->d_inode, stat); | |
if (PRLFS_SB(dentry->d_sb)->share) { | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ if (__kuid_val(stat->uid) != -1) | |
+#else | |
if (stat->uid != -1) | |
+#endif | |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
stat->uid = current->fsuid; | |
#else | |
stat->uid = current->cred->fsuid; | |
#endif | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ if (__kgid_val(stat->gid) != -1) | |
+#else | |
if (stat->gid != -1) | |
+#endif | |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
stat->gid = current->fsgid; | |
#else | |
@@ -577,9 +593,17 @@ | |
mode = inode->i_mode; | |
isdir = S_ISDIR(mode); | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ if (__kuid_val(inode->i_uid) != -1) | |
+#else | |
if (inode->i_uid != -1) | |
+#endif | |
mode = mode >> 6; | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ else if (__kgid_val(inode->i_gid) != -1) | |
+#else | |
else if (inode->i_gid != -1) | |
+#endif | |
mode = mode >> 3; | |
mode &= 0007; | |
mask &= MAY_READ | MAY_WRITE | MAY_EXEC; | |
diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/prlfs.h prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h | |
--- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/prlfs.h 2013-11-11 17:56:58.000000000 +0200 | |
+++ prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h 2013-11-29 20:46:27.662771996 +0200 | |
@@ -28,8 +28,13 @@ | |
struct pci_dev *pdev; | |
unsigned sfid; | |
unsigned ttl; | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ kuid_t uid; | |
+ kgid_t gid; | |
+#else | |
uid_t uid; | |
gid_t gid; | |
+#endif | |
int readonly; | |
int share; | |
int plain; | |
diff -Nru prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/super.c prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c | |
--- prl_fs.orig/SharedFolders/Guest/Linux/prl_fs/super.c 2013-11-11 17:56:58.000000000 +0200 | |
+++ prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c 2013-11-29 20:28:39.212000000 +0200 | |
@@ -13,6 +13,7 @@ | |
#include <linux/seq_file.h> | |
#include <linux/ctype.h> | |
#include <linux/vfs.h> | |
+#include <linux/parser.h> | |
#include "prlfs.h" | |
#include "prlfs_compat.h" | |
@@ -26,38 +27,35 @@ | |
extern struct file_operations prlfs_names_fops; | |
extern struct inode_operations prlfs_names_iops; | |
-static int prlfs_strtoui(char *cp, unsigned *result){ | |
- int ret = 0; | |
- unsigned ui = 0; | |
- unsigned digit; | |
- | |
- if (!cp || (*cp == 0)) | |
- return -EINVAL; | |
- | |
- while (*cp) { | |
- if (isdigit(*cp)) { | |
- digit = *cp - '0'; | |
- } else { | |
- ret = -EINVAL; | |
- break; | |
- } | |
- if (ui > ui * 10U + digit) | |
- return -EINVAL; | |
- ui = ui * 10U + digit; | |
- cp++; | |
- } | |
- | |
- if (ret == 0) | |
- *result = ui; | |
- | |
- return ret; | |
-} | |
+enum { | |
+ Opt_uid, | |
+ Opt_gid, | |
+ Opt_ttl, | |
+ Opt_nls, | |
+ Opt_share, | |
+ Opt_plain, | |
+ Opt_sf, | |
+ Opt_err, | |
+}; | |
+ | |
+static const match_table_t prlfs_tokens = { | |
+ {Opt_uid, "uid=%d"}, | |
+ {Opt_gid, "gid=%d"}, | |
+ {Opt_ttl, "ttl=%u"}, | |
+ {Opt_nls, "nls=%s"}, | |
+ {Opt_share, "share"}, | |
+ {Opt_plain, "plain"}, | |
+ {Opt_sf, "sf=%s"}, | |
+ {Opt_err, NULL} | |
+}; | |
static int | |
prlfs_parse_mount_options(char *options, struct prlfs_sb_info *sbi) | |
{ | |
+ substring_t args[MAX_OPT_ARGS]; | |
int ret = 0; | |
- char *opt, *val; | |
+ int val; | |
+ char *opt; | |
DPRINTK("ENTER\n"); | |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
@@ -70,35 +68,54 @@ | |
sbi->ttl = HZ; | |
if (!options) | |
- goto out; | |
+ goto out; | |
- while (!ret && (opt = strsep(&options, ",")) != NULL) | |
+ while (!ret && ((opt = strsep(&options, ",")) != NULL)) | |
{ | |
+ int token; | |
if (!*opt) | |
continue; | |
- val = strchr(opt, '='); | |
- if (val) { | |
- *(val++) = 0; | |
- if (strlen(val) == 0) | |
- val = NULL; | |
- } | |
- if (!strcmp(opt, "ttl") && val) | |
- ret = prlfs_strtoui(val, &sbi->ttl); | |
- else if (!strcmp(opt, "uid") && val) | |
- ret = prlfs_strtoui(val, &sbi->uid); | |
- else if (!strcmp(opt, "gid") && val) | |
- ret = prlfs_strtoui(val, &sbi->gid); | |
- else if (!strcmp(opt, "nls") && val) | |
- strncpy(sbi->nls, val, LOCALE_NAME_LEN - 1); | |
- else if (!strcmp(opt, "share")) | |
+ token = match_token(opt, prlfs_tokens, args); | |
+ switch (token) { | |
+ case Opt_uid: | |
+ if (!(ret = match_int(&args[0], &val))) | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ sbi->uid = KUIDT_INIT(val); | |
+#else | |
+ sbi->uid = val; | |
+#endif | |
+ break; | |
+ case Opt_gid: | |
+ if (!(ret = match_int(&args[0], &val))) | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ sbi->gid = KGIDT_INIT(val); | |
+#else | |
+ sbi->gid = val; | |
+#endif | |
+ break; | |
+ case Opt_ttl: | |
+ if (!(ret = match_int(&args[0], &val))) | |
+ sbi->ttl = val; | |
+ break; | |
+ case Opt_nls: | |
+ if (!match_strlcpy(sbi->nls, &args[0], LOCALE_NAME_LEN - 1)) | |
+ ret = -EINVAL; | |
+ break; | |
+ case Opt_share: | |
sbi->share = 1; | |
- else if (!strcmp(opt, "plain")) | |
+ break; | |
+ case Opt_plain: | |
sbi->plain = 1; | |
- else if (!strcmp(opt, "sf") && val) | |
- strncpy(sbi->name, val, sizeof(sbi->name)); | |
- else | |
+ break; | |
+ case Opt_sf: | |
+ if (!match_strlcpy(sbi->name, &args[0], sizeof(sbi->name))) | |
+ ret = -EINVAL; | |
+ break; | |
+ default: | |
ret = -EINVAL; | |
+ } | |
+ DPRINTK("PARSE interating %d:%d:%s\n", token, val, args[0]); | |
} | |
out: | |
DPRINTK("EXIT returning %d\n", ret); | |
diff -Nru prl_fs.orig/SharedFolders/Interfaces/sf_lin.h prl_fs/SharedFolders/Interfaces/sf_lin.h | |
--- prl_fs.orig/SharedFolders/Interfaces/sf_lin.h 2013-11-11 18:11:49.000000000 +0200 | |
+++ prl_fs/SharedFolders/Interfaces/sf_lin.h 2013-11-29 03:11:48.924415600 +0200 | |
@@ -40,8 +40,13 @@ | |
unsigned long long mtime; | |
unsigned long long ctime; | |
unsigned int mode; | |
- unsigned int uid; | |
- unsigned int gid; | |
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) | |
+ kuid_t uid; | |
+ kgid_t gid; | |
+#else | |
+ uid_t uid; | |
+ gid_t gid; | |
+#endif | |
unsigned int valid; | |
} PACKED; | |
SFLIN_CHECK_SIZE(prlfs_attr, sizeof(struct prlfs_attr), 48) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment