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

bcachefs: Convert bch2_fs_open() to darray

Open coded dynamic arrays are deprecated.

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

+33 -31
+6
fs/bcachefs/darray.h
··· 69 69 _ret; \ 70 70 }) 71 71 72 + #define darray_remove_item(_d, _pos) \ 73 + array_remove_item((_d)->data, (_d)->nr, (_pos) - (_d)->data) 74 + 72 75 #define darray_for_each(_d, _i) \ 73 76 for (_i = (_d).data; _i < (_d).data + (_d).nr; _i++) 77 + 78 + #define darray_for_each_reverse(_d, _i) \ 79 + for (_i = (_d).data + (_d).nr - 1; _i >= (_d).data; --_i) 74 80 75 81 #define darray_init(_d) \ 76 82 do { \
+27 -31
fs/bcachefs/super.c
··· 1885 1885 struct bch_fs *bch2_fs_open(char * const *devices, unsigned nr_devices, 1886 1886 struct bch_opts opts) 1887 1887 { 1888 - struct bch_sb_handle *sb = NULL; 1888 + DARRAY(struct bch_sb_handle) sbs = { 0 }; 1889 1889 struct bch_fs *c = NULL; 1890 - unsigned i, best_sb = 0; 1890 + struct bch_sb_handle *sb, *best = NULL; 1891 1891 struct printbuf errbuf = PRINTBUF; 1892 1892 int ret = 0; 1893 1893 ··· 1899 1899 goto err; 1900 1900 } 1901 1901 1902 - sb = kcalloc(nr_devices, sizeof(*sb), GFP_KERNEL); 1903 - if (!sb) { 1904 - ret = -ENOMEM; 1902 + ret = darray_make_room(&sbs, nr_devices); 1903 + if (ret) 1905 1904 goto err; 1906 - } 1907 1905 1908 - for (i = 0; i < nr_devices; i++) { 1909 - ret = bch2_read_super(devices[i], &opts, &sb[i]); 1906 + for (unsigned i = 0; i < nr_devices; i++) { 1907 + struct bch_sb_handle sb = { NULL }; 1908 + 1909 + ret = bch2_read_super(devices[i], &opts, &sb); 1910 1910 if (ret) 1911 1911 goto err; 1912 1912 1913 + BUG_ON(darray_push(&sbs, sb)); 1913 1914 } 1914 1915 1915 - for (i = 1; i < nr_devices; i++) 1916 - if (le64_to_cpu(sb[i].sb->seq) > 1917 - le64_to_cpu(sb[best_sb].sb->seq)) 1918 - best_sb = i; 1916 + darray_for_each(sbs, sb) 1917 + if (!best || le64_to_cpu(sb->sb->seq) > le64_to_cpu(best->sb->seq)) 1918 + best = sb; 1919 1919 1920 - i = 0; 1921 - while (i < nr_devices) { 1922 - if (i != best_sb && 1923 - !bch2_dev_exists(sb[best_sb].sb, sb[i].sb->dev_idx)) { 1924 - pr_info("%pg has been removed, skipping", sb[i].bdev); 1925 - bch2_free_super(&sb[i]); 1926 - array_remove_item(sb, nr_devices, i); 1920 + darray_for_each_reverse(sbs, sb) { 1921 + if (sb != best && !bch2_dev_exists(best->sb, sb->sb->dev_idx)) { 1922 + pr_info("%pg has been removed, skipping", sb->bdev); 1923 + bch2_free_super(sb); 1924 + darray_remove_item(&sbs, sb); 1925 + best -= best > sb; 1927 1926 continue; 1928 1927 } 1929 1928 1930 - ret = bch2_dev_in_fs(sb[best_sb].sb, sb[i].sb); 1929 + ret = bch2_dev_in_fs(best->sb, sb->sb); 1931 1930 if (ret) 1932 1931 goto err_print; 1933 - i++; 1934 1932 } 1935 1933 1936 - c = bch2_fs_alloc(sb[best_sb].sb, opts); 1937 - if (IS_ERR(c)) { 1938 - ret = PTR_ERR(c); 1934 + c = bch2_fs_alloc(best->sb, opts); 1935 + ret = PTR_ERR_OR_ZERO(c); 1936 + if (ret) 1939 1937 goto err; 1940 - } 1941 1938 1942 1939 down_write(&c->state_lock); 1943 - for (i = 0; i < nr_devices; i++) { 1944 - ret = bch2_dev_attach_bdev(c, &sb[i]); 1940 + darray_for_each(sbs, sb) { 1941 + ret = bch2_dev_attach_bdev(c, sb); 1945 1942 if (ret) { 1946 1943 up_write(&c->state_lock); 1947 1944 goto err; ··· 1957 1960 goto err; 1958 1961 } 1959 1962 out: 1960 - kfree(sb); 1963 + darray_for_each(sbs, sb) 1964 + bch2_free_super(sb); 1965 + darray_exit(&sbs); 1961 1966 printbuf_exit(&errbuf); 1962 1967 module_put(THIS_MODULE); 1963 1968 return c; ··· 1969 1970 err: 1970 1971 if (!IS_ERR_OR_NULL(c)) 1971 1972 bch2_fs_stop(c); 1972 - if (sb) 1973 - for (i = 0; i < nr_devices; i++) 1974 - bch2_free_super(&sb[i]); 1975 1973 c = ERR_PTR(ret); 1976 1974 goto out; 1977 1975 }