Skip to content

Commit bb3cc85

Browse files
Mike Christieaxboe
authored andcommitted
drbd: use bio op accessors
Separate the op from the rq_flag_bits and have drbd set/get the bio using bio_set_op_attrs/bio_op. Signed-off-by: Mike Christie <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent ad0d9e7 commit bb3cc85

File tree

6 files changed

+59
-42
lines changed

6 files changed

+59
-42
lines changed

drivers/block/drbd/drbd_actlog.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -137,19 +137,19 @@ void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_b
137137

138138
static int _drbd_md_sync_page_io(struct drbd_device *device,
139139
struct drbd_backing_dev *bdev,
140-
sector_t sector, int rw)
140+
sector_t sector, int op)
141141
{
142142
struct bio *bio;
143143
/* we do all our meta data IO in aligned 4k blocks. */
144144
const int size = 4096;
145-
int err;
145+
int err, op_flags = 0;
146146

147147
device->md_io.done = 0;
148148
device->md_io.error = -ENODEV;
149149

150-
if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags))
151-
rw |= REQ_FUA | REQ_FLUSH;
152-
rw |= REQ_SYNC | REQ_NOIDLE;
150+
if ((op == REQ_OP_WRITE) && !test_bit(MD_NO_FUA, &device->flags))
151+
op_flags |= REQ_FUA | REQ_FLUSH;
152+
op_flags |= REQ_SYNC | REQ_NOIDLE;
153153

154154
bio = bio_alloc_drbd(GFP_NOIO);
155155
bio->bi_bdev = bdev->md_bdev;
@@ -159,9 +159,9 @@ static int _drbd_md_sync_page_io(struct drbd_device *device,
159159
goto out;
160160
bio->bi_private = device;
161161
bio->bi_end_io = drbd_md_endio;
162-
bio->bi_rw = rw;
162+
bio_set_op_attrs(bio, op, op_flags);
163163

164-
if (!(rw & WRITE) && device->state.disk == D_DISKLESS && device->ldev == NULL)
164+
if (op != REQ_OP_WRITE && device->state.disk == D_DISKLESS && device->ldev == NULL)
165165
/* special case, drbd_md_read() during drbd_adm_attach(): no get_ldev */
166166
;
167167
else if (!get_ldev_if_state(device, D_ATTACHING)) {
@@ -174,7 +174,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device,
174174
bio_get(bio); /* one bio_put() is in the completion handler */
175175
atomic_inc(&device->md_io.in_use); /* drbd_md_put_buffer() is in the completion handler */
176176
device->md_io.submit_jif = jiffies;
177-
if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD))
177+
if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD))
178178
bio_io_error(bio);
179179
else
180180
submit_bio(bio);
@@ -188,7 +188,7 @@ static int _drbd_md_sync_page_io(struct drbd_device *device,
188188
}
189189

