]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Jan Kara <jack@suse.cz> |
2 | References: fate#302681 | |
3 | Subject: [PATCH 22/28] ocfs2: Assign feature bits and system inodes to quota feature and quota files | |
4 | Patch-mainline: 2.6.29? | |
5 | ||
6 | Signed-off-by: Jan Kara <jack@suse.cz> | |
7 | --- | |
8 | fs/ocfs2/inode.c | 2 ++ | |
9 | fs/ocfs2/ocfs2_fs.h | 23 ++++++++++++++++++++--- | |
10 | fs/ocfs2/super.c | 17 +++++++++++++++++ | |
11 | 3 files changed, 39 insertions(+), 3 deletions(-) | |
12 | ||
13 | --- a/fs/ocfs2/inode.c | |
14 | +++ b/fs/ocfs2/inode.c | |
15 | @@ -292,6 +292,8 @@ int ocfs2_populate_inode(struct inode *i | |
16 | mlog(0, "local alloc inode: i_ino=%lu\n", inode->i_ino); | |
17 | } else if (fe->i_flags & cpu_to_le32(OCFS2_BITMAP_FL)) { | |
18 | OCFS2_I(inode)->ip_flags |= OCFS2_INODE_BITMAP; | |
19 | + } else if (fe->i_flags & cpu_to_le32(OCFS2_QUOTA_FL)) { | |
20 | + inode->i_flags |= S_NOQUOTA; | |
21 | } else if (fe->i_flags & cpu_to_le32(OCFS2_SUPER_BLOCK_FL)) { | |
22 | mlog(0, "superblock inode: i_ino=%lu\n", inode->i_ino); | |
23 | /* we can't actually hit this as read_inode can't | |
24 | --- a/fs/ocfs2/ocfs2_fs.h | |
25 | +++ b/fs/ocfs2/ocfs2_fs.h | |
26 | @@ -94,7 +94,9 @@ | |
27 | | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \ | |
28 | | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \ | |
29 | | OCFS2_FEATURE_INCOMPAT_XATTR) | |
30 | -#define OCFS2_FEATURE_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN | |
31 | +#define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \ | |
32 | + | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \ | |
33 | + | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) | |
34 | ||
35 | /* | |
36 | * Heartbeat-only devices are missing journals and other files. The | |
37 | @@ -163,6 +165,12 @@ | |
38 | */ | |
39 | #define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN 0x0001 | |
40 | ||
41 | +/* | |
42 | + * Maintain quota information for this filesystem | |
43 | + */ | |
44 | +#define OCFS2_FEATURE_RO_COMPAT_USRQUOTA 0x0002 | |
45 | +#define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA 0x0004 | |
46 | + | |
47 | /* The byte offset of the first backup block will be 1G. | |
48 | * The following will be 4G, 16G, 64G, 256G and 1T. | |
49 | */ | |
50 | @@ -192,6 +200,7 @@ | |
51 | #define OCFS2_HEARTBEAT_FL (0x00000200) /* Heartbeat area */ | |
52 | #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ | |
53 | #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ | |
54 | +#define OCFS2_QUOTA_FL (0x00001000) /* Quota file */ | |
55 | ||
56 | /* | |
57 | * Flags on ocfs2_dinode.i_dyn_features | |
58 | @@ -329,13 +338,17 @@ enum { | |
59 | #define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE | |
60 | HEARTBEAT_SYSTEM_INODE, | |
61 | GLOBAL_BITMAP_SYSTEM_INODE, | |
62 | -#define OCFS2_LAST_GLOBAL_SYSTEM_INODE GLOBAL_BITMAP_SYSTEM_INODE | |
63 | + USER_QUOTA_SYSTEM_INODE, | |
64 | + GROUP_QUOTA_SYSTEM_INODE, | |
65 | +#define OCFS2_LAST_GLOBAL_SYSTEM_INODE GROUP_QUOTA_SYSTEM_INODE | |
66 | ORPHAN_DIR_SYSTEM_INODE, | |
67 | EXTENT_ALLOC_SYSTEM_INODE, | |
68 | INODE_ALLOC_SYSTEM_INODE, | |
69 | JOURNAL_SYSTEM_INODE, | |
70 | LOCAL_ALLOC_SYSTEM_INODE, | |
71 | TRUNCATE_LOG_SYSTEM_INODE, | |
72 | + LOCAL_USER_QUOTA_SYSTEM_INODE, | |
73 | + LOCAL_GROUP_QUOTA_SYSTEM_INODE, | |
74 | NUM_SYSTEM_INODES | |
75 | }; | |
76 | ||
77 | @@ -349,6 +362,8 @@ static struct ocfs2_system_inode_info oc | |
78 | [SLOT_MAP_SYSTEM_INODE] = { "slot_map", 0, S_IFREG | 0644 }, | |
79 | [HEARTBEAT_SYSTEM_INODE] = { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 }, | |
80 | [GLOBAL_BITMAP_SYSTEM_INODE] = { "global_bitmap", 0, S_IFREG | 0644 }, | |
81 | + [USER_QUOTA_SYSTEM_INODE] = { "aquota.user", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | |
82 | + [GROUP_QUOTA_SYSTEM_INODE] = { "aquota.group", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | |
83 | ||
84 | /* Slot-specific system inodes (one copy per slot) */ | |
85 | [ORPHAN_DIR_SYSTEM_INODE] = { "orphan_dir:%04d", 0, S_IFDIR | 0755 }, | |
86 | @@ -356,7 +371,9 @@ static struct ocfs2_system_inode_info oc | |
87 | [INODE_ALLOC_SYSTEM_INODE] = { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 }, | |
88 | [JOURNAL_SYSTEM_INODE] = { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 }, | |
89 | [LOCAL_ALLOC_SYSTEM_INODE] = { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 }, | |
90 | - [TRUNCATE_LOG_SYSTEM_INODE] = { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 } | |
91 | + [TRUNCATE_LOG_SYSTEM_INODE] = { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 }, | |
92 | + [LOCAL_USER_QUOTA_SYSTEM_INODE] = { "aquota%04d.user", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | |
93 | + [LOCAL_GROUP_QUOTA_SYSTEM_INODE] = { "aquota%04d.group", OCFS2_QUOTA_FL, S_IFREG | 0644 }, | |
94 | }; | |
95 | ||
96 | /* Parameter passed from mount.ocfs2 to module */ | |
97 | --- a/fs/ocfs2/super.c | |
98 | +++ b/fs/ocfs2/super.c | |
99 | @@ -225,6 +225,19 @@ static int ocfs2_sync_fs(struct super_bl | |
100 | return 0; | |
101 | } | |
102 | ||
103 | +static int ocfs2_need_system_inode(struct ocfs2_super *osb, int ino) | |
104 | +{ | |
105 | + if (!OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, OCFS2_FEATURE_RO_COMPAT_USRQUOTA) | |
106 | + && (ino == USER_QUOTA_SYSTEM_INODE | |
107 | + || ino == LOCAL_USER_QUOTA_SYSTEM_INODE)) | |
108 | + return 0; | |
109 | + if (!OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, OCFS2_FEATURE_RO_COMPAT_GRPQUOTA) | |
110 | + && (ino == GROUP_QUOTA_SYSTEM_INODE | |
111 | + || ino == LOCAL_GROUP_QUOTA_SYSTEM_INODE)) | |
112 | + return 0; | |
113 | + return 1; | |
114 | +} | |
115 | + | |
116 | static int ocfs2_init_global_system_inodes(struct ocfs2_super *osb) | |
117 | { | |
118 | struct inode *new = NULL; | |
119 | @@ -251,6 +264,8 @@ static int ocfs2_init_global_system_inod | |
120 | ||
121 | for (i = OCFS2_FIRST_ONLINE_SYSTEM_INODE; | |
122 | i <= OCFS2_LAST_GLOBAL_SYSTEM_INODE; i++) { | |
123 | + if (!ocfs2_need_system_inode(osb, i)) | |
124 | + continue; | |
125 | new = ocfs2_get_system_file_inode(osb, i, osb->slot_num); | |
126 | if (!new) { | |
127 | ocfs2_release_system_inodes(osb); | |
128 | @@ -281,6 +296,8 @@ static int ocfs2_init_local_system_inode | |
129 | for (i = OCFS2_LAST_GLOBAL_SYSTEM_INODE + 1; | |
130 | i < NUM_SYSTEM_INODES; | |
131 | i++) { | |
132 | + if (!ocfs2_need_system_inode(osb, i)) | |
133 | + continue; | |
134 | new = ocfs2_get_system_file_inode(osb, i, osb->slot_num); | |
135 | if (!new) { | |
136 | ocfs2_release_system_inodes(osb); |