Commit 9b7880e7 authored by Jan Kara's avatar Jan Kara Committed by Linus Torvalds

isofs: implement dmode option

Implement dmode option for iso9660 filesystem to allow setting of access
rights for directories on the filesystem.
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Cc: "Ilya N. Golubev" <gin@mo.msk.ru>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6d141c3f
...@@ -24,6 +24,7 @@ Mount options unique to the isofs filesystem. ...@@ -24,6 +24,7 @@ Mount options unique to the isofs filesystem.
map=normal Map non-Rock Ridge filenames to lower case map=normal Map non-Rock Ridge filenames to lower case
map=acorn As map=normal but also apply Acorn extensions if present map=acorn As map=normal but also apply Acorn extensions if present
mode=xxx Sets the permissions on files to xxx mode=xxx Sets the permissions on files to xxx
dmode=xxx Sets the permissions on directories to xxx
nojoliet Ignore Joliet extensions if they are present. nojoliet Ignore Joliet extensions if they are present.
norock Ignore Rock Ridge extensions if they are present. norock Ignore Rock Ridge extensions if they are present.
hide Completely strip hidden files from the file system. hide Completely strip hidden files from the file system.
......
...@@ -144,7 +144,8 @@ struct iso9660_options{ ...@@ -144,7 +144,8 @@ struct iso9660_options{
char nocompress; char nocompress;
unsigned char check; unsigned char check;
unsigned int blocksize; unsigned int blocksize;
mode_t mode; mode_t fmode;
mode_t dmode;
gid_t gid; gid_t gid;
uid_t uid; uid_t uid;
char *iocharset; char *iocharset;
...@@ -305,7 +306,7 @@ enum { ...@@ -305,7 +306,7 @@ enum {
Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore, Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore,
Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet, Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet,
Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err, Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err,
Opt_nocompress, Opt_hide, Opt_showassoc, Opt_nocompress, Opt_hide, Opt_showassoc, Opt_dmode,
}; };
static match_table_t tokens = { static match_table_t tokens = {
...@@ -332,6 +333,7 @@ static match_table_t tokens = { ...@@ -332,6 +333,7 @@ static match_table_t tokens = {
{Opt_uid, "uid=%u"}, {Opt_uid, "uid=%u"},
{Opt_gid, "gid=%u"}, {Opt_gid, "gid=%u"},
{Opt_mode, "mode=%u"}, {Opt_mode, "mode=%u"},
{Opt_dmode, "dmode=%u"},
{Opt_block, "block=%u"}, {Opt_block, "block=%u"},
{Opt_ignore, "conv=binary"}, {Opt_ignore, "conv=binary"},
{Opt_ignore, "conv=b"}, {Opt_ignore, "conv=b"},
...@@ -359,7 +361,7 @@ static int parse_options(char *options, struct iso9660_options *popt) ...@@ -359,7 +361,7 @@ static int parse_options(char *options, struct iso9660_options *popt)
popt->check = 'u'; /* unset */ popt->check = 'u'; /* unset */
popt->nocompress = 0; popt->nocompress = 0;
popt->blocksize = 1024; popt->blocksize = 1024;
popt->mode = S_IRUGO | S_IXUGO; /* popt->fmode = popt->dmode = S_IRUGO | S_IXUGO; /*
* r-x for all. The disc could * r-x for all. The disc could
* be shared with DOS machines so * be shared with DOS machines so
* virtually anything could be * virtually anything could be
...@@ -451,7 +453,12 @@ static int parse_options(char *options, struct iso9660_options *popt) ...@@ -451,7 +453,12 @@ static int parse_options(char *options, struct iso9660_options *popt)
case Opt_mode: case Opt_mode:
if (match_int(&args[0], &option)) if (match_int(&args[0], &option))
return 0; return 0;
popt->mode = option; popt->fmode = option;
break;
case Opt_dmode:
if (match_int(&args[0], &option))
return 0;
popt->dmode = option;
break; break;
case Opt_block: case Opt_block:
if (match_int(&args[0], &option)) if (match_int(&args[0], &option))
...@@ -801,7 +808,8 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -801,7 +808,8 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
* on the disk as suid, so we merely allow them to set the default * on the disk as suid, so we merely allow them to set the default
* permissions. * permissions.
*/ */
sbi->s_mode = opt.mode & 0777; sbi->s_fmode = opt.fmode & 0777;
sbi->s_dmode = opt.dmode & 0777;
/* /*
* Read the root inode, which _may_ result in changing * Read the root inode, which _may_ result in changing
...@@ -1248,7 +1256,7 @@ static int isofs_read_inode(struct inode *inode) ...@@ -1248,7 +1256,7 @@ static int isofs_read_inode(struct inode *inode)
ei->i_file_format = isofs_file_normal; ei->i_file_format = isofs_file_normal;
if (de->flags[-high_sierra] & 2) { if (de->flags[-high_sierra] & 2) {
inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR; inode->i_mode = sbi->s_dmode | S_IFDIR;
inode->i_nlink = 1; /* inode->i_nlink = 1; /*
* Set to 1. We know there are 2, but * Set to 1. We know there are 2, but
* the find utility tries to optimize * the find utility tries to optimize
...@@ -1258,9 +1266,8 @@ static int isofs_read_inode(struct inode *inode) ...@@ -1258,9 +1266,8 @@ static int isofs_read_inode(struct inode *inode)
*/ */
} else { } else {
/* Everybody gets to read the file. */ /* Everybody gets to read the file. */
inode->i_mode = sbi->s_mode; inode->i_mode = sbi->s_fmode | S_IFREG;
inode->i_nlink = 1; inode->i_nlink = 1;
inode->i_mode |= S_IFREG;
} }
inode->i_uid = sbi->s_uid; inode->i_uid = sbi->s_uid;
inode->i_gid = sbi->s_gid; inode->i_gid = sbi->s_gid;
......
...@@ -51,7 +51,8 @@ struct isofs_sb_info { ...@@ -51,7 +51,8 @@ struct isofs_sb_info {
unsigned char s_hide; unsigned char s_hide;
unsigned char s_showassoc; unsigned char s_showassoc;
mode_t s_mode; mode_t s_fmode;
mode_t s_dmode;
gid_t s_gid; gid_t s_gid;
uid_t s_uid; uid_t s_uid;
struct nls_table *s_nls_iocharset; /* Native language support table */ struct nls_table *s_nls_iocharset; /* Native language support table */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment