int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
struct alloc_request *req,
struct dev_stripe_state *stripe,
- enum bch_data_type data_type,
struct closure *cl)
{
struct bch_fs *c = trans->c;
struct bch_dev_usage usage;
struct open_bucket *ob = bch2_bucket_alloc_trans(trans, ca,
- req->watermark, data_type,
+ req->watermark, req->data_type,
cl, req->flags & BCH_WRITE_alloc_nowait,
&usage);
if (!IS_ERR(ob))
* Try nonblocking first, so that if one device is full we'll try from
* other devices:
*/
- ret = bch2_bucket_alloc_set_trans(trans, req, &req->wp->stripe,
- req->wp->data_type, cl);
+ ret = bch2_bucket_alloc_set_trans(trans, req, &req->wp->stripe, cl);
if (ret &&
!bch2_err_matches(ret, BCH_ERR_transaction_restart) &&
!bch2_err_matches(ret, BCH_ERR_insufficient_devices) &&
*wp_ret = req.wp = writepoint_find(trans, write_point.v);
+ req.data_type = req.wp->data_type;
+
ret = bch2_trans_relock(trans);
if (ret)
goto err;
/* metadata may not allocate on cache devices: */
- if (req.wp->data_type != BCH_DATA_user)
+ if (req.data_type != BCH_DATA_user)
req.have_cache = true;
if (target && !(flags & BCH_WRITE_only_specified_devs)) {
bool ec;
enum bch_watermark watermark;
enum bch_write_flags flags;
+ enum bch_data_type data_type;
struct bch_devs_list *devs_have;
struct write_point *wp;
enum bch_write_flags;
int bch2_bucket_alloc_set_trans(struct btree_trans *, struct alloc_request *,
- struct dev_stripe_state *, enum bch_data_type,
- struct closure *);
+ struct dev_stripe_state *, struct closure *);
int bch2_alloc_sectors_start_trans(struct btree_trans *,
unsigned, unsigned,
if (nr_have_parity < s->nr_parity) {
req.nr_replicas = s->nr_parity;
req.nr_effective = nr_have_parity;
+ req.data_type = BCH_DATA_parity;
- ret = bch2_bucket_alloc_set_trans(trans, &req,
- &h->parity_stripe,
- BCH_DATA_parity,
- cl);
+ ret = bch2_bucket_alloc_set_trans(trans, &req, &h->parity_stripe, cl);
open_bucket_for_each(c, &req.ptrs, ob, i) {
j = find_next_zero_bit(s->blocks_gotten,
if (nr_have_data < s->nr_data) {
req.nr_replicas = s->nr_data;
req.nr_effective = nr_have_data;
+ req.data_type = BCH_DATA_user;
- ret = bch2_bucket_alloc_set_trans(trans, &req,
- &h->block_stripe,
- BCH_DATA_user,
- cl);
+ ret = bch2_bucket_alloc_set_trans(trans, &req, &h->block_stripe, cl);
open_bucket_for_each(c, &req.ptrs, ob, i) {
j = find_next_zero_bit(s->blocks_gotten,