]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/io_read.c
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / libbcachefs / io_read.c
index 3281c4dd1d5252840fa0c13f1c7c4f720108ebdf..dce136cd227132b68a802c76b173dc3eae95e552 100644 (file)
@@ -80,7 +80,7 @@ struct promote_op {
        struct bpos             pos;
 
        struct data_update      write;
-       struct bio_vec          bi_inline_vecs[0]; /* must be last */
+       struct bio_vec          bi_inline_vecs[]; /* must be last */
 };
 
 static const struct rhashtable_params bch_promote_params = {
@@ -134,7 +134,7 @@ static void promote_done(struct bch_write_op *wop)
                container_of(wop, struct promote_op, write.op);
        struct bch_fs *c = op->write.op.c;
 
-       bch2_time_stats_update(&c->times[BCH_TIME_data_promote],
+       time_stats_update(&c->times[BCH_TIME_data_promote],
                               op->start_time);
        promote_free(c, op);
 }
@@ -172,11 +172,13 @@ static struct promote_op *__promote_alloc(struct btree_trans *trans,
        int ret;
 
        if (!bch2_write_ref_tryget(c, BCH_WRITE_REF_promote))
-               return NULL;
+               return ERR_PTR(-BCH_ERR_nopromote_no_writes);
 
-       op = kzalloc(sizeof(*op) + sizeof(struct bio_vec) * pages, GFP_NOFS);
-       if (!op)
+       op = kzalloc(sizeof(*op) + sizeof(struct bio_vec) * pages, GFP_KERNEL);
+       if (!op) {
+               ret = -BCH_ERR_nopromote_enomem;
                goto err;
+       }
 
        op->start_time = local_clock();
        op->pos = pos;
@@ -187,24 +189,29 @@ static struct promote_op *__promote_alloc(struct btree_trans *trans,
         */
        *rbio = kzalloc(sizeof(struct bch_read_bio) +
                        sizeof(struct bio_vec) * pages,
-                       GFP_NOFS);
-       if (!*rbio)
+                       GFP_KERNEL);
+       if (!*rbio) {
+               ret = -BCH_ERR_nopromote_enomem;
                goto err;
+       }
 
        rbio_init(&(*rbio)->bio, opts);
        bio_init(&(*rbio)->bio, NULL, (*rbio)->bio.bi_inline_vecs, pages, 0);
 
-       if (bch2_bio_alloc_pages(&(*rbio)->bio, sectors << 9,
-                                GFP_NOFS))
+       if (bch2_bio_alloc_pages(&(*rbio)->bio, sectors << 9, GFP_KERNEL)) {
+               ret = -BCH_ERR_nopromote_enomem;
                goto err;
+       }
 
        (*rbio)->bounce         = true;
        (*rbio)->split          = true;
        (*rbio)->kmalloc        = true;
 
        if (rhashtable_lookup_insert_fast(&c->promote_table, &op->hash,
-                                         bch_promote_params))
+                                         bch_promote_params)) {
+               ret = -BCH_ERR_nopromote_in_flight;
                goto err;
+       }
 
        bio = &op->write.op.wbio.bio;
        bio_init(bio, NULL, bio->bi_inline_vecs, pages, 0);
@@ -223,9 +230,8 @@ static struct promote_op *__promote_alloc(struct btree_trans *trans,
         * -BCH_ERR_ENOSPC_disk_reservation:
         */
        if (ret) {
-               ret = rhashtable_remove_fast(&c->promote_table, &op->hash,
-                                       bch_promote_params);
-               BUG_ON(ret);
+               BUG_ON(rhashtable_remove_fast(&c->promote_table, &op->hash,
+                                             bch_promote_params));
                goto err;
        }
 
@@ -239,7 +245,7 @@ err:
        *rbio = NULL;
        kfree(op);
        bch2_write_ref_put(c, BCH_WRITE_REF_promote);
-       return NULL;
+       return ERR_PTR(ret);
 }
 
 noinline
@@ -274,10 +280,9 @@ static struct promote_op *promote_alloc(struct btree_trans *trans,
                                  ? BTREE_ID_reflink
                                  : BTREE_ID_extents,
                                  k, pos, pick, opts, sectors, rbio);
-       if (!promote) {
-               ret = -BCH_ERR_nopromote_enomem;
+       ret = PTR_ERR_OR_ZERO(promote);
+       if (ret)
                goto nopromote;
-       }
 
        *bounce         = true;
        *read_full      = promote_full;
@@ -351,7 +356,7 @@ static inline struct bch_read_bio *bch2_rbio_free(struct bch_read_bio *rbio)
 static void bch2_rbio_done(struct bch_read_bio *rbio)
 {
        if (rbio->start_time)
-               bch2_time_stats_update(&rbio->c->times[BCH_TIME_data_read],
+               time_stats_update(&rbio->c->times[BCH_TIME_data_read],
                                       rbio->start_time);
        bio_endio(&rbio->bio);
 }
@@ -637,12 +642,17 @@ csum_err:
                goto out;
        }
 
+       struct printbuf buf = PRINTBUF;
+       buf.atomic++;
+       prt_str(&buf, "data ");
+       bch2_csum_err_msg(&buf, crc.csum_type, rbio->pick.crc.csum, csum);
+
        bch_err_inum_offset_ratelimited(ca,
                rbio->read_pos.inode,
                rbio->read_pos.offset << 9,
-               "data checksum error: expected %0llx:%0llx got %0llx:%0llx (type %s)",
-               rbio->pick.crc.csum.hi, rbio->pick.crc.csum.lo,
-               csum.hi, csum.lo, bch2_csum_types[crc.csum_type]);
+               "data %s", buf.buf);
+       printbuf_exit(&buf);
+
        bch2_io_error(ca, BCH_MEMBER_ERROR_checksum);
        bch2_rbio_error(rbio, READ_RETRY_AVOID, BLK_STS_IOERR);
        goto out;