Commit 7ac9bcd5da59dd96eb1153d3fc04c3471fa5c09d

Authored by Marcin Slusarz
Committed by Jan Kara
1 parent 530f1a5e3e

udf: implement mode and dmode mounting options

"dmode" allows overriding permissions of directories and
"mode" allows overriding permissions of files.

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Jan Kara <jack@suse.cz>

Showing 4 changed files with 43 additions and 3 deletions Side-by-side Diff

Documentation/filesystems/udf.txt
... ... @@ -24,6 +24,8 @@
24 24  
25 25 gid= Set the default group.
26 26 umask= Set the default umask.
  27 + mode= Set the default file permissions.
  28 + dmode= Set the default directory permissions.
27 29 uid= Set the default user.
28 30 bs= Set the block size.
29 31 unhide Show otherwise hidden files.
... ... @@ -1222,8 +1222,15 @@
1222 1222 inode->i_size = le64_to_cpu(fe->informationLength);
1223 1223 iinfo->i_lenExtents = inode->i_size;
1224 1224  
1225   - inode->i_mode = udf_convert_permissions(fe);
1226   - inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
  1225 + if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY &&
  1226 + sbi->s_fmode != -1)
  1227 + inode->i_mode = sbi->s_fmode;
  1228 + else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY &&
  1229 + sbi->s_dmode != -1)
  1230 + inode->i_mode = sbi->s_dmode;
  1231 + else
  1232 + inode->i_mode = udf_convert_permissions(fe);
  1233 + inode->i_mode &= ~sbi->s_umask;
1227 1234  
1228 1235 if (iinfo->i_efe == 0) {
1229 1236 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
... ... @@ -201,6 +201,8 @@
201 201 mode_t umask;
202 202 gid_t gid;
203 203 uid_t uid;
  204 + mode_t fmode;
  205 + mode_t dmode;
204 206 struct nls_table *nls_map;
205 207 };
206 208  
... ... @@ -282,6 +284,10 @@
282 284 seq_printf(seq, ",gid=%u", sbi->s_gid);
283 285 if (sbi->s_umask != 0)
284 286 seq_printf(seq, ",umask=%o", sbi->s_umask);
  287 + if (sbi->s_fmode != -1)
  288 + seq_printf(seq, ",mode=%o", sbi->s_fmode);
  289 + if (sbi->s_dmode != -1)
  290 + seq_printf(seq, ",dmode=%o", sbi->s_dmode);
285 291 if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
286 292 seq_printf(seq, ",session=%u", sbi->s_session);
287 293 if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET))
... ... @@ -317,6 +323,8 @@
317 323 *
318 324 * gid= Set the default group.
319 325 * umask= Set the default umask.
  326 + * mode= Set the default file permissions.
  327 + * dmode= Set the default directory permissions.
320 328 * uid= Set the default user.
321 329 * bs= Set the block size.
322 330 * unhide Show otherwise hidden files.
... ... @@ -366,7 +374,8 @@
366 374 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
367 375 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
368 376 Opt_rootdir, Opt_utf8, Opt_iocharset,
369   - Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore
  377 + Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore,
  378 + Opt_fmode, Opt_dmode
370 379 };
371 380  
372 381 static const match_table_t tokens = {
... ... @@ -395,6 +404,8 @@
395 404 {Opt_rootdir, "rootdir=%u"},
396 405 {Opt_utf8, "utf8"},
397 406 {Opt_iocharset, "iocharset=%s"},
  407 + {Opt_fmode, "mode=%o"},
  408 + {Opt_dmode, "dmode=%o"},
398 409 {Opt_err, NULL}
399 410 };
400 411  
... ... @@ -531,6 +542,16 @@
531 542 case Opt_gforget:
532 543 uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
533 544 break;
  545 + case Opt_fmode:
  546 + if (match_octal(args, &option))
  547 + return 0;
  548 + uopt->fmode = option & 0777;
  549 + break;
  550 + case Opt_dmode:
  551 + if (match_octal(args, &option))
  552 + return 0;
  553 + uopt->dmode = option & 0777;
  554 + break;
534 555 default:
535 556 printk(KERN_ERR "udf: bad mount option \"%s\" "
536 557 "or missing value\n", p);
... ... @@ -560,6 +581,8 @@
560 581 uopt.uid = sbi->s_uid;
561 582 uopt.gid = sbi->s_gid;
562 583 uopt.umask = sbi->s_umask;
  584 + uopt.fmode = sbi->s_fmode;
  585 + uopt.dmode = sbi->s_dmode;
563 586  
564 587 if (!udf_parse_options(options, &uopt, true))
565 588 return -EINVAL;
... ... @@ -568,6 +591,8 @@
568 591 sbi->s_uid = uopt.uid;
569 592 sbi->s_gid = uopt.gid;
570 593 sbi->s_umask = uopt.umask;
  594 + sbi->s_fmode = uopt.fmode;
  595 + sbi->s_dmode = uopt.dmode;
571 596  
572 597 if (sbi->s_lvid_bh) {
573 598 int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev);
... ... @@ -1869,6 +1894,8 @@
1869 1894 uopt.uid = -1;
1870 1895 uopt.gid = -1;
1871 1896 uopt.umask = 0;
  1897 + uopt.fmode = -1;
  1898 + uopt.dmode = -1;
1872 1899  
1873 1900 sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
1874 1901 if (!sbi)
... ... @@ -1906,6 +1933,8 @@
1906 1933 sbi->s_uid = uopt.uid;
1907 1934 sbi->s_gid = uopt.gid;
1908 1935 sbi->s_umask = uopt.umask;
  1936 + sbi->s_fmode = uopt.fmode;
  1937 + sbi->s_dmode = uopt.dmode;
1909 1938 sbi->s_nls_map = uopt.nls_map;
1910 1939  
1911 1940 /* Set the block size for all transfers */
... ... @@ -123,6 +123,8 @@
123 123 mode_t s_umask;
124 124 gid_t s_gid;
125 125 uid_t s_uid;
  126 + mode_t s_fmode;
  127 + mode_t s_dmode;
126 128  
127 129 /* Root Info */
128 130 struct timespec s_record_time;