summaryrefslogtreecommitdiff
path: root/libbcachefs/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/io.c')
-rw-r--r--libbcachefs/io.c53
1 files changed, 32 insertions, 21 deletions
diff --git a/libbcachefs/io.c b/libbcachefs/io.c
index 946c75bb..e5fc72da 100644
--- a/libbcachefs/io.c
+++ b/libbcachefs/io.c
@@ -350,7 +350,7 @@ static void init_append_extent(struct bch_write_op *op,
bch2_keylist_push(&op->insert_keys);
}
-static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
+static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp)
{
struct bch_fs *c = op->c;
struct bio *orig = &op->wbio.bio;
@@ -371,7 +371,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
/* Need to decompress data? */
if ((op->flags & BCH_WRITE_DATA_COMPRESSED) &&
(crc_uncompressed_size(NULL, &op->crc) != op->size ||
- crc_compressed_size(NULL, &op->crc) > ob->sectors_free)) {
+ crc_compressed_size(NULL, &op->crc) > wp->sectors_free)) {
int ret;
ret = bch2_bio_uncompress_inplace(c, orig, op->size, op->crc);
@@ -389,7 +389,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
op->crc.nonce,
op->crc.csum,
op->crc.csum_type,
- ob);
+ wp->ob);
bio = orig;
wbio = wbio_init(bio);
@@ -398,7 +398,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
compression_type != BCH_COMPRESSION_NONE) {
/* all units here in bytes */
unsigned total_output = 0, output_available =
- min(ob->sectors_free << 9, orig->bi_iter.bi_size);
+ min(wp->sectors_free << 9, orig->bi_iter.bi_size);
unsigned crc_nonce = bch2_csum_type_is_encryption(csum_type)
? op->nonce : 0;
struct bch_csum csum;
@@ -441,7 +441,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
init_append_extent(op,
dst_len >> 9, src_len >> 9,
fragment_compression_type,
- crc_nonce, csum, csum_type, ob);
+ crc_nonce, csum, csum_type, wp->ob);
total_output += dst_len;
bio_advance(bio, dst_len);
@@ -468,14 +468,14 @@ static int bch2_write_extent(struct bch_write_op *op, struct open_bucket *ob)
more = orig->bi_iter.bi_size != 0;
} else {
- bio = bio_next_split(orig, ob->sectors_free, GFP_NOIO,
+ bio = bio_next_split(orig, wp->sectors_free, GFP_NOIO,
&c->bio_write);
wbio = wbio_init(bio);
wbio->put_bio = bio != orig;
init_append_extent(op, bio_sectors(bio), bio_sectors(bio),
compression_type, 0,
- (struct bch_csum) { 0 }, csum_type, ob);
+ (struct bch_csum) { 0 }, csum_type, wp->ob);
more = bio != orig;
}
@@ -505,7 +505,8 @@ static void __bch2_write(struct closure *cl)
struct bch_write_op *op = container_of(cl, struct bch_write_op, cl);
struct bch_fs *c = op->c;
unsigned open_bucket_nr = 0;
- struct open_bucket *b;
+ struct write_point *wp;
+ struct open_bucket *ob;
int ret;
do {
@@ -519,16 +520,19 @@ static void __bch2_write(struct closure *cl)
BKEY_EXTENT_U64s_MAX))
continue_at(cl, bch2_write_index, index_update_wq(op));
- b = bch2_alloc_sectors_start(c, op->wp,
+ wp = bch2_alloc_sectors_start(c, BCH_DATA_USER,
+ op->devs,
+ op->write_point,
op->nr_replicas,
c->opts.data_replicas_required,
op->alloc_reserve,
+ op->flags,
(op->flags & BCH_WRITE_ALLOC_NOWAIT) ? NULL : cl);
- EBUG_ON(!b);
+ EBUG_ON(!wp);
- if (unlikely(IS_ERR(b))) {
- if (unlikely(PTR_ERR(b) != -EAGAIN)) {
- ret = PTR_ERR(b);
+ if (unlikely(IS_ERR(wp))) {
+ if (unlikely(PTR_ERR(wp) != -EAGAIN)) {
+ ret = PTR_ERR(wp);
goto err;
}
@@ -561,13 +565,15 @@ static void __bch2_write(struct closure *cl)
continue;
}
- BUG_ON(b - c->open_buckets == 0 ||
- b - c->open_buckets > U8_MAX);
- op->open_buckets[open_bucket_nr++] = b - c->open_buckets;
+ ob = wp->ob;
- ret = bch2_write_extent(op, b);
+ BUG_ON(ob - c->open_buckets == 0 ||
+ ob - c->open_buckets > U8_MAX);
+ op->open_buckets[open_bucket_nr++] = ob - c->open_buckets;
- bch2_alloc_sectors_done(c, op->wp, b);
+ ret = bch2_write_extent(op, wp);
+
+ bch2_alloc_sectors_done(c, wp);
if (ret < 0)
goto err;
@@ -704,7 +710,9 @@ void bch2_write(struct closure *cl)
void bch2_write_op_init(struct bch_write_op *op, struct bch_fs *c,
struct disk_reservation res,
- struct write_point *wp, struct bpos pos,
+ struct bch_devs_mask *devs,
+ unsigned long write_point,
+ struct bpos pos,
u64 *journal_seq, unsigned flags)
{
EBUG_ON(res.sectors && !res.nr_replicas);
@@ -723,7 +731,8 @@ void bch2_write_op_init(struct bch_write_op *op, struct bch_fs *c,
op->pos = pos;
op->version = ZERO_VERSION;
op->res = res;
- op->wp = wp;
+ op->devs = devs;
+ op->write_point = write_point;
if (journal_seq) {
op->journal_seq_p = journal_seq;
@@ -826,6 +835,7 @@ static struct promote_op *promote_alloc(struct bch_fs *c,
* Adjust bio to correspond to _live_ portion of @k -
* which might be less than what we're actually reading:
*/
+ bio->bi_iter.bi_size = sectors << 9;
bio_advance(bio, pick->crc.offset << 9);
BUG_ON(bio_sectors(bio) < k.k->size);
bio->bi_iter.bi_size = k.k->size << 9;
@@ -836,7 +846,8 @@ static struct promote_op *promote_alloc(struct bch_fs *c,
*/
op->write.op.pos.offset = iter.bi_sector;
}
- bch2_migrate_write_init(c, &op->write, &c->promote_write_point,
+ bch2_migrate_write_init(c, &op->write,
+ c->fastest_devs,
k, NULL,
BCH_WRITE_ALLOC_NOWAIT|
BCH_WRITE_CACHED);