diff options
Diffstat (limited to 'libbcachefs/io.h')
-rw-r--r-- | libbcachefs/io.h | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/libbcachefs/io.h b/libbcachefs/io.h index bd0d7c43..0c145eb6 100644 --- a/libbcachefs/io.h +++ b/libbcachefs/io.h @@ -21,6 +21,8 @@ void bch2_latency_acct(struct bch_dev *, unsigned, int); void bch2_submit_wbio_replicas(struct bch_write_bio *, struct bch_fs *, enum bch_data_type, const struct bkey_i *); +#define BLK_STS_REMOVED ((__force blk_status_t)128) + enum bch_write_flags { BCH_WRITE_ALLOC_NOWAIT = (1 << 0), BCH_WRITE_CACHED = (1 << 1), @@ -29,11 +31,12 @@ enum bch_write_flags { BCH_WRITE_PAGES_STABLE = (1 << 4), BCH_WRITE_PAGES_OWNED = (1 << 5), BCH_WRITE_ONLY_SPECIFIED_DEVS = (1 << 6), + BCH_WRITE_NOPUT_RESERVATION = (1 << 7), /* Internal: */ - BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 7), - BCH_WRITE_DONE = (1 << 8), - BCH_WRITE_LOOPED = (1 << 9), + BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 8), + BCH_WRITE_DONE = (1 << 9), + BCH_WRITE_LOOPED = (1 << 10), }; static inline u64 *op_journal_seq(struct bch_write_op *op) @@ -42,6 +45,12 @@ static inline u64 *op_journal_seq(struct bch_write_op *op) ? op->journal_seq_p : &op->journal_seq; } +static inline void op_journal_seq_set(struct bch_write_op *op, u64 *journal_seq) +{ + op->journal_seq_p = journal_seq; + op->flags |= BCH_WRITE_JOURNAL_SEQ_PTR; +} + static inline struct workqueue_struct *index_update_wq(struct bch_write_op *op) { return op->alloc_reserve == RESERVE_MOVINGGC @@ -51,14 +60,14 @@ static inline struct workqueue_struct *index_update_wq(struct bch_write_op *op) int bch2_write_index_default(struct bch_write_op *); -static inline void __bch2_write_op_init(struct bch_write_op *op, struct bch_fs *c) +static inline void bch2_write_op_init(struct bch_write_op *op, struct bch_fs *c) { op->c = c; op->io_wq = index_update_wq(op); op->flags = 0; op->written = 0; op->error = 0; - op->csum_type = bch2_data_checksum_type(c); + op->csum_type = bch2_data_checksum_type(c, c->opts.data_checksum); op->compression_type = bch2_compression_opt_to_type(c->opts.compression); op->nr_replicas = 0; @@ -75,27 +84,6 @@ static inline void __bch2_write_op_init(struct bch_write_op *op, struct bch_fs * op->index_update_fn = bch2_write_index_default; } -static inline void bch2_write_op_init(struct bch_write_op *op, struct bch_fs *c, - struct disk_reservation res, - struct bch_devs_mask *devs, - struct write_point_specifier write_point, - struct bpos pos, - u64 *journal_seq, unsigned flags) -{ - __bch2_write_op_init(op, c); - op->flags = flags; - op->nr_replicas = res.nr_replicas; - op->pos = pos; - op->res = res; - op->devs = devs; - op->write_point = write_point; - - if (journal_seq) { - op->journal_seq_p = journal_seq; - op->flags |= BCH_WRITE_JOURNAL_SEQ_PTR; - } -} - void bch2_write(struct closure *); static inline struct bch_write_bio *wbio_init(struct bio *bio) @@ -134,25 +122,27 @@ static inline void bch2_read_extent(struct bch_fs *c, struct extent_pick_ptr *pick, unsigned flags) { - rbio->_state = 0; __bch2_read_extent(c, rbio, rbio->bio.bi_iter, e, pick, flags); } static inline void bch2_read(struct bch_fs *c, struct bch_read_bio *rbio, u64 inode) { - rbio->_state = 0; + BUG_ON(rbio->_state); __bch2_read(c, rbio, rbio->bio.bi_iter, inode, NULL, BCH_READ_RETRY_IF_STALE| BCH_READ_MAY_PROMOTE| BCH_READ_USER_MAPPED); } -static inline struct bch_read_bio *rbio_init(struct bio *bio) +static inline struct bch_read_bio *rbio_init(struct bio *bio, + struct bch_io_opts opts) { struct bch_read_bio *rbio = to_rbio(bio); - rbio->_state = 0; + rbio->_state = 0; + rbio->promote = NULL; + rbio->opts = opts; return rbio; } |