Signed-off-by: Ludwig Nussel <ludwig.nussel@xxxxxxx> --- Documentation/filesystems/ext2.txt | 6 ++++++ fs/ext2/inode.c | 12 ++++++++++++ fs/ext2/super.c | 35 ++++++++++++++++++++++++++++++++++- include/linux/ext2_fs_sb.h | 4 ++++ 4 files changed, 56 insertions(+), 1 deletions(-) diff --git a/Documentation/filesystems/ext2.txt b/Documentation/filesystems/ext2.txt index 67639f9..5501ae0 100644 --- a/Documentation/filesystems/ext2.txt +++ b/Documentation/filesystems/ext2.txt @@ -42,6 +42,12 @@ orlov (*) Use the Orlov block allocator. resuid=n The user ID which may use the reserved blocks. resgid=n The group ID which may use the reserved blocks. +uid=n[:m] make all files appear to belong to this is uid. + The optional second uid is actually written do disk. + +gid=n[:m] make all files appear to belong to this is gid. + The optional second gid is actually written do disk. + sb=n Use alternate superblock at this location. user_xattr Enable "user." POSIX Extended Attributes diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index e271303..7ceb73c 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -1239,6 +1239,12 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; } + if (EXT2_SB(sb)->s_uid) { + inode->i_uid = EXT2_SB(sb)->s_uid; + } + if (EXT2_SB(sb)->s_gid) { + inode->i_gid = EXT2_SB(sb)->s_gid; + } inode->i_nlink = le16_to_cpu(raw_inode->i_links_count); inode->i_size = le32_to_cpu(raw_inode->i_size); inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); @@ -1353,6 +1359,12 @@ int ext2_write_inode(struct inode *inode, int do_sync) ext2_get_inode_flags(ei); raw_inode->i_mode = cpu_to_le16(inode->i_mode); + if (EXT2_SB(sb)->s_uid) { + uid = EXT2_SB(sb)->s_diskuid; + } + if (EXT2_SB(sb)->s_gid) { + gid = EXT2_SB(sb)->s_diskgid; + } if (!(test_opt(sb, NO_UID32))) { raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid)); raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid)); diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 1a9ffee..f89b407 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -382,7 +382,8 @@ enum { Opt_err_ro, Opt_nouid32, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_nobh, Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_xip, Opt_ignore, Opt_err, Opt_quota, - Opt_usrquota, Opt_grpquota, Opt_reservation, Opt_noreservation + Opt_usrquota, Opt_grpquota, Opt_reservation, Opt_noreservation, + Opt_uid, Opt_diskuid, Opt_gid, Opt_diskgid }; static const match_table_t tokens = { @@ -416,6 +417,10 @@ static const match_table_t tokens = { {Opt_usrquota, "usrquota"}, {Opt_reservation, "reservation"}, {Opt_noreservation, "noreservation"}, + {Opt_uid, "uid=%u"}, + {Opt_diskuid, "uid=%u:%u"}, + {Opt_gid, "gid=%u"}, + {Opt_diskgid, "gid=%u:%u"}, {Opt_err, NULL} }; @@ -556,6 +561,34 @@ static int parse_options (char * options, clear_opt(sbi->s_mount_opt, RESERVATION); printk("reservations OFF\n"); break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_uid = sbi->s_diskuid = option; + break; + case Opt_diskuid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_uid = option; + + if (match_int(&args[1], &option)) + return 0; + sbi->s_diskuid = option; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_gid = sbi->s_diskgid = option; + break; + case Opt_diskgid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_gid = option; + + if (match_int(&args[1], &option)) + return 0; + sbi->s_diskgid = option; + break; case Opt_ignore: break; default: diff --git a/include/linux/ext2_fs_sb.h b/include/linux/ext2_fs_sb.h index 1cdb663..062e8a9 100644 --- a/include/linux/ext2_fs_sb.h +++ b/include/linux/ext2_fs_sb.h @@ -88,6 +88,10 @@ struct ext2_sb_info { unsigned long s_sb_block; uid_t s_resuid; gid_t s_resgid; + uid_t s_uid; /* make all files appear to belong to this uid */ + uid_t s_diskuid; /* write this uid to disk (if s_uid != 0) */ + gid_t s_gid; /* make all files appear to belong to this gid */ + gid_t s_diskgid; /* write this gid to disk (if s_gid != 0) */ unsigned short s_mount_state; unsigned short s_pad; int s_addr_per_block_bits; -- 1.6.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html