Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Marcin Slusarz and committed by
Jan Kara
7ac9bcd5 530f1a5e

+43 -3
+2
Documentation/filesystems/udf.txt
··· 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.
+9 -2
fs/udf/inode.c
··· 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) <<
+30 -1
fs/udf/super.c
··· 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 ··· 284 282 seq_printf(seq, ",gid=%u", sbi->s_gid); 285 283 if (sbi->s_umask != 0) 286 284 seq_printf(seq, ",umask=%o", sbi->s_umask); 285 + if (sbi->s_fmode != -1) 286 + seq_printf(seq, ",mode=%o", sbi->s_fmode); 287 + if (sbi->s_dmode != -1) 288 + seq_printf(seq, ",dmode=%o", sbi->s_dmode); 287 289 if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) 288 290 seq_printf(seq, ",session=%u", sbi->s_session); 289 291 if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) ··· 323 317 * 324 318 * gid= Set the default group. 325 319 * umask= Set the default umask. 320 + * mode= Set the default file permissions. 321 + * dmode= Set the default directory permissions. 326 322 * uid= Set the default user. 327 323 * bs= Set the block size. 328 324 * unhide Show otherwise hidden files. ··· 374 366 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, 375 367 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, 376 368 Opt_rootdir, Opt_utf8, Opt_iocharset, 377 - Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore 369 + Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore, 370 + Opt_fmode, Opt_dmode 378 371 }; 379 372 380 373 static const match_table_t tokens = { ··· 404 395 {Opt_rootdir, "rootdir=%u"}, 405 396 {Opt_utf8, "utf8"}, 406 397 {Opt_iocharset, "iocharset=%s"}, 398 + {Opt_fmode, "mode=%o"}, 399 + {Opt_dmode, "dmode=%o"}, 407 400 {Opt_err, NULL} 408 401 }; 409 402 ··· 542 531 case Opt_gforget: 543 532 uopt->flags |= (1 << UDF_FLAG_GID_FORGET); 544 533 break; 534 + case Opt_fmode: 535 + if (match_octal(args, &option)) 536 + return 0; 537 + uopt->fmode = option & 0777; 538 + break; 539 + case Opt_dmode: 540 + if (match_octal(args, &option)) 541 + return 0; 542 + uopt->dmode = option & 0777; 543 + break; 545 544 default: 546 545 printk(KERN_ERR "udf: bad mount option \"%s\" " 547 546 "or missing value\n", p); ··· 581 560 uopt.uid = sbi->s_uid; 582 561 uopt.gid = sbi->s_gid; 583 562 uopt.umask = sbi->s_umask; 563 + uopt.fmode = sbi->s_fmode; 564 + uopt.dmode = sbi->s_dmode; 584 565 585 566 if (!udf_parse_options(options, &uopt, true)) 586 567 return -EINVAL; ··· 591 568 sbi->s_uid = uopt.uid; 592 569 sbi->s_gid = uopt.gid; 593 570 sbi->s_umask = uopt.umask; 571 + sbi->s_fmode = uopt.fmode; 572 + sbi->s_dmode = uopt.dmode; 594 573 595 574 if (sbi->s_lvid_bh) { 596 575 int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev); ··· 1894 1869 uopt.uid = -1; 1895 1870 uopt.gid = -1; 1896 1871 uopt.umask = 0; 1872 + uopt.fmode = -1; 1873 + uopt.dmode = -1; 1897 1874 1898 1875 sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); 1899 1876 if (!sbi) ··· 1933 1906 sbi->s_uid = uopt.uid; 1934 1907 sbi->s_gid = uopt.gid; 1935 1908 sbi->s_umask = uopt.umask; 1909 + sbi->s_fmode = uopt.fmode; 1910 + sbi->s_dmode = uopt.dmode; 1936 1911 sbi->s_nls_map = uopt.nls_map; 1937 1912 1938 1913 /* Set the block size for all transfers */
+2
fs/udf/udf_sb.h
··· 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;