mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
7ffb6a7ec6
The recent nocow locking rework introduced a deadlock in the data move path: the new nocow locking scheme uses a hash table with a fixed size array for chaining, meaning on hash collision we may have to wait for other locks to be released before we can lock a bucket. And since the data move path needs to submit writes from the same thread that's taking nocow locks and submitting reads, this introduces a deadlock. This shouldn't happen often in practice, but since the data move path can keep large numbers of IOs in flight simultaneously, it's something we have to handle. This patch makes move_ctxt_wait_event() available to bch2_data_update_init() and uses it when appropriate, which is our normal solution to this kind of thing. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
44 lines
1.1 KiB
C
44 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _BCACHEFS_DATA_UPDATE_H
|
|
#define _BCACHEFS_DATA_UPDATE_H
|
|
|
|
#include "bkey_buf.h"
|
|
#include "io_types.h"
|
|
|
|
struct moving_context;
|
|
|
|
struct data_update_opts {
|
|
unsigned rewrite_ptrs;
|
|
unsigned kill_ptrs;
|
|
u16 target;
|
|
u8 extra_replicas;
|
|
unsigned btree_insert_flags;
|
|
unsigned write_flags;
|
|
};
|
|
|
|
struct data_update {
|
|
/* extent being updated: */
|
|
enum btree_id btree_id;
|
|
struct bkey_buf k;
|
|
struct data_update_opts data_opts;
|
|
struct moving_context *ctxt;
|
|
struct bch_write_op op;
|
|
};
|
|
|
|
int bch2_data_update_index_update(struct bch_write_op *);
|
|
|
|
void bch2_data_update_read_done(struct data_update *,
|
|
struct bch_extent_crc_unpacked);
|
|
|
|
void bch2_data_update_exit(struct data_update *);
|
|
void bch2_update_unwritten_extent(struct btree_trans *, struct data_update *);
|
|
int bch2_data_update_init(struct btree_trans *, struct moving_context *,
|
|
struct data_update *,
|
|
struct write_point_specifier,
|
|
struct bch_io_opts, struct data_update_opts,
|
|
enum btree_id, struct bkey_s_c);
|
|
void bch2_data_update_opts_normalize(struct bkey_s_c, struct data_update_opts *);
|
|
|
|
#endif /* _BCACHEFS_DATA_UPDATE_H */
|