@@ -1703,9 +1703,6 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
1703
1703
struct bch_opts opts = bch2_opts_empty ();
1704
1704
struct bch_sb_handle sb ;
1705
1705
struct bch_dev * ca = NULL ;
1706
- struct bch_sb_field_members_v2 * mi ;
1707
- struct bch_member dev_mi ;
1708
- unsigned dev_idx , nr_devices , u64s ;
1709
1706
struct printbuf errbuf = PRINTBUF ;
1710
1707
struct printbuf label = PRINTBUF ;
1711
1708
int ret ;
@@ -1715,7 +1712,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
1715
1712
if (ret )
1716
1713
goto err ;
1717
1714
1718
- dev_mi = bch2_sb_member_get (sb .sb , sb .sb -> dev_idx );
1715
+ struct bch_member dev_mi = bch2_sb_member_get (sb .sb , sb .sb -> dev_idx );
1719
1716
1720
1717
if (BCH_MEMBER_GROUP (& dev_mi )) {
1721
1718
bch2_disk_path_to_text_sb (& label , sb .sb , BCH_MEMBER_GROUP (& dev_mi ) - 1 );
@@ -1753,55 +1750,19 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
1753
1750
goto err_unlock ;
1754
1751
1755
1752
if (dynamic_fault ("bcachefs:add:no_slot" ))
1756
- goto no_slot ;
1757
-
1758
- if (c -> sb .nr_devices < BCH_SB_MEMBERS_MAX ) {
1759
- dev_idx = c -> sb .nr_devices ;
1760
- goto have_slot ;
1761
- }
1762
-
1763
- int best = -1 ;
1764
- u64 best_last_mount = 0 ;
1765
- for (dev_idx = 0 ; dev_idx < BCH_SB_MEMBERS_MAX ; dev_idx ++ ) {
1766
- struct bch_member m = bch2_sb_member_get (c -> disk_sb .sb , dev_idx );
1767
- if (bch2_member_alive (& m ))
1768
- continue ;
1769
-
1770
- u64 last_mount = le64_to_cpu (m .last_mount );
1771
- if (best < 0 || last_mount < best_last_mount ) {
1772
- best = dev_idx ;
1773
- best_last_mount = last_mount ;
1774
- }
1775
- }
1776
- if (best >= 0 ) {
1777
- dev_idx = best ;
1778
- goto have_slot ;
1779
- }
1780
- no_slot :
1781
- ret = - BCH_ERR_ENOSPC_sb_members ;
1782
- bch_err_msg (c , ret , "setting up new superblock" );
1783
- goto err_unlock ;
1784
-
1785
- have_slot :
1786
- nr_devices = max_t (unsigned , dev_idx + 1 , c -> sb .nr_devices );
1787
-
1788
- mi = bch2_sb_field_get (c -> disk_sb .sb , members_v2 );
1789
- u64s = DIV_ROUND_UP (sizeof (struct bch_sb_field_members_v2 ) +
1790
- le16_to_cpu (mi -> member_bytes ) * nr_devices , sizeof (u64 ));
1753
+ goto err_unlock ;
1791
1754
1792
- mi = bch2_sb_field_resize (& c -> disk_sb , members_v2 , u64s );
1793
- if (!mi ) {
1794
- ret = - BCH_ERR_ENOSPC_sb_members ;
1755
+ ret = bch2_sb_member_alloc (c );
1756
+ if (ret < 0 ) {
1795
1757
bch_err_msg (c , ret , "setting up new superblock" );
1796
1758
goto err_unlock ;
1797
1759
}
1798
- struct bch_member * m = bch2_members_v2_get_mut ( c -> disk_sb . sb , dev_idx ) ;
1760
+ unsigned dev_idx = ret ;
1799
1761
1800
1762
/* success: */
1801
1763
1802
- * m = dev_mi ;
1803
- m -> last_mount = cpu_to_le64 (ktime_get_real_seconds ());
1804
- c -> disk_sb .sb -> nr_devices = nr_devices ;
1764
+ dev_mi .last_mount = cpu_to_le64 (ktime_get_real_seconds ());
1765
+ * bch2_members_v2_get_mut (c -> disk_sb .sb , dev_idx ) = dev_mi ;
1805
1766
1806
1767
ca -> disk_sb .sb -> dev_idx = dev_idx ;
1807
1768
bch2_dev_attach (c , ca , dev_idx );
0 commit comments