190190
int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev,
191-
sector_t sector, int rw)
191+
sector_t sector, int op)
192192
{
193193
int err;
194194
D_ASSERT(device, atomic_read(&device->md_io.in_use) == 1);
@@ -197,19 +197,21 @@ int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bd
197197

198198
dynamic_drbd_dbg(device, "meta_data io: %s [%d]:%s(,%llus,%s) %pS\n",
199199
current->comm, current->pid, __func__,
200-
(unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ",
200+
(unsigned long long)sector, (op == REQ_OP_WRITE) ? "WRITE" : "READ",
201201
(void*)_RET_IP_ );
202202

203203
if (sector < drbd_md_first_sector(bdev) ||
204204
sector + 7 > drbd_md_last_sector(bdev))
205205
drbd_alert(device, "%s [%d]:%s(,%llus,%s) out of range md access!\n",
206206
current->comm, current->pid, __func__,
207-
(unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ");
207+
(unsigned long long)sector,
208+
(op == REQ_OP_WRITE) ? "WRITE" : "READ");
208209

209-
err = _drbd_md_sync_page_io(device, bdev, sector, rw);
210+
err = _drbd_md_sync_page_io(device, bdev, sector, op);
210211
if (err) {
211212
drbd_err(device, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n",
212-
(unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err);
213+
(unsigned long long)sector,
214+
(op == REQ_OP_WRITE) ? "WRITE" : "READ", err);
213215
}
214216
return err;
215217
}

drivers/block/drbd/drbd_bitmap.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho
980980
struct drbd_bitmap *b = device->bitmap;
981981
struct page *page;
982982
unsigned int len;
983-
unsigned int rw = (ctx->flags & BM_AIO_READ) ? READ : WRITE;
983+
unsigned int op = (ctx->flags & BM_AIO_READ) ? REQ_OP_READ : REQ_OP_WRITE;
984984

985985
sector_t on_disk_sector =
986986
device->ldev->md.md_offset + device->ldev->md.bm_offset;
@@ -1011,9 +1011,9 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho
10111011
bio_add_page(bio, page, len, 0);
10121012
bio->bi_private = ctx;
10131013
bio->bi_end_io = drbd_bm_endio;
1014-
bio->bi_rw = rw;
1014+
bio_set_op_attrs(bio, op, 0);
10151015

1016-
if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) {
1016+
if (drbd_insert_fault(device, (op == REQ_OP_WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) {
10171017
bio_io_error(bio);
10181018
} else {
10191019
submit_bio(bio);

drivers/block/drbd/drbd_int.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,7 @@ extern int drbd_resync_finished(struct drbd_device *device);
15071507
extern void *drbd_md_get_buffer(struct drbd_device *device, const char *intent);
15081508
extern void drbd_md_put_buffer(struct drbd_device *device);
15091509
extern int drbd_md_sync_page_io(struct drbd_device *device,
1510-
struct drbd_backing_dev *bdev, sector_t sector, int rw);
1510+
struct drbd_backing_dev *bdev, sector_t sector, int op);
15111511
extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int);
15121512
extern void wait_until_done_or_force_detached(struct drbd_device *device,
15131513
struct drbd_backing_dev *bdev, unsigned int *done);
@@ -1557,7 +1557,7 @@ extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector
15571557
bool throttle_if_app_is_waiting);
15581558
extern int drbd_submit_peer_request(struct drbd_device *,
15591559
struct drbd_peer_request *, const unsigned,
1560-
const int);
1560+
const unsigned, const int);
15611561
extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *);
15621562
extern struct drbd_peer_request *drbd_alloc_peer_req(struct drbd_peer_device *, u64,
15631563
sector_t, unsigned int,

drivers/block/drbd/drbd_main.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,15 +1603,16 @@ static int _drbd_send_zc_ee(struct drbd_peer_device *peer_device,
16031603
return 0;
16041604
}
16051605

1606-
static u32 bio_flags_to_wire(struct drbd_connection *connection, unsigned long bi_rw)
1606+
static u32 bio_flags_to_wire(struct drbd_connection *connection,
1607+
struct bio *bio)
16071608
{
16081609
if (connection->agreed_pro_version >= 95)
1609-
return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) |
1610-
(bi_rw & REQ_FUA ? DP_FUA : 0) |
1611-
(bi_rw & REQ_FLUSH ? DP_FLUSH : 0) |
1612-
(bi_rw & REQ_DISCARD ? DP_DISCARD : 0);
1610+
return (bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) |
1611+
(bio->bi_rw & REQ_FUA ? DP_FUA : 0) |
1612+
(bio->bi_rw & REQ_FLUSH ? DP_FLUSH : 0) |
1613+
(bio_op(bio) == REQ_OP_DISCARD ? DP_DISCARD : 0);
16131614
else
1614-
return bi_rw & REQ_SYNC ? DP_RW_SYNC : 0;
1615+
return bio->bi_rw & REQ_SYNC ? DP_RW_SYNC : 0;
16151616
}
16161617

