diff options
-rw-r--r-- | fs/ocfs2/dlmglue.c | 6 | ||||
-rw-r--r-- | fs/ocfs2/journal.c | 80 | ||||
-rw-r--r-- | fs/ocfs2/journal.h | 20 | ||||
-rw-r--r-- | fs/ocfs2/super.c | 13 |
4 files changed, 2 insertions, 117 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index ff8d3dbdeb31..1c29b96b99e7 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
@@ -1668,12 +1668,6 @@ int ocfs2_meta_lock_full(struct inode *inode, | |||
1668 | } | 1668 | } |
1669 | } | 1669 | } |
1670 | 1670 | ||
1671 | if (handle) { | ||
1672 | status = ocfs2_handle_add_lock(handle, inode); | ||
1673 | if (status < 0) | ||
1674 | mlog_errno(status); | ||
1675 | } | ||
1676 | |||
1677 | bail: | 1671 | bail: |
1678 | if (status < 0) { | 1672 | if (status < 0) { |
1679 | if (ret_bh && (*ret_bh)) { | 1673 | if (ret_bh && (*ret_bh)) { |
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index f02af63e5fae..3ef1678c893a 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
@@ -57,9 +57,6 @@ static int ocfs2_recover_node(struct ocfs2_super *osb, | |||
57 | static int __ocfs2_recovery_thread(void *arg); | 57 | static int __ocfs2_recovery_thread(void *arg); |
58 | static int ocfs2_commit_cache(struct ocfs2_super *osb); | 58 | static int ocfs2_commit_cache(struct ocfs2_super *osb); |
59 | static int ocfs2_wait_on_mount(struct ocfs2_super *osb); | 59 | static int ocfs2_wait_on_mount(struct ocfs2_super *osb); |
60 | static void ocfs2_handle_cleanup_locks(struct ocfs2_journal *journal, | ||
61 | struct ocfs2_journal_handle *handle); | ||
62 | static void ocfs2_commit_unstarted_handle(struct ocfs2_journal_handle *handle); | ||
63 | static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb, | 60 | static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb, |
64 | int dirty); | 61 | int dirty); |
65 | static int ocfs2_trylock_journal(struct ocfs2_super *osb, | 62 | static int ocfs2_trylock_journal(struct ocfs2_super *osb, |
@@ -123,11 +120,8 @@ struct ocfs2_journal_handle *ocfs2_alloc_handle(struct ocfs2_super *osb) | |||
123 | "handle!\n"); | 120 | "handle!\n"); |
124 | return NULL; | 121 | return NULL; |
125 | } | 122 | } |
126 | |||
127 | retval->num_locks = 0; | ||
128 | retval->k_handle = NULL; | 123 | retval->k_handle = NULL; |
129 | 124 | ||
130 | INIT_LIST_HEAD(&retval->locks); | ||
131 | retval->journal = osb->journal; | 125 | retval->journal = osb->journal; |
132 | 126 | ||
133 | return retval; | 127 | return retval; |
@@ -195,27 +189,12 @@ struct ocfs2_journal_handle *ocfs2_start_trans(struct ocfs2_super *osb, | |||
195 | 189 | ||
196 | done_free: | 190 | done_free: |
197 | if (handle) | 191 | if (handle) |
198 | ocfs2_commit_unstarted_handle(handle); /* will kfree handle */ | 192 | kfree(handle); |
199 | 193 | ||
200 | mlog_exit(ret); | 194 | mlog_exit(ret); |
201 | return ERR_PTR(ret); | 195 | return ERR_PTR(ret); |
202 | } | 196 | } |
203 | 197 | ||
204 | /* This is trivial so we do it out of the main commit | ||
205 | * paths. Beware, it can be called from start_trans too! */ | ||
206 | static void ocfs2_commit_unstarted_handle(struct ocfs2_journal_handle *handle) | ||
207 | { | ||
208 | mlog_entry_void(); | ||
209 | |||
210 | /* You are allowed to add journal locks before the transaction | ||
211 | * has started. */ | ||
212 | ocfs2_handle_cleanup_locks(handle->journal, handle); | ||
213 | |||
214 | kfree(handle); | ||
215 | |||
216 | mlog_exit_void(); | ||
217 | } | ||
218 | |||
219 | void ocfs2_commit_trans(struct ocfs2_journal_handle *handle) | 198 | void ocfs2_commit_trans(struct ocfs2_journal_handle *handle) |
220 | { | 199 | { |
221 | handle_t *jbd_handle; | 200 | handle_t *jbd_handle; |
@@ -227,7 +206,7 @@ void ocfs2_commit_trans(struct ocfs2_journal_handle *handle) | |||
227 | BUG_ON(!handle); | 206 | BUG_ON(!handle); |
228 | 207 | ||
229 | if (!handle->k_handle) { | 208 | if (!handle->k_handle) { |
230 | ocfs2_commit_unstarted_handle(handle); | 209 | kfree(handle); |
231 | mlog_exit_void(); | 210 | mlog_exit_void(); |
232 | return; | 211 | return; |
233 | } | 212 | } |
@@ -251,8 +230,6 @@ void ocfs2_commit_trans(struct ocfs2_journal_handle *handle) | |||
251 | handle->k_handle = NULL; /* it's been free'd in journal_stop */ | 230 | handle->k_handle = NULL; /* it's been free'd in journal_stop */ |
252 | } | 231 | } |
253 | 232 | ||
254 | ocfs2_handle_cleanup_locks(journal, handle); | ||
255 | |||
256 | up_read(&journal->j_trans_barrier); | 233 | up_read(&journal->j_trans_barrier); |
257 | 234 | ||
258 | kfree(handle); | 235 | kfree(handle); |
@@ -394,59 +371,6 @@ int ocfs2_journal_dirty_data(handle_t *handle, | |||
394 | return err; | 371 | return err; |
395 | } | 372 | } |
396 | 373 | ||
397 | /* We always assume you're adding a metadata lock at level 'ex' */ | ||
398 | int ocfs2_handle_add_lock(struct ocfs2_journal_handle *handle, | ||
399 | struct inode *inode) | ||
400 | { | ||
401 | int status; | ||
402 | struct ocfs2_journal_lock *lock; | ||
403 | |||
404 | BUG_ON(!inode); | ||
405 | |||
406 | lock = kmem_cache_alloc(ocfs2_lock_cache, GFP_NOFS); | ||
407 | if (!lock) { | ||
408 | status = -ENOMEM; | ||
409 | mlog_errno(-ENOMEM); | ||
410 | goto bail; | ||
411 | } | ||
412 | |||
413 | if (!igrab(inode)) | ||
414 | BUG(); | ||
415 | lock->jl_inode = inode; | ||
416 | |||
417 | list_add_tail(&(lock->jl_lock_list), &(handle->locks)); | ||
418 | handle->num_locks++; | ||
419 | |||
420 | status = 0; | ||
421 | bail: | ||
422 | mlog_exit(status); | ||
423 | return status; | ||
424 | } | ||
425 | |||
426 | static void ocfs2_handle_cleanup_locks(struct ocfs2_journal *journal, | ||
427 | struct ocfs2_journal_handle *handle) | ||
428 | { | ||
429 | struct list_head *p, *n; | ||
430 | struct ocfs2_journal_lock *lock; | ||
431 | struct inode *inode; | ||
432 | |||
433 | list_for_each_safe(p, n, &(handle->locks)) { | ||
434 | lock = list_entry(p, struct ocfs2_journal_lock, | ||
435 | jl_lock_list); | ||
436 | list_del(&lock->jl_lock_list); | ||
437 | handle->num_locks--; | ||
438 | |||
439 | inode = lock->jl_inode; | ||
440 | ocfs2_meta_unlock(inode, 1); | ||
441 | if (atomic_read(&inode->i_count) == 1) | ||
442 | mlog(ML_ERROR, | ||
443 | "Inode %llu, I'm doing a last iput for!", | ||
444 | (unsigned long long)OCFS2_I(inode)->ip_blkno); | ||
445 | iput(inode); | ||
446 | kmem_cache_free(ocfs2_lock_cache, lock); | ||
447 | } | ||
448 | } | ||
449 | |||
450 | #define OCFS2_DEFAULT_COMMIT_INTERVAL (HZ * 5) | 374 | #define OCFS2_DEFAULT_COMMIT_INTERVAL (HZ * 5) |
451 | 375 | ||
452 | void ocfs2_set_journal_params(struct ocfs2_super *osb) | 376 | void ocfs2_set_journal_params(struct ocfs2_super *osb) |
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 3a16d7d88e1c..7e9c1303d633 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h | |||
@@ -133,22 +133,9 @@ static inline void ocfs2_inode_set_new(struct ocfs2_super *osb, | |||
133 | spin_unlock(&trans_inc_lock); | 133 | spin_unlock(&trans_inc_lock); |
134 | } | 134 | } |
135 | 135 | ||
136 | extern kmem_cache_t *ocfs2_lock_cache; | ||
137 | |||
138 | struct ocfs2_journal_lock { | ||
139 | struct inode *jl_inode; | ||
140 | struct list_head jl_lock_list; | ||
141 | }; | ||
142 | |||
143 | struct ocfs2_journal_handle { | 136 | struct ocfs2_journal_handle { |
144 | handle_t *k_handle; /* kernel handle. */ | 137 | handle_t *k_handle; /* kernel handle. */ |
145 | struct ocfs2_journal *journal; | 138 | struct ocfs2_journal *journal; |
146 | |||
147 | /* The following two fields are for ocfs2_handle_add_lock */ | ||
148 | int num_locks; | ||
149 | struct list_head locks; /* A bunch of locks to | ||
150 | * release on commit. This | ||
151 | * should be a list_head */ | ||
152 | }; | 139 | }; |
153 | 140 | ||
154 | /* Exported only for the journal struct init code in super.c. Do not call. */ | 141 | /* Exported only for the journal struct init code in super.c. Do not call. */ |
@@ -229,11 +216,6 @@ static inline void ocfs2_checkpoint_inode(struct inode *inode) | |||
229 | * ocfs2_journal_dirty - Mark a journalled buffer as having dirty data. | 216 | * ocfs2_journal_dirty - Mark a journalled buffer as having dirty data. |
230 | * ocfs2_journal_dirty_data - Indicate that a data buffer should go out before | 217 | * ocfs2_journal_dirty_data - Indicate that a data buffer should go out before |
231 | * the current handle commits. | 218 | * the current handle commits. |
232 | * ocfs2_handle_add_lock - Sometimes we need to delay lock release | ||
233 | * until after a transaction has been completed. Use | ||
234 | * ocfs2_handle_add_lock to indicate that a lock needs | ||
235 | * to be released at the end of that handle. Locks | ||
236 | * will be released in the order that they are added. | ||
237 | */ | 219 | */ |
238 | 220 | ||
239 | /* You must always start_trans with a number of buffs > 0, but it's | 221 | /* You must always start_trans with a number of buffs > 0, but it's |
@@ -288,8 +270,6 @@ int ocfs2_journal_dirty(struct ocfs2_journal_handle *handle, | |||
288 | struct buffer_head *bh); | 270 | struct buffer_head *bh); |
289 | int ocfs2_journal_dirty_data(handle_t *handle, | 271 | int ocfs2_journal_dirty_data(handle_t *handle, |
290 | struct buffer_head *bh); | 272 | struct buffer_head *bh); |
291 | int ocfs2_handle_add_lock(struct ocfs2_journal_handle *handle, | ||
292 | struct inode *inode); | ||
293 | 273 | ||
294 | /* | 274 | /* |
295 | * Credit Macros: | 275 | * Credit Macros: |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index f3027c2fe2b6..290d531bed61 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -70,8 +70,6 @@ | |||
70 | 70 | ||
71 | static kmem_cache_t *ocfs2_inode_cachep = NULL; | 71 | static kmem_cache_t *ocfs2_inode_cachep = NULL; |
72 | 72 | ||
73 | kmem_cache_t *ocfs2_lock_cache = NULL; | ||
74 | |||
75 | /* OCFS2 needs to schedule several differnt types of work which | 73 | /* OCFS2 needs to schedule several differnt types of work which |
76 | * require cluster locking, disk I/O, recovery waits, etc. Since these | 74 | * require cluster locking, disk I/O, recovery waits, etc. Since these |
77 | * types of work tend to be heavy we avoid using the kernel events | 75 | * types of work tend to be heavy we avoid using the kernel events |
@@ -946,14 +944,6 @@ static int ocfs2_initialize_mem_caches(void) | |||
946 | if (!ocfs2_inode_cachep) | 944 | if (!ocfs2_inode_cachep) |
947 | return -ENOMEM; | 945 | return -ENOMEM; |
948 | 946 | ||
949 | ocfs2_lock_cache = kmem_cache_create("ocfs2_lock", | ||
950 | sizeof(struct ocfs2_journal_lock), | ||
951 | 0, | ||
952 | SLAB_HWCACHE_ALIGN, | ||
953 | NULL, NULL); | ||
954 | if (!ocfs2_lock_cache) | ||
955 | return -ENOMEM; | ||
956 | |||
957 | return 0; | 947 | return 0; |
958 | } | 948 | } |
959 | 949 | ||
@@ -961,11 +951,8 @@ static void ocfs2_free_mem_caches(void) | |||
961 | { | 951 | { |
962 | if (ocfs2_inode_cachep) | 952 | if (ocfs2_inode_cachep) |
963 | kmem_cache_destroy(ocfs2_inode_cachep); | 953 | kmem_cache_destroy(ocfs2_inode_cachep); |
964 | if (ocfs2_lock_cache) | ||
965 | kmem_cache_destroy(ocfs2_lock_cache); | ||
966 | 954 | ||
967 | ocfs2_inode_cachep = NULL; | 955 | ocfs2_inode_cachep = NULL; |
968 | ocfs2_lock_cache = NULL; | ||
969 | } | 956 | } |
970 | 957 | ||
971 | static int ocfs2_get_sector(struct super_block *sb, | 958 | static int ocfs2_get_sector(struct super_block *sb, |