diff options
-rw-r--r-- | fs/nilfs2/btree.c | 40 | ||||
-rw-r--r-- | fs/nilfs2/btree.h | 23 | ||||
-rw-r--r-- | fs/nilfs2/segbuf.c | 25 | ||||
-rw-r--r-- | fs/nilfs2/segbuf.h | 1 | ||||
-rw-r--r-- | fs/nilfs2/segment.c | 36 | ||||
-rw-r--r-- | fs/nilfs2/segment.h | 2 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 134 |
7 files changed, 97 insertions, 164 deletions
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index dcd4e1c4deaa..b27a342c5af6 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
@@ -31,46 +31,6 @@ | |||
31 | #include "alloc.h" | 31 | #include "alloc.h" |
32 | #include "dat.h" | 32 | #include "dat.h" |
33 | 33 | ||
34 | /** | ||
35 | * struct nilfs_btree_path - A path on which B-tree operations are executed | ||
36 | * @bp_bh: buffer head of node block | ||
37 | * @bp_sib_bh: buffer head of sibling node block | ||
38 | * @bp_index: index of child node | ||
39 | * @bp_oldreq: ptr end request for old ptr | ||
40 | * @bp_newreq: ptr alloc request for new ptr | ||
41 | * @bp_op: rebalance operation | ||
42 | */ | ||
43 | struct nilfs_btree_path { | ||
44 | struct buffer_head *bp_bh; | ||
45 | struct buffer_head *bp_sib_bh; | ||
46 | int bp_index; | ||
47 | union nilfs_bmap_ptr_req bp_oldreq; | ||
48 | union nilfs_bmap_ptr_req bp_newreq; | ||
49 | struct nilfs_btnode_chkey_ctxt bp_ctxt; | ||
50 | void (*bp_op)(struct nilfs_btree *, struct nilfs_btree_path *, | ||
51 | int, __u64 *, __u64 *); | ||
52 | }; | ||
53 | |||
54 | /* | ||
55 | * B-tree path operations | ||
56 | */ | ||
57 | |||
58 | static struct kmem_cache *nilfs_btree_path_cache; | ||
59 | |||
60 | int __init nilfs_btree_path_cache_init(void) | ||
61 | { | ||
62 | nilfs_btree_path_cache = | ||
63 | kmem_cache_create("nilfs2_btree_path_cache", | ||
64 | sizeof(struct nilfs_btree_path) * | ||
65 | NILFS_BTREE_LEVEL_MAX, 0, 0, NULL); | ||
66 | return (nilfs_btree_path_cache != NULL) ? 0 : -ENOMEM; | ||
67 | } | ||
68 | |||
69 | void nilfs_btree_path_cache_destroy(void) | ||
70 | { | ||
71 | kmem_cache_destroy(nilfs_btree_path_cache); | ||
72 | } | ||
73 | |||
74 | static struct nilfs_btree_path *nilfs_btree_alloc_path(void) | 34 | static struct nilfs_btree_path *nilfs_btree_alloc_path(void) |
75 | { | 35 | { |
76 | struct nilfs_btree_path *path; | 36 | struct nilfs_btree_path *path; |
diff --git a/fs/nilfs2/btree.h b/fs/nilfs2/btree.h index 4b82d84ade75..af638d59e3bf 100644 --- a/fs/nilfs2/btree.h +++ b/fs/nilfs2/btree.h | |||
@@ -30,9 +30,6 @@ | |||
30 | #include "btnode.h" | 30 | #include "btnode.h" |
31 | #include "bmap.h" | 31 | #include "bmap.h" |
32 | 32 | ||
33 | struct nilfs_btree; | ||
34 | struct nilfs_btree_path; | ||
35 | |||
36 | /** | 33 | /** |
37 | * struct nilfs_btree - B-tree structure | 34 | * struct nilfs_btree - B-tree structure |
38 | * @bt_bmap: bmap base structure | 35 | * @bt_bmap: bmap base structure |
@@ -41,6 +38,25 @@ struct nilfs_btree { | |||
41 | struct nilfs_bmap bt_bmap; | 38 | struct nilfs_bmap bt_bmap; |
42 | }; | 39 | }; |
43 | 40 | ||
41 | /** | ||
42 | * struct nilfs_btree_path - A path on which B-tree operations are executed | ||
43 | * @bp_bh: buffer head of node block | ||
44 | * @bp_sib_bh: buffer head of sibling node block | ||
45 | * @bp_index: index of child node | ||
46 | * @bp_oldreq: ptr end request for old ptr | ||
47 | * @bp_newreq: ptr alloc request for new ptr | ||
48 | * @bp_op: rebalance operation | ||
49 | */ | ||
50 | struct nilfs_btree_path { | ||
51 | struct buffer_head *bp_bh; | ||
52 | struct buffer_head *bp_sib_bh; | ||
53 | int bp_index; | ||
54 | union nilfs_bmap_ptr_req bp_oldreq; | ||
55 | union nilfs_bmap_ptr_req bp_newreq; | ||
56 | struct nilfs_btnode_chkey_ctxt bp_ctxt; | ||
57 | void (*bp_op)(struct nilfs_btree *, struct nilfs_btree_path *, | ||
58 | int, __u64 *, __u64 *); | ||
59 | }; | ||
44 | 60 | ||
45 | #define NILFS_BTREE_ROOT_SIZE NILFS_BMAP_SIZE | 61 | #define NILFS_BTREE_ROOT_SIZE NILFS_BMAP_SIZE |
46 | #define NILFS_BTREE_ROOT_NCHILDREN_MAX \ | 62 | #define NILFS_BTREE_ROOT_NCHILDREN_MAX \ |
@@ -57,6 +73,7 @@ struct nilfs_btree { | |||
57 | #define NILFS_BTREE_KEY_MIN ((__u64)0) | 73 | #define NILFS_BTREE_KEY_MIN ((__u64)0) |
58 | #define NILFS_BTREE_KEY_MAX (~(__u64)0) | 74 | #define NILFS_BTREE_KEY_MAX (~(__u64)0) |
59 | 75 | ||
76 | extern struct kmem_cache *nilfs_btree_path_cache; | ||
60 | 77 | ||
61 | int nilfs_btree_path_cache_init(void); | 78 | int nilfs_btree_path_cache_init(void); |
62 | void nilfs_btree_path_cache_destroy(void); | 79 | void nilfs_btree_path_cache_destroy(void); |
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c index 6bf3b1f3406e..9f83bc02593c 100644 --- a/fs/nilfs2/segbuf.c +++ b/fs/nilfs2/segbuf.c | |||
@@ -40,35 +40,10 @@ struct nilfs_write_info { | |||
40 | sector_t blocknr; | 40 | sector_t blocknr; |
41 | }; | 41 | }; |
42 | 42 | ||
43 | |||
44 | static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, | 43 | static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, |
45 | struct the_nilfs *nilfs); | 44 | struct the_nilfs *nilfs); |
46 | static int nilfs_segbuf_wait(struct nilfs_segment_buffer *segbuf); | 45 | static int nilfs_segbuf_wait(struct nilfs_segment_buffer *segbuf); |
47 | 46 | ||
48 | |||
49 | static struct kmem_cache *nilfs_segbuf_cachep; | ||
50 | |||
51 | static void nilfs_segbuf_init_once(void *obj) | ||
52 | { | ||
53 | memset(obj, 0, sizeof(struct nilfs_segment_buffer)); | ||
54 | } | ||
55 | |||
56 | int __init nilfs_init_segbuf_cache(void) | ||
57 | { | ||
58 | nilfs_segbuf_cachep = | ||
59 | kmem_cache_create("nilfs2_segbuf_cache", | ||
60 | sizeof(struct nilfs_segment_buffer), | ||
61 | 0, SLAB_RECLAIM_ACCOUNT, | ||
62 | nilfs_segbuf_init_once); | ||
63 | |||
64 | return (nilfs_segbuf_cachep == NULL) ? -ENOMEM : 0; | ||
65 | } | ||
66 | |||
67 | void nilfs_destroy_segbuf_cache(void) | ||
68 | { | ||
69 | kmem_cache_destroy(nilfs_segbuf_cachep); | ||
70 | } | ||
71 | |||
72 | struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *sb) | 47 | struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *sb) |
73 | { | 48 | { |
74 | struct nilfs_segment_buffer *segbuf; | 49 | struct nilfs_segment_buffer *segbuf; |
diff --git a/fs/nilfs2/segbuf.h b/fs/nilfs2/segbuf.h index ae12c2c3e370..e21497f61b0c 100644 --- a/fs/nilfs2/segbuf.h +++ b/fs/nilfs2/segbuf.h | |||
@@ -123,6 +123,7 @@ struct nilfs_segment_buffer { | |||
123 | b_assoc_buffers)) | 123 | b_assoc_buffers)) |
124 | #define NILFS_SEGBUF_BH_IS_LAST(bh, head) ((bh)->b_assoc_buffers.next == head) | 124 | #define NILFS_SEGBUF_BH_IS_LAST(bh, head) ((bh)->b_assoc_buffers.next == head) |
125 | 125 | ||
126 | extern struct kmem_cache *nilfs_segbuf_cachep; | ||
126 | 127 | ||
127 | int __init nilfs_init_segbuf_cache(void); | 128 | int __init nilfs_init_segbuf_cache(void); |
128 | void nilfs_destroy_segbuf_cache(void); | 129 | void nilfs_destroy_segbuf_cache(void); |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index f649f0189589..a17bfa193e3f 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -116,42 +116,6 @@ static void nilfs_dispose_list(struct nilfs_sb_info *, struct list_head *, | |||
116 | #define nilfs_cnt32_lt(a, b) nilfs_cnt32_gt(b, a) | 116 | #define nilfs_cnt32_lt(a, b) nilfs_cnt32_gt(b, a) |
117 | #define nilfs_cnt32_le(a, b) nilfs_cnt32_ge(b, a) | 117 | #define nilfs_cnt32_le(a, b) nilfs_cnt32_ge(b, a) |
118 | 118 | ||
119 | /* | ||
120 | * Transaction | ||
121 | */ | ||
122 | static struct kmem_cache *nilfs_transaction_cachep; | ||
123 | |||
124 | /** | ||
125 | * nilfs_init_transaction_cache - create a cache for nilfs_transaction_info | ||
126 | * | ||
127 | * nilfs_init_transaction_cache() creates a slab cache for the struct | ||
128 | * nilfs_transaction_info. | ||
129 | * | ||
130 | * Return Value: On success, it returns 0. On error, one of the following | ||
131 | * negative error code is returned. | ||
132 | * | ||
133 | * %-ENOMEM - Insufficient memory available. | ||
134 | */ | ||
135 | int nilfs_init_transaction_cache(void) | ||
136 | { | ||
137 | nilfs_transaction_cachep = | ||
138 | kmem_cache_create("nilfs2_transaction_cache", | ||
139 | sizeof(struct nilfs_transaction_info), | ||
140 | 0, SLAB_RECLAIM_ACCOUNT, NULL); | ||
141 | return (nilfs_transaction_cachep == NULL) ? -ENOMEM : 0; | ||
142 | } | ||
143 | |||
144 | /** | ||
145 | * nilfs_destroy_transaction_cache - destroy the cache for transaction info | ||
146 | * | ||
147 | * nilfs_destroy_transaction_cache() frees the slab cache for the struct | ||
148 | * nilfs_transaction_info. | ||
149 | */ | ||
150 | void nilfs_destroy_transaction_cache(void) | ||
151 | { | ||
152 | kmem_cache_destroy(nilfs_transaction_cachep); | ||
153 | } | ||
154 | |||
155 | static int nilfs_prepare_segment_lock(struct nilfs_transaction_info *ti) | 119 | static int nilfs_prepare_segment_lock(struct nilfs_transaction_info *ti) |
156 | { | 120 | { |
157 | struct nilfs_transaction_info *cur_ti = current->journal_info; | 121 | struct nilfs_transaction_info *cur_ti = current->journal_info; |
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h index e61fc797383e..7aca76532683 100644 --- a/fs/nilfs2/segment.h +++ b/fs/nilfs2/segment.h | |||
@@ -217,6 +217,8 @@ enum { | |||
217 | */ | 217 | */ |
218 | #define NILFS_SC_DEFAULT_WATERMARK 3600 | 218 | #define NILFS_SC_DEFAULT_WATERMARK 3600 |
219 | 219 | ||
220 | /* super.c */ | ||
221 | extern struct kmem_cache *nilfs_transaction_cachep; | ||
220 | 222 | ||
221 | /* segment.c */ | 223 | /* segment.c */ |
222 | extern int nilfs_init_transaction_cache(void); | 224 | extern int nilfs_init_transaction_cache(void); |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 0b1758bf0726..5a08c82e7e25 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -67,6 +67,11 @@ MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem " | |||
67 | "(NILFS)"); | 67 | "(NILFS)"); |
68 | MODULE_LICENSE("GPL"); | 68 | MODULE_LICENSE("GPL"); |
69 | 69 | ||
70 | struct kmem_cache *nilfs_inode_cachep; | ||
71 | struct kmem_cache *nilfs_transaction_cachep; | ||
72 | struct kmem_cache *nilfs_segbuf_cachep; | ||
73 | struct kmem_cache *nilfs_btree_path_cache; | ||
74 | |||
70 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); | 75 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); |
71 | 76 | ||
72 | /** | 77 | /** |
@@ -129,7 +134,6 @@ void nilfs_warning(struct super_block *sb, const char *function, | |||
129 | va_end(args); | 134 | va_end(args); |
130 | } | 135 | } |
131 | 136 | ||
132 | static struct kmem_cache *nilfs_inode_cachep; | ||
133 | 137 | ||
134 | struct inode *nilfs_alloc_inode_common(struct the_nilfs *nilfs) | 138 | struct inode *nilfs_alloc_inode_common(struct the_nilfs *nilfs) |
135 | { | 139 | { |
@@ -155,34 +159,6 @@ void nilfs_destroy_inode(struct inode *inode) | |||
155 | kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode)); | 159 | kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode)); |
156 | } | 160 | } |
157 | 161 | ||
158 | static void init_once(void *obj) | ||
159 | { | ||
160 | struct nilfs_inode_info *ii = obj; | ||
161 | |||
162 | INIT_LIST_HEAD(&ii->i_dirty); | ||
163 | #ifdef CONFIG_NILFS_XATTR | ||
164 | init_rwsem(&ii->xattr_sem); | ||
165 | #endif | ||
166 | nilfs_btnode_cache_init_once(&ii->i_btnode_cache); | ||
167 | ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union; | ||
168 | inode_init_once(&ii->vfs_inode); | ||
169 | } | ||
170 | |||
171 | static int nilfs_init_inode_cache(void) | ||
172 | { | ||
173 | nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache", | ||
174 | sizeof(struct nilfs_inode_info), | ||
175 | 0, SLAB_RECLAIM_ACCOUNT, | ||
176 | init_once); | ||
177 | |||
178 | return (nilfs_inode_cachep == NULL) ? -ENOMEM : 0; | ||
179 | } | ||
180 | |||
181 | static inline void nilfs_destroy_inode_cache(void) | ||
182 | { | ||
183 | kmem_cache_destroy(nilfs_inode_cachep); | ||
184 | } | ||
185 | |||
186 | static void nilfs_clear_inode(struct inode *inode) | 162 | static void nilfs_clear_inode(struct inode *inode) |
187 | { | 163 | { |
188 | struct nilfs_inode_info *ii = NILFS_I(inode); | 164 | struct nilfs_inode_info *ii = NILFS_I(inode); |
@@ -1139,54 +1115,92 @@ struct file_system_type nilfs_fs_type = { | |||
1139 | .fs_flags = FS_REQUIRES_DEV, | 1115 | .fs_flags = FS_REQUIRES_DEV, |
1140 | }; | 1116 | }; |
1141 | 1117 | ||
1142 | static int __init init_nilfs_fs(void) | 1118 | static void nilfs_inode_init_once(void *obj) |
1143 | { | 1119 | { |
1144 | int err; | 1120 | struct nilfs_inode_info *ii = obj; |
1145 | |||
1146 | err = nilfs_init_inode_cache(); | ||
1147 | if (err) | ||
1148 | goto failed; | ||
1149 | 1121 | ||
1150 | err = nilfs_init_transaction_cache(); | 1122 | INIT_LIST_HEAD(&ii->i_dirty); |
1151 | if (err) | 1123 | #ifdef CONFIG_NILFS_XATTR |
1152 | goto failed_inode_cache; | 1124 | init_rwsem(&ii->xattr_sem); |
1125 | #endif | ||
1126 | nilfs_btnode_cache_init_once(&ii->i_btnode_cache); | ||
1127 | ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union; | ||
1128 | inode_init_once(&ii->vfs_inode); | ||
1129 | } | ||
1153 | 1130 | ||
1154 | err = nilfs_init_segbuf_cache(); | 1131 | static void nilfs_segbuf_init_once(void *obj) |
1155 | if (err) | 1132 | { |
1156 | goto failed_transaction_cache; | 1133 | memset(obj, 0, sizeof(struct nilfs_segment_buffer)); |
1134 | } | ||
1157 | 1135 | ||
1158 | err = nilfs_btree_path_cache_init(); | 1136 | static void nilfs_destroy_cachep(void) |
1159 | if (err) | 1137 | { |
1160 | goto failed_segbuf_cache; | 1138 | if (nilfs_inode_cachep) |
1139 | kmem_cache_destroy(nilfs_inode_cachep); | ||
1140 | if (nilfs_transaction_cachep) | ||
1141 | kmem_cache_destroy(nilfs_transaction_cachep); | ||
1142 | if (nilfs_segbuf_cachep) | ||
1143 | kmem_cache_destroy(nilfs_segbuf_cachep); | ||
1144 | if (nilfs_btree_path_cache) | ||
1145 | kmem_cache_destroy(nilfs_btree_path_cache); | ||
1146 | } | ||
1161 | 1147 | ||
1162 | err = register_filesystem(&nilfs_fs_type); | 1148 | static int __init nilfs_init_cachep(void) |
1163 | if (err) | 1149 | { |
1164 | goto failed_btree_path_cache; | 1150 | nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache", |
1151 | sizeof(struct nilfs_inode_info), 0, | ||
1152 | SLAB_RECLAIM_ACCOUNT, nilfs_inode_init_once); | ||
1153 | if (!nilfs_inode_cachep) | ||
1154 | goto fail; | ||
1155 | |||
1156 | nilfs_transaction_cachep = kmem_cache_create("nilfs2_transaction_cache", | ||
1157 | sizeof(struct nilfs_transaction_info), 0, | ||
1158 | SLAB_RECLAIM_ACCOUNT, NULL); | ||
1159 | if (!nilfs_transaction_cachep) | ||
1160 | goto fail; | ||
1161 | |||
1162 | nilfs_segbuf_cachep = kmem_cache_create("nilfs2_segbuf_cache", | ||
1163 | sizeof(struct nilfs_segment_buffer), 0, | ||
1164 | SLAB_RECLAIM_ACCOUNT, nilfs_segbuf_init_once); | ||
1165 | if (!nilfs_segbuf_cachep) | ||
1166 | goto fail; | ||
1167 | |||
1168 | nilfs_btree_path_cache = kmem_cache_create("nilfs2_btree_path_cache", | ||
1169 | sizeof(struct nilfs_btree_path) * NILFS_BTREE_LEVEL_MAX, | ||
1170 | 0, 0, NULL); | ||
1171 | if (!nilfs_btree_path_cache) | ||
1172 | goto fail; | ||
1165 | 1173 | ||
1166 | return 0; | 1174 | return 0; |
1167 | 1175 | ||
1168 | failed_btree_path_cache: | 1176 | fail: |
1169 | nilfs_btree_path_cache_destroy(); | 1177 | nilfs_destroy_cachep(); |
1178 | return -ENOMEM; | ||
1179 | } | ||
1180 | |||
1181 | static int __init init_nilfs_fs(void) | ||
1182 | { | ||
1183 | int err; | ||
1170 | 1184 | ||
1171 | failed_segbuf_cache: | 1185 | err = nilfs_init_cachep(); |
1172 | nilfs_destroy_segbuf_cache(); | 1186 | if (err) |
1187 | goto fail; | ||
1173 | 1188 | ||
1174 | failed_transaction_cache: | 1189 | err = register_filesystem(&nilfs_fs_type); |
1175 | nilfs_destroy_transaction_cache(); | 1190 | if (err) |
1191 | goto free_cachep; | ||
1176 | 1192 | ||
1177 | failed_inode_cache: | 1193 | return 0; |
1178 | nilfs_destroy_inode_cache(); | ||
1179 | 1194 | ||
1180 | failed: | 1195 | free_cachep: |
1196 | nilfs_destroy_cachep(); | ||
1197 | fail: | ||
1181 | return err; | 1198 | return err; |
1182 | } | 1199 | } |
1183 | 1200 | ||
1184 | static void __exit exit_nilfs_fs(void) | 1201 | static void __exit exit_nilfs_fs(void) |
1185 | { | 1202 | { |
1186 | nilfs_destroy_segbuf_cache(); | 1203 | nilfs_destroy_cachep(); |
1187 | nilfs_destroy_transaction_cache(); | ||
1188 | nilfs_destroy_inode_cache(); | ||
1189 | nilfs_btree_path_cache_destroy(); | ||
1190 | unregister_filesystem(&nilfs_fs_type); | 1204 | unregister_filesystem(&nilfs_fs_type); |
1191 | } | 1205 | } |
1192 | 1206 | ||