]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.suse/ocfs2-Assign-feature-bits-and-system-inodes-to-quot.patch
Updated xen patches taken from suse.
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.suse / ocfs2-Assign-feature-bits-and-system-inodes-to-quot.patch
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);