From: "Eric W. Biederman" <ebied...@xmission.com>

Cc: Anton Altaparmakov <an...@tuxera.com>
Acked-by: Serge Hallyn <serge.hal...@canonical.com>
Signed-off-by: Eric W. Biederman <ebied...@xmission.com>
---
 fs/ntfs/inode.c  |    7 ++++---
 fs/ntfs/super.c  |   39 ++++++++++++++++++++++++++++++++-------
 fs/ntfs/volume.h |    5 +++--
 init/Kconfig     |    1 -
 4 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
index c6dbd3d..1d27331 100644
--- a/fs/ntfs/inode.c
+++ b/fs/ntfs/inode.c
@@ -2124,7 +2124,8 @@ int ntfs_read_inode_mount(struct inode *vi)
                         * ntfs_read_inode() will have set up the default ones.
                         */
                        /* Set uid and gid to root. */
-                       vi->i_uid = vi->i_gid = 0;
+                       vi->i_uid = GLOBAL_ROOT_UID;
+                       vi->i_gid = GLOBAL_ROOT_GID;
                        /* Regular file. No access for anyone. */
                        vi->i_mode = S_IFREG;
                        /* No VFS initiated operations allowed for $MFT. */
@@ -2312,8 +2313,8 @@ int ntfs_show_options(struct seq_file *sf, struct dentry 
*root)
        ntfs_volume *vol = NTFS_SB(root->d_sb);
        int i;
 
-       seq_printf(sf, ",uid=%i", vol->uid);
-       seq_printf(sf, ",gid=%i", vol->gid);
+       seq_printf(sf, ",uid=%i", from_kuid_munged(&init_user_ns, vol->uid));
+       seq_printf(sf, ",gid=%i", from_kgid_munged(&init_user_ns, vol->gid));
        if (vol->fmask == vol->dmask)
                seq_printf(sf, ",umask=0%o", vol->fmask);
        else {
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
index 2bc149d..da01c16 100644
--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -102,8 +102,8 @@ static bool parse_options(ntfs_volume *vol, char *opt)
        char *p, *v, *ov;
        static char *utf8 = "utf8";
        int errors = 0, sloppy = 0;
-       uid_t uid = (uid_t)-1;
-       gid_t gid = (gid_t)-1;
+       kuid_t uid = INVALID_UID;
+       kgid_t gid = INVALID_GID;
        umode_t fmask = (umode_t)-1, dmask = (umode_t)-1;
        int mft_zone_multiplier = -1, on_errors = -1;
        int show_sys_files = -1, case_sensitive = -1, disable_sparse = -1;
@@ -128,6 +128,30 @@ static bool parse_options(ntfs_volume *vol, char *opt)
                if (*v)                                                 \
                        goto needs_val;                                 \
        }
+#define NTFS_GETOPT_UID(option, variable)                              \
+       if (!strcmp(p, option)) {                                       \
+               uid_t uid_value;                                        \
+               if (!v || !*v)                                          \
+                       goto needs_arg;                                 \
+               uid_value = simple_strtoul(ov = v, &v, 0);              \
+               if (*v)                                                 \
+                       goto needs_val;                                 \
+               variable = make_kuid(current_user_ns(), uid_value);     \
+               if (!uid_valid(variable))                               \
+                       goto needs_val;                                 \
+       }
+#define NTFS_GETOPT_GID(option, variable)                              \
+       if (!strcmp(p, option)) {                                       \
+               gid_t gid_value;                                        \
+               if (!v || !*v)                                          \
+                       goto needs_arg;                                 \
+               gid_value = simple_strtoul(ov = v, &v, 0);              \
+               if (*v)                                                 \
+                       goto needs_val;                                 \
+               variable = make_kgid(current_user_ns(), gid_value);     \
+               if (!gid_valid(variable))                               \
+                       goto needs_val;                                 \
+       }
 #define NTFS_GETOPT_OCTAL(option, variable)                            \
        if (!strcmp(p, option)) {                                       \
                if (!v || !*v)                                          \
@@ -165,8 +189,8 @@ static bool parse_options(ntfs_volume *vol, char *opt)
        while ((p = strsep(&opt, ","))) {
                if ((v = strchr(p, '=')))
                        *v++ = 0;
-               NTFS_GETOPT("uid", uid)
-               else NTFS_GETOPT("gid", gid)
+               NTFS_GETOPT_UID("uid", uid)
+               else NTFS_GETOPT_GID("gid", gid)
                else NTFS_GETOPT_OCTAL("umask", fmask = dmask)
                else NTFS_GETOPT_OCTAL("fmask", fmask)
                else NTFS_GETOPT_OCTAL("dmask", dmask)
@@ -283,9 +307,9 @@ no_mount_options:
                vol->on_errors = on_errors;
        if (!vol->on_errors || vol->on_errors == ON_ERRORS_RECOVER)
                vol->on_errors |= ON_ERRORS_CONTINUE;
-       if (uid != (uid_t)-1)
+       if (uid_valid(uid))
                vol->uid = uid;
-       if (gid != (gid_t)-1)
+       if (gid_valid(gid))
                vol->gid = gid;
        if (fmask != (umode_t)-1)
                vol->fmask = fmask;
@@ -1023,7 +1047,8 @@ static bool load_and_init_mft_mirror(ntfs_volume *vol)
         * ntfs_read_inode() will have set up the default ones.
         */
        /* Set uid and gid to root. */
-       tmp_ino->i_uid = tmp_ino->i_gid = 0;
+       tmp_ino->i_uid = GLOBAL_ROOT_UID;
+       tmp_ino->i_gid = GLOBAL_ROOT_GID;
        /* Regular file.  No access for anyone. */
        tmp_ino->i_mode = S_IFREG;
        /* No VFS initiated operations allowed for $MFTMirr. */
diff --git a/fs/ntfs/volume.h b/fs/ntfs/volume.h
index 15e3ba8..4f579b0 100644
--- a/fs/ntfs/volume.h
+++ b/fs/ntfs/volume.h
@@ -25,6 +25,7 @@
 #define _LINUX_NTFS_VOLUME_H
 
 #include <linux/rwsem.h>
+#include <linux/uidgid.h>
 
 #include "types.h"
 #include "layout.h"
@@ -46,8 +47,8 @@ typedef struct {
                                           sized blocks on the device. */
        /* Configuration provided by user at mount time. */
        unsigned long flags;            /* Miscellaneous flags, see below. */
-       uid_t uid;                      /* uid that files will be mounted as. */
-       gid_t gid;                      /* gid that files will be mounted as. */
+       kuid_t uid;                     /* uid that files will be mounted as. */
+       kgid_t gid;                     /* gid that files will be mounted as. */
        umode_t fmask;                  /* The mask for file permissions. */
        umode_t dmask;                  /* The mask for directory
                                           permissions. */
diff --git a/init/Kconfig b/init/Kconfig
index 90c9e06..0f65a02 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -949,7 +949,6 @@ config UIDGID_CONVERTED
        depends on NCP_FS = n
        depends on NFSD = n
        depends on NFS_FS = n
-       depends on NTFS_FS = n
        depends on OCFS2_FS = n
        depends on OMFS_FS = n
        depends on QNX4FS_FS = n
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to