@@ -533,9 +533,11 @@ int bch2_fs_read_write(struct bch_fs *c)
533533
534534int bch2_fs_read_write_early (struct bch_fs * c )
535535{
536- lockdep_assert_held (& c -> state_lock );
536+ down_write (& c -> state_lock );
537+ int ret = __bch2_fs_read_write (c , true);
538+ up_write (& c -> state_lock );
537539
538- return __bch2_fs_read_write ( c , true) ;
540+ return ret ;
539541}
540542
541543/* Filesystem startup/shutdown: */
@@ -1019,38 +1021,39 @@ static void print_mount_opts(struct bch_fs *c)
10191021int bch2_fs_start (struct bch_fs * c )
10201022{
10211023 time64_t now = ktime_get_real_seconds ();
1022- int ret ;
1024+ int ret = 0 ;
10231025
10241026 print_mount_opts (c );
10251027
10261028 down_write (& c -> state_lock );
1029+ mutex_lock (& c -> sb_lock );
10271030
10281031 BUG_ON (test_bit (BCH_FS_started , & c -> flags ));
10291032
1030- mutex_lock (& c -> sb_lock );
1033+ if (!bch2_sb_field_get_minsize (& c -> disk_sb , ext ,
1034+ sizeof (struct bch_sb_field_ext ) / sizeof (u64 ))) {
1035+ mutex_unlock (& c -> sb_lock );
1036+ up_write (& c -> state_lock );
1037+ ret = - BCH_ERR_ENOSPC_sb ;
1038+ goto err ;
1039+ }
10311040
10321041 ret = bch2_sb_members_v2_init (c );
10331042 if (ret ) {
10341043 mutex_unlock (& c -> sb_lock );
1044+ up_write (& c -> state_lock );
10351045 goto err ;
10361046 }
10371047
10381048 for_each_online_member (c , ca )
10391049 bch2_members_v2_get_mut (c -> disk_sb .sb , ca -> dev_idx )-> last_mount = cpu_to_le64 (now );
10401050
1041- struct bch_sb_field_ext * ext =
1042- bch2_sb_field_get_minsize (& c -> disk_sb , ext , sizeof (* ext ) / sizeof (u64 ));
10431051 mutex_unlock (& c -> sb_lock );
10441052
1045- if (!ext ) {
1046- bch_err (c , "insufficient space in superblock for sb_field_ext" );
1047- ret = - BCH_ERR_ENOSPC_sb ;
1048- goto err ;
1049- }
1050-
10511053 for_each_rw_member (c , ca )
10521054 bch2_dev_allocator_add (c , ca );
10531055 bch2_recalc_capacity (c );
1056+ up_write (& c -> state_lock );
10541057
10551058 c -> recovery_task = current ;
10561059 ret = BCH_SB_INITIALIZED (c -> disk_sb .sb )
@@ -1066,31 +1069,28 @@ int bch2_fs_start(struct bch_fs *c)
10661069 goto err ;
10671070
10681071 if (bch2_fs_init_fault ("fs_start" )) {
1069- bch_err (c , "fs_start fault injected" );
1070- ret = - EINVAL ;
1072+ ret = - BCH_ERR_injected_fs_start ;
10711073 goto err ;
10721074 }
10731075
10741076 set_bit (BCH_FS_started , & c -> flags );
10751077 wake_up (& c -> ro_ref_wait );
10761078
1079+ down_write (& c -> state_lock );
10771080 if (c -> opts .read_only ) {
10781081 bch2_fs_read_only (c );
10791082 } else {
10801083 ret = !test_bit (BCH_FS_rw , & c -> flags )
10811084 ? bch2_fs_read_write (c )
10821085 : bch2_fs_read_write_late (c );
1083- if (ret )
1084- goto err ;
10851086 }
1087+ up_write (& c -> state_lock );
10861088
1087- ret = 0 ;
10881089err :
10891090 if (ret )
10901091 bch_err_msg (c , ret , "starting filesystem" );
10911092 else
10921093 bch_verbose (c , "done starting filesystem" );
1093- up_write (& c -> state_lock );
10941094 return ret ;
10951095}
10961096
0 commit comments