|
|
@@ -59,6 +59,7 @@ static struct drbd_request *drbd_req_new(struct drbd_device *device, struct bio
|
|
|
drbd_req_make_private_bio(req, bio_src);
|
|
|
req->rq_state = (bio_data_dir(bio_src) == WRITE ? RQ_WRITE : 0)
|
|
|
| (bio_op(bio_src) == REQ_OP_WRITE_SAME ? RQ_WSAME : 0)
|
|
|
+ | (bio_op(bio_src) == REQ_OP_WRITE_ZEROES ? RQ_UNMAP : 0)
|
|
|
| (bio_op(bio_src) == REQ_OP_DISCARD ? RQ_UNMAP : 0);
|
|
|
req->device = device;
|
|
|
req->master_bio = bio_src;
|
|
|
@@ -1180,7 +1181,8 @@ drbd_submit_req_private_bio(struct drbd_request *req)
|
|
|
if (get_ldev(device)) {
|
|
|
if (drbd_insert_fault(device, type))
|
|
|
bio_io_error(bio);
|
|
|
- else if (bio_op(bio) == REQ_OP_DISCARD)
|
|
|
+ else if (bio_op(bio) == REQ_OP_WRITE_ZEROES ||
|
|
|
+ bio_op(bio) == REQ_OP_DISCARD)
|
|
|
drbd_process_discard_req(req);
|
|
|
else
|
|
|
generic_make_request(bio);
|
|
|
@@ -1234,7 +1236,8 @@ drbd_request_prepare(struct drbd_device *device, struct bio *bio, unsigned long
|
|
|
_drbd_start_io_acct(device, req);
|
|
|
|
|
|
/* process discards always from our submitter thread */
|
|
|
- if (bio_op(bio) & REQ_OP_DISCARD)
|
|
|
+ if ((bio_op(bio) & REQ_OP_WRITE_ZEROES) ||
|
|
|
+ (bio_op(bio) & REQ_OP_DISCARD))
|
|
|
goto queue_for_submitter_thread;
|
|
|
|
|
|
if (rw == WRITE && req->private_bio && req->i.size
|