@@ -1004,13 +1004,50 @@ static void print_mount_opts(struct bch_fs *c)
1004
1004
printbuf_exit (& p );
1005
1005
}
1006
1006
1007
+ static bool bch2_fs_may_start (struct bch_fs * c )
1008
+ {
1009
+ struct bch_dev * ca ;
1010
+ unsigned i , flags = 0 ;
1011
+
1012
+ if (c -> opts .very_degraded )
1013
+ flags |= BCH_FORCE_IF_DEGRADED |BCH_FORCE_IF_LOST ;
1014
+
1015
+ if (c -> opts .degraded )
1016
+ flags |= BCH_FORCE_IF_DEGRADED ;
1017
+
1018
+ if (!c -> opts .degraded &&
1019
+ !c -> opts .very_degraded ) {
1020
+ mutex_lock (& c -> sb_lock );
1021
+
1022
+ for (i = 0 ; i < c -> disk_sb .sb -> nr_devices ; i ++ ) {
1023
+ if (!bch2_member_exists (c -> disk_sb .sb , i ))
1024
+ continue ;
1025
+
1026
+ ca = bch2_dev_locked (c , i );
1027
+
1028
+ if (!bch2_dev_is_online (ca ) &&
1029
+ (ca -> mi .state == BCH_MEMBER_STATE_rw ||
1030
+ ca -> mi .state == BCH_MEMBER_STATE_ro )) {
1031
+ mutex_unlock (& c -> sb_lock );
1032
+ return false;
1033
+ }
1034
+ }
1035
+ mutex_unlock (& c -> sb_lock );
1036
+ }
1037
+
1038
+ return bch2_have_enough_devs (c , bch2_online_devs (c ), flags , true);
1039
+ }
1040
+
1007
1041
int bch2_fs_start (struct bch_fs * c )
1008
1042
{
1009
1043
time64_t now = ktime_get_real_seconds ();
1010
1044
int ret = 0 ;
1011
1045
1012
1046
print_mount_opts (c );
1013
1047
1048
+ if (!bch2_fs_may_start (c ))
1049
+ return - BCH_ERR_insufficient_devices_to_start ;
1050
+
1014
1051
down_write (& c -> state_lock );
1015
1052
mutex_lock (& c -> sb_lock );
1016
1053
@@ -1537,40 +1574,6 @@ bool bch2_dev_state_allowed(struct bch_fs *c, struct bch_dev *ca,
1537
1574
}
1538
1575
}
1539
1576
1540
- static bool bch2_fs_may_start (struct bch_fs * c )
1541
- {
1542
- struct bch_dev * ca ;
1543
- unsigned i , flags = 0 ;
1544
-
1545
- if (c -> opts .very_degraded )
1546
- flags |= BCH_FORCE_IF_DEGRADED |BCH_FORCE_IF_LOST ;
1547
-
1548
- if (c -> opts .degraded )
1549
- flags |= BCH_FORCE_IF_DEGRADED ;
1550
-
1551
- if (!c -> opts .degraded &&
1552
- !c -> opts .very_degraded ) {
1553
- mutex_lock (& c -> sb_lock );
1554
-
1555
- for (i = 0 ; i < c -> disk_sb .sb -> nr_devices ; i ++ ) {
1556
- if (!bch2_member_exists (c -> disk_sb .sb , i ))
1557
- continue ;
1558
-
1559
- ca = bch2_dev_locked (c , i );
1560
-
1561
- if (!bch2_dev_is_online (ca ) &&
1562
- (ca -> mi .state == BCH_MEMBER_STATE_rw ||
1563
- ca -> mi .state == BCH_MEMBER_STATE_ro )) {
1564
- mutex_unlock (& c -> sb_lock );
1565
- return false;
1566
- }
1567
- }
1568
- mutex_unlock (& c -> sb_lock );
1569
- }
1570
-
1571
- return bch2_have_enough_devs (c , bch2_online_devs (c ), flags , true);
1572
- }
1573
-
1574
1577
static void __bch2_dev_read_only (struct bch_fs * c , struct bch_dev * ca )
1575
1578
{
1576
1579
bch2_dev_io_ref_stop (ca , WRITE );
@@ -2206,11 +2209,6 @@ struct bch_fs *bch2_fs_open(char * const *devices, unsigned nr_devices,
2206
2209
}
2207
2210
up_write (& c -> state_lock );
2208
2211
2209
- if (!bch2_fs_may_start (c )) {
2210
- ret = - BCH_ERR_insufficient_devices_to_start ;
2211
- goto err_print ;
2212
- }
2213
-
2214
2212
if (!c -> opts .nostart ) {
2215
2213
ret = bch2_fs_start (c );
2216
2214
if (ret )
0 commit comments