Skip to content

Commit 8c6d298

Browse files
koverstreetKent Overstreet
authored andcommitted
bcachefs: Convert io paths for snapshots
This plumbs around the subvolume ID as was done previously for other filesystem code, but now for the IO paths - the control flow in the IO paths is trickier so the changes in this patch are more involved. Signed-off-by: Kent Overstreet <[email protected]>
1 parent ef1669f commit 8c6d298

File tree

5 files changed

+144
-93
lines changed

5 files changed

+144
-93
lines changed

fs/bcachefs/fs-io.c

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -769,23 +769,35 @@ static void readpage_bio_extend(struct readpages_iter *iter,
769769
}
770770
}
771771

772-
static void bchfs_read(struct btree_trans *trans, struct btree_iter *iter,
773-
struct bch_read_bio *rbio, u64 inum,
772+
static void bchfs_read(struct btree_trans *trans,
773+
struct bch_read_bio *rbio,
774+
subvol_inum inum,
774775
struct readpages_iter *readpages_iter)
775776
{
776777
struct bch_fs *c = trans->c;
778+
struct btree_iter iter;
777779
struct bkey_buf sk;
778780
int flags = BCH_READ_RETRY_IF_STALE|
779781
BCH_READ_MAY_PROMOTE;
782+
u32 snapshot;
780783
int ret = 0;
781784

782785
rbio->c = c;
783786
rbio->start_time = local_clock();
787+
rbio->subvol = inum.subvol;
784788

785789
bch2_bkey_buf_init(&sk);
786790
retry:
787791
bch2_trans_begin(trans);
792+
iter = (struct btree_iter) { NULL };
788793

794+
ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
795+
if (ret)
796+
goto err;
797+
798+
bch2_trans_iter_init(trans, &iter, BTREE_ID_extents,
799+
SPOS(inum.inum, rbio->bio.bi_iter.bi_sector, snapshot),
800+
BTREE_ITER_SLOTS|BTREE_ITER_FILTER_SNAPSHOTS);
789801
while (1) {
790802
struct bkey_s_c k;
791803
unsigned bytes, sectors, offset_into_extent;
@@ -800,15 +812,15 @@ static void bchfs_read(struct btree_trans *trans, struct btree_iter *iter,
800812
break;
801813
}
802814

803-
bch2_btree_iter_set_pos(iter,
804-
POS(inum, rbio->bio.bi_iter.bi_sector));
815+
bch2_btree_iter_set_pos(&iter,
816+
POS(inum.inum, rbio->bio.bi_iter.bi_sector));
805817

806-
k = bch2_btree_iter_peek_slot(iter);
818+
k = bch2_btree_iter_peek_slot(&iter);
807819
ret = bkey_err(k);
808820
if (ret)
809821
break;
810822

811-
offset_into_extent = iter->pos.offset -
823+
offset_into_extent = iter.pos.offset -
812824
bkey_start_offset(k.k);
813825
sectors = k.k->size - offset_into_extent;
814826

@@ -838,7 +850,7 @@ static void bchfs_read(struct btree_trans *trans, struct btree_iter *iter,
838850
if (bkey_extent_is_allocation(k.k))
839851
bch2_add_page_sectors(&rbio->bio, k);
840852

841-
bch2_read_extent(trans, rbio, iter->pos,
853+
bch2_read_extent(trans, rbio, iter.pos,
842854
data_btree, k, offset_into_extent, flags);
843855

844856
if (flags & BCH_READ_LAST_FRAGMENT)
@@ -847,12 +859,14 @@ static void bchfs_read(struct btree_trans *trans, struct btree_iter *iter,
847859
swap(rbio->bio.bi_iter.bi_size, bytes);
848860
bio_advance(&rbio->bio, bytes);
849861
}
862+
err:
863+
bch2_trans_iter_exit(trans, &iter);
850864

851865
if (ret == -EINTR)
852866
goto retry;
853867

854868
if (ret) {
855-
bch_err_inum_ratelimited(c, inum,
869+
bch_err_inum_ratelimited(c, inum.inum,
856870
"read error %i from btree lookup", ret);
857871
rbio->bio.bi_status = BLK_STS_IOERR;
858872
bio_endio(&rbio->bio);
@@ -867,7 +881,6 @@ void bch2_readahead(struct readahead_control *ractl)
867881
struct bch_fs *c = inode->v.i_sb->s_fs_info;
868882
struct bch_io_opts opts = io_opts(c, &inode->ei_inode);
869883
struct btree_trans trans;
870-
struct btree_iter iter;
871884
struct page *page;
872885
struct readpages_iter readpages_iter;
873886
int ret;
@@ -876,8 +889,6 @@ void bch2_readahead(struct readahead_control *ractl)
876889
BUG_ON(ret);
877890

878891
bch2_trans_init(&trans, c, 0, 0);
879-
bch2_trans_iter_init(&trans, &iter, BTREE_ID_extents, POS_MIN,
880-
BTREE_ITER_SLOTS);
881892

882893
bch2_pagecache_add_get(&inode->ei_pagecache_lock);
883894

@@ -898,22 +909,20 @@ void bch2_readahead(struct readahead_control *ractl)
898909
rbio->bio.bi_end_io = bch2_readpages_end_io;
899910
BUG_ON(!bio_add_page(&rbio->bio, page, PAGE_SIZE, 0));
900911

901-
bchfs_read(&trans, &iter, rbio, inode->v.i_ino,
912+
bchfs_read(&trans, rbio, inode_inum(inode),
902913
&readpages_iter);
903914
}
904915

905916
bch2_pagecache_add_put(&inode->ei_pagecache_lock);
906917

907-
bch2_trans_iter_exit(&trans, &iter);
908918
bch2_trans_exit(&trans);
909919
kfree(readpages_iter.pages);
910920
}
911921

912922
static void __bchfs_readpage(struct bch_fs *c, struct bch_read_bio *rbio,
913-
u64 inum, struct page *page)
923+
subvol_inum inum, struct page *page)
914924
{
915925
struct btree_trans trans;
916-
struct btree_iter iter;
917926

918927
bch2_page_state_create(page, __GFP_NOFAIL);
919928

@@ -923,12 +932,7 @@ static void __bchfs_readpage(struct bch_fs *c, struct bch_read_bio *rbio,
923932
BUG_ON(!bio_add_page(&rbio->bio, page, PAGE_SIZE, 0));
924933

925934
bch2_trans_init(&trans, c, 0, 0);
926-
bch2_trans_iter_init(&trans, &iter, BTREE_ID_extents, POS_MIN,
927-
BTREE_ITER_SLOTS);
928-
929-
bchfs_read(&trans, &iter, rbio, inum, NULL);
930-
931-
bch2_trans_iter_exit(&trans, &iter);
935+
bchfs_read(&trans, rbio, inum, NULL);
932936
bch2_trans_exit(&trans);
933937
}
934938

@@ -951,7 +955,7 @@ static int bch2_read_single_page(struct page *page,
951955
rbio->bio.bi_private = &done;
952956
rbio->bio.bi_end_io = bch2_read_single_page_end_io;
953957

954-
__bchfs_readpage(c, rbio, inode->v.i_ino, page);
958+
__bchfs_readpage(c, rbio, inode_inum(inode), page);
955959
wait_for_completion(&done);
956960

957961
ret = blk_status_to_errno(rbio->bio.bi_status);
@@ -1096,6 +1100,7 @@ static void bch2_writepage_io_alloc(struct bch_fs *c,
10961100
op->nr_replicas = nr_replicas;
10971101
op->res.nr_replicas = nr_replicas;
10981102
op->write_point = writepoint_hashed(inode->ei_last_dirtied);
1103+
op->subvol = inode->ei_subvol;
10991104
op->pos = POS(inode->v.i_ino, sector);
11001105
op->end_io = bch2_writepage_io_done;
11011106
op->wbio.bio.bi_iter.bi_sector = sector;
@@ -1733,7 +1738,7 @@ static int bch2_direct_IO_read(struct kiocb *req, struct iov_iter *iter)
17331738
if (iter->count)
17341739
closure_get(&dio->cl);
17351740

1736-
bch2_read(c, rbio_init(bio, opts), inode->v.i_ino);
1741+
bch2_read(c, rbio_init(bio, opts), inode_inum(inode));
17371742
}
17381743

17391744
iter->count += shorten;
@@ -1816,7 +1821,8 @@ static bool bch2_check_range_allocated(struct bch_fs *c, subvol_inum inum,
18161821
if (bkey_cmp(bkey_start_pos(k.k), POS(inum.inum, end)) >= 0)
18171822
break;
18181823

1819-
if (nr_replicas > bch2_bkey_replicas(c, k) ||
1824+
if (k.k->p.snapshot != snapshot ||
1825+
nr_replicas > bch2_bkey_replicas(c, k) ||
18201826
(!compressed && bch2_bkey_sectors_compressed(k))) {
18211827
ret = false;
18221828
break;
@@ -1944,6 +1950,7 @@ static long bch2_dio_write_loop(struct dio_write *dio)
19441950
op_journal_seq_set(&dio->op, &inode->ei_journal_seq);
19451951
dio->op.write_point = writepoint_hashed((unsigned long) current);
19461952
dio->op.nr_replicas = dio->op.opts.data_replicas;
1953+
dio->op.subvol = inode->ei_subvol;
19471954
dio->op.pos = POS(inode->v.i_ino, (u64) req->ki_pos >> 9);
19481955

19491956
if ((req->ki_flags & IOCB_DSYNC) &&
@@ -2438,7 +2445,7 @@ int bch2_truncate(struct mnt_idmap *idmap,
24382445

24392446
truncate_setsize(&inode->v, iattr->ia_size);
24402447

2441-
ret = bch2_fpunch(c, inode->v.i_ino,
2448+
ret = bch2_fpunch(c, inode_inum(inode),
24422449
round_up(iattr->ia_size, block_bytes(c)) >> 9,
24432450
U64_MAX, &inode->ei_journal_seq, &i_sectors_delta);
24442451
i_sectors_acct(c, inode, NULL, i_sectors_delta);
@@ -2498,7 +2505,7 @@ static long bchfs_fpunch(struct bch_inode_info *inode, loff_t offset, loff_t len
24982505
if (discard_start < discard_end) {
24992506
s64 i_sectors_delta = 0;
25002507

2501-
ret = bch2_fpunch(c, inode->v.i_ino,
2508+
ret = bch2_fpunch(c, inode_inum(inode),
25022509
discard_start, discard_end,
25032510
&inode->ei_journal_seq,
25042511
&i_sectors_delta);
@@ -2577,7 +2584,7 @@ static long bchfs_fcollapse_finsert(struct bch_inode_info *inode,
25772584
} else {
25782585
s64 i_sectors_delta = 0;
25792586

2580-
ret = bch2_fpunch(c, inode->v.i_ino,
2587+
ret = bch2_fpunch(c, inode_inum(inode),
25812588
offset >> 9, (offset + len) >> 9,
25822589
&inode->ei_journal_seq,
25832590
&i_sectors_delta);
@@ -2793,7 +2800,8 @@ static int __bchfs_fallocate(struct bch_inode_info *inode, int mode,
27932800
reservation.v.nr_replicas = disk_res.nr_replicas;
27942801
}
27952802

2796-
ret = bch2_extent_update(&trans, &iter, &reservation.k_i,
2803+
ret = bch2_extent_update(&trans, inode_inum(inode), &iter,
2804+
&reservation.k_i,
27972805
&disk_res, &inode->ei_journal_seq,
27982806
0, &i_sectors_delta, true);
27992807
i_sectors_acct(c, inode, &quota_res, i_sectors_delta);

0 commit comments

Comments
 (0)