@@ -2678,27 +2678,19 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
2678
2678
char b [BDEVNAME_SIZE ];
2679
2679
int ret ;
2680
2680
2681
- /*
2682
- * Unlock here to avoid various RECLAIM-FS-ON <-> IN-RECLAIM-FS
2683
- * dependency inversion warnings.
2684
- */
2685
- reiserfs_write_unlock (sb );
2686
2681
journal = SB_JOURNAL (sb ) = vzalloc (sizeof (struct reiserfs_journal ));
2687
2682
if (!journal ) {
2688
2683
reiserfs_warning (sb , "journal-1256" ,
2689
2684
"unable to get memory for journal structure" );
2690
- reiserfs_write_lock (sb );
2691
2685
return 1 ;
2692
2686
}
2693
2687
INIT_LIST_HEAD (& journal -> j_bitmap_nodes );
2694
2688
INIT_LIST_HEAD (& journal -> j_prealloc_list );
2695
2689
INIT_LIST_HEAD (& journal -> j_working_list );
2696
2690
INIT_LIST_HEAD (& journal -> j_journal_list );
2697
2691
journal -> j_persistent_trans = 0 ;
2698
- ret = reiserfs_allocate_list_bitmaps (sb , journal -> j_list_bitmap ,
2699
- reiserfs_bmap_count (sb ));
2700
- reiserfs_write_lock (sb );
2701
- if (ret )
2692
+ if (reiserfs_allocate_list_bitmaps (sb , journal -> j_list_bitmap ,
2693
+ reiserfs_bmap_count (sb )))
2702
2694
goto free_and_return ;
2703
2695
2704
2696
allocate_bitmap_nodes (sb );
@@ -2727,27 +2719,11 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
2727
2719
goto free_and_return ;
2728
2720
}
2729
2721
2730
- /*
2731
- * We need to unlock here to avoid creating the following
2732
- * dependency:
2733
- * reiserfs_lock -> sysfs_mutex
2734
- * Because the reiserfs mmap path creates the following dependency:
2735
- * mm->mmap -> reiserfs_lock, hence we have
2736
- * mm->mmap -> reiserfs_lock ->sysfs_mutex
2737
- * This would ends up in a circular dependency with sysfs readdir path
2738
- * which does sysfs_mutex -> mm->mmap_sem
2739
- * This is fine because the reiserfs lock is useless in mount path,
2740
- * at least until we call journal_begin. We keep it for paranoid
2741
- * reasons.
2742
- */
2743
- reiserfs_write_unlock (sb );
2744
2722
if (journal_init_dev (sb , journal , j_dev_name ) != 0 ) {
2745
- reiserfs_write_lock (sb );
2746
2723
reiserfs_warning (sb , "sh-462" ,
2747
2724
"unable to initialize jornal device" );
2748
2725
goto free_and_return ;
2749
2726
}
2750
- reiserfs_write_lock (sb );
2751
2727
2752
2728
rs = SB_DISK_SUPER_BLOCK (sb );
2753
2729
@@ -2829,9 +2805,7 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
2829
2805
journal -> j_mount_id = 10 ;
2830
2806
journal -> j_state = 0 ;
2831
2807
atomic_set (& (journal -> j_jlock ), 0 );
2832
- reiserfs_write_unlock (sb );
2833
2808
journal -> j_cnode_free_list = allocate_cnodes (num_cnodes );
2834
- reiserfs_write_lock (sb );
2835
2809
journal -> j_cnode_free_orig = journal -> j_cnode_free_list ;
2836
2810
journal -> j_cnode_free = journal -> j_cnode_free_list ? num_cnodes : 0 ;
2837
2811
journal -> j_cnode_used = 0 ;
@@ -2848,24 +2822,37 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
2848
2822
2849
2823
init_journal_hash (sb );
2850
2824
jl = journal -> j_current_jl ;
2825
+
2826
+ /*
2827
+ * get_list_bitmap() may call flush_commit_list() which
2828
+ * requires the lock. Calling flush_commit_list() shouldn't happen
2829
+ * this early but I like to be paranoid.
2830
+ */
2831
+ reiserfs_write_lock (sb );
2851
2832
jl -> j_list_bitmap = get_list_bitmap (sb , jl );
2833
+ reiserfs_write_unlock (sb );
2852
2834
if (!jl -> j_list_bitmap ) {
2853
2835
reiserfs_warning (sb , "journal-2005" ,
2854
2836
"get_list_bitmap failed for journal list 0" );
2855
2837
goto free_and_return ;
2856
2838
}
2857
- if (journal_read (sb ) < 0 ) {
2839
+
2840
+ /*
2841
+ * Journal_read needs to be inspected in order to push down
2842
+ * the lock further inside (or even remove it).
2843
+ */
2844
+ reiserfs_write_lock (sb );
2845
+ ret = journal_read (sb );
2846
+ reiserfs_write_unlock (sb );
2847
+ if (ret < 0 ) {
2858
2848
reiserfs_warning (sb , "reiserfs-2006" ,
2859
2849
"Replay Failure, unable to mount" );
2860
2850
goto free_and_return ;
2861
2851
}
2862
2852
2863
2853
reiserfs_mounted_fs_count ++ ;
2864
- if (reiserfs_mounted_fs_count <= 1 ) {
2865
- reiserfs_write_unlock (sb );
2854
+ if (reiserfs_mounted_fs_count <= 1 )
2866
2855
commit_wq = alloc_workqueue ("reiserfs" , WQ_MEM_RECLAIM , 0 );
2867
- reiserfs_write_lock (sb );
2868
- }
2869
2856
2870
2857
INIT_DELAYED_WORK (& journal -> j_work , flush_async_commits );
2871
2858
journal -> j_work_sb = sb ;
0 commit comments