Commit 7ac9bcd5da59dd96eb1153d3fc04c3471fa5c09d
Committed by
Jan Kara
1 parent
530f1a5e3e
Exists in
master
and in
4 other branches
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. |
fs/udf/inode.c
... | ... | @@ -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) << |
fs/udf/super.c
... | ... | @@ -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 */ |