16171618
/* Used to send write or TRIM aka REQ_DISCARD requests
@@ -1636,7 +1637,7 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request *
16361637
p->sector = cpu_to_be64(req->i.sector);
16371638
p->block_id = (unsigned long)req;
16381639
p->seq_num = cpu_to_be32(atomic_inc_return(&device->packet_seq));
1639-
dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio->bi_rw);
1640+
dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio);
16401641
if (device->state.conn >= C_SYNC_SOURCE &&
16411642
device->state.conn <= C_PAUSED_SYNC_T)
16421643
dp_flags |= DP_MAY_SET_IN_SYNC;
@@ -3061,7 +3062,7 @@ void drbd_md_write(struct drbd_device *device, void *b)
30613062
D_ASSERT(device, drbd_md_ss(device->ldev) == device->ldev->md.md_offset);
30623063
sector = device->ldev->md.md_offset;
30633064

3064-
if (drbd_md_sync_page_io(device, device->ldev, sector, WRITE)) {
3065+
if (drbd_md_sync_page_io(device, device->ldev, sector, REQ_OP_WRITE)) {
30653066
/* this was a try anyways ... */
30663067
drbd_err(device, "meta data update failed!\n");
30673068
drbd_chk_io_error(device, 1, DRBD_META_IO_ERROR);
@@ -3263,7 +3264,8 @@ int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev)
32633264
* Affects the paranoia out-of-range access check in drbd_md_sync_page_io(). */
32643265
bdev->md.md_size_sect = 8;
32653266

3266-
if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset, READ)) {
3267+
if (drbd_md_sync_page_io(device, bdev, bdev->md.md_offset,
3268+
REQ_OP_READ)) {
32673269
/* NOTE: can't do normal error processing here as this is
32683270
called BEFORE disk is attached */
32693271
drbd_err(device, "Error while reading metadata.\n");

drivers/block/drbd/drbd_receiver.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,7 +1398,8 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin
13981398
/* TODO allocate from our own bio_set. */
13991399
int drbd_submit_peer_request(struct drbd_device *device,
14001400
struct drbd_peer_request *peer_req,
1401-
const unsigned rw, const int fault_type)
1401+
const unsigned op, const unsigned op_flags,
1402+
const int fault_type)
14021403
{
14031404
struct bio *bios = NULL;
14041405
struct bio *bio;
@@ -1450,15 +1451,15 @@ int drbd_submit_peer_request(struct drbd_device *device,
14501451
/* > peer_req->i.sector, unless this is the first bio */
14511452
bio->bi_iter.bi_sector = sector;
14521453
bio->bi_bdev = device->ldev->backing_bdev;
1453-
bio->bi_rw = rw;
1454+
bio_set_op_attrs(bio, op, op_flags);
14541455
bio->bi_private = peer_req;
14551456
bio->bi_end_io = drbd_peer_request_endio;
14561457

14571458
bio->bi_next = bios;
14581459
bios = bio;
14591460
++n_bios;
14601461

1461-
if (rw & REQ_DISCARD) {
1462+
if (op == REQ_OP_DISCARD) {
14621463
bio->bi_iter.bi_size = data_size;
14631464
goto submit;
14641465
}
@@ -1830,7 +1831,8 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto
18301831
spin_unlock_irq(&device->resource->req_lock);
18311832

18321833
atomic_add(pi->size >> 9, &device->rs_sect_ev);
1833-
if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0)
1834+
if (drbd_submit_peer_request(device, peer_req, REQ_OP_WRITE, 0,
1835+
DRBD_FAULT_RS_WR) == 0)
18341836
return 0;
18351837

18361838
/* don't care for the reason here */
@@ -2152,12 +2154,19 @@ static int wait_for_and_update_peer_seq(struct drbd_peer_device *peer_device, co
21522154
/* see also bio_flags_to_wire()
21532155
* DRBD_REQ_*, because we need to semantically map the flags to data packet
21542156
* flags and back. We may replicate to other kernel versions. */
2155-
static unsigned long wire_flags_to_bio(u32 dpf)
2157+
static unsigned long wire_flags_to_bio_flags(u32 dpf)
21562158
{
21572159
return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) |
21582160
(dpf & DP_FUA ? REQ_FUA : 0) |
2159-
(dpf & DP_FLUSH ? REQ_FLUSH : 0) |
2160-
(dpf & DP_DISCARD ? REQ_DISCARD : 0);
2161+
(dpf & DP_FLUSH ? REQ_FLUSH : 0);
2162+
}
2163+
2164+
static unsigned long wire_flags_to_bio_op(u32 dpf)
2165+
{
2166+
if (dpf & DP_DISCARD)
2167+
return REQ_OP_DISCARD;
2168+
else
2169+
return REQ_OP_WRITE;
21612170
}
21622171

21632172
static void fail_postponed_requests(struct drbd_device *device, sector_t sector,
@@ -2303,7 +2312,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info *
23032312
struct drbd_peer_request *peer_req;
23042313
struct p_data *p = pi->data;
23052314
u32 peer_seq = be32_to_cpu(p->seq_num);
2306-
int rw = WRITE;
2315+
int op, op_flags;
23072316
u32 dp_flags;
23082317
int err, tp;
23092318

@@ -2342,14 +2351,15 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info *
23422351
peer_req->flags |= EE_APPLICATION;
23432352

23442353
dp_flags = be32_to_cpu(p->dp_flags);
2345-
rw |= wire_flags_to_bio(dp_flags);
2354+
op = wire_flags_to_bio_op(dp_flags);
2355+
op_flags = wire_flags_to_bio_flags(dp_flags);
23462356
if (pi->cmd == P_TRIM) {
23472357
struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev);
23482358
peer_req->flags |= EE_IS_TRIM;
23492359
if (!blk_queue_discard(q))
23502360
peer_req->flags |= EE_IS_TRIM_USE_ZEROOUT;
23512361
D_ASSERT(peer_device, peer_req->i.size > 0);
2352-
D_ASSERT(peer_device, rw & REQ_DISCARD);
2362+
D_ASSERT(peer_device, op == REQ_OP_DISCARD);
23532363
D_ASSERT(peer_device, peer_req->pages == NULL);
23542364
} else if (peer_req->pages == NULL) {
23552365
D_ASSERT(device, peer_req->i.size == 0);
@@ -2433,7 +2443,8 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info *
24332443
peer_req->flags |= EE_CALL_AL_COMPLETE_IO;
24342444
}
24352445

2436-
err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR);
2446+
err = drbd_submit_peer_request(device, peer_req, op, op_flags,
2447+
DRBD_FAULT_DT_WR);
24372448
if (!err)
24382449
return 0;
24392450

@@ -2723,7 +2734,8 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
27232734
submit:
27242735
update_receiver_timing_details(connection, drbd_submit_peer_request);
27252736
inc_unacked(device);
2726-
if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0)
2737+
if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0,
2738+
fault_type) == 0)
27272739
return 0;
27282740

