Showing error 589

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


Source:

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                }
Show full sources