User: | Jiri Slaby |
Error type: | Double Lock |
Error type description: | Some lock is locked twice unintentionally in a sequence |
File location: | fs/jbd/commit.c |
Line in file: | 463 |
Project: | Linux Kernel |
Project version: | 2.6.28 |
Tools: |
Stanse
(1.2)
Smatch (1.59) |
Entered: | 2011-11-07 22:19:59 UTC |
433 /* 434 * Wait for all previously submitted IO to complete. 435 */ 436 spin_lock(&journal->j_list_lock); 437 while (commit_transaction->t_locked_list) { 438 struct buffer_head *bh; 439 440 jh = commit_transaction->t_locked_list->b_tprev; 441 bh = jh2bh(jh); 442 get_bh(bh); 443 if (buffer_locked(bh)) { 444 spin_unlock(&journal->j_list_lock); 445 wait_on_buffer(bh); 446 spin_lock(&journal->j_list_lock); 447 } 448 if (unlikely(!buffer_uptodate(bh))) { 449 if (!trylock_page(bh->b_page)) { 450 spin_unlock(&journal->j_list_lock); 451 lock_page(bh->b_page); 452 spin_lock(&journal->j_list_lock); 453 } 454 if (bh->b_page->mapping) 455 set_bit(AS_EIO, &bh->b_page->mapping->flags); 456 457 unlock_page(bh->b_page); 458 SetPageError(bh->b_page); 459 err = -EIO; 460 } 461 if (!inverted_lock(journal, bh)) { 462 put_bh(bh); 463 spin_lock(&journal->j_list_lock); 464 continue; 465 } 466 if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) { 467 __journal_unfile_buffer(jh); 468 jbd_unlock_bh_state(bh); 469 journal_remove_journal_head(bh); 470 put_bh(bh); 471 } else { 472 jbd_unlock_bh_state(bh); 473 }