27292741
/* don't care for the reason here */

drivers/block/drbd/drbd_worker.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void drbd_peer_request_endio(struct bio *bio)
174174
struct drbd_peer_request *peer_req = bio->bi_private;
175175
struct drbd_device *device = peer_req->peer_device->device;
176176
int is_write = bio_data_dir(bio) == WRITE;
177-
int is_discard = !!(bio->bi_rw & REQ_DISCARD);
177+
int is_discard = !!(bio_op(bio) == REQ_OP_DISCARD);
178178

179179
if (bio->bi_error && __ratelimit(&drbd_ratelimit_state))
180180
drbd_warn(device, "%s: error=%d s=%llus\n",
@@ -248,7 +248,7 @@ void drbd_request_endio(struct bio *bio)
248248

249249
/* to avoid recursion in __req_mod */
250250
if (unlikely(bio->bi_error)) {
251-
if (bio->bi_rw & REQ_DISCARD)
251+
if (bio_op(bio) == REQ_OP_DISCARD)
252252
what = (bio->bi_error == -EOPNOTSUPP)
253253
? DISCARD_COMPLETED_NOTSUPP
254254
: DISCARD_COMPLETED_WITH_ERROR;
@@ -397,7 +397,8 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector,
397397
spin_unlock_irq(&device->resource->req_lock);
398398

399399
atomic_add(size >> 9, &device->rs_sect_ev);
400-
if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0)
400+
if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0,
401+
DRBD_FAULT_RS_RD) == 0)
401402
return 0;
402403

403404
/* If it failed because of ENOMEM, retry should help. If it failed

0 commit comments

Comments
 (0)