summaryrefslogtreecommitdiff
path: root/libbcachefs/io.h
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/io.h')
-rw-r--r--libbcachefs/io.h50
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;
}