mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
Update bcachefs sources to 9f34144308 bcachefs: Refactor dio write code to reinit bch_write_op
This commit is contained in:
parent
37c9ba26af
commit
3b3574e8f6
@ -1 +1 @@
|
|||||||
b1708f0191fcad1b7afa47dd6a7c6b1104c4639d
|
9f34144308fcabb5dcf718406a8c90795e6fd481
|
||||||
|
@ -568,6 +568,16 @@ static inline bool btree_node_is_extents(struct btree *b)
|
|||||||
return btree_node_type_is_extents(btree_node_type(b));
|
return btree_node_type_is_extents(btree_node_type(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline enum btree_node_type btree_iter_key_type(struct btree_iter *iter)
|
||||||
|
{
|
||||||
|
return __btree_node_type(iter->level, iter->btree_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool btree_iter_is_extents(struct btree_iter *iter)
|
||||||
|
{
|
||||||
|
return btree_node_type_is_extents(btree_iter_key_type(iter));
|
||||||
|
}
|
||||||
|
|
||||||
#define BTREE_NODE_TYPE_HAS_TRIGGERS \
|
#define BTREE_NODE_TYPE_HAS_TRIGGERS \
|
||||||
((1U << BKEY_TYPE_EXTENTS)| \
|
((1U << BKEY_TYPE_EXTENTS)| \
|
||||||
(1U << BKEY_TYPE_ALLOC)| \
|
(1U << BKEY_TYPE_ALLOC)| \
|
||||||
|
@ -281,7 +281,7 @@ btree_key_can_insert(struct btree_trans *trans,
|
|||||||
if (unlikely(btree_node_old_extent_overwrite(b)))
|
if (unlikely(btree_node_old_extent_overwrite(b)))
|
||||||
return BTREE_INSERT_BTREE_NODE_FULL;
|
return BTREE_INSERT_BTREE_NODE_FULL;
|
||||||
|
|
||||||
ret = !(iter->flags & BTREE_ITER_IS_EXTENTS)
|
ret = !btree_iter_is_extents(iter)
|
||||||
? BTREE_INSERT_OK
|
? BTREE_INSERT_OK
|
||||||
: bch2_extent_can_insert(trans, iter, insert);
|
: bch2_extent_can_insert(trans, iter, insert);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -1367,8 +1367,8 @@ int bch2_mark_update(struct btree_trans *trans,
|
|||||||
unsigned flags)
|
unsigned flags)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
struct btree *b = iter->l[0].b;
|
struct btree *b = iter_l(iter)->b;
|
||||||
struct btree_node_iter node_iter = iter->l[0].iter;
|
struct btree_node_iter node_iter = iter_l(iter)->iter;
|
||||||
struct bkey_packed *_k;
|
struct bkey_packed *_k;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -1430,21 +1430,21 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans,
|
|||||||
disk_res_sectors);
|
disk_res_sectors);
|
||||||
|
|
||||||
trans_for_each_update(trans, i) {
|
trans_for_each_update(trans, i) {
|
||||||
struct btree_iter *iter = i->iter;
|
|
||||||
struct btree *b = iter->l[0].b;
|
|
||||||
struct btree_node_iter node_iter = iter->l[0].iter;
|
|
||||||
struct bkey_packed *_k;
|
|
||||||
|
|
||||||
pr_err("while inserting");
|
pr_err("while inserting");
|
||||||
bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(i->k));
|
bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(i->k));
|
||||||
pr_err("%s", buf);
|
pr_err("%s", buf);
|
||||||
pr_err("overlapping with");
|
pr_err("overlapping with");
|
||||||
|
|
||||||
node_iter = iter->l[0].iter;
|
if (btree_iter_type(i->iter) != BTREE_ITER_CACHED) {
|
||||||
|
struct btree *b = iter_l(i->iter)->b;
|
||||||
|
struct btree_node_iter node_iter = iter_l(i->iter)->iter;
|
||||||
|
struct bkey_packed *_k;
|
||||||
|
|
||||||
while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) {
|
while ((_k = bch2_btree_node_iter_peek(&node_iter, b))) {
|
||||||
struct bkey unpacked;
|
struct bkey unpacked;
|
||||||
struct bkey_s_c k;
|
struct bkey_s_c k;
|
||||||
|
|
||||||
|
pr_info("_k %px format %u", _k, _k->format);
|
||||||
k = bkey_disassemble(b, _k, &unpacked);
|
k = bkey_disassemble(b, _k, &unpacked);
|
||||||
|
|
||||||
if (btree_node_is_extents(b)
|
if (btree_node_is_extents(b)
|
||||||
@ -1457,6 +1457,12 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans,
|
|||||||
|
|
||||||
bch2_btree_node_iter_advance(&node_iter, b);
|
bch2_btree_node_iter_advance(&node_iter, b);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
struct bkey_cached *ck = (void *) i->iter->l[0].b;
|
||||||
|
|
||||||
|
bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(ck->k));
|
||||||
|
pr_err("%s", buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1807,8 +1813,8 @@ int bch2_trans_mark_update(struct btree_trans *trans,
|
|||||||
struct bkey_i *insert,
|
struct bkey_i *insert,
|
||||||
unsigned flags)
|
unsigned flags)
|
||||||
{
|
{
|
||||||
struct btree *b = iter->l[0].b;
|
struct btree *b = iter_l(iter)->b;
|
||||||
struct btree_node_iter node_iter = iter->l[0].iter;
|
struct btree_node_iter node_iter = iter_l(iter)->iter;
|
||||||
struct bkey_packed *_k;
|
struct bkey_packed *_k;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ struct dio_write {
|
|||||||
sync:1,
|
sync:1,
|
||||||
free_iov:1;
|
free_iov:1;
|
||||||
struct quota_res quota_res;
|
struct quota_res quota_res;
|
||||||
|
u64 written;
|
||||||
|
|
||||||
struct iov_iter iter;
|
struct iov_iter iter;
|
||||||
struct iovec inline_vecs[2];
|
struct iovec inline_vecs[2];
|
||||||
@ -1796,18 +1797,19 @@ ssize_t bch2_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
|||||||
|
|
||||||
/* O_DIRECT writes */
|
/* O_DIRECT writes */
|
||||||
|
|
||||||
|
static void bch2_dio_write_loop_async(struct bch_write_op *);
|
||||||
|
|
||||||
static long bch2_dio_write_loop(struct dio_write *dio)
|
static long bch2_dio_write_loop(struct dio_write *dio)
|
||||||
{
|
{
|
||||||
bool kthread = (current->flags & PF_KTHREAD) != 0;
|
bool kthread = (current->flags & PF_KTHREAD) != 0;
|
||||||
struct bch_fs *c = dio->op.c;
|
|
||||||
struct kiocb *req = dio->req;
|
struct kiocb *req = dio->req;
|
||||||
struct address_space *mapping = req->ki_filp->f_mapping;
|
struct address_space *mapping = req->ki_filp->f_mapping;
|
||||||
struct bch_inode_info *inode = file_bch_inode(req->ki_filp);
|
struct bch_inode_info *inode = file_bch_inode(req->ki_filp);
|
||||||
|
struct bch_fs *c = inode->v.i_sb->s_fs_info;
|
||||||
struct bio *bio = &dio->op.wbio.bio;
|
struct bio *bio = &dio->op.wbio.bio;
|
||||||
struct bvec_iter_all iter;
|
struct bvec_iter_all iter;
|
||||||
struct bio_vec *bv;
|
struct bio_vec *bv;
|
||||||
unsigned unaligned;
|
unsigned unaligned;
|
||||||
u64 new_i_size;
|
|
||||||
bool sync = dio->sync;
|
bool sync = dio->sync;
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
@ -1854,8 +1856,24 @@ static long bch2_dio_write_loop(struct dio_write *dio)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
dio->op.pos = POS(inode->v.i_ino,
|
bch2_write_op_init(&dio->op, c, io_opts(c, &inode->ei_inode));
|
||||||
(req->ki_pos >> 9) + dio->op.written);
|
dio->op.end_io = bch2_dio_write_loop_async;
|
||||||
|
dio->op.target = dio->op.opts.foreground_target;
|
||||||
|
op_journal_seq_set(&dio->op, &inode->ei_journal_seq);
|
||||||
|
dio->op.write_point = writepoint_hashed((unsigned long) current);
|
||||||
|
dio->op.nr_replicas = dio->op.opts.data_replicas;
|
||||||
|
dio->op.pos = POS(inode->v.i_ino, (u64) req->ki_pos >> 9);
|
||||||
|
|
||||||
|
if ((req->ki_flags & IOCB_DSYNC) &&
|
||||||
|
!c->opts.journal_flush_disabled)
|
||||||
|
dio->op.flags |= BCH_WRITE_FLUSH;
|
||||||
|
|
||||||
|
ret = bch2_disk_reservation_get(c, &dio->op.res, bio_sectors(bio),
|
||||||
|
dio->op.opts.data_replicas, 0);
|
||||||
|
if (unlikely(ret) &&
|
||||||
|
!bch2_check_range_allocated(c, dio->op.pos,
|
||||||
|
bio_sectors(bio), dio->op.opts.data_replicas))
|
||||||
|
goto err;
|
||||||
|
|
||||||
task_io_account_write(bio->bi_iter.bi_size);
|
task_io_account_write(bio->bi_iter.bi_size);
|
||||||
|
|
||||||
@ -1887,13 +1905,12 @@ do_io:
|
|||||||
loop:
|
loop:
|
||||||
i_sectors_acct(c, inode, &dio->quota_res,
|
i_sectors_acct(c, inode, &dio->quota_res,
|
||||||
dio->op.i_sectors_delta);
|
dio->op.i_sectors_delta);
|
||||||
dio->op.i_sectors_delta = 0;
|
req->ki_pos += (u64) dio->op.written << 9;
|
||||||
|
dio->written += dio->op.written;
|
||||||
new_i_size = req->ki_pos + ((u64) dio->op.written << 9);
|
|
||||||
|
|
||||||
spin_lock(&inode->v.i_lock);
|
spin_lock(&inode->v.i_lock);
|
||||||
if (new_i_size > inode->v.i_size)
|
if (req->ki_pos > inode->v.i_size)
|
||||||
i_size_write(&inode->v, new_i_size);
|
i_size_write(&inode->v, req->ki_pos);
|
||||||
spin_unlock(&inode->v.i_lock);
|
spin_unlock(&inode->v.i_lock);
|
||||||
|
|
||||||
bio_for_each_segment_all(bv, bio, iter)
|
bio_for_each_segment_all(bv, bio, iter)
|
||||||
@ -1905,10 +1922,9 @@ loop:
|
|||||||
reinit_completion(&dio->done);
|
reinit_completion(&dio->done);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dio->op.error ?: ((long) dio->op.written << 9);
|
ret = dio->op.error ?: ((long) dio->written << 9);
|
||||||
err:
|
err:
|
||||||
bch2_pagecache_block_put(&inode->ei_pagecache_lock);
|
bch2_pagecache_block_put(&inode->ei_pagecache_lock);
|
||||||
bch2_disk_reservation_put(c, &dio->op.res);
|
|
||||||
bch2_quota_reservation_put(c, inode, &dio->quota_res);
|
bch2_quota_reservation_put(c, inode, &dio->quota_res);
|
||||||
|
|
||||||
if (dio->free_iov)
|
if (dio->free_iov)
|
||||||
@ -1943,7 +1959,6 @@ ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
|
|||||||
struct address_space *mapping = file->f_mapping;
|
struct address_space *mapping = file->f_mapping;
|
||||||
struct bch_inode_info *inode = file_bch_inode(file);
|
struct bch_inode_info *inode = file_bch_inode(file);
|
||||||
struct bch_fs *c = inode->v.i_sb->s_fs_info;
|
struct bch_fs *c = inode->v.i_sb->s_fs_info;
|
||||||
struct bch_io_opts opts = io_opts(c, &inode->ei_inode);
|
|
||||||
struct dio_write *dio;
|
struct dio_write *dio;
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
bool locked = true, extending;
|
bool locked = true, extending;
|
||||||
@ -1991,35 +2006,14 @@ ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
|
|||||||
dio->sync = is_sync_kiocb(req) || extending;
|
dio->sync = is_sync_kiocb(req) || extending;
|
||||||
dio->free_iov = false;
|
dio->free_iov = false;
|
||||||
dio->quota_res.sectors = 0;
|
dio->quota_res.sectors = 0;
|
||||||
|
dio->written = 0;
|
||||||
dio->iter = *iter;
|
dio->iter = *iter;
|
||||||
|
|
||||||
bch2_write_op_init(&dio->op, c, opts);
|
|
||||||
dio->op.end_io = bch2_dio_write_loop_async;
|
|
||||||
dio->op.target = opts.foreground_target;
|
|
||||||
op_journal_seq_set(&dio->op, &inode->ei_journal_seq);
|
|
||||||
dio->op.write_point = writepoint_hashed((unsigned long) current);
|
|
||||||
dio->op.flags |= BCH_WRITE_NOPUT_RESERVATION;
|
|
||||||
|
|
||||||
if ((req->ki_flags & IOCB_DSYNC) &&
|
|
||||||
!c->opts.journal_flush_disabled)
|
|
||||||
dio->op.flags |= BCH_WRITE_FLUSH;
|
|
||||||
|
|
||||||
ret = bch2_quota_reservation_add(c, inode, &dio->quota_res,
|
ret = bch2_quota_reservation_add(c, inode, &dio->quota_res,
|
||||||
iter->count >> 9, true);
|
iter->count >> 9, true);
|
||||||
if (unlikely(ret))
|
if (unlikely(ret))
|
||||||
goto err_put_bio;
|
goto err_put_bio;
|
||||||
|
|
||||||
dio->op.nr_replicas = dio->op.opts.data_replicas;
|
|
||||||
|
|
||||||
ret = bch2_disk_reservation_get(c, &dio->op.res, iter->count >> 9,
|
|
||||||
dio->op.opts.data_replicas, 0);
|
|
||||||
if (unlikely(ret) &&
|
|
||||||
!bch2_check_range_allocated(c, POS(inode->v.i_ino,
|
|
||||||
req->ki_pos >> 9),
|
|
||||||
iter->count >> 9,
|
|
||||||
dio->op.opts.data_replicas))
|
|
||||||
goto err_put_bio;
|
|
||||||
|
|
||||||
ret = write_invalidate_inode_pages_range(mapping,
|
ret = write_invalidate_inode_pages_range(mapping,
|
||||||
req->ki_pos,
|
req->ki_pos,
|
||||||
req->ki_pos + iter->count - 1);
|
req->ki_pos + iter->count - 1);
|
||||||
@ -2030,12 +2024,9 @@ ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
|
|||||||
err:
|
err:
|
||||||
if (locked)
|
if (locked)
|
||||||
inode_unlock(&inode->v);
|
inode_unlock(&inode->v);
|
||||||
if (ret > 0)
|
|
||||||
req->ki_pos += ret;
|
|
||||||
return ret;
|
return ret;
|
||||||
err_put_bio:
|
err_put_bio:
|
||||||
bch2_pagecache_block_put(&inode->ei_pagecache_lock);
|
bch2_pagecache_block_put(&inode->ei_pagecache_lock);
|
||||||
bch2_disk_reservation_put(c, &dio->op.res);
|
|
||||||
bch2_quota_reservation_put(c, inode, &dio->quota_res);
|
bch2_quota_reservation_put(c, inode, &dio->quota_res);
|
||||||
bio_put(bio);
|
bio_put(bio);
|
||||||
inode_dio_end(&inode->v);
|
inode_dio_end(&inode->v);
|
||||||
|
@ -493,7 +493,6 @@ static void bch2_write_done(struct closure *cl)
|
|||||||
if (!op->error && (op->flags & BCH_WRITE_FLUSH))
|
if (!op->error && (op->flags & BCH_WRITE_FLUSH))
|
||||||
op->error = bch2_journal_error(&c->journal);
|
op->error = bch2_journal_error(&c->journal);
|
||||||
|
|
||||||
if (!(op->flags & BCH_WRITE_NOPUT_RESERVATION))
|
|
||||||
bch2_disk_reservation_put(c, &op->res);
|
bch2_disk_reservation_put(c, &op->res);
|
||||||
percpu_ref_put(&c->writes);
|
percpu_ref_put(&c->writes);
|
||||||
bch2_keylist_free(&op->insert_keys, op->inline_keys);
|
bch2_keylist_free(&op->insert_keys, op->inline_keys);
|
||||||
@ -1281,7 +1280,6 @@ void bch2_write(struct closure *cl)
|
|||||||
continue_at_nobarrier(cl, __bch2_write, NULL);
|
continue_at_nobarrier(cl, __bch2_write, NULL);
|
||||||
return;
|
return;
|
||||||
err:
|
err:
|
||||||
if (!(op->flags & BCH_WRITE_NOPUT_RESERVATION))
|
|
||||||
bch2_disk_reservation_put(c, &op->res);
|
bch2_disk_reservation_put(c, &op->res);
|
||||||
|
|
||||||
if (op->end_io) {
|
if (op->end_io) {
|
||||||
|
@ -30,14 +30,13 @@ enum bch_write_flags {
|
|||||||
BCH_WRITE_PAGES_STABLE = (1 << 4),
|
BCH_WRITE_PAGES_STABLE = (1 << 4),
|
||||||
BCH_WRITE_PAGES_OWNED = (1 << 5),
|
BCH_WRITE_PAGES_OWNED = (1 << 5),
|
||||||
BCH_WRITE_ONLY_SPECIFIED_DEVS = (1 << 6),
|
BCH_WRITE_ONLY_SPECIFIED_DEVS = (1 << 6),
|
||||||
BCH_WRITE_NOPUT_RESERVATION = (1 << 7),
|
BCH_WRITE_WROTE_DATA_INLINE = (1 << 7),
|
||||||
BCH_WRITE_WROTE_DATA_INLINE = (1 << 8),
|
BCH_WRITE_FROM_INTERNAL = (1 << 8),
|
||||||
BCH_WRITE_FROM_INTERNAL = (1 << 9),
|
|
||||||
|
|
||||||
/* Internal: */
|
/* Internal: */
|
||||||
BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 10),
|
BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 9),
|
||||||
BCH_WRITE_SKIP_CLOSURE_PUT = (1 << 11),
|
BCH_WRITE_SKIP_CLOSURE_PUT = (1 << 10),
|
||||||
BCH_WRITE_DONE = (1 << 12),
|
BCH_WRITE_DONE = (1 << 11),
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline u64 *op_journal_seq(struct bch_write_op *op)
|
static inline u64 *op_journal_seq(struct bch_write_op *op)
|
||||||
|
Loading…
Reference in New Issue
Block a user