From 8d81094b01532c758cc166325997cd3c36a3dbd8 Mon Sep 17 00:00:00 2001 From: "Andries E. Brouwer" Date: Sun, 1 Dec 2002 04:22:13 -0800 Subject: [PATCH] fix wrong permissions for vfat directories This fixes the umask/fmask/dmask confusion in vfat. --- fs/fat/inode.c | 18 +++++++++++++----- fs/umsdos/ioctl.c | 4 +++- include/linux/msdos_fs_sb.h | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/fs/fat/inode.c b/fs/fat/inode.c index b852c46cdbb2..6ad055bba0b0 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -205,7 +205,7 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt) seq_printf(m, ",uid=%d", opts->fs_uid); if (opts->fs_gid != 0) seq_printf(m, ",gid=%d", opts->fs_gid); - seq_printf(m, ",umask=%04o", opts->fs_umask); + seq_printf(m, ",fmask=%04o", opts->fs_fmask); seq_printf(m, ",dmask=%04o", opts->fs_dmask); if (sbi->nls_disk) seq_printf(m, ",codepage=%s", sbi->nls_disk->charset); @@ -267,7 +267,7 @@ static int parse_options(char *options, int is_vfat, int *debug, opts->fs_uid = current->uid; opts->fs_gid = current->gid; - opts->fs_umask = opts->fs_dmask = current->fs->umask; + opts->fs_fmask = opts->fs_dmask = current->fs->umask; opts->codepage = 0; opts->iocharset = NULL; if (is_vfat) @@ -333,7 +333,15 @@ static int parse_options(char *options, int is_vfat, int *debug, else if (!strcmp(this_char,"umask")) { if (!value || !*value) ret = 0; else { - opts->fs_umask = simple_strtoul(value,&value,8); + opts->fs_fmask = opts->fs_dmask = + simple_strtoul(value,&value,8); + if (*value) ret = 0; + } + } + else if (!strcmp(this_char,"fmask")) { + if (!value || !*value) ret = 0; + else { + opts->fs_fmask = simple_strtoul(value,&value,8); if (*value) ret = 0; } } @@ -1119,7 +1127,7 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de) ((sbi->options.showexec && !is_exec(de->ext)) ? S_IRUGO|S_IWUGO : S_IRWXUGO) - & ~sbi->options.fs_umask) | S_IFREG; + & ~sbi->options.fs_fmask) | S_IFREG; MSDOS_I(inode)->i_start = CF_LE_W(de->start); if (sbi->fat_bits == 32) { MSDOS_I(inode)->i_start |= @@ -1253,7 +1261,7 @@ int fat_notify_change(struct dentry * dentry, struct iattr * attr) if (S_ISDIR(inode->i_mode)) mask = sbi->options.fs_dmask; else - mask = sbi->options.fs_umask; + mask = sbi->options.fs_fmask; inode->i_mode &= S_IFMT | (S_IRWXUGO & ~mask); out: unlock_kernel(); diff --git a/fs/umsdos/ioctl.c b/fs/umsdos/ioctl.c index 722581c1a53f..323c2dbcccd0 100644 --- a/fs/umsdos/ioctl.c +++ b/fs/umsdos/ioctl.c @@ -430,7 +430,9 @@ new_dentry->d_parent->d_name.name, new_dentry->d_name.name); */ dir->i_sb->u.msdos_sb.options.fs_uid = data.umsdos_dirent.uid; dir->i_sb->u.msdos_sb.options.fs_gid = data.umsdos_dirent.gid; - dir->i_sb->u.msdos_sb.options.fs_umask = data.umsdos_dirent.mode; + dir->i_sb->u.msdos_sb.options.fs_fmask = + dir->i_sb->u.msdos_sb.options.fs_dmask = + data.umsdos_dirent.mode; ret = 0; } out: diff --git a/include/linux/msdos_fs_sb.h b/include/linux/msdos_fs_sb.h index 3b84157867e9..317a02cd7c88 100644 --- a/include/linux/msdos_fs_sb.h +++ b/include/linux/msdos_fs_sb.h @@ -8,7 +8,7 @@ struct fat_mount_options { uid_t fs_uid; gid_t fs_gid; - unsigned short fs_umask; + unsigned short fs_fmask; unsigned short fs_dmask; unsigned short codepage; /* Codepage for shortname conversions */ char *iocharset; /* Charset used for filename input/display */ -- cgit v1.2.3