drbd: Adding support for BIO/Request flags: REQ_FUA, REQ_FLUSH and REQ_DISCARD
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
1090c056c5
commit
76d2e7eca8
3 changed files with 34 additions and 22 deletions
|
@ -374,9 +374,13 @@ union p_header {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* these defines must not be changed without changing the protocol version */
|
/* these defines must not be changed without changing the protocol version */
|
||||||
#define DP_HARDBARRIER 1
|
#define DP_HARDBARRIER 1 /* depricated */
|
||||||
#define DP_RW_SYNC 2
|
#define DP_RW_SYNC 2 /* equals REQ_SYNC */
|
||||||
#define DP_MAY_SET_IN_SYNC 4
|
#define DP_MAY_SET_IN_SYNC 4
|
||||||
|
#define DP_UNPLUG 8 /* equals REQ_UNPLUG */
|
||||||
|
#define DP_FUA 16 /* equals REQ_FUA */
|
||||||
|
#define DP_FLUSH 32 /* equals REQ_FLUSH */
|
||||||
|
#define DP_DISCARD 64 /* equals REQ_DISCARD */
|
||||||
|
|
||||||
struct p_data {
|
struct p_data {
|
||||||
union p_header head;
|
union p_header head;
|
||||||
|
|
|
@ -2426,6 +2426,18 @@ static int _drbd_send_zc_ee(struct drbd_conf *mdev, struct drbd_epoch_entry *e)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 bio_flags_to_wire(struct drbd_conf *mdev, unsigned long bi_rw)
|
||||||
|
{
|
||||||
|
if (mdev->agreed_pro_version >= 95)
|
||||||
|
return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) |
|
||||||
|
(bi_rw & REQ_UNPLUG ? DP_UNPLUG : 0) |
|
||||||
|
(bi_rw & REQ_FUA ? DP_FUA : 0) |
|
||||||
|
(bi_rw & REQ_FLUSH ? DP_FLUSH : 0) |
|
||||||
|
(bi_rw & REQ_DISCARD ? DP_DISCARD : 0);
|
||||||
|
else
|
||||||
|
return bi_rw & (REQ_SYNC | REQ_UNPLUG) ? DP_RW_SYNC : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Used to send write requests
|
/* Used to send write requests
|
||||||
* R_PRIMARY -> Peer (P_DATA)
|
* R_PRIMARY -> Peer (P_DATA)
|
||||||
*/
|
*/
|
||||||
|
@ -2459,21 +2471,9 @@ int drbd_send_dblock(struct drbd_conf *mdev, struct drbd_request *req)
|
||||||
p.block_id = (unsigned long)req;
|
p.block_id = (unsigned long)req;
|
||||||
p.seq_num = cpu_to_be32(req->seq_num =
|
p.seq_num = cpu_to_be32(req->seq_num =
|
||||||
atomic_add_return(1, &mdev->packet_seq));
|
atomic_add_return(1, &mdev->packet_seq));
|
||||||
dp_flags = 0;
|
|
||||||
|
|
||||||
/* NOTE: no need to check if barriers supported here as we would
|
dp_flags = bio_flags_to_wire(mdev, req->master_bio->bi_rw);
|
||||||
* not pass the test in make_request_common in that case
|
|
||||||
*/
|
|
||||||
if (req->master_bio->bi_rw & REQ_HARDBARRIER) {
|
|
||||||
dev_err(DEV, "ASSERT FAILED would have set DP_HARDBARRIER\n");
|
|
||||||
/* dp_flags |= DP_HARDBARRIER; */
|
|
||||||
}
|
|
||||||
if (req->master_bio->bi_rw & REQ_SYNC)
|
|
||||||
dp_flags |= DP_RW_SYNC;
|
|
||||||
/* for now handle SYNCIO and UNPLUG
|
|
||||||
* as if they still were one and the same flag */
|
|
||||||
if (req->master_bio->bi_rw & REQ_UNPLUG)
|
|
||||||
dp_flags |= DP_RW_SYNC;
|
|
||||||
if (mdev->state.conn >= C_SYNC_SOURCE &&
|
if (mdev->state.conn >= C_SYNC_SOURCE &&
|
||||||
mdev->state.conn <= C_PAUSED_SYNC_T)
|
mdev->state.conn <= C_PAUSED_SYNC_T)
|
||||||
dp_flags |= DP_MAY_SET_IN_SYNC;
|
dp_flags |= DP_MAY_SET_IN_SYNC;
|
||||||
|
|
|
@ -1753,6 +1753,18 @@ static int drbd_wait_peer_seq(struct drbd_conf *mdev, const u32 packet_seq)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long write_flags_to_bio(struct drbd_conf *mdev, u32 dpf)
|
||||||
|
{
|
||||||
|
if (mdev->agreed_pro_version >= 95)
|
||||||
|
return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) |
|
||||||
|
(dpf & DP_UNPLUG ? REQ_UNPLUG : 0) |
|
||||||
|
(dpf & DP_FUA ? REQ_FUA : 0) |
|
||||||
|
(dpf & DP_FLUSH ? REQ_FUA : 0) |
|
||||||
|
(dpf & DP_DISCARD ? REQ_DISCARD : 0);
|
||||||
|
else
|
||||||
|
return dpf & DP_RW_SYNC ? (REQ_SYNC | REQ_UNPLUG) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* mirrored write */
|
/* mirrored write */
|
||||||
static int receive_Data(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned int data_size)
|
static int receive_Data(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned int data_size)
|
||||||
{
|
{
|
||||||
|
@ -1818,12 +1830,8 @@ static int receive_Data(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned
|
||||||
spin_unlock(&mdev->epoch_lock);
|
spin_unlock(&mdev->epoch_lock);
|
||||||
|
|
||||||
dp_flags = be32_to_cpu(p->dp_flags);
|
dp_flags = be32_to_cpu(p->dp_flags);
|
||||||
if (dp_flags & DP_HARDBARRIER) {
|
rw |= write_flags_to_bio(mdev, dp_flags);
|
||||||
dev_err(DEV, "ASSERT FAILED would have submitted barrier request\n");
|
|
||||||
/* rw |= REQ_HARDBARRIER; */
|
|
||||||
}
|
|
||||||
if (dp_flags & DP_RW_SYNC)
|
|
||||||
rw |= REQ_SYNC | REQ_UNPLUG;
|
|
||||||
if (dp_flags & DP_MAY_SET_IN_SYNC)
|
if (dp_flags & DP_MAY_SET_IN_SYNC)
|
||||||
e->flags |= EE_MAY_SET_IN_SYNC;
|
e->flags |= EE_MAY_SET_IN_SYNC;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue