diff options
Diffstat (limited to 'fs/ocfs2/localalloc.c')
-rw-r--r-- | fs/ocfs2/localalloc.c | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index f2f384dd5ba8..75f09f1b4ced 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
@@ -196,7 +196,7 @@ bail: | |||
196 | void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | 196 | void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) |
197 | { | 197 | { |
198 | int status; | 198 | int status; |
199 | struct ocfs2_journal_handle *handle = NULL; | 199 | struct ocfs2_journal_handle *handle; |
200 | struct inode *local_alloc_inode = NULL; | 200 | struct inode *local_alloc_inode = NULL; |
201 | struct buffer_head *bh = NULL; | 201 | struct buffer_head *bh = NULL; |
202 | struct buffer_head *main_bm_bh = NULL; | 202 | struct buffer_head *main_bm_bh = NULL; |
@@ -207,7 +207,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
207 | mlog_entry_void(); | 207 | mlog_entry_void(); |
208 | 208 | ||
209 | if (osb->local_alloc_state == OCFS2_LA_UNUSED) | 209 | if (osb->local_alloc_state == OCFS2_LA_UNUSED) |
210 | goto bail; | 210 | goto out; |
211 | 211 | ||
212 | local_alloc_inode = | 212 | local_alloc_inode = |
213 | ocfs2_get_system_file_inode(osb, | 213 | ocfs2_get_system_file_inode(osb, |
@@ -216,40 +216,34 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
216 | if (!local_alloc_inode) { | 216 | if (!local_alloc_inode) { |
217 | status = -ENOENT; | 217 | status = -ENOENT; |
218 | mlog_errno(status); | 218 | mlog_errno(status); |
219 | goto bail; | 219 | goto out; |
220 | } | 220 | } |
221 | 221 | ||
222 | osb->local_alloc_state = OCFS2_LA_DISABLED; | 222 | osb->local_alloc_state = OCFS2_LA_DISABLED; |
223 | 223 | ||
224 | handle = ocfs2_alloc_handle(osb); | ||
225 | if (!handle) { | ||
226 | status = -ENOMEM; | ||
227 | mlog_errno(status); | ||
228 | goto bail; | ||
229 | } | ||
230 | |||
231 | main_bm_inode = ocfs2_get_system_file_inode(osb, | 224 | main_bm_inode = ocfs2_get_system_file_inode(osb, |
232 | GLOBAL_BITMAP_SYSTEM_INODE, | 225 | GLOBAL_BITMAP_SYSTEM_INODE, |
233 | OCFS2_INVALID_SLOT); | 226 | OCFS2_INVALID_SLOT); |
234 | if (!main_bm_inode) { | 227 | if (!main_bm_inode) { |
235 | status = -EINVAL; | 228 | status = -EINVAL; |
236 | mlog_errno(status); | 229 | mlog_errno(status); |
237 | goto bail; | 230 | goto out; |
238 | } | 231 | } |
239 | 232 | ||
240 | ocfs2_handle_add_inode(handle, main_bm_inode); | 233 | mutex_lock(&main_bm_inode->i_mutex); |
241 | status = ocfs2_meta_lock(main_bm_inode, handle, &main_bm_bh, 1); | 234 | |
235 | status = ocfs2_meta_lock(main_bm_inode, NULL, &main_bm_bh, 1); | ||
242 | if (status < 0) { | 236 | if (status < 0) { |
243 | mlog_errno(status); | 237 | mlog_errno(status); |
244 | goto bail; | 238 | goto out_mutex; |
245 | } | 239 | } |
246 | 240 | ||
247 | /* WINDOW_MOVE_CREDITS is a bit heavy... */ | 241 | /* WINDOW_MOVE_CREDITS is a bit heavy... */ |
248 | handle = ocfs2_start_trans(osb, handle, OCFS2_WINDOW_MOVE_CREDITS); | 242 | handle = ocfs2_start_trans(osb, NULL, OCFS2_WINDOW_MOVE_CREDITS); |
249 | if (IS_ERR(handle)) { | 243 | if (IS_ERR(handle)) { |
250 | mlog_errno(PTR_ERR(handle)); | 244 | mlog_errno(PTR_ERR(handle)); |
251 | handle = NULL; | 245 | handle = NULL; |
252 | goto bail; | 246 | goto out_unlock; |
253 | } | 247 | } |
254 | 248 | ||
255 | bh = osb->local_alloc_bh; | 249 | bh = osb->local_alloc_bh; |
@@ -258,7 +252,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
258 | alloc_copy = kmalloc(bh->b_size, GFP_KERNEL); | 252 | alloc_copy = kmalloc(bh->b_size, GFP_KERNEL); |
259 | if (!alloc_copy) { | 253 | if (!alloc_copy) { |
260 | status = -ENOMEM; | 254 | status = -ENOMEM; |
261 | goto bail; | 255 | goto out_commit; |
262 | } | 256 | } |
263 | memcpy(alloc_copy, alloc, bh->b_size); | 257 | memcpy(alloc_copy, alloc, bh->b_size); |
264 | 258 | ||
@@ -266,7 +260,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
266 | OCFS2_JOURNAL_ACCESS_WRITE); | 260 | OCFS2_JOURNAL_ACCESS_WRITE); |
267 | if (status < 0) { | 261 | if (status < 0) { |
268 | mlog_errno(status); | 262 | mlog_errno(status); |
269 | goto bail; | 263 | goto out_commit; |
270 | } | 264 | } |
271 | 265 | ||
272 | ocfs2_clear_local_alloc(alloc); | 266 | ocfs2_clear_local_alloc(alloc); |
@@ -274,7 +268,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
274 | status = ocfs2_journal_dirty(handle, bh); | 268 | status = ocfs2_journal_dirty(handle, bh); |
275 | if (status < 0) { | 269 | if (status < 0) { |
276 | mlog_errno(status); | 270 | mlog_errno(status); |
277 | goto bail; | 271 | goto out_commit; |
278 | } | 272 | } |
279 | 273 | ||
280 | brelse(bh); | 274 | brelse(bh); |
@@ -286,16 +280,20 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
286 | if (status < 0) | 280 | if (status < 0) |
287 | mlog_errno(status); | 281 | mlog_errno(status); |
288 | 282 | ||
289 | bail: | 283 | out_commit: |
290 | if (handle) | 284 | ocfs2_commit_trans(handle); |
291 | ocfs2_commit_trans(handle); | ||
292 | 285 | ||
286 | out_unlock: | ||
293 | if (main_bm_bh) | 287 | if (main_bm_bh) |
294 | brelse(main_bm_bh); | 288 | brelse(main_bm_bh); |
295 | 289 | ||
296 | if (main_bm_inode) | 290 | ocfs2_meta_unlock(main_bm_inode, 1); |
297 | iput(main_bm_inode); | ||
298 | 291 | ||
292 | out_mutex: | ||
293 | mutex_unlock(&main_bm_inode->i_mutex); | ||
294 | iput(main_bm_inode); | ||
295 | |||
296 | out: | ||
299 | if (local_alloc_inode) | 297 | if (local_alloc_inode) |
300 | iput(local_alloc_inode); | 298 | iput(local_alloc_inode); |
301 | 299 | ||
@@ -385,41 +383,35 @@ int ocfs2_complete_local_alloc_recovery(struct ocfs2_super *osb, | |||
385 | struct ocfs2_dinode *alloc) | 383 | struct ocfs2_dinode *alloc) |
386 | { | 384 | { |
387 | int status; | 385 | int status; |
388 | struct ocfs2_journal_handle *handle = NULL; | 386 | struct ocfs2_journal_handle *handle; |
389 | struct buffer_head *main_bm_bh = NULL; | 387 | struct buffer_head *main_bm_bh = NULL; |
390 | struct inode *main_bm_inode = NULL; | 388 | struct inode *main_bm_inode; |
391 | 389 | ||
392 | mlog_entry_void(); | 390 | mlog_entry_void(); |
393 | 391 | ||
394 | handle = ocfs2_alloc_handle(osb); | ||
395 | if (!handle) { | ||
396 | status = -ENOMEM; | ||
397 | mlog_errno(status); | ||
398 | goto bail; | ||
399 | } | ||
400 | |||
401 | main_bm_inode = ocfs2_get_system_file_inode(osb, | 392 | main_bm_inode = ocfs2_get_system_file_inode(osb, |
402 | GLOBAL_BITMAP_SYSTEM_INODE, | 393 | GLOBAL_BITMAP_SYSTEM_INODE, |
403 | OCFS2_INVALID_SLOT); | 394 | OCFS2_INVALID_SLOT); |
404 | if (!main_bm_inode) { | 395 | if (!main_bm_inode) { |
405 | status = -EINVAL; | 396 | status = -EINVAL; |
406 | mlog_errno(status); | 397 | mlog_errno(status); |
407 | goto bail; | 398 | goto out; |
408 | } | 399 | } |
409 | 400 | ||
410 | ocfs2_handle_add_inode(handle, main_bm_inode); | 401 | mutex_lock(&main_bm_inode->i_mutex); |
411 | status = ocfs2_meta_lock(main_bm_inode, handle, &main_bm_bh, 1); | 402 | |
403 | status = ocfs2_meta_lock(main_bm_inode, NULL, &main_bm_bh, 1); | ||
412 | if (status < 0) { | 404 | if (status < 0) { |
413 | mlog_errno(status); | 405 | mlog_errno(status); |
414 | goto bail; | 406 | goto out_mutex; |
415 | } | 407 | } |
416 | 408 | ||
417 | handle = ocfs2_start_trans(osb, handle, OCFS2_WINDOW_MOVE_CREDITS); | 409 | handle = ocfs2_start_trans(osb, NULL, OCFS2_WINDOW_MOVE_CREDITS); |
418 | if (IS_ERR(handle)) { | 410 | if (IS_ERR(handle)) { |
419 | status = PTR_ERR(handle); | 411 | status = PTR_ERR(handle); |
420 | handle = NULL; | 412 | handle = NULL; |
421 | mlog_errno(status); | 413 | mlog_errno(status); |
422 | goto bail; | 414 | goto out_unlock; |
423 | } | 415 | } |
424 | 416 | ||
425 | /* we want the bitmap change to be recorded on disk asap */ | 417 | /* we want the bitmap change to be recorded on disk asap */ |
@@ -430,16 +422,20 @@ int ocfs2_complete_local_alloc_recovery(struct ocfs2_super *osb, | |||
430 | if (status < 0) | 422 | if (status < 0) |
431 | mlog_errno(status); | 423 | mlog_errno(status); |
432 | 424 | ||
433 | bail: | 425 | ocfs2_commit_trans(handle); |
434 | if (handle) | 426 | |
435 | ocfs2_commit_trans(handle); | 427 | out_unlock: |
428 | ocfs2_meta_unlock(main_bm_inode, 1); | ||
429 | |||
430 | out_mutex: | ||
431 | mutex_unlock(&main_bm_inode->i_mutex); | ||
436 | 432 | ||
437 | if (main_bm_bh) | 433 | if (main_bm_bh) |
438 | brelse(main_bm_bh); | 434 | brelse(main_bm_bh); |
439 | 435 | ||
440 | if (main_bm_inode) | 436 | iput(main_bm_inode); |
441 | iput(main_bm_inode); | ||
442 | 437 | ||
438 | out: | ||
443 | mlog_exit(status); | 439 | mlog_exit(status); |
444 | return status; | 440 | return status; |
445 | } | 441 | } |