Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: for_each_member_device() now declares loop iter

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+154 -239
+5 -13
fs/bcachefs/alloc_background.c
··· 1787 1787 static void bch2_do_invalidates_work(struct work_struct *work) 1788 1788 { 1789 1789 struct bch_fs *c = container_of(work, struct bch_fs, invalidate_work); 1790 - struct bch_dev *ca; 1791 1790 struct btree_trans *trans = bch2_trans_get(c); 1792 - unsigned i; 1793 1791 int ret = 0; 1794 1792 1795 1793 ret = bch2_btree_write_buffer_tryflush(trans); 1796 1794 if (ret) 1797 1795 goto err; 1798 1796 1799 - for_each_member_device(ca, c, i) { 1797 + for_each_member_device(c, ca) { 1800 1798 s64 nr_to_invalidate = 1801 1799 should_invalidate_buckets(ca, bch2_dev_usage_read(ca)); 1802 1800 ··· 1923 1925 1924 1926 int bch2_fs_freespace_init(struct bch_fs *c) 1925 1927 { 1926 - struct bch_dev *ca; 1927 - unsigned i; 1928 1928 int ret = 0; 1929 1929 bool doing_init = false; 1930 1930 ··· 1931 1935 * every mount: 1932 1936 */ 1933 1937 1934 - for_each_member_device(ca, c, i) { 1938 + for_each_member_device(c, ca) { 1935 1939 if (ca->mi.freespace_initialized) 1936 1940 continue; 1937 1941 ··· 1991 1995 1992 1996 void bch2_recalc_capacity(struct bch_fs *c) 1993 1997 { 1994 - struct bch_dev *ca; 1995 1998 u64 capacity = 0, reserved_sectors = 0, gc_reserve; 1996 1999 unsigned bucket_size_max = 0; 1997 2000 unsigned long ra_pages = 0; 1998 - unsigned i; 1999 2001 2000 2002 lockdep_assert_held(&c->state_lock); 2001 2003 2002 - for_each_online_member(ca, c, i) { 2004 + for_each_online_member(c, ca) { 2003 2005 struct backing_dev_info *bdi = ca->disk_sb.bdev->bd_disk->bdi; 2004 2006 2005 2007 ra_pages += bdi->ra_pages; ··· 2005 2011 2006 2012 bch2_set_ra_pages(c, ra_pages); 2007 2013 2008 - for_each_rw_member(ca, c, i) { 2014 + for_each_rw_member(c, ca) { 2009 2015 u64 dev_reserve = 0; 2010 2016 2011 2017 /* ··· 2061 2067 2062 2068 u64 bch2_min_rw_member_capacity(struct bch_fs *c) 2063 2069 { 2064 - struct bch_dev *ca; 2065 - unsigned i; 2066 2070 u64 ret = U64_MAX; 2067 2071 2068 - for_each_rw_member(ca, c, i) 2072 + for_each_rw_member(c, ca) 2069 2073 ret = min(ret, ca->mi.nbuckets * ca->mi.bucket_size); 2070 2074 return ret; 2071 2075 }
+63 -98
fs/bcachefs/btree_gc.c
··· 1153 1153 1154 1154 static void bch2_mark_superblocks(struct bch_fs *c) 1155 1155 { 1156 - struct bch_dev *ca; 1157 - unsigned i; 1158 - 1159 1156 mutex_lock(&c->sb_lock); 1160 1157 gc_pos_set(c, gc_phase(GC_PHASE_SB)); 1161 1158 1162 - for_each_online_member(ca, c, i) 1159 + for_each_online_member(c, ca) 1163 1160 bch2_mark_dev_superblock(c, ca, BTREE_TRIGGER_GC); 1164 1161 mutex_unlock(&c->sb_lock); 1165 1162 } ··· 1181 1184 1182 1185 static void bch2_gc_free(struct bch_fs *c) 1183 1186 { 1184 - struct bch_dev *ca; 1185 - unsigned i; 1186 - 1187 1187 genradix_free(&c->reflink_gc_table); 1188 1188 genradix_free(&c->gc_stripes); 1189 1189 1190 - for_each_member_device(ca, c, i) { 1190 + for_each_member_device(c, ca) { 1191 1191 kvpfree(rcu_dereference_protected(ca->buckets_gc, 1), 1192 1192 sizeof(struct bucket_array) + 1193 1193 ca->mi.nbuckets * sizeof(struct bucket)); ··· 1206 1212 bool verify = !metadata_only && 1207 1213 !c->opts.reconstruct_alloc && 1208 1214 (!initial || (c->sb.compat & (1ULL << BCH_COMPAT_alloc_info))); 1209 - unsigned i, dev; 1215 + unsigned i; 1210 1216 int ret = 0; 1211 1217 1212 1218 percpu_down_write(&c->mark_lock); ··· 1218 1224 , ##__VA_ARGS__, dst->_f, src->_f))) \ 1219 1225 dst->_f = src->_f 1220 1226 #define copy_dev_field(_err, _f, _msg, ...) \ 1221 - copy_field(_err, _f, "dev %u has wrong " _msg, dev, ##__VA_ARGS__) 1227 + copy_field(_err, _f, "dev %u has wrong " _msg, ca->dev_idx, ##__VA_ARGS__) 1222 1228 #define copy_fs_field(_err, _f, _msg, ...) \ 1223 1229 copy_field(_err, _f, "fs has wrong " _msg, ##__VA_ARGS__) 1224 1230 1225 1231 for (i = 0; i < ARRAY_SIZE(c->usage); i++) 1226 1232 bch2_fs_usage_acc_to_base(c, i); 1227 1233 1228 - for_each_member_device(ca, c, dev) { 1234 + __for_each_member_device(c, ca) { 1229 1235 struct bch_dev_usage *dst = ca->usage_base; 1230 1236 struct bch_dev_usage *src = (void *) 1231 1237 bch2_acc_percpu_u64s((u64 __percpu *) ca->usage_gc, ··· 1301 1307 1302 1308 static int bch2_gc_start(struct bch_fs *c) 1303 1309 { 1304 - struct bch_dev *ca = NULL; 1305 - unsigned i; 1306 - 1307 1310 BUG_ON(c->usage_gc); 1308 1311 1309 1312 c->usage_gc = __alloc_percpu_gfp(fs_usage_u64s(c) * sizeof(u64), ··· 1310 1319 return -BCH_ERR_ENOMEM_gc_start; 1311 1320 } 1312 1321 1313 - for_each_member_device(ca, c, i) { 1322 + for_each_member_device(c, ca) { 1314 1323 BUG_ON(ca->usage_gc); 1315 1324 1316 1325 ca->usage_gc = alloc_percpu(struct bch_dev_usage); ··· 1329 1338 1330 1339 static int bch2_gc_reset(struct bch_fs *c) 1331 1340 { 1332 - struct bch_dev *ca; 1333 - unsigned i; 1334 - 1335 - for_each_member_device(ca, c, i) { 1341 + for_each_member_device(c, ca) { 1336 1342 free_percpu(ca->usage_gc); 1337 1343 ca->usage_gc = NULL; 1338 1344 } ··· 1366 1378 const struct bch_alloc_v4 *old; 1367 1379 enum bch_data_type type; 1368 1380 int ret; 1369 - 1370 - if (bkey_ge(iter->pos, POS(ca->dev_idx, ca->mi.nbuckets))) 1371 - return 1; 1372 1381 1373 1382 old = bch2_alloc_to_v4(k, &old_convert); 1374 1383 new = *old; ··· 1463 1478 1464 1479 static int bch2_gc_alloc_done(struct bch_fs *c, bool metadata_only) 1465 1480 { 1466 - struct btree_trans *trans = bch2_trans_get(c); 1467 - struct bch_dev *ca; 1468 - unsigned i; 1469 1481 int ret = 0; 1470 1482 1471 - for_each_member_device(ca, c, i) { 1472 - ret = for_each_btree_key_commit(trans, iter, BTREE_ID_alloc, 1473 - POS(ca->dev_idx, ca->mi.first_bucket), 1474 - BTREE_ITER_SLOTS|BTREE_ITER_PREFETCH, k, 1475 - NULL, NULL, BCH_TRANS_COMMIT_lazy_rw, 1476 - bch2_alloc_write_key(trans, &iter, k, metadata_only)); 1477 - 1478 - if (ret < 0) { 1479 - bch_err_fn(c, ret); 1483 + for_each_member_device(c, ca) { 1484 + ret = bch2_trans_run(c, 1485 + for_each_btree_key_upto_commit(trans, iter, BTREE_ID_alloc, 1486 + POS(ca->dev_idx, ca->mi.first_bucket), 1487 + POS(ca->dev_idx, ca->mi.nbuckets - 1), 1488 + BTREE_ITER_SLOTS|BTREE_ITER_PREFETCH, k, 1489 + NULL, NULL, BCH_TRANS_COMMIT_lazy_rw, 1490 + bch2_alloc_write_key(trans, &iter, k, metadata_only))); 1491 + if (ret) { 1480 1492 percpu_ref_put(&ca->ref); 1481 1493 break; 1482 1494 } 1483 1495 } 1484 1496 1485 - bch2_trans_put(trans); 1486 - return ret < 0 ? ret : 0; 1497 + bch_err_fn(c, ret); 1498 + return ret; 1487 1499 } 1488 1500 1489 1501 static int bch2_gc_alloc_start(struct bch_fs *c, bool metadata_only) 1490 1502 { 1491 - struct bch_dev *ca; 1492 - struct btree_trans *trans = bch2_trans_get(c); 1493 - struct bucket *g; 1494 - struct bch_alloc_v4 a_convert; 1495 - const struct bch_alloc_v4 *a; 1496 - unsigned i; 1497 - int ret; 1498 - 1499 - for_each_member_device(ca, c, i) { 1503 + for_each_member_device(c, ca) { 1500 1504 struct bucket_array *buckets = kvpmalloc(sizeof(struct bucket_array) + 1501 1505 ca->mi.nbuckets * sizeof(struct bucket), 1502 1506 GFP_KERNEL|__GFP_ZERO); 1503 1507 if (!buckets) { 1504 1508 percpu_ref_put(&ca->ref); 1505 1509 bch_err(c, "error allocating ca->buckets[gc]"); 1506 - ret = -BCH_ERR_ENOMEM_gc_alloc_start; 1507 - goto err; 1510 + return -BCH_ERR_ENOMEM_gc_alloc_start; 1508 1511 } 1509 1512 1510 1513 buckets->first_bucket = ca->mi.first_bucket; ··· 1500 1527 rcu_assign_pointer(ca->buckets_gc, buckets); 1501 1528 } 1502 1529 1503 - ret = for_each_btree_key(trans, iter, BTREE_ID_alloc, POS_MIN, 1504 - BTREE_ITER_PREFETCH, k, ({ 1505 - ca = bch_dev_bkey_exists(c, k.k->p.inode); 1506 - g = gc_bucket(ca, k.k->p.offset); 1530 + int ret = bch2_trans_run(c, 1531 + for_each_btree_key(trans, iter, BTREE_ID_alloc, POS_MIN, 1532 + BTREE_ITER_PREFETCH, k, ({ 1533 + struct bch_dev *ca = bch_dev_bkey_exists(c, k.k->p.inode); 1534 + struct bucket *g = gc_bucket(ca, k.k->p.offset); 1507 1535 1508 - a = bch2_alloc_to_v4(k, &a_convert); 1536 + struct bch_alloc_v4 a_convert; 1537 + const struct bch_alloc_v4 *a = bch2_alloc_to_v4(k, &a_convert); 1509 1538 1510 - g->gen_valid = 1; 1511 - g->gen = a->gen; 1539 + g->gen_valid = 1; 1540 + g->gen = a->gen; 1512 1541 1513 - if (metadata_only && 1514 - (a->data_type == BCH_DATA_user || 1515 - a->data_type == BCH_DATA_cached || 1516 - a->data_type == BCH_DATA_parity)) { 1517 - g->data_type = a->data_type; 1518 - g->dirty_sectors = a->dirty_sectors; 1519 - g->cached_sectors = a->cached_sectors; 1520 - g->stripe = a->stripe; 1521 - g->stripe_redundancy = a->stripe_redundancy; 1522 - } 1542 + if (metadata_only && 1543 + (a->data_type == BCH_DATA_user || 1544 + a->data_type == BCH_DATA_cached || 1545 + a->data_type == BCH_DATA_parity)) { 1546 + g->data_type = a->data_type; 1547 + g->dirty_sectors = a->dirty_sectors; 1548 + g->cached_sectors = a->cached_sectors; 1549 + g->stripe = a->stripe; 1550 + g->stripe_redundancy = a->stripe_redundancy; 1551 + } 1523 1552 1524 - 0; 1525 - })); 1526 - err: 1527 - bch2_trans_put(trans); 1553 + 0; 1554 + }))); 1528 1555 bch_err_fn(c, ret); 1529 1556 return ret; 1530 1557 } 1531 1558 1532 1559 static void bch2_gc_alloc_reset(struct bch_fs *c, bool metadata_only) 1533 1560 { 1534 - struct bch_dev *ca; 1535 - unsigned i; 1536 - 1537 - for_each_member_device(ca, c, i) { 1561 + for_each_member_device(c, ca) { 1538 1562 struct bucket_array *buckets = gc_bucket_array(ca); 1539 1563 struct bucket *g; 1540 1564 ··· 1902 1932 1903 1933 int bch2_gc_gens(struct bch_fs *c) 1904 1934 { 1905 - struct btree_trans *trans; 1906 - struct bch_dev *ca; 1907 1935 u64 b, start_time = local_clock(); 1908 - unsigned i; 1909 1936 int ret; 1910 1937 1911 1938 /* ··· 1915 1948 1916 1949 trace_and_count(c, gc_gens_start, c); 1917 1950 down_read(&c->gc_lock); 1918 - trans = bch2_trans_get(c); 1919 1951 1920 - for_each_member_device(ca, c, i) { 1952 + for_each_member_device(c, ca) { 1921 1953 struct bucket_gens *gens = bucket_gens(ca); 1922 1954 1923 1955 BUG_ON(ca->oldest_gen); ··· 1933 1967 ca->oldest_gen[b] = gens->b[b]; 1934 1968 } 1935 1969 1936 - for (i = 0; i < BTREE_ID_NR; i++) 1970 + for (unsigned i = 0; i < BTREE_ID_NR; i++) 1937 1971 if (btree_type_has_ptrs(i)) { 1938 1972 c->gc_gens_btree = i; 1939 1973 c->gc_gens_pos = POS_MIN; 1940 1974 1941 - ret = for_each_btree_key_commit(trans, iter, i, 1942 - POS_MIN, 1943 - BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, 1944 - k, 1945 - NULL, NULL, 1946 - BCH_TRANS_COMMIT_no_enospc, 1947 - gc_btree_gens_key(trans, &iter, k)); 1948 - if (!bch2_err_matches(ret, EROFS)) 1949 - bch_err_fn(c, ret); 1975 + ret = bch2_trans_run(c, 1976 + for_each_btree_key_commit(trans, iter, i, 1977 + POS_MIN, 1978 + BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, 1979 + k, 1980 + NULL, NULL, 1981 + BCH_TRANS_COMMIT_no_enospc, 1982 + gc_btree_gens_key(trans, &iter, k))); 1950 1983 if (ret) 1951 1984 goto err; 1952 1985 } 1953 1986 1954 - ret = for_each_btree_key_commit(trans, iter, BTREE_ID_alloc, 1955 - POS_MIN, 1956 - BTREE_ITER_PREFETCH, 1957 - k, 1958 - NULL, NULL, 1959 - BCH_TRANS_COMMIT_no_enospc, 1960 - bch2_alloc_write_oldest_gen(trans, &iter, k)); 1961 - if (!bch2_err_matches(ret, EROFS)) 1962 - bch_err_fn(c, ret); 1987 + ret = bch2_trans_run(c, 1988 + for_each_btree_key_commit(trans, iter, BTREE_ID_alloc, 1989 + POS_MIN, 1990 + BTREE_ITER_PREFETCH, 1991 + k, 1992 + NULL, NULL, 1993 + BCH_TRANS_COMMIT_no_enospc, 1994 + bch2_alloc_write_oldest_gen(trans, &iter, k))); 1963 1995 if (ret) 1964 1996 goto err; 1965 1997 ··· 1969 2005 bch2_time_stats_update(&c->times[BCH_TIME_btree_gc], start_time); 1970 2006 trace_and_count(c, gc_gens_end, c); 1971 2007 err: 1972 - for_each_member_device(ca, c, i) { 2008 + for_each_member_device(c, ca) { 1973 2009 kvfree(ca->oldest_gen); 1974 2010 ca->oldest_gen = NULL; 1975 2011 } 1976 2012 1977 - bch2_trans_put(trans); 1978 2013 up_read(&c->gc_lock); 1979 2014 mutex_unlock(&c->gc_gens_lock); 2015 + if (!bch2_err_matches(ret, EROFS)) 2016 + bch_err_fn(c, ret); 1980 2017 return ret; 1981 2018 } 1982 2019
+6 -13
fs/bcachefs/buckets.c
··· 47 47 48 48 void bch2_fs_usage_initialize(struct bch_fs *c) 49 49 { 50 - struct bch_fs_usage *usage; 51 - struct bch_dev *ca; 52 - unsigned i; 53 - 54 50 percpu_down_write(&c->mark_lock); 55 - usage = c->usage_base; 51 + struct bch_fs_usage *usage = c->usage_base; 56 52 57 - for (i = 0; i < ARRAY_SIZE(c->usage); i++) 53 + for (unsigned i = 0; i < ARRAY_SIZE(c->usage); i++) 58 54 bch2_fs_usage_acc_to_base(c, i); 59 55 60 - for (i = 0; i < BCH_REPLICAS_MAX; i++) 56 + for (unsigned i = 0; i < BCH_REPLICAS_MAX; i++) 61 57 usage->reserved += usage->persistent_reserved[i]; 62 58 63 - for (i = 0; i < c->replicas.nr; i++) { 59 + for (unsigned i = 0; i < c->replicas.nr; i++) { 64 60 struct bch_replicas_entry_v1 *e = 65 61 cpu_replicas_entry(&c->replicas, i); 66 62 67 63 fs_usage_data_type_to_base(usage, e->data_type, usage->replicas[i]); 68 64 } 69 65 70 - for_each_member_device(ca, c, i) { 66 + for_each_member_device(c, ca) { 71 67 struct bch_dev_usage dev = bch2_dev_usage_read(ca); 72 68 73 69 usage->hidden += (dev.d[BCH_DATA_sb].buckets + ··· 1762 1766 1763 1767 int bch2_trans_mark_dev_sbs(struct bch_fs *c) 1764 1768 { 1765 - struct bch_dev *ca; 1766 - unsigned i; 1767 - 1768 - for_each_online_member(ca, c, i) { 1769 + for_each_online_member(c, ca) { 1769 1770 int ret = bch2_trans_mark_dev_sb(c, ca); 1770 1771 if (ret) { 1771 1772 percpu_ref_put(&ca->ref);
+2 -4
fs/bcachefs/chardev.c
··· 866 866 struct bch_ioctl_disk_get_idx arg) 867 867 { 868 868 dev_t dev = huge_decode_dev(arg.dev); 869 - struct bch_dev *ca; 870 - unsigned i; 871 869 872 870 if (!capable(CAP_SYS_ADMIN)) 873 871 return -EPERM; ··· 873 875 if (!dev) 874 876 return -EINVAL; 875 877 876 - for_each_online_member(ca, c, i) 878 + for_each_online_member(c, ca) 877 879 if (ca->dev == dev) { 878 880 percpu_ref_put(&ca->io_ref); 879 - return i; 881 + return ca->dev_idx; 880 882 } 881 883 882 884 return -BCH_ERR_ENOENT_dev_idx_not_found;
+4 -7
fs/bcachefs/fs.c
··· 1694 1694 static int bch2_show_devname(struct seq_file *seq, struct dentry *root) 1695 1695 { 1696 1696 struct bch_fs *c = root->d_sb->s_fs_info; 1697 - struct bch_dev *ca; 1698 - unsigned i; 1699 1697 bool first = true; 1700 1698 1701 - for_each_online_member(ca, c, i) { 1699 + for_each_online_member(c, ca) { 1702 1700 if (!first) 1703 1701 seq_putc(seq, ':'); 1704 1702 first = false; ··· 1820 1822 int flags, const char *dev_name, void *data) 1821 1823 { 1822 1824 struct bch_fs *c; 1823 - struct bch_dev *ca; 1824 1825 struct super_block *sb; 1825 1826 struct inode *vinode; 1826 1827 struct bch_opts opts = bch2_opts_empty(); 1827 1828 char **devs; 1828 1829 struct bch_fs **devs_to_fs = NULL; 1829 - unsigned i, nr_devs; 1830 + unsigned nr_devs; 1830 1831 int ret; 1831 1832 1832 1833 opt_set(opts, read_only, (flags & SB_RDONLY) != 0); ··· 1847 1850 goto got_sb; 1848 1851 } 1849 1852 1850 - for (i = 0; i < nr_devs; i++) 1853 + for (unsigned i = 0; i < nr_devs; i++) 1851 1854 devs_to_fs[i] = bch2_path_to_fs(devs[i]); 1852 1855 1853 1856 sb = sget(fs_type, bch2_test_super, bch2_noset_super, ··· 1918 1921 1919 1922 sb->s_bdi->ra_pages = VM_READAHEAD_PAGES; 1920 1923 1921 - for_each_online_member(ca, c, i) { 1924 + for_each_online_member(c, ca) { 1922 1925 struct block_device *bdev = ca->disk_sb.bdev; 1923 1926 1924 1927 /* XXX: create an anonymous device for multi device filesystems */
+1 -4
fs/bcachefs/journal.c
··· 1029 1029 1030 1030 int bch2_fs_journal_alloc(struct bch_fs *c) 1031 1031 { 1032 - struct bch_dev *ca; 1033 - unsigned i; 1034 - 1035 - for_each_online_member(ca, c, i) { 1032 + for_each_online_member(c, ca) { 1036 1033 if (ca->journal.nr) 1037 1034 continue; 1038 1035
+5 -8
fs/bcachefs/journal_io.c
··· 1171 1171 struct journal_list jlist; 1172 1172 struct journal_replay *i, **_i, *prev = NULL; 1173 1173 struct genradix_iter radix_iter; 1174 - struct bch_dev *ca; 1175 - unsigned iter; 1176 1174 struct printbuf buf = PRINTBUF; 1177 1175 bool degraded = false, last_write_torn = false; 1178 1176 u64 seq; ··· 1181 1183 jlist.last_seq = 0; 1182 1184 jlist.ret = 0; 1183 1185 1184 - for_each_member_device(ca, c, iter) { 1186 + for_each_member_device(c, ca) { 1185 1187 if (!c->opts.fsck && 1186 1188 !(bch2_dev_has_data(c, ca) & (1 << BCH_DATA_journal))) 1187 1189 continue; ··· 1347 1349 continue; 1348 1350 1349 1351 for (ptr = 0; ptr < i->nr_ptrs; ptr++) { 1350 - ca = bch_dev_bkey_exists(c, i->ptrs[ptr].dev); 1352 + struct bch_dev *ca = bch_dev_bkey_exists(c, i->ptrs[ptr].dev); 1351 1353 1352 1354 if (!i->ptrs[ptr].csum_good) 1353 1355 bch_err_dev_offset(ca, i->ptrs[ptr].sector, ··· 1891 1893 { 1892 1894 closure_type(j, struct journal, io); 1893 1895 struct bch_fs *c = container_of(j, struct bch_fs, journal); 1894 - struct bch_dev *ca; 1895 1896 struct journal_buf *w = journal_last_unwritten_buf(j); 1896 1897 struct bch_replicas_padded replicas; 1897 1898 struct bio *bio; 1898 1899 struct printbuf journal_debug_buf = PRINTBUF; 1899 - unsigned i, nr_rw_members = 0; 1900 + unsigned nr_rw_members = 0; 1900 1901 int ret; 1901 1902 1902 1903 BUG_ON(BCH_SB_CLEAN(c->disk_sb.sb)); ··· 1955 1958 if (c->opts.nochanges) 1956 1959 goto no_io; 1957 1960 1958 - for_each_rw_member(ca, c, i) 1961 + for_each_rw_member(c, ca) 1959 1962 nr_rw_members++; 1960 1963 1961 1964 if (nr_rw_members > 1) ··· 1972 1975 goto err; 1973 1976 1974 1977 if (!JSET_NO_FLUSH(w->data) && w->separate_flush) { 1975 - for_each_rw_member(ca, c, i) { 1978 + for_each_rw_member(c, ca) { 1976 1979 percpu_ref_get(&ca->io_ref); 1977 1980 1978 1981 bio = ca->journal.bio;
+2 -6
fs/bcachefs/journal_reclaim.c
··· 263 263 void bch2_journal_do_discards(struct journal *j) 264 264 { 265 265 struct bch_fs *c = container_of(j, struct bch_fs, journal); 266 - struct bch_dev *ca; 267 - unsigned iter; 268 266 269 267 mutex_lock(&j->discard_lock); 270 268 271 - for_each_rw_member(ca, c, iter) { 269 + for_each_rw_member(c, ca) { 272 270 struct journal_device *ja = &ca->journal; 273 271 274 272 while (should_discard_bucket(j, ja)) { ··· 581 583 static u64 journal_seq_to_flush(struct journal *j) 582 584 { 583 585 struct bch_fs *c = container_of(j, struct bch_fs, journal); 584 - struct bch_dev *ca; 585 586 u64 seq_to_flush = 0; 586 - unsigned iter; 587 587 588 588 spin_lock(&j->lock); 589 589 590 - for_each_rw_member(ca, c, iter) { 590 + for_each_rw_member(c, ca) { 591 591 struct journal_device *ja = &ca->journal; 592 592 unsigned nr_buckets, bucket_to_flush; 593 593
+2 -5
fs/bcachefs/movinggc.c
··· 267 267 */ 268 268 unsigned long bch2_copygc_wait_amount(struct bch_fs *c) 269 269 { 270 - struct bch_dev *ca; 271 - unsigned dev_idx; 272 270 s64 wait = S64_MAX, fragmented_allowed, fragmented; 273 - unsigned i; 274 271 275 - for_each_rw_member(ca, c, dev_idx) { 272 + for_each_rw_member(c, ca) { 276 273 struct bch_dev_usage usage = bch2_dev_usage_read(ca); 277 274 278 275 fragmented_allowed = ((__dev_buckets_available(ca, usage, BCH_WATERMARK_stripe) * 279 276 ca->mi.bucket_size) >> 1); 280 277 fragmented = 0; 281 278 282 - for (i = 0; i < BCH_DATA_NR; i++) 279 + for (unsigned i = 0; i < BCH_DATA_NR; i++) 283 280 if (data_type_movable(i)) 284 281 fragmented += usage.d[i].fragmented; 285 282
+4 -6
fs/bcachefs/recovery.c
··· 1097 1097 struct bch_inode_unpacked root_inode, lostfound_inode; 1098 1098 struct bkey_inode_buf packed_inode; 1099 1099 struct qstr lostfound = QSTR("lost+found"); 1100 - struct bch_dev *ca; 1101 - unsigned i; 1102 1100 int ret; 1103 1101 1104 1102 bch_notice(c, "initializing new filesystem"); ··· 1118 1120 set_bit(BCH_FS_may_go_rw, &c->flags); 1119 1121 set_bit(BCH_FS_fsck_done, &c->flags); 1120 1122 1121 - for (i = 0; i < BTREE_ID_NR; i++) 1123 + for (unsigned i = 0; i < BTREE_ID_NR; i++) 1122 1124 bch2_btree_root_alloc(c, i); 1123 1125 1124 - for_each_member_device(ca, c, i) 1126 + for_each_member_device(c, ca) 1125 1127 bch2_dev_usage_init(ca); 1126 1128 1127 1129 ret = bch2_fs_journal_alloc(c); ··· 1149 1151 if (ret) 1150 1152 goto err; 1151 1153 1152 - for_each_online_member(ca, c, i) 1154 + for_each_online_member(c, ca) 1153 1155 ca->new_fs_bucket_idx = 0; 1154 1156 1155 1157 ret = bch2_fs_freespace_init(c); ··· 1212 1214 1213 1215 return 0; 1214 1216 err: 1215 - bch_err_fn(ca, ret); 1217 + bch_err_fn(c, ret); 1216 1218 return ret; 1217 1219 }
+7 -10
fs/bcachefs/sb-clean.c
··· 191 191 struct jset_entry **end, 192 192 u64 journal_seq) 193 193 { 194 - struct bch_dev *ca; 195 - unsigned i, dev; 196 - 197 194 percpu_down_read(&c->mark_lock); 198 195 199 196 if (!journal_seq) { 200 - for (i = 0; i < ARRAY_SIZE(c->usage); i++) 197 + for (unsigned i = 0; i < ARRAY_SIZE(c->usage); i++) 201 198 bch2_fs_usage_acc_to_base(c, i); 202 199 } else { 203 200 bch2_fs_usage_acc_to_base(c, journal_seq & JOURNAL_BUF_MASK); ··· 220 223 u->v = cpu_to_le64(atomic64_read(&c->key_version)); 221 224 } 222 225 223 - for (i = 0; i < BCH_REPLICAS_MAX; i++) { 226 + for (unsigned i = 0; i < BCH_REPLICAS_MAX; i++) { 224 227 struct jset_entry_usage *u = 225 228 container_of(jset_entry_init(end, sizeof(*u)), 226 229 struct jset_entry_usage, entry); ··· 231 234 u->v = cpu_to_le64(c->usage_base->persistent_reserved[i]); 232 235 } 233 236 234 - for (i = 0; i < c->replicas.nr; i++) { 237 + for (unsigned i = 0; i < c->replicas.nr; i++) { 235 238 struct bch_replicas_entry_v1 *e = 236 239 cpu_replicas_entry(&c->replicas, i); 237 240 struct jset_entry_data_usage *u = ··· 244 247 "embedded variable length struct"); 245 248 } 246 249 247 - for_each_member_device(ca, c, dev) { 250 + for_each_member_device(c, ca) { 248 251 unsigned b = sizeof(struct jset_entry_dev_usage) + 249 252 sizeof(struct jset_entry_dev_usage_type) * BCH_DATA_NR; 250 253 struct jset_entry_dev_usage *u = ··· 252 255 struct jset_entry_dev_usage, entry); 253 256 254 257 u->entry.type = BCH_JSET_ENTRY_dev_usage; 255 - u->dev = cpu_to_le32(dev); 258 + u->dev = cpu_to_le32(ca->dev_idx); 256 259 257 - for (i = 0; i < BCH_DATA_NR; i++) { 260 + for (unsigned i = 0; i < BCH_DATA_NR; i++) { 258 261 u->d[i].buckets = cpu_to_le64(ca->usage_base->d[i].buckets); 259 262 u->d[i].sectors = cpu_to_le64(ca->usage_base->d[i].sectors); 260 263 u->d[i].fragmented = cpu_to_le64(ca->usage_base->d[i].fragmented); ··· 263 266 264 267 percpu_up_read(&c->mark_lock); 265 268 266 - for (i = 0; i < 2; i++) { 269 + for (unsigned i = 0; i < 2; i++) { 267 270 struct jset_entry_clock *clock = 268 271 container_of(jset_entry_init(end, sizeof(*clock)), 269 272 struct jset_entry_clock, entry);
+30 -26
fs/bcachefs/sb-members.h
··· 97 97 #define for_each_member_device_rcu(ca, c, iter, mask) \ 98 98 for ((iter) = 0; ((ca) = __bch2_next_dev((c), &(iter), mask)); (iter)++) 99 99 100 - static inline struct bch_dev *bch2_get_next_dev(struct bch_fs *c, unsigned *iter) 100 + static inline struct bch_dev *bch2_get_next_dev(struct bch_fs *c, struct bch_dev *ca) 101 101 { 102 - struct bch_dev *ca; 102 + unsigned idx = ca ? ca->dev_idx + 1 : 0; 103 + 104 + if (ca) 105 + percpu_ref_put(&ca->ref); 103 106 104 107 rcu_read_lock(); 105 - if ((ca = __bch2_next_dev(c, iter, NULL))) 108 + if ((ca = __bch2_next_dev(c, &idx, NULL))) 106 109 percpu_ref_get(&ca->ref); 107 110 rcu_read_unlock(); 108 111 ··· 115 112 /* 116 113 * If you break early, you must drop your ref on the current device 117 114 */ 118 - #define for_each_member_device(ca, c, iter) \ 119 - for ((iter) = 0; \ 120 - (ca = bch2_get_next_dev(c, &(iter))); \ 121 - percpu_ref_put(&ca->ref), (iter)++) 115 + #define __for_each_member_device(_c, _ca) \ 116 + for (; (_ca = bch2_get_next_dev(_c, _ca));) 117 + 118 + #define for_each_member_device(_c, _ca) \ 119 + for (struct bch_dev *_ca = NULL; \ 120 + (_ca = bch2_get_next_dev(_c, _ca));) 122 121 123 122 static inline struct bch_dev *bch2_get_next_online_dev(struct bch_fs *c, 124 - unsigned *iter, 125 - int state_mask) 123 + struct bch_dev *ca, 124 + unsigned state_mask) 126 125 { 127 - struct bch_dev *ca; 126 + unsigned idx = ca ? ca->dev_idx + 1 : 0; 127 + 128 + if (ca) 129 + percpu_ref_put(&ca->io_ref); 128 130 129 131 rcu_read_lock(); 130 - while ((ca = __bch2_next_dev(c, iter, NULL)) && 132 + while ((ca = __bch2_next_dev(c, &idx, NULL)) && 131 133 (!((1 << ca->mi.state) & state_mask) || 132 134 !percpu_ref_tryget(&ca->io_ref))) 133 - (*iter)++; 135 + idx++; 134 136 rcu_read_unlock(); 135 137 136 138 return ca; 137 139 } 138 140 139 - #define __for_each_online_member(ca, c, iter, state_mask) \ 140 - for ((iter) = 0; \ 141 - (ca = bch2_get_next_online_dev(c, &(iter), state_mask)); \ 142 - percpu_ref_put(&ca->io_ref), (iter)++) 141 + #define __for_each_online_member(_c, _ca, state_mask) \ 142 + for (struct bch_dev *_ca = NULL; \ 143 + (_ca = bch2_get_next_online_dev(_c, _ca, state_mask));) 143 144 144 - #define for_each_online_member(ca, c, iter) \ 145 - __for_each_online_member(ca, c, iter, ~0) 145 + #define for_each_online_member(c, ca) \ 146 + __for_each_online_member(c, ca, ~0) 146 147 147 - #define for_each_rw_member(ca, c, iter) \ 148 - __for_each_online_member(ca, c, iter, 1 << BCH_MEMBER_STATE_rw) 148 + #define for_each_rw_member(c, ca) \ 149 + __for_each_online_member(c, ca, BIT(BCH_MEMBER_STATE_rw)) 149 150 150 - #define for_each_readable_member(ca, c, iter) \ 151 - __for_each_online_member(ca, c, iter, \ 152 - (1 << BCH_MEMBER_STATE_rw)|(1 << BCH_MEMBER_STATE_ro)) 151 + #define for_each_readable_member(c, ca) \ 152 + __for_each_online_member(c, ca, BIT( BCH_MEMBER_STATE_rw)|BIT(BCH_MEMBER_STATE_ro)) 153 153 154 154 /* 155 155 * If a key exists that references a device, the device won't be going away and ··· 178 172 static inline struct bch_devs_mask bch2_online_devs(struct bch_fs *c) 179 173 { 180 174 struct bch_devs_mask devs; 181 - struct bch_dev *ca; 182 - unsigned i; 183 175 184 176 memset(&devs, 0, sizeof(devs)); 185 - for_each_online_member(ca, c, i) 177 + for_each_online_member(c, ca) 186 178 __set_bit(ca->dev_idx, devs.d); 187 179 return devs; 188 180 }
+11 -16
fs/bcachefs/super-io.c
··· 241 241 242 242 if (sb->fs_sb) { 243 243 struct bch_fs *c = container_of(sb, struct bch_fs, disk_sb); 244 - struct bch_dev *ca; 245 - unsigned i; 246 244 247 245 lockdep_assert_held(&c->sb_lock); 248 246 249 247 /* XXX: we're not checking that offline device have enough space */ 250 248 251 - for_each_online_member(ca, c, i) { 249 + for_each_online_member(c, ca) { 252 250 struct bch_sb_handle *dev_sb = &ca->disk_sb; 253 251 254 252 if (bch2_sb_realloc(dev_sb, le32_to_cpu(dev_sb->sb->u64s) + d)) { ··· 512 514 static void bch2_sb_update(struct bch_fs *c) 513 515 { 514 516 struct bch_sb *src = c->disk_sb.sb; 515 - struct bch_dev *ca; 516 - unsigned i; 517 517 518 518 lockdep_assert_held(&c->sb_lock); 519 519 ··· 542 546 le_bitvector_to_cpu(c->sb.errors_silent, (void *) ext->errors_silent, 543 547 sizeof(c->sb.errors_silent) * 8); 544 548 545 - for_each_member_device(ca, c, i) { 549 + for_each_member_device(c, ca) { 546 550 struct bch_member m = bch2_sb_member_get(src, ca->dev_idx); 547 551 ca->mi = bch2_mi_to_cpu(&m); 548 552 } ··· 922 926 int bch2_write_super(struct bch_fs *c) 923 927 { 924 928 struct closure *cl = &c->sb_write; 925 - struct bch_dev *ca; 926 929 struct printbuf err = PRINTBUF; 927 - unsigned i, sb = 0, nr_wrote; 930 + unsigned sb = 0, nr_wrote; 928 931 struct bch_devs_mask sb_written; 929 932 bool wrote, can_mount_without_written, can_mount_with_written; 930 933 unsigned degraded_flags = BCH_FORCE_IF_DEGRADED; ··· 958 963 bch2_sb_errors_from_cpu(c); 959 964 bch2_sb_downgrade_update(c); 960 965 961 - for_each_online_member(ca, c, i) 966 + for_each_online_member(c, ca) 962 967 bch2_sb_from_fs(c, ca); 963 968 964 - for_each_online_member(ca, c, i) { 969 + for_each_online_member(c, ca) { 965 970 printbuf_reset(&err); 966 971 967 972 ret = bch2_sb_validate(&ca->disk_sb, &err, WRITE); ··· 994 999 return -BCH_ERR_sb_not_downgraded; 995 1000 } 996 1001 997 - for_each_online_member(ca, c, i) { 1002 + for_each_online_member(c, ca) { 998 1003 __set_bit(ca->dev_idx, sb_written.d); 999 1004 ca->sb_write_error = 0; 1000 1005 } 1001 1006 1002 - for_each_online_member(ca, c, i) 1007 + for_each_online_member(c, ca) 1003 1008 read_back_super(c, ca); 1004 1009 closure_sync(cl); 1005 1010 1006 - for_each_online_member(ca, c, i) { 1011 + for_each_online_member(c, ca) { 1007 1012 if (ca->sb_write_error) 1008 1013 continue; 1009 1014 ··· 1030 1035 1031 1036 do { 1032 1037 wrote = false; 1033 - for_each_online_member(ca, c, i) 1038 + for_each_online_member(c, ca) 1034 1039 if (!ca->sb_write_error && 1035 1040 sb < ca->disk_sb.sb->layout.nr_superblocks) { 1036 1041 write_one_super(c, ca, sb); ··· 1040 1045 sb++; 1041 1046 } while (wrote); 1042 1047 1043 - for_each_online_member(ca, c, i) { 1048 + for_each_online_member(c, ca) { 1044 1049 if (ca->sb_write_error) 1045 1050 __clear_bit(ca->dev_idx, sb_written.d); 1046 1051 else ··· 1052 1057 can_mount_with_written = 1053 1058 bch2_have_enough_devs(c, sb_written, degraded_flags, false); 1054 1059 1055 - for (i = 0; i < ARRAY_SIZE(sb_written.d); i++) 1060 + for (unsigned i = 0; i < ARRAY_SIZE(sb_written.d); i++) 1056 1061 sb_written.d[i] = ~sb_written.d[i]; 1057 1062 1058 1063 can_mount_without_written =
+12 -23
fs/bcachefs/super.c
··· 249 249 250 250 static void __bch2_fs_read_only(struct bch_fs *c) 251 251 { 252 - struct bch_dev *ca; 253 - unsigned i, clean_passes = 0; 252 + unsigned clean_passes = 0; 254 253 u64 seq = 0; 255 254 256 255 bch2_fs_ec_stop(c); ··· 285 286 /* 286 287 * After stopping journal: 287 288 */ 288 - for_each_member_device(ca, c, i) 289 + for_each_member_device(c, ca) 289 290 bch2_dev_allocator_remove(c, ca); 290 291 } 291 292 ··· 426 427 427 428 static int __bch2_fs_read_write(struct bch_fs *c, bool early) 428 429 { 429 - struct bch_dev *ca; 430 - unsigned i; 431 430 int ret; 432 431 433 432 if (test_bit(BCH_FS_initial_gc_unfixed, &c->flags)) { ··· 466 469 */ 467 470 set_bit(JOURNAL_NEED_FLUSH_WRITE, &c->journal.flags); 468 471 469 - for_each_rw_member(ca, c, i) 472 + for_each_rw_member(c, ca) 470 473 bch2_dev_allocator_add(c, ca); 471 474 bch2_recalc_capacity(c); 472 475 ··· 476 479 #ifndef BCH_WRITE_REF_DEBUG 477 480 percpu_ref_reinit(&c->writes); 478 481 #else 479 - for (i = 0; i < BCH_WRITE_REF_NR; i++) { 482 + for (unsigned i = 0; i < BCH_WRITE_REF_NR; i++) { 480 483 BUG_ON(atomic_long_read(&c->writes[i])); 481 484 atomic_long_inc(&c->writes[i]); 482 485 } ··· 599 602 600 603 void __bch2_fs_stop(struct bch_fs *c) 601 604 { 602 - struct bch_dev *ca; 603 - unsigned i; 604 - 605 605 bch_verbose(c, "shutting down"); 606 606 607 607 set_bit(BCH_FS_stopping, &c->flags); ··· 609 615 bch2_fs_read_only(c); 610 616 up_write(&c->state_lock); 611 617 612 - for_each_member_device(ca, c, i) 618 + for_each_member_device(c, ca) 613 619 if (ca->kobj.state_in_sysfs && 614 620 ca->disk_sb.bdev) 615 621 sysfs_remove_link(bdev_kobj(ca->disk_sb.bdev), "bcachefs"); ··· 631 637 /* btree prefetch might have kicked off reads in the background: */ 632 638 bch2_btree_flush_all_reads(c); 633 639 634 - for_each_member_device(ca, c, i) 640 + for_each_member_device(c, ca) 635 641 cancel_work_sync(&ca->io_error_work); 636 642 637 643 cancel_work_sync(&c->read_only_work); ··· 670 676 671 677 static int bch2_fs_online(struct bch_fs *c) 672 678 { 673 - struct bch_dev *ca; 674 - unsigned i; 675 679 int ret = 0; 676 680 677 681 lockdep_assert_held(&bch_fs_list_lock); ··· 702 710 703 711 down_write(&c->state_lock); 704 712 705 - for_each_member_device(ca, c, i) { 713 + for_each_member_device(c, ca) { 706 714 ret = bch2_dev_sysfs_online(c, ca); 707 715 if (ret) { 708 716 bch_err(c, "error creating sysfs objects"); ··· 992 1000 993 1001 int bch2_fs_start(struct bch_fs *c) 994 1002 { 995 - struct bch_dev *ca; 996 1003 time64_t now = ktime_get_real_seconds(); 997 - unsigned i; 998 1004 int ret; 999 1005 1000 1006 print_mount_opts(c); ··· 1009 1019 goto err; 1010 1020 } 1011 1021 1012 - for_each_online_member(ca, c, i) 1013 - bch2_members_v2_get_mut(c->disk_sb.sb, i)->last_mount = cpu_to_le64(now); 1022 + for_each_online_member(c, ca) 1023 + bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx)->last_mount = cpu_to_le64(now); 1014 1024 1015 1025 mutex_unlock(&c->sb_lock); 1016 1026 1017 - for_each_rw_member(ca, c, i) 1027 + for_each_rw_member(c, ca) 1018 1028 bch2_dev_allocator_add(c, ca); 1019 1029 bch2_recalc_capacity(c); 1020 1030 ··· 1352 1362 enum bch_member_state new_state, int flags) 1353 1363 { 1354 1364 struct bch_devs_mask new_online_devs; 1355 - struct bch_dev *ca2; 1356 - int i, nr_rw = 0, required; 1365 + int nr_rw = 0, required; 1357 1366 1358 1367 lockdep_assert_held(&c->state_lock); 1359 1368 ··· 1364 1375 return true; 1365 1376 1366 1377 /* do we have enough devices to write to? */ 1367 - for_each_member_device(ca2, c, i) 1378 + for_each_member_device(c, ca2) 1368 1379 if (ca2 != ca) 1369 1380 nr_rw += ca2->mi.state == BCH_MEMBER_STATE_rw; 1370 1381