@@ -1703,9 +1703,6 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
17031703 struct bch_opts opts = bch2_opts_empty ();
17041704 struct bch_sb_handle sb ;
17051705 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 ;
17091706 struct printbuf errbuf = PRINTBUF ;
17101707 struct printbuf label = PRINTBUF ;
17111708 int ret ;
@@ -1715,7 +1712,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
17151712 if (ret )
17161713 goto err ;
17171714
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 );
17191716
17201717 if (BCH_MEMBER_GROUP (& dev_mi )) {
17211718 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)
17531750 goto err_unlock ;
17541751
17551752 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 ;
17911754
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 ) {
17951757 bch_err_msg (c , ret , "setting up new superblock" );
17961758 goto err_unlock ;
17971759 }
1798- struct bch_member * m = bch2_members_v2_get_mut ( c -> disk_sb . sb , dev_idx ) ;
1760+ unsigned dev_idx = ret ;
17991761
18001762 /* success: */
18011763
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 ;
18051766
18061767 ca -> disk_sb .sb -> dev_idx = dev_idx ;
18071768 bch2_dev_attach (c , ca , dev_idx );
0 commit comments