Accepting request 324251 from home:wanghaisu:branches:network:ha-clustering:Factory
Fate#317940. Merge into one patch. Support zeroout/discard instead of zap-devices. OBS-URL: https://build.opensuse.org/request/show/324251 OBS-URL: https://build.opensuse.org/package/show/network:ha-clustering:Factory/drbd?expand=0&rev=17
This commit is contained in:
parent
e327903f6c
commit
428f2cbe4b
@ -1,68 +0,0 @@
|
|||||||
From 5874ec7ba93074fdc3c2e878080a4b08d3408bbf Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Mon, 13 Jul 2015 10:46:29 +0800
|
|
||||||
Subject: [Patch v2 00/10] Zero out devices instead of initial full sync
|
|
||||||
|
|
||||||
Patch set is based on drbd-8.4 859e34a9, have
|
|
||||||
already compiled/tested against SLES12.
|
|
||||||
|
|
||||||
If this feature can be merged into upstream, please
|
|
||||||
ignore v1, since v1 may caused pingACK timeout when
|
|
||||||
zeroing out large device.
|
|
||||||
|
|
||||||
Compare to v1, changes are as follow:
|
|
||||||
1. Using drbd_device_post_work to zero out device as background
|
|
||||||
task, so that it won't block pingACK when zeroing out
|
|
||||||
large device.
|
|
||||||
|
|
||||||
2. Fix bug of won't update peer node status if it finished
|
|
||||||
zeroing out earier.
|
|
||||||
|
|
||||||
3. Change some functions from file drbd_receive.c to
|
|
||||||
drbd_worker.c and reorder the patch set.
|
|
||||||
|
|
||||||
|
|
||||||
Full sync for drbd initial usually take a long time, especically
|
|
||||||
when network become the bottleneck of the syncing. Simply skip
|
|
||||||
the full sync with "--clear-bitmap" may not the perfect solution
|
|
||||||
for all the cases, like using the bare device(no filesystem) to
|
|
||||||
work,etc database,vm... This patche set can be used to zero out
|
|
||||||
devices locally instead of a full sync to make the consistent
|
|
||||||
block device. This approach can be useful when lack of network
|
|
||||||
bandwidth to sync.
|
|
||||||
|
|
||||||
The patches add one new option "--zap-devices" to "new-current-uuid"
|
|
||||||
to zero out devices. It will start zeroing out devices of both
|
|
||||||
side.
|
|
||||||
|
|
||||||
Nick Wang (10):
|
|
||||||
drbd: Fix the wrong logic of move history.
|
|
||||||
drbd: Add options zap_devices to new-current-uuid
|
|
||||||
drbd: Add a function to zero out drbd backing device.
|
|
||||||
drbd: New packet P_ZERO_OUT.
|
|
||||||
drbd: Functions to notify peer node to start
|
|
||||||
zeroing out and zero out finished.
|
|
||||||
drbd: Wapper for zeroing out device by worker.
|
|
||||||
drbd: Add flag for drbd device work.
|
|
||||||
drbd: Function to work with packet P_ZERO_OUT.
|
|
||||||
drbd: Receive zero out command from peer node.
|
|
||||||
drbd: Handle new-current-uuid --zap-devices.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
|
|
||||||
drbd/drbd_int.h | 13 ++++++++
|
|
||||||
drbd/drbd_main.c | 51 ++++++++++++++++++++++++++--
|
|
||||||
drbd/drbd_nl.c | 21 +++++++++++-
|
|
||||||
drbd/drbd_protocol.h | 1 +
|
|
||||||
drbd/drbd_receiver.c | 69 ++++++++++++++++++++++++++++++++++++++
|
|
||||||
drbd/drbd_worker.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
drbd/linux/drbd_genl.h | 1 +
|
|
||||||
7 files changed, 243 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
|||||||
From 4d75389962585d5a543cadb2742cb4dfe22dc807 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 17:20:04 +0800
|
|
||||||
Subject: [Patch v2 01/10] drbd: Fix the wrong logic of moving history
|
|
||||||
|
|
||||||
Logic of moving history is wrong. May overlap
|
|
||||||
history when more than two history.
|
|
||||||
If won't extent more that two history. The loop
|
|
||||||
can be delete.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_main.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
|
||||||
index 9871894..a3dc39e 100644
|
|
||||||
--- a/drbd/drbd_main.c
|
|
||||||
+++ b/drbd/drbd_main.c
|
|
||||||
@@ -3466,8 +3466,8 @@ void drbd_uuid_move_history(struct drbd_device *device) __must_hold(local)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
- for (i = UI_HISTORY_START; i < UI_HISTORY_END; i++)
|
|
||||||
- device->ldev->md.uuid[i+1] = device->ldev->md.uuid[i];
|
|
||||||
+ for (i = UI_HISTORY_END; i > UI_HISTORY_START; i--)
|
|
||||||
+ device->ldev->md.uuid[i] = device->ldev->md.uuid[i-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void __drbd_uuid_set(struct drbd_device *device, int idx, u64 val) __must_hold(local)
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
529
0001-drbd-Support-zeroout-device-in-initial-sync.patch
Normal file
529
0001-drbd-Support-zeroout-device-in-initial-sync.patch
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
From e15ba3799caf4cdcdf151078efe01e9a3f3ab206 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nick Wang <nwang@suse.com>
|
||||||
|
Date: Fri, 10 Jul 2015 17:28:18 +0800
|
||||||
|
Subject: [PATCH] drbd: Support zeroout device instead of initial full sync
|
||||||
|
|
||||||
|
Patch set for zeroing out device on both side
|
||||||
|
instead of initial full sync. Useful for high
|
||||||
|
latency network environment.
|
||||||
|
|
||||||
|
Implement --zeroout-devices and --discard-devices
|
||||||
|
for new-current-uuid
|
||||||
|
---
|
||||||
|
drbd/drbd_int.h | 15 +++++++
|
||||||
|
drbd/drbd_main.c | 60 +++++++++++++++++++++++++++-
|
||||||
|
drbd/drbd_nl.c | 41 +++++++++++++++++--
|
||||||
|
drbd/drbd_protocol.h | 2 +
|
||||||
|
drbd/drbd_receiver.c | 86 +++++++++++++++++++++++++++++++++++++++-
|
||||||
|
drbd/drbd_worker.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
drbd/linux/drbd_genl.h | 2 +
|
||||||
|
7 files changed, 305 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||||
|
index d1e2bc0..555b24c 100644
|
||||||
|
--- a/drbd/drbd_int.h
|
||||||
|
+++ b/drbd/drbd_int.h
|
||||||
|
@@ -621,6 +621,13 @@ enum {
|
||||||
|
RS_START, /* tell worker to start resync/OV */
|
||||||
|
RS_PROGRESS, /* tell worker that resync made significant progress */
|
||||||
|
RS_DONE, /* tell worker that resync is done */
|
||||||
|
+ P_ZERO_START, /* tell worker to zero out device */
|
||||||
|
+ S_ZERO_START, /* tell worker to zero out device as requested*/
|
||||||
|
+
|
||||||
|
+ /* used for zero out/discard device */
|
||||||
|
+ DISCARD_DISK, /* flag to discard device */
|
||||||
|
+ ZERO_DONE, /* succeed on zero out a device */
|
||||||
|
+ ZERO_FAIL, /* fail to zero out a device */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drbd_bitmap; /* opaque for drbd_device */
|
||||||
|
@@ -1204,6 +1211,11 @@ extern int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_pa
|
||||||
|
extern int drbd_send_protocol(struct drbd_connection *connection);
|
||||||
|
extern int drbd_send_uuids(struct drbd_peer_device *);
|
||||||
|
extern int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *);
|
||||||
|
+extern int drbd_send_zeroout_start(struct drbd_peer_device *);
|
||||||
|
+extern int drbd_send_discard_start(struct drbd_peer_device *);
|
||||||
|
+extern int drbd_send_zeroout_finish(struct drbd_peer_device *);
|
||||||
|
+extern int drbd_send_zeroout_ok(struct drbd_peer_device *);
|
||||||
|
+extern int drbd_send_zeroout_fail(struct drbd_peer_device *);
|
||||||
|
extern void drbd_gen_and_send_sync_uuid(struct drbd_peer_device *);
|
||||||
|
extern int drbd_send_sizes(struct drbd_peer_device *peer_device, int trigger_reply, enum dds_flags flags);
|
||||||
|
extern int drbd_send_state(struct drbd_peer_device *, union drbd_state);
|
||||||
|
@@ -1661,6 +1673,9 @@ extern void drbd_send_acks_wf(struct work_struct *ws);
|
||||||
|
extern bool drbd_rs_c_min_rate_throttle(struct drbd_device *device);
|
||||||
|
extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector,
|
||||||
|
bool throttle_if_app_is_waiting);
|
||||||
|
+extern int zeroout_local_device(struct drbd_device *device, bool discard);
|
||||||
|
+extern void require_zeroout_local_device(struct drbd_device *device);
|
||||||
|
+extern void receive_zeroout_local_device(struct drbd_device *device);
|
||||||
|
extern int drbd_submit_peer_request(struct drbd_device *,
|
||||||
|
struct drbd_peer_request *, const unsigned,
|
||||||
|
const int);
|
||||||
|
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||||
|
index 31bf43f..badc719 100644
|
||||||
|
--- a/drbd/drbd_main.c
|
||||||
|
+++ b/drbd/drbd_main.c
|
||||||
|
@@ -908,6 +908,62 @@ int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *peer_device)
|
||||||
|
return _drbd_send_uuids(peer_device, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * drbd_send_zeroout_start() - Notify peer node to zeroout device
|
||||||
|
+ * @peer_device: DRBD peer device.
|
||||||
|
+ */
|
||||||
|
+int drbd_send_zeroout_start(struct drbd_peer_device *peer_device)
|
||||||
|
+{
|
||||||
|
+ return _drbd_send_uuids(peer_device, 16);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * drbd_send_discard_start() - Notify peer node to discard device
|
||||||
|
+ * @peer_device: DRBD peer device.
|
||||||
|
+ */
|
||||||
|
+int drbd_send_discard_start(struct drbd_peer_device *peer_device)
|
||||||
|
+{
|
||||||
|
+ return _drbd_send_uuids(peer_device, 32);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * drbd_send_zeroout_finish() - Notify both node finished zeroing out
|
||||||
|
+ * @peer_device: DRBD peer device.
|
||||||
|
+ */
|
||||||
|
+int drbd_send_zeroout_finish(struct drbd_peer_device *peer_device)
|
||||||
|
+{
|
||||||
|
+ return _drbd_send_uuids(peer_device, 64);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * _drbd_send_zeroout_state() - Sends the drbd state to the peer
|
||||||
|
+ * @peer_device: DRBD peer device.
|
||||||
|
+ * @state: Device zero out status.
|
||||||
|
+ */
|
||||||
|
+static int _drbd_send_zeroout_state(struct drbd_peer_device *peer_device, unsigned int status)
|
||||||
|
+{
|
||||||
|
+ struct drbd_socket *sock;
|
||||||
|
+ struct p_state *p;
|
||||||
|
+
|
||||||
|
+ sock = &peer_device->connection->data;
|
||||||
|
+ p = drbd_prepare_command(peer_device, sock);
|
||||||
|
+ if (!p)
|
||||||
|
+ return -EIO;
|
||||||
|
+ p->state = cpu_to_be32(status);
|
||||||
|
+ return drbd_send_command(peer_device, sock, P_ZERO_OUT, sizeof(*p), NULL, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int drbd_send_zeroout_ok(struct drbd_peer_device *peer_device)
|
||||||
|
+{
|
||||||
|
+ return _drbd_send_zeroout_state(peer_device, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int drbd_send_zeroout_fail(struct drbd_peer_device *peer_device)
|
||||||
|
+{
|
||||||
|
+ return _drbd_send_zeroout_state(peer_device, 1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void drbd_print_uuids(struct drbd_device *device, const char *text)
|
||||||
|
{
|
||||||
|
if (get_ldev_if_state(device, D_NEGOTIATING)) {
|
||||||
|
@@ -3466,8 +3522,8 @@ void drbd_uuid_move_history(struct drbd_device *device) __must_hold(local)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- for (i = UI_HISTORY_START; i < UI_HISTORY_END; i++)
|
||||||
|
- device->ldev->md.uuid[i+1] = device->ldev->md.uuid[i];
|
||||||
|
+ for (i = UI_HISTORY_END; i > UI_HISTORY_START; i--)
|
||||||
|
+ device->ldev->md.uuid[i] = device->ldev->md.uuid[i-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void __drbd_uuid_set(struct drbd_device *device, int idx, u64 val) __must_hold(local)
|
||||||
|
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||||
|
index bb7e1b0..dc2bfec 100644
|
||||||
|
--- a/drbd/drbd_nl.c
|
||||||
|
+++ b/drbd/drbd_nl.c
|
||||||
|
@@ -4015,8 +4015,11 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
struct drbd_config_context adm_ctx;
|
||||||
|
struct drbd_device *device;
|
||||||
|
+ struct drbd_peer_device *peer_device = NULL;
|
||||||
|
enum drbd_ret_code retcode;
|
||||||
|
int skip_initial_sync = 0;
|
||||||
|
+ int zeroout_devices = 0;
|
||||||
|
+ int discard_devices = 0;
|
||||||
|
int err;
|
||||||
|
struct new_c_uuid_parms args;
|
||||||
|
|
||||||
|
@@ -4045,12 +4048,28 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ peer_device = first_peer_device(device);
|
||||||
|
+
|
||||||
|
/* this is "skip initial sync", assume to be clean */
|
||||||
|
if (device->state.conn == C_CONNECTED &&
|
||||||
|
- first_peer_device(device)->connection->agreed_pro_version >= 90 &&
|
||||||
|
+ peer_device->connection->agreed_pro_version >= 90 &&
|
||||||
|
device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && args.clear_bm) {
|
||||||
|
drbd_info(device, "Preparing to skip initial sync\n");
|
||||||
|
skip_initial_sync = 1;
|
||||||
|
+ /* this is "zero out/discard" devices to make it all zero.
|
||||||
|
+ * ignore "zero out" if both "clear_bm" and "zeroout_devices/discard_devices" set. */
|
||||||
|
+ } else if (device->state.conn == C_CONNECTED &&
|
||||||
|
+ peer_device->connection->agreed_features & FF_DISCARD &&
|
||||||
|
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
||||||
|
+ args.zeroout_devices) {
|
||||||
|
+ drbd_info(device, "Preparing to zero out devices, will take a long time\n");
|
||||||
|
+ zeroout_devices = 1;
|
||||||
|
+ } else if (device->state.conn == C_CONNECTED &&
|
||||||
|
+ peer_device->connection->agreed_features & FF_DISCARD &&
|
||||||
|
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
||||||
|
+ args.discard_devices) {
|
||||||
|
+ drbd_info(device, "Preparing to discard devices, will take a long time\n");
|
||||||
|
+ discard_devices = 1;
|
||||||
|
} else if (device->state.conn != C_STANDALONE) {
|
||||||
|
retcode = ERR_CONNECTED;
|
||||||
|
goto out_dec;
|
||||||
|
@@ -4059,7 +4078,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
drbd_uuid_set(device, UI_BITMAP, 0); /* Rotate UI_BITMAP to History 1, etc... */
|
||||||
|
drbd_uuid_new_current(device); /* New current, previous to UI_BITMAP */
|
||||||
|
|
||||||
|
- if (args.clear_bm) {
|
||||||
|
+ if (args.clear_bm || args.zeroout_devices || args.discard_devices) {
|
||||||
|
err = drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
||||||
|
"clear_n_write from new_c_uuid", BM_LOCKED_MASK);
|
||||||
|
if (err) {
|
||||||
|
@@ -4067,7 +4086,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
retcode = ERR_IO_MD_DISK;
|
||||||
|
}
|
||||||
|
if (skip_initial_sync) {
|
||||||
|
- drbd_send_uuids_skip_initial_sync(first_peer_device(device));
|
||||||
|
+ drbd_send_uuids_skip_initial_sync(peer_device);
|
||||||
|
_drbd_uuid_set(device, UI_BITMAP, 0);
|
||||||
|
drbd_print_uuids(device, "cleared bitmap UUID");
|
||||||
|
spin_lock_irq(&device->resource->req_lock);
|
||||||
|
@@ -4075,6 +4094,22 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
CS_VERBOSE, NULL);
|
||||||
|
spin_unlock_irq(&device->resource->req_lock);
|
||||||
|
}
|
||||||
|
+ if (zeroout_devices || discard_devices) {
|
||||||
|
+ if (discard_devices) {
|
||||||
|
+ drbd_send_discard_start(peer_device);
|
||||||
|
+ set_bit(DISCARD_DISK, &device->flags);
|
||||||
|
+ } else {
|
||||||
|
+ drbd_send_zeroout_start(peer_device);
|
||||||
|
+ clear_bit(DISCARD_DISK, &device->flags);
|
||||||
|
+ }
|
||||||
|
+ _drbd_uuid_set(device, UI_BITMAP, 0);
|
||||||
|
+ drbd_print_uuids(device, "cleared bitmap UUID for zeroing device");
|
||||||
|
+
|
||||||
|
+ /* CLear bit flag of zero out */
|
||||||
|
+ clear_bit(ZERO_DONE, &device->flags);
|
||||||
|
+ clear_bit(ZERO_FAIL, &device->flags);
|
||||||
|
+ drbd_device_post_work(device, P_ZERO_START);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
drbd_md_sync(device);
|
||||||
|
diff --git a/drbd/drbd_protocol.h b/drbd/drbd_protocol.h
|
||||||
|
index 405b181..d9db0ce 100644
|
||||||
|
--- a/drbd/drbd_protocol.h
|
||||||
|
+++ b/drbd/drbd_protocol.h
|
||||||
|
@@ -59,6 +59,7 @@ enum drbd_packet {
|
||||||
|
/* REQ_DISCARD. We used "discard" in different contexts before,
|
||||||
|
* which is why I chose TRIM here, to disambiguate. */
|
||||||
|
P_TRIM = 0x31,
|
||||||
|
+ P_ZERO_OUT = 0x32,
|
||||||
|
|
||||||
|
P_MAY_IGNORE = 0x100, /* Flag to test if (cmd > P_MAY_IGNORE) ... */
|
||||||
|
P_MAX_OPT_CMD = 0x101,
|
||||||
|
@@ -161,6 +162,7 @@ struct p_block_req {
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FF_TRIM 1
|
||||||
|
+#define FF_DISCARD 4
|
||||||
|
|
||||||
|
struct p_connection_features {
|
||||||
|
u32 protocol_min;
|
||||||
|
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||||
|
index 06e5667..ec324ef 100644
|
||||||
|
--- a/drbd/drbd_receiver.c
|
||||||
|
+++ b/drbd/drbd_receiver.c
|
||||||
|
@@ -47,7 +47,7 @@
|
||||||
|
#include "drbd_vli.h"
|
||||||
|
#include <linux/scatterlist.h>
|
||||||
|
|
||||||
|
-#define PRO_FEATURES (FF_TRIM)
|
||||||
|
+#define PRO_FEATURES (FF_TRIM | FF_DISCARD)
|
||||||
|
|
||||||
|
struct flush_work {
|
||||||
|
struct drbd_work w;
|
||||||
|
@@ -4317,6 +4317,20 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
||||||
|
peer_device->connection->agreed_pro_version >= 90 &&
|
||||||
|
device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
||||||
|
(p_uuid[UI_FLAGS] & 8);
|
||||||
|
+ int zeroout_devices =
|
||||||
|
+ device->state.conn == C_CONNECTED &&
|
||||||
|
+ peer_device->connection->agreed_pro_version >= 90 &&
|
||||||
|
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
||||||
|
+ (p_uuid[UI_FLAGS] & 16);
|
||||||
|
+ int discard_devices =
|
||||||
|
+ device->state.conn == C_CONNECTED &&
|
||||||
|
+ peer_device->connection->agreed_pro_version >= 90 &&
|
||||||
|
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
||||||
|
+ (p_uuid[UI_FLAGS] & 32);
|
||||||
|
+ int zeroout_finish =
|
||||||
|
+ device->state.conn == C_CONNECTED &&
|
||||||
|
+ peer_device->connection->agreed_pro_version >= 90 &&
|
||||||
|
+ (p_uuid[UI_FLAGS] & 64);
|
||||||
|
if (skip_initial_sync) {
|
||||||
|
drbd_info(device, "Accepted new current UUID, preparing to skip initial sync\n");
|
||||||
|
drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
||||||
|
@@ -4324,11 +4338,42 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
||||||
|
BM_LOCKED_TEST_ALLOWED);
|
||||||
|
_drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]);
|
||||||
|
_drbd_uuid_set(device, UI_BITMAP, 0);
|
||||||
|
+ spin_lock_irq(&device->resource->req_lock);
|
||||||
|
_drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE),
|
||||||
|
CS_VERBOSE, NULL);
|
||||||
|
+ spin_unlock_irq(&device->resource->req_lock);
|
||||||
|
drbd_md_sync(device);
|
||||||
|
updated_uuids = 1;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (zeroout_devices || discard_devices) {
|
||||||
|
+ if (discard_devices) {
|
||||||
|
+ drbd_info(device, "Accepted to discard devices, will take a long time\n");
|
||||||
|
+ set_bit(DISCARD_DISK, &device->flags);
|
||||||
|
+ } else {
|
||||||
|
+ drbd_info(device, "Accepted to zeroout devices, will take a long time\n");
|
||||||
|
+ clear_bit(DISCARD_DISK, &device->flags);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
||||||
|
+ "clear_n_write from receive_uuids",
|
||||||
|
+ BM_LOCKED_TEST_ALLOWED);
|
||||||
|
+ _drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]);
|
||||||
|
+ _drbd_uuid_set(device, UI_BITMAP, 0);
|
||||||
|
+ drbd_print_uuids(device, "cleared bitmap UUID for zeroing device");
|
||||||
|
+
|
||||||
|
+ drbd_device_post_work(device, S_ZERO_START);
|
||||||
|
+ updated_uuids = 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (zeroout_finish) {
|
||||||
|
+ drbd_info(device, "Both side finished zero out devices.\n");
|
||||||
|
+ spin_lock_irq(&device->resource->req_lock);
|
||||||
|
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE),
|
||||||
|
+ CS_VERBOSE, NULL);
|
||||||
|
+ spin_unlock_irq(&device->resource->req_lock);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
put_ldev(device);
|
||||||
|
} else if (device->state.disk < D_INCONSISTENT &&
|
||||||
|
device->state.role == R_PRIMARY) {
|
||||||
|
@@ -4383,6 +4428,41 @@ static union drbd_state convert_state(union drbd_state ps)
|
||||||
|
return ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int receive_zeroout_state(struct drbd_connection *connection, struct packet_info *pi)
|
||||||
|
+{
|
||||||
|
+ struct drbd_peer_device *peer_device;
|
||||||
|
+ struct drbd_device *device;
|
||||||
|
+ struct p_state *p = pi->data;
|
||||||
|
+ unsigned int isfail;
|
||||||
|
+
|
||||||
|
+ peer_device = conn_peer_device(connection, pi->vnr);
|
||||||
|
+ if (!peer_device)
|
||||||
|
+ return -EIO;
|
||||||
|
+ device = peer_device->device;
|
||||||
|
+
|
||||||
|
+ isfail = be32_to_cpu(p->state);
|
||||||
|
+
|
||||||
|
+ if (isfail) {
|
||||||
|
+ drbd_info(device, "Failed to zero out peer device\n");
|
||||||
|
+ set_bit(ZERO_FAIL, &device->flags);
|
||||||
|
+ } else {
|
||||||
|
+ drbd_info(device, "Finished zero out peer device\n");
|
||||||
|
+ if (test_and_clear_bit(ZERO_DONE, &device->flags)) {
|
||||||
|
+ drbd_info(device, "Both side finished zeroing.\n");
|
||||||
|
+ spin_lock_irq(&device->resource->req_lock);
|
||||||
|
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE,
|
||||||
|
+ pdsk, D_UP_TO_DATE), CS_VERBOSE, NULL);
|
||||||
|
+ spin_unlock_irq(&device->resource->req_lock);
|
||||||
|
+ drbd_send_zeroout_finish(peer_device);
|
||||||
|
+ } else {
|
||||||
|
+ /* waiting for local device finished */
|
||||||
|
+ set_bit(ZERO_DONE, &device->flags);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int receive_req_state(struct drbd_connection *connection, struct packet_info *pi)
|
||||||
|
{
|
||||||
|
struct drbd_peer_device *peer_device;
|
||||||
|
@@ -5008,6 +5088,7 @@ static struct data_cmd drbd_cmd_handler[] = {
|
||||||
|
[P_CONN_ST_CHG_REQ] = { 0, sizeof(struct p_req_state), receive_req_conn_state },
|
||||||
|
[P_PROTOCOL_UPDATE] = { 1, sizeof(struct p_protocol), receive_protocol },
|
||||||
|
[P_TRIM] = { 0, sizeof(struct p_trim), receive_Data },
|
||||||
|
+ [P_ZERO_OUT] = { 0, sizeof(struct p_state), receive_zeroout_state },
|
||||||
|
};
|
||||||
|
|
||||||
|
static void drbdd(struct drbd_connection *connection)
|
||||||
|
@@ -5287,6 +5368,9 @@ static int drbd_do_features(struct drbd_connection *connection)
|
||||||
|
drbd_info(connection, "Agreed to%ssupport TRIM on protocol level\n",
|
||||||
|
connection->agreed_features & FF_TRIM ? " " : " not ");
|
||||||
|
|
||||||
|
+ drbd_info(connection, "Agreed to%ssupport DISCARD DEVICE on protocol level\n",
|
||||||
|
+ connection->agreed_features & FF_DISCARD ? " " : " not ");
|
||||||
|
+
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
incompat:
|
||||||
|
diff --git a/drbd/drbd_worker.c b/drbd/drbd_worker.c
|
||||||
|
index 2a15aeb..a8e231f 100644
|
||||||
|
--- a/drbd/drbd_worker.c
|
||||||
|
+++ b/drbd/drbd_worker.c
|
||||||
|
@@ -1653,6 +1653,105 @@ void drbd_rs_controller_reset(struct drbd_device *device)
|
||||||
|
rcu_read_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * zeroout_local_device()
|
||||||
|
+ * @device: DRBD device.
|
||||||
|
+ * @discard: whether to discard the block range.
|
||||||
|
+ *
|
||||||
|
+ * Description:
|
||||||
|
+ * Zero out drbd backing device when creating new uuid.
|
||||||
|
+ *
|
||||||
|
+**/
|
||||||
|
+int zeroout_local_device(struct drbd_device *device, bool discard)
|
||||||
|
+{
|
||||||
|
+ struct block_device *bdev;
|
||||||
|
+
|
||||||
|
+ bdev = device->ldev->backing_bdev;
|
||||||
|
+ if (device->ldev->known_size != drbd_get_capacity(bdev))
|
||||||
|
+ device->ldev->known_size = drbd_get_capacity(bdev);
|
||||||
|
+
|
||||||
|
+ if (discard){
|
||||||
|
+ /* zero out the backing device by discarding blocks */
|
||||||
|
+ return blkdev_issue_zeroout(bdev, 0,
|
||||||
|
+ device->ldev->known_size, GFP_NOIO, true);
|
||||||
|
+ } else {
|
||||||
|
+ /* zero out the backing device with WRITE call*/
|
||||||
|
+ return blkdev_issue_zeroout(bdev, 0,
|
||||||
|
+ device->ldev->known_size, GFP_NOIO, false);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * require_zeroout_local_device()
|
||||||
|
+ * @device: DRBD device.
|
||||||
|
+ *
|
||||||
|
+ * Description:
|
||||||
|
+ * Start to zero out local device. Update
|
||||||
|
+ * status if peer node (secondary) finished
|
||||||
|
+ * zeroing.
|
||||||
|
+ *
|
||||||
|
+**/
|
||||||
|
+void require_zeroout_local_device(struct drbd_device *device)
|
||||||
|
+{
|
||||||
|
+ int zeroout_err = 0;
|
||||||
|
+
|
||||||
|
+ if (test_and_clear_bit(DISCARD_DISK, &device->flags)) {
|
||||||
|
+ zeroout_err = zeroout_local_device(device, true);
|
||||||
|
+ } else {
|
||||||
|
+ zeroout_err = zeroout_local_device(device, false);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (zeroout_err) {
|
||||||
|
+ drbd_err(device, "Failed to zero out local device\n");
|
||||||
|
+ set_bit(ZERO_FAIL, &device->flags);
|
||||||
|
+ drbd_chk_io_error(device, 1, DRBD_WRITE_ERROR);
|
||||||
|
+ } else {
|
||||||
|
+ drbd_info(device, "Finished zero out local device.\n");
|
||||||
|
+
|
||||||
|
+ if (test_and_clear_bit(ZERO_DONE, &device->flags)) {
|
||||||
|
+ spin_lock_irq(&device->resource->req_lock);
|
||||||
|
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE,
|
||||||
|
+ pdsk, D_UP_TO_DATE), CS_VERBOSE, NULL);
|
||||||
|
+ spin_unlock_irq(&device->resource->req_lock);
|
||||||
|
+ drbd_send_zeroout_finish(first_peer_device(device));
|
||||||
|
+ } else if (test_and_clear_bit(ZERO_FAIL, &device->flags)) {
|
||||||
|
+ drbd_info(device, "Peer device has already failed on zero out\n");
|
||||||
|
+ } else {
|
||||||
|
+ /* waiting for peer device finished */
|
||||||
|
+ set_bit(ZERO_DONE, &device->flags);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * receive_zeroout_local_device()
|
||||||
|
+ * @device: DRBD device.
|
||||||
|
+ *
|
||||||
|
+ * Description:
|
||||||
|
+ * Start to zero out local device.
|
||||||
|
+ * Notify peer node the zeroing result.
|
||||||
|
+ *
|
||||||
|
+**/
|
||||||
|
+void receive_zeroout_local_device(struct drbd_device *device)
|
||||||
|
+{
|
||||||
|
+ int zeroout_err = 0;
|
||||||
|
+ struct drbd_peer_device *const peer_device = first_peer_device(device);
|
||||||
|
+
|
||||||
|
+ if (test_and_clear_bit(DISCARD_DISK, &device->flags)) {
|
||||||
|
+ zeroout_err = zeroout_local_device(device, true);
|
||||||
|
+ } else {
|
||||||
|
+ zeroout_err = zeroout_local_device(device, false);
|
||||||
|
+ }
|
||||||
|
+ if (zeroout_err) {
|
||||||
|
+ drbd_err(device, "Failed to zero out local device\n");
|
||||||
|
+ drbd_send_zeroout_fail(peer_device);
|
||||||
|
+ drbd_chk_io_error(device, 1, DRBD_WRITE_ERROR);
|
||||||
|
+ } else {
|
||||||
|
+ drbd_info(device, "Finished zero out local device.\n");
|
||||||
|
+ drbd_send_zeroout_ok(peer_device);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void start_resync_timer_fn(unsigned long data)
|
||||||
|
{
|
||||||
|
struct drbd_device *device = (struct drbd_device *) data;
|
||||||
|
@@ -1986,6 +2085,10 @@ static void do_device_work(struct drbd_device *device, const unsigned long todo)
|
||||||
|
drbd_ldev_destroy(device);
|
||||||
|
if (test_bit(RS_START, &todo))
|
||||||
|
do_start_resync(device);
|
||||||
|
+ if (test_bit(P_ZERO_START, &todo))
|
||||||
|
+ require_zeroout_local_device(device);
|
||||||
|
+ if (test_bit(S_ZERO_START, &todo))
|
||||||
|
+ receive_zeroout_local_device(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DRBD_DEVICE_WORK_MASK \
|
||||||
|
@@ -1995,6 +2098,8 @@ static void do_device_work(struct drbd_device *device, const unsigned long todo)
|
||||||
|
|(1UL << RS_START) \
|
||||||
|
|(1UL << RS_PROGRESS) \
|
||||||
|
|(1UL << RS_DONE) \
|
||||||
|
+ |(1UL << P_ZERO_START) \
|
||||||
|
+ |(1UL << S_ZERO_START) \
|
||||||
|
)
|
||||||
|
|
||||||
|
static unsigned long get_work_bits(unsigned long *flags)
|
||||||
|
diff --git a/drbd/linux/drbd_genl.h b/drbd/linux/drbd_genl.h
|
||||||
|
index 5db53f5..5a31a5c 100644
|
||||||
|
--- a/drbd/linux/drbd_genl.h
|
||||||
|
+++ b/drbd/linux/drbd_genl.h
|
||||||
|
@@ -240,6 +240,8 @@ GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms,
|
||||||
|
|
||||||
|
GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms,
|
||||||
|
__flg_field(1, DRBD_GENLA_F_MANDATORY, clear_bm)
|
||||||
|
+ __flg_field(2, 0, zeroout_devices)
|
||||||
|
+ __flg_field(3, 0, discard_devices)
|
||||||
|
)
|
||||||
|
|
||||||
|
GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms,
|
||||||
|
--
|
||||||
|
2.1.4
|
||||||
|
|
@ -1,61 +0,0 @@
|
|||||||
From 84ae2314faeff2a9e06a66bc9a79520eadcbf305 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 17:28:18 +0800
|
|
||||||
Subject: [Patch v2 02/10] drbd: Add option zap_devices to new-current-uuid
|
|
||||||
|
|
||||||
Using zeroing out device instead of initial
|
|
||||||
full sync of device. Can be useful in high
|
|
||||||
latency network environment.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_nl.c | 9 +++++++++
|
|
||||||
drbd/linux/drbd_genl.h | 1 +
|
|
||||||
2 files changed, 10 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
|
||||||
index 691b615..1d17663 100644
|
|
||||||
--- a/drbd/drbd_nl.c
|
|
||||||
+++ b/drbd/drbd_nl.c
|
|
||||||
@@ -4017,6 +4017,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
|
||||||
struct drbd_device *device;
|
|
||||||
enum drbd_ret_code retcode;
|
|
||||||
int skip_initial_sync = 0;
|
|
||||||
+ int zero_out_devices = 0;
|
|
||||||
int err;
|
|
||||||
struct new_c_uuid_parms args;
|
|
||||||
|
|
||||||
@@ -4051,6 +4052,14 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
|
||||||
device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && args.clear_bm) {
|
|
||||||
drbd_info(device, "Preparing to skip initial sync\n");
|
|
||||||
skip_initial_sync = 1;
|
|
||||||
+ /* this is "zero out" devices to make it all zero.
|
|
||||||
+ * ignore "zero out" if both "clear_bm" and "zap_devices" set. */
|
|
||||||
+ } else if (device->state.conn == C_CONNECTED &&
|
|
||||||
+ first_peer_device(device)->connection->agreed_pro_version >= 90 &&
|
|
||||||
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
|
||||||
+ args.zap_devices) {
|
|
||||||
+ drbd_info(device, "Preparing to zero out devices, will take a long time\n");
|
|
||||||
+ zero_out_devices = 1;
|
|
||||||
} else if (device->state.conn != C_STANDALONE) {
|
|
||||||
retcode = ERR_CONNECTED;
|
|
||||||
goto out_dec;
|
|
||||||
diff --git a/drbd/linux/drbd_genl.h b/drbd/linux/drbd_genl.h
|
|
||||||
index 5db53f5..eef8d8c 100644
|
|
||||||
--- a/drbd/linux/drbd_genl.h
|
|
||||||
+++ b/drbd/linux/drbd_genl.h
|
|
||||||
@@ -240,6 +240,7 @@ GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms,
|
|
||||||
|
|
||||||
GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms,
|
|
||||||
__flg_field(1, DRBD_GENLA_F_MANDATORY, clear_bm)
|
|
||||||
+ __flg_field(2, DRBD_GENLA_F_MANDATORY, zap_devices)
|
|
||||||
)
|
|
||||||
|
|
||||||
GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms,
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
From 94d1f879305b472aff6009ba4c4f08b9d70f1cf1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 17:34:46 +0800
|
|
||||||
Subject: [Patch v2 03/10] drbd: A function to zero out drbd backing device
|
|
||||||
|
|
||||||
The function can be used to zero out the whole
|
|
||||||
backing device.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_int.h | 1 +
|
|
||||||
drbd/drbd_worker.c | 21 +++++++++++++++++++++
|
|
||||||
2 files changed, 22 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
|
||||||
index a234228..9ecf971 100644
|
|
||||||
--- a/drbd/drbd_int.h
|
|
||||||
+++ b/drbd/drbd_int.h
|
|
||||||
@@ -1662,6 +1662,7 @@ extern void drbd_send_acks_wf(struct work_struct *ws);
|
|
||||||
extern bool drbd_rs_c_min_rate_throttle(struct drbd_device *device);
|
|
||||||
extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector,
|
|
||||||
bool throttle_if_app_is_waiting);
|
|
||||||
+extern int zero_out_local_device(struct drbd_device *device);
|
|
||||||
extern int drbd_submit_peer_request(struct drbd_device *,
|
|
||||||
struct drbd_peer_request *, const unsigned,
|
|
||||||
const int);
|
|
||||||
diff --git a/drbd/drbd_worker.c b/drbd/drbd_worker.c
|
|
||||||
index 2a15aeb..50564f5 100644
|
|
||||||
--- a/drbd/drbd_worker.c
|
|
||||||
+++ b/drbd/drbd_worker.c
|
|
||||||
@@ -1653,6 +1653,27 @@ void drbd_rs_controller_reset(struct drbd_device *device)
|
|
||||||
rcu_read_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * zero_out_local_device()
|
|
||||||
+ * @device: DRBD device.
|
|
||||||
+ *
|
|
||||||
+ * Description:
|
|
||||||
+ * Zero out drbd backing device when creating new uuid.
|
|
||||||
+ *
|
|
||||||
+**/
|
|
||||||
+int zero_out_local_device(struct drbd_device *device)
|
|
||||||
+{
|
|
||||||
+ struct block_device *bdev;
|
|
||||||
+
|
|
||||||
+ bdev = device->ldev->backing_bdev;
|
|
||||||
+ if (device->ldev->known_size != drbd_get_capacity(bdev))
|
|
||||||
+ device->ldev->known_size = drbd_get_capacity(bdev);
|
|
||||||
+
|
|
||||||
+ /* zero out the backing device */
|
|
||||||
+ return blkdev_issue_zeroout(bdev, 0,
|
|
||||||
+ device->ldev->known_size, GFP_NOIO, false);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void start_resync_timer_fn(unsigned long data)
|
|
||||||
{
|
|
||||||
struct drbd_device *device = (struct drbd_device *) data;
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
|||||||
From c6085cdb8f55facfae4468548f258117e63134d4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 17:59:12 +0800
|
|
||||||
Subject: [Patch v2 04/10] drbd: New packet P_ZERO_OUT
|
|
||||||
|
|
||||||
Using packet P_ZERO_OUT to get peer node's result
|
|
||||||
of zeroing out.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_int.h | 5 +++++
|
|
||||||
drbd/drbd_main.c | 28 ++++++++++++++++++++++++++++
|
|
||||||
drbd/drbd_protocol.h | 1 +
|
|
||||||
3 files changed, 34 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
|
||||||
index 9ecf971..014b65e 100644
|
|
||||||
--- a/drbd/drbd_int.h
|
|
||||||
+++ b/drbd/drbd_int.h
|
|
||||||
@@ -622,6 +622,9 @@ enum {
|
|
||||||
RS_START, /* tell worker to start resync/OV */
|
|
||||||
RS_PROGRESS, /* tell worker that resync made significant progress */
|
|
||||||
RS_DONE, /* tell worker that resync is done */
|
|
||||||
+ /* used for zero out device */
|
|
||||||
+ ZERO_DONE, /* succeed on zero out a device */
|
|
||||||
+ ZERO_FAIL, /* fail to zero out a device */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct drbd_bitmap; /* opaque for drbd_device */
|
|
||||||
@@ -1205,6 +1208,8 @@ extern int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_pa
|
|
||||||
extern int drbd_send_protocol(struct drbd_connection *connection);
|
|
||||||
extern int drbd_send_uuids(struct drbd_peer_device *);
|
|
||||||
extern int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *);
|
|
||||||
+extern int drbd_send_zero_out_ok(struct drbd_peer_device *);
|
|
||||||
+extern int drbd_send_zero_out_fail(struct drbd_peer_device *);
|
|
||||||
extern void drbd_gen_and_send_sync_uuid(struct drbd_peer_device *);
|
|
||||||
extern int drbd_send_sizes(struct drbd_peer_device *peer_device, int trigger_reply, enum dds_flags flags);
|
|
||||||
extern int drbd_send_state(struct drbd_peer_device *, union drbd_state);
|
|
||||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
|
||||||
index a3dc39e..740015e 100644
|
|
||||||
--- a/drbd/drbd_main.c
|
|
||||||
+++ b/drbd/drbd_main.c
|
|
||||||
@@ -908,6 +908,34 @@ int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *peer_device)
|
|
||||||
return _drbd_send_uuids(peer_device, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * _drbd_send_zero_out_state() - Sends the drbd state to the peer
|
|
||||||
+ * @peer_device: DRBD peer device.
|
|
||||||
+ * @state: Device zero out status.
|
|
||||||
+ */
|
|
||||||
+static int _drbd_send_zero_out_state(struct drbd_peer_device *peer_device, unsigned int status)
|
|
||||||
+{
|
|
||||||
+ struct drbd_socket *sock;
|
|
||||||
+ struct p_state *p;
|
|
||||||
+
|
|
||||||
+ sock = &peer_device->connection->data;
|
|
||||||
+ p = drbd_prepare_command(peer_device, sock);
|
|
||||||
+ if (!p)
|
|
||||||
+ return -EIO;
|
|
||||||
+ p->state = cpu_to_be32(status);
|
|
||||||
+ return drbd_send_command(peer_device, sock, P_ZERO_OUT, sizeof(*p), NULL, 0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int drbd_send_zero_out_ok(struct drbd_peer_device *peer_device)
|
|
||||||
+{
|
|
||||||
+ return _drbd_send_zero_out_state(peer_device, 0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int drbd_send_zero_out_fail(struct drbd_peer_device *peer_device)
|
|
||||||
+{
|
|
||||||
+ return _drbd_send_zero_out_state(peer_device, 1);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void drbd_print_uuids(struct drbd_device *device, const char *text)
|
|
||||||
{
|
|
||||||
if (get_ldev_if_state(device, D_NEGOTIATING)) {
|
|
||||||
diff --git a/drbd/drbd_protocol.h b/drbd/drbd_protocol.h
|
|
||||||
index 405b181..3a82442 100644
|
|
||||||
--- a/drbd/drbd_protocol.h
|
|
||||||
+++ b/drbd/drbd_protocol.h
|
|
||||||
@@ -59,6 +59,7 @@ enum drbd_packet {
|
|
||||||
/* REQ_DISCARD. We used "discard" in different contexts before,
|
|
||||||
* which is why I chose TRIM here, to disambiguate. */
|
|
||||||
P_TRIM = 0x31,
|
|
||||||
+ P_ZERO_OUT = 0x32,
|
|
||||||
|
|
||||||
P_MAY_IGNORE = 0x100, /* Flag to test if (cmd > P_MAY_IGNORE) ... */
|
|
||||||
P_MAX_OPT_CMD = 0x101,
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
From b831a988370d6b6e2c989c40736155d529be3273 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:15:07 +0800
|
|
||||||
Subject: [Patch v2 05/10] drbd: Functions to notify peer node to zero out
|
|
||||||
|
|
||||||
Notify peer node to start zeroing out device.
|
|
||||||
Update state of peer node when both nodes are
|
|
||||||
finished zeroing.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_int.h | 2 ++
|
|
||||||
drbd/drbd_main.c | 19 +++++++++++++++++++
|
|
||||||
2 files changed, 21 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
|
||||||
index 014b65e..f43f957 100644
|
|
||||||
--- a/drbd/drbd_int.h
|
|
||||||
+++ b/drbd/drbd_int.h
|
|
||||||
@@ -1208,6 +1208,8 @@ extern int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_pa
|
|
||||||
extern int drbd_send_protocol(struct drbd_connection *connection);
|
|
||||||
extern int drbd_send_uuids(struct drbd_peer_device *);
|
|
||||||
extern int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *);
|
|
||||||
+extern int drbd_send_zero_out_start(struct drbd_peer_device *);
|
|
||||||
+extern int drbd_send_zero_out_finish(struct drbd_peer_device *);
|
|
||||||
extern int drbd_send_zero_out_ok(struct drbd_peer_device *);
|
|
||||||
extern int drbd_send_zero_out_fail(struct drbd_peer_device *);
|
|
||||||
extern void drbd_gen_and_send_sync_uuid(struct drbd_peer_device *);
|
|
||||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
|
||||||
index 740015e..2b821cd 100644
|
|
||||||
--- a/drbd/drbd_main.c
|
|
||||||
+++ b/drbd/drbd_main.c
|
|
||||||
@@ -908,6 +908,25 @@ int drbd_send_uuids_skip_initial_sync(struct drbd_peer_device *peer_device)
|
|
||||||
return _drbd_send_uuids(peer_device, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * drbd_send_zero_out_start() - Notify peer node to start zero out
|
|
||||||
+ * @peer_device: DRBD peer device.
|
|
||||||
+ */
|
|
||||||
+int drbd_send_zero_out_start(struct drbd_peer_device *peer_device)
|
|
||||||
+{
|
|
||||||
+ return _drbd_send_uuids(peer_device, 16);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * drbd_send_zero_out_finish() - Notify both node finished zeroing out
|
|
||||||
+ * @peer_device: DRBD peer device.
|
|
||||||
+ */
|
|
||||||
+int drbd_send_zero_out_finish(struct drbd_peer_device *peer_device)
|
|
||||||
+{
|
|
||||||
+ return _drbd_send_uuids(peer_device, 32);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* _drbd_send_zero_out_state() - Sends the drbd state to the peer
|
|
||||||
* @peer_device: DRBD peer device.
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
|||||||
From 8bef1ececca3cf22c35f3e9ef95e72c0fd8125a9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:22:25 +0800
|
|
||||||
Subject: [Patch v2 06/10] drbd: Wapper for zeroing out device by worker
|
|
||||||
|
|
||||||
Wapper functions for drbd_device_post_work to start
|
|
||||||
zeroing out device. Change state when both node
|
|
||||||
finish zeroing.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_int.h | 2 ++
|
|
||||||
drbd/drbd_worker.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 65 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
|
||||||
index f43f957..dd680a9 100644
|
|
||||||
--- a/drbd/drbd_int.h
|
|
||||||
+++ b/drbd/drbd_int.h
|
|
||||||
@@ -1670,6 +1670,8 @@ extern bool drbd_rs_c_min_rate_throttle(struct drbd_device *device);
|
|
||||||
extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector,
|
|
||||||
bool throttle_if_app_is_waiting);
|
|
||||||
extern int zero_out_local_device(struct drbd_device *device);
|
|
||||||
+extern void require_zero_out_local_device(struct drbd_device *device);
|
|
||||||
+extern void receive_zero_out_local_device(struct drbd_device *device);
|
|
||||||
extern int drbd_submit_peer_request(struct drbd_device *,
|
|
||||||
struct drbd_peer_request *, const unsigned,
|
|
||||||
const int);
|
|
||||||
diff --git a/drbd/drbd_worker.c b/drbd/drbd_worker.c
|
|
||||||
index 50564f5..293aa27 100644
|
|
||||||
--- a/drbd/drbd_worker.c
|
|
||||||
+++ b/drbd/drbd_worker.c
|
|
||||||
@@ -1674,6 +1674,69 @@ int zero_out_local_device(struct drbd_device *device)
|
|
||||||
device->ldev->known_size, GFP_NOIO, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * require_zero_out_local_device()
|
|
||||||
+ * @device: DRBD device.
|
|
||||||
+ *
|
|
||||||
+ * Description:
|
|
||||||
+ * Start to zero out local device. Update
|
|
||||||
+ * status if peer node (secondary) finished
|
|
||||||
+ * zeroing.
|
|
||||||
+ *
|
|
||||||
+**/
|
|
||||||
+void require_zero_out_local_device(struct drbd_device *device)
|
|
||||||
+{
|
|
||||||
+ int zero_out_err = 0;
|
|
||||||
+
|
|
||||||
+ zero_out_err = zero_out_local_device(device);
|
|
||||||
+
|
|
||||||
+ if (zero_out_err) {
|
|
||||||
+ drbd_err(device, "Failed to zero out local device\n");
|
|
||||||
+ set_bit(ZERO_FAIL, &device->flags);
|
|
||||||
+ drbd_chk_io_error(device, 1, DRBD_WRITE_ERROR);
|
|
||||||
+ } else {
|
|
||||||
+ drbd_info(device, "Finished zero out local device.\n");
|
|
||||||
+
|
|
||||||
+ if (test_and_clear_bit(ZERO_DONE, &device->flags)) {
|
|
||||||
+ spin_lock_irq(&device->resource->req_lock);
|
|
||||||
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE,
|
|
||||||
+ pdsk, D_UP_TO_DATE), CS_VERBOSE, NULL);
|
|
||||||
+ spin_unlock_irq(&device->resource->req_lock);
|
|
||||||
+ drbd_send_zero_out_finish(first_peer_device(device));
|
|
||||||
+ } else if (test_and_clear_bit(ZERO_FAIL, &device->flags)) {
|
|
||||||
+ drbd_info(device, "Peer device has already failed on zero out\n");
|
|
||||||
+ } else {
|
|
||||||
+ /* waiting for peer device finished */
|
|
||||||
+ set_bit(ZERO_DONE, &device->flags);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * receive_zero_out_local_device()
|
|
||||||
+ * @device: DRBD device.
|
|
||||||
+ *
|
|
||||||
+ * Description:
|
|
||||||
+ * Start to zero out local device.
|
|
||||||
+ * Notify peer node the zeroing result.
|
|
||||||
+ *
|
|
||||||
+**/
|
|
||||||
+void receive_zero_out_local_device(struct drbd_device *device)
|
|
||||||
+{
|
|
||||||
+ int zero_out_err = 0;
|
|
||||||
+ struct drbd_peer_device *const peer_device = first_peer_device(device);
|
|
||||||
+
|
|
||||||
+ zero_out_err = zero_out_local_device(device);
|
|
||||||
+ if (zero_out_err) {
|
|
||||||
+ drbd_err(device, "Failed to zero out local device\n");
|
|
||||||
+ drbd_send_zero_out_fail(peer_device);
|
|
||||||
+ drbd_chk_io_error(device, 1, DRBD_WRITE_ERROR);
|
|
||||||
+ } else {
|
|
||||||
+ drbd_info(device, "Finished zero out local device.\n");
|
|
||||||
+ drbd_send_zero_out_ok(peer_device);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void start_resync_timer_fn(unsigned long data)
|
|
||||||
{
|
|
||||||
struct drbd_device *device = (struct drbd_device *) data;
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
From 88d3c5ee059952db304f5f3f82ca4c5e4a72a7a5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:25:19 +0800
|
|
||||||
Subject: [Patch v2 07/10] drbd: Flags for background drbd device work
|
|
||||||
|
|
||||||
Background drbd device work for zeroing out device.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_int.h | 3 +++
|
|
||||||
drbd/drbd_worker.c | 6 ++++++
|
|
||||||
2 files changed, 9 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
|
||||||
index dd680a9..287ffd7 100644
|
|
||||||
--- a/drbd/drbd_int.h
|
|
||||||
+++ b/drbd/drbd_int.h
|
|
||||||
@@ -622,6 +622,9 @@ enum {
|
|
||||||
RS_START, /* tell worker to start resync/OV */
|
|
||||||
RS_PROGRESS, /* tell worker that resync made significant progress */
|
|
||||||
RS_DONE, /* tell worker that resync is done */
|
|
||||||
+ P_ZERO_START, /* tell worker to zero out device */
|
|
||||||
+ S_ZERO_START, /* tell worker to zero out device as requested*/
|
|
||||||
+
|
|
||||||
/* used for zero out device */
|
|
||||||
ZERO_DONE, /* succeed on zero out a device */
|
|
||||||
ZERO_FAIL, /* fail to zero out a device */
|
|
||||||
diff --git a/drbd/drbd_worker.c b/drbd/drbd_worker.c
|
|
||||||
index 293aa27..23e82c1 100644
|
|
||||||
--- a/drbd/drbd_worker.c
|
|
||||||
+++ b/drbd/drbd_worker.c
|
|
||||||
@@ -2070,6 +2070,10 @@ static void do_device_work(struct drbd_device *device, const unsigned long todo)
|
|
||||||
drbd_ldev_destroy(device);
|
|
||||||
if (test_bit(RS_START, &todo))
|
|
||||||
do_start_resync(device);
|
|
||||||
+ if (test_bit(P_ZERO_START, &todo))
|
|
||||||
+ require_zero_out_local_device(device);
|
|
||||||
+ if (test_bit(S_ZERO_START, &todo))
|
|
||||||
+ receive_zero_out_local_device(device);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DRBD_DEVICE_WORK_MASK \
|
|
||||||
@@ -2079,6 +2083,8 @@ static void do_device_work(struct drbd_device *device, const unsigned long todo)
|
|
||||||
|(1UL << RS_START) \
|
|
||||||
|(1UL << RS_PROGRESS) \
|
|
||||||
|(1UL << RS_DONE) \
|
|
||||||
+ |(1UL << P_ZERO_START) \
|
|
||||||
+ |(1UL << S_ZERO_START) \
|
|
||||||
)
|
|
||||||
|
|
||||||
static unsigned long get_work_bits(unsigned long *flags)
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
From fb7da7037d9096bd34285425f85c4b4584e55701 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:29:25 +0800
|
|
||||||
Subject: [Patch v2 08/10] drbd: Function to work with packet P_ZERO_OUT
|
|
||||||
|
|
||||||
Using packet P_ZERO_OUT to update zero out
|
|
||||||
status of peer node.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_receiver.c | 36 ++++++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 36 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
|
||||||
index 5e6b149..6eae84f 100644
|
|
||||||
--- a/drbd/drbd_receiver.c
|
|
||||||
+++ b/drbd/drbd_receiver.c
|
|
||||||
@@ -4383,6 +4383,41 @@ static union drbd_state convert_state(union drbd_state ps)
|
|
||||||
return ms;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int receive_zero_out_state(struct drbd_connection *connection, struct packet_info *pi)
|
|
||||||
+{
|
|
||||||
+ struct drbd_peer_device *peer_device;
|
|
||||||
+ struct drbd_device *device;
|
|
||||||
+ struct p_state *p = pi->data;
|
|
||||||
+ unsigned int isfail;
|
|
||||||
+
|
|
||||||
+ peer_device = conn_peer_device(connection, pi->vnr);
|
|
||||||
+ if (!peer_device)
|
|
||||||
+ return -EIO;
|
|
||||||
+ device = peer_device->device;
|
|
||||||
+
|
|
||||||
+ isfail = be32_to_cpu(p->state);
|
|
||||||
+
|
|
||||||
+ if (isfail) {
|
|
||||||
+ drbd_info(device, "Failed to zero out peer device\n");
|
|
||||||
+ set_bit(ZERO_FAIL, &device->flags);
|
|
||||||
+ } else {
|
|
||||||
+ drbd_info(device, "Finished zero out peer device\n");
|
|
||||||
+ if (test_and_clear_bit(ZERO_DONE, &device->flags)) {
|
|
||||||
+ drbd_info(device, "Both side finished zeroing.\n");
|
|
||||||
+ spin_lock_irq(&device->resource->req_lock);
|
|
||||||
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE,
|
|
||||||
+ pdsk, D_UP_TO_DATE), CS_VERBOSE, NULL);
|
|
||||||
+ spin_unlock_irq(&device->resource->req_lock);
|
|
||||||
+ drbd_send_zero_out_finish(peer_device);
|
|
||||||
+ } else {
|
|
||||||
+ /* waiting for local device finished */
|
|
||||||
+ set_bit(ZERO_DONE, &device->flags);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int receive_req_state(struct drbd_connection *connection, struct packet_info *pi)
|
|
||||||
{
|
|
||||||
struct drbd_peer_device *peer_device;
|
|
||||||
@@ -5008,6 +5043,7 @@ static struct data_cmd drbd_cmd_handler[] = {
|
|
||||||
[P_CONN_ST_CHG_REQ] = { 0, sizeof(struct p_req_state), receive_req_conn_state },
|
|
||||||
[P_PROTOCOL_UPDATE] = { 1, sizeof(struct p_protocol), receive_protocol },
|
|
||||||
[P_TRIM] = { 0, sizeof(struct p_trim), receive_Data },
|
|
||||||
+ [P_ZERO_OUT] = { 0, sizeof(struct p_state), receive_zero_out_state },
|
|
||||||
};
|
|
||||||
|
|
||||||
static void drbdd(struct drbd_connection *connection)
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
From 8ef810075675a5453d81adb64f5d35b375cd0959 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:34:30 +0800
|
|
||||||
Subject: [Patch v2 09/10] drbd: Handle zero out command from peer node
|
|
||||||
|
|
||||||
Recevie P_UUID flag 16 for starting zero out device,
|
|
||||||
P_UUID flag 32 after both side finished zeroing,
|
|
||||||
Change state to uptodate.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_receiver.c | 33 +++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 33 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
|
||||||
index 6eae84f..4d6d99a 100644
|
|
||||||
--- a/drbd/drbd_receiver.c
|
|
||||||
+++ b/drbd/drbd_receiver.c
|
|
||||||
@@ -4317,6 +4317,15 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
|
||||||
peer_device->connection->agreed_pro_version >= 90 &&
|
|
||||||
device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
|
||||||
(p_uuid[UI_FLAGS] & 8);
|
|
||||||
+ int zero_out_devices =
|
|
||||||
+ device->state.conn == C_CONNECTED &&
|
|
||||||
+ peer_device->connection->agreed_pro_version >= 90 &&
|
|
||||||
+ device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED &&
|
|
||||||
+ (p_uuid[UI_FLAGS] & 16);
|
|
||||||
+ int zero_out_finish =
|
|
||||||
+ device->state.conn == C_CONNECTED &&
|
|
||||||
+ peer_device->connection->agreed_pro_version >= 90 &&
|
|
||||||
+ (p_uuid[UI_FLAGS] & 32);
|
|
||||||
if (skip_initial_sync) {
|
|
||||||
drbd_info(device, "Accepted new current UUID, preparing to skip initial sync\n");
|
|
||||||
drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
|
||||||
@@ -4324,11 +4333,35 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
|
||||||
BM_LOCKED_TEST_ALLOWED);
|
|
||||||
_drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]);
|
|
||||||
_drbd_uuid_set(device, UI_BITMAP, 0);
|
|
||||||
+ spin_lock_irq(&device->resource->req_lock);
|
|
||||||
_drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE),
|
|
||||||
CS_VERBOSE, NULL);
|
|
||||||
+ spin_unlock_irq(&device->resource->req_lock);
|
|
||||||
drbd_md_sync(device);
|
|
||||||
updated_uuids = 1;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ if (zero_out_devices) {
|
|
||||||
+ drbd_info(device, "Accepted to zero out devices, will take a long time\n");
|
|
||||||
+ drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
|
||||||
+ "clear_n_write from receive_uuids",
|
|
||||||
+ BM_LOCKED_TEST_ALLOWED);
|
|
||||||
+ _drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]);
|
|
||||||
+ _drbd_uuid_set(device, UI_BITMAP, 0);
|
|
||||||
+ drbd_print_uuids(device, "cleared bitmap UUID for zeroing device");
|
|
||||||
+
|
|
||||||
+ drbd_device_post_work(device, S_ZERO_START);
|
|
||||||
+ updated_uuids = 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (zero_out_finish) {
|
|
||||||
+ drbd_info(device, "Both side finished zero out devices.\n");
|
|
||||||
+ spin_lock_irq(&device->resource->req_lock);
|
|
||||||
+ _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE),
|
|
||||||
+ CS_VERBOSE, NULL);
|
|
||||||
+ spin_unlock_irq(&device->resource->req_lock);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
put_ldev(device);
|
|
||||||
} else if (device->state.disk < D_INCONSISTENT &&
|
|
||||||
device->state.role == R_PRIMARY) {
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
From 5874ec7ba93074fdc3c2e878080a4b08d3408bbf Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nick Wang <nwang@suse.com>
|
|
||||||
Date: Fri, 10 Jul 2015 18:39:12 +0800
|
|
||||||
Subject: [Patch v2 10/10] drbd: Handle new-current-uuid --zap-devices
|
|
||||||
|
|
||||||
Zap devices for zeroing out device on both side
|
|
||||||
instead of initial full sync.
|
|
||||||
|
|
||||||
Signed-off-by: Nick Wang <nwang@suse.com>
|
|
||||||
CC: Philipp Reisner <philipp.reisner@linbit.com>
|
|
||||||
CC: Lars Ellenberg <lars.ellenberg@linbit.com>
|
|
||||||
CC: drbd-dev@lists.linbit.com
|
|
||||||
CC: linux-kernel@vger.kernel.org
|
|
||||||
---
|
|
||||||
drbd/drbd_nl.c | 12 +++++++++++-
|
|
||||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
|
||||||
index 1d17663..131f112 100644
|
|
||||||
--- a/drbd/drbd_nl.c
|
|
||||||
+++ b/drbd/drbd_nl.c
|
|
||||||
@@ -4068,7 +4068,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
|
||||||
drbd_uuid_set(device, UI_BITMAP, 0); /* Rotate UI_BITMAP to History 1, etc... */
|
|
||||||
drbd_uuid_new_current(device); /* New current, previous to UI_BITMAP */
|
|
||||||
|
|
||||||
- if (args.clear_bm) {
|
|
||||||
+ if (args.clear_bm || args.zap_devices) {
|
|
||||||
err = drbd_bitmap_io(device, &drbd_bmio_clear_n_write,
|
|
||||||
"clear_n_write from new_c_uuid", BM_LOCKED_MASK);
|
|
||||||
if (err) {
|
|
||||||
@@ -4084,6 +4084,16 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info)
|
|
||||||
CS_VERBOSE, NULL);
|
|
||||||
spin_unlock_irq(&device->resource->req_lock);
|
|
||||||
}
|
|
||||||
+ if (zero_out_devices) {
|
|
||||||
+ drbd_send_zero_out_start(first_peer_device(device));
|
|
||||||
+ _drbd_uuid_set(device, UI_BITMAP, 0);
|
|
||||||
+ drbd_print_uuids(device, "cleared bitmap UUID for zeroing device");
|
|
||||||
+
|
|
||||||
+ /* CLear bit flag of zero out */
|
|
||||||
+ clear_bit(ZERO_DONE, &device->flags);
|
|
||||||
+ clear_bit(ZERO_FAIL, &device->flags);
|
|
||||||
+ drbd_device_post_work(device, P_ZERO_START);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
drbd_md_sync(device);
|
|
||||||
--
|
|
||||||
1.8.4.5
|
|
||||||
|
|
20
drbd.changes
20
drbd.changes
@ -1,3 +1,23 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Aug 19 08:50:27 UTC 2015 - nwang@suse.com
|
||||||
|
|
||||||
|
- Fate#317940, merge patch set into one patch.
|
||||||
|
- Support zeroout/discard-devices instead of zap-devices
|
||||||
|
- New feature flag FF_DISCARD
|
||||||
|
- Add patch 0001-drbd-Support-zeroout-device-in-initial-sync.patch
|
||||||
|
- Remove old patch set:
|
||||||
|
Patch 0000-cover-letter-fate317940.patch
|
||||||
|
Patch 0001-drbd-Fix-the-wrong-logic-of-moving-history.patch
|
||||||
|
Patch 0002-drbd-Add-options-zap_devices-to-new-current-uuid.patch
|
||||||
|
Patch 0003-drbd-A-function-to-zero-out-drbd-backing-device.patch
|
||||||
|
Patch 0004-drbd-New-packet-P_ZERO_OUT.patch
|
||||||
|
Patch 0005-drbd-Functions-to-notify-peer-node-to-start.patch
|
||||||
|
Patch 0006-drbd-Wapper-for-zeroing-out-device-by-worker.patch
|
||||||
|
Patch 0007-drbd-Flags-for-background-drbd-device-work.patch
|
||||||
|
Patch 0008-drbd-Function-to-work-with-packet-P_ZERO_OUT.patch
|
||||||
|
Patch 0009-drbd-Receive-zero-out-command-from-peer-node.patch
|
||||||
|
Patch 0010-drbd-Handle-new-current-uuid-zap-devices.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Jul 29 01:03:11 UTC 2015 - nwang@suse.com
|
Wed Jul 29 01:03:11 UTC 2015 - nwang@suse.com
|
||||||
|
|
||||||
|
34
drbd.spec
34
drbd.spec
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package drbd
|
# spec file for package drbd
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -24,29 +24,18 @@
|
|||||||
Name: drbd
|
Name: drbd
|
||||||
Version: 8.4.6
|
Version: 8.4.6
|
||||||
Release: 0
|
Release: 0
|
||||||
#Name: drbd-kernel
|
|
||||||
Summary: Distributed Replicated Block Device
|
Summary: Distributed Replicated Block Device
|
||||||
License: GPL-2.0+
|
License: GPL-2.0+
|
||||||
Group: Productivity/Clustering/HA
|
Group: Productivity/Clustering/HA
|
||||||
Url: http://www.drbd.org/
|
Url: http://www.drbd.org/
|
||||||
Source: http://oss.linbit.com/drbd/8.4/%{name}-%{version}.tar.gz
|
Source: http://oss.linbit.com/drbd/8.4/%{name}-%{version}.tar.gz
|
||||||
Source1: preamble
|
Source1: preamble
|
||||||
# In kernel is: kernel/drivers/block/drbd/drbd.ko
|
#In kernel is: kernel/drivers/block/drbd/drbd.ko
|
||||||
Source2: Module.supported
|
Source2: Module.supported
|
||||||
|
|
||||||
# Patch set (0-10) for fate: https://fate.suse.com/317940
|
#Patch for fate: https://fate.suse.com/317940
|
||||||
# Already merged into linbit upstream and waiting for next release
|
#Whether can merge into linbit is under discussion
|
||||||
Patch0: 0000-cover-letter-fate317940.patch
|
Patch1: 0001-drbd-Support-zeroout-device-in-initial-sync.patch
|
||||||
Patch1: 0001-drbd-Fix-the-wrong-logic-of-moving-history.patch
|
|
||||||
Patch2: 0002-drbd-Add-options-zap_devices-to-new-current-uuid.patch
|
|
||||||
Patch3: 0003-drbd-A-function-to-zero-out-drbd-backing-device.patch
|
|
||||||
Patch4: 0004-drbd-New-packet-P_ZERO_OUT.patch
|
|
||||||
Patch5: 0005-drbd-Functions-to-notify-peer-node-to-start.patch
|
|
||||||
Patch6: 0006-drbd-Wapper-for-zeroing-out-device-by-worker.patch
|
|
||||||
Patch7: 0007-drbd-Flags-for-background-drbd-device-work.patch
|
|
||||||
Patch8: 0008-drbd-Function-to-work-with-packet-P_ZERO_OUT.patch
|
|
||||||
Patch9: 0009-drbd-Receive-zero-out-command-from-peer-node.patch
|
|
||||||
Patch10: 0010-drbd-Handle-new-current-uuid-zap-devices.patch
|
|
||||||
|
|
||||||
BuildRequires: kernel-source
|
BuildRequires: kernel-source
|
||||||
BuildRequires: kernel-syms
|
BuildRequires: kernel-syms
|
||||||
@ -58,11 +47,7 @@ BuildRequires: kernel-syms-rt
|
|||||||
|
|
||||||
Requires: drbd-utils >= 8.9.0
|
Requires: drbd-utils >= 8.9.0
|
||||||
Supplements: drbd-utils >= 8.9.0
|
Supplements: drbd-utils >= 8.9.0
|
||||||
Obsoletes: drbd-bash-completion < %{version}
|
|
||||||
Obsoletes: drbd-kmp < %{version}
|
Obsoletes: drbd-kmp < %{version}
|
||||||
Obsoletes: drbd-pacemaker < %{version}
|
|
||||||
Obsoletes: drbd-udev < %{version}
|
|
||||||
Obsoletes: drbd-utils < %{version}
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
ExcludeArch: i586 s390
|
ExcludeArch: i586 s390
|
||||||
|
|
||||||
@ -85,15 +70,6 @@ installed kernel.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n drbd-%{version}
|
%setup -q -n drbd-%{version}
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch6 -p1
|
|
||||||
%patch7 -p1
|
|
||||||
%patch8 -p1
|
|
||||||
%patch9 -p1
|
|
||||||
%patch10 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
rm -rf obj
|
rm -rf obj
|
||||||
|
Loading…
Reference in New Issue
Block a user