diff --git a/0000-cover-letter-fate317940.patch b/0000-cover-letter-fate317940.patch deleted file mode 100644 index 5f39a56..0000000 --- a/0000-cover-letter-fate317940.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 5874ec7ba93074fdc3c2e878080a4b08d3408bbf Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0001-drbd-Fix-the-wrong-logic-of-moving-history.patch b/0001-drbd-Fix-the-wrong-logic-of-moving-history.patch deleted file mode 100644 index 2c6701d..0000000 --- a/0001-drbd-Fix-the-wrong-logic-of-moving-history.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 4d75389962585d5a543cadb2742cb4dfe22dc807 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0001-drbd-Support-zeroout-device-in-initial-sync.patch b/0001-drbd-Support-zeroout-device-in-initial-sync.patch new file mode 100644 index 0000000..f419ed4 --- /dev/null +++ b/0001-drbd-Support-zeroout-device-in-initial-sync.patch @@ -0,0 +1,529 @@ +From e15ba3799caf4cdcdf151078efe01e9a3f3ab206 Mon Sep 17 00:00:00 2001 +From: Nick Wang +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 + +-#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 + diff --git a/0002-drbd-Add-options-zap_devices-to-new-current-uuid.patch b/0002-drbd-Add-options-zap_devices-to-new-current-uuid.patch deleted file mode 100644 index 2fc9232..0000000 --- a/0002-drbd-Add-options-zap_devices-to-new-current-uuid.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 84ae2314faeff2a9e06a66bc9a79520eadcbf305 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0003-drbd-A-function-to-zero-out-drbd-backing-device.patch b/0003-drbd-A-function-to-zero-out-drbd-backing-device.patch deleted file mode 100644 index 6146c0f..0000000 --- a/0003-drbd-A-function-to-zero-out-drbd-backing-device.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 94d1f879305b472aff6009ba4c4f08b9d70f1cf1 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0004-drbd-New-packet-P_ZERO_OUT.patch b/0004-drbd-New-packet-P_ZERO_OUT.patch deleted file mode 100644 index 80f2f15..0000000 --- a/0004-drbd-New-packet-P_ZERO_OUT.patch +++ /dev/null @@ -1,96 +0,0 @@ -From c6085cdb8f55facfae4468548f258117e63134d4 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0005-drbd-Functions-to-notify-peer-node-to-start.patch b/0005-drbd-Functions-to-notify-peer-node-to-start.patch deleted file mode 100644 index 813dc6a..0000000 --- a/0005-drbd-Functions-to-notify-peer-node-to-start.patch +++ /dev/null @@ -1,65 +0,0 @@ -From b831a988370d6b6e2c989c40736155d529be3273 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0006-drbd-Wapper-for-zeroing-out-device-by-worker.patch b/0006-drbd-Wapper-for-zeroing-out-device-by-worker.patch deleted file mode 100644 index c2731ca..0000000 --- a/0006-drbd-Wapper-for-zeroing-out-device-by-worker.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 8bef1ececca3cf22c35f3e9ef95e72c0fd8125a9 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0007-drbd-Flags-for-background-drbd-device-work.patch b/0007-drbd-Flags-for-background-drbd-device-work.patch deleted file mode 100644 index bb94466..0000000 --- a/0007-drbd-Flags-for-background-drbd-device-work.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 88d3c5ee059952db304f5f3f82ca4c5e4a72a7a5 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0008-drbd-Function-to-work-with-packet-P_ZERO_OUT.patch b/0008-drbd-Function-to-work-with-packet-P_ZERO_OUT.patch deleted file mode 100644 index 2e1106c..0000000 --- a/0008-drbd-Function-to-work-with-packet-P_ZERO_OUT.patch +++ /dev/null @@ -1,74 +0,0 @@ -From fb7da7037d9096bd34285425f85c4b4584e55701 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0009-drbd-Receive-zero-out-command-from-peer-node.patch b/0009-drbd-Receive-zero-out-command-from-peer-node.patch deleted file mode 100644 index 1a93741..0000000 --- a/0009-drbd-Receive-zero-out-command-from-peer-node.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 8ef810075675a5453d81adb64f5d35b375cd0959 Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/0010-drbd-Handle-new-current-uuid-zap-devices.patch b/0010-drbd-Handle-new-current-uuid-zap-devices.patch deleted file mode 100644 index 991d66d..0000000 --- a/0010-drbd-Handle-new-current-uuid-zap-devices.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 5874ec7ba93074fdc3c2e878080a4b08d3408bbf Mon Sep 17 00:00:00 2001 -From: Nick Wang -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 -CC: Philipp Reisner -CC: Lars Ellenberg -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 - diff --git a/drbd.changes b/drbd.changes index 80ee29e..723809c 100644 --- a/drbd.changes +++ b/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 diff --git a/drbd.spec b/drbd.spec index ed8575b..1729899 100644 --- a/drbd.spec +++ b/drbd.spec @@ -1,7 +1,7 @@ # # 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 # remain the property of their copyright owners, unless otherwise agreed @@ -24,29 +24,18 @@ Name: drbd Version: 8.4.6 Release: 0 -#Name: drbd-kernel Summary: Distributed Replicated Block Device License: GPL-2.0+ Group: Productivity/Clustering/HA Url: http://www.drbd.org/ Source: http://oss.linbit.com/drbd/8.4/%{name}-%{version}.tar.gz Source1: preamble -# In kernel is: kernel/drivers/block/drbd/drbd.ko +#In kernel is: kernel/drivers/block/drbd/drbd.ko Source2: Module.supported -# Patch set (0-10) for fate: https://fate.suse.com/317940 -# Already merged into linbit upstream and waiting for next release -Patch0: 0000-cover-letter-fate317940.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 +#Patch for fate: https://fate.suse.com/317940 +#Whether can merge into linbit is under discussion +Patch1: 0001-drbd-Support-zeroout-device-in-initial-sync.patch BuildRequires: kernel-source BuildRequires: kernel-syms @@ -58,11 +47,7 @@ BuildRequires: kernel-syms-rt Requires: drbd-utils >= 8.9.0 Supplements: drbd-utils >= 8.9.0 -Obsoletes: drbd-bash-completion < %{version} Obsoletes: drbd-kmp < %{version} -Obsoletes: drbd-pacemaker < %{version} -Obsoletes: drbd-udev < %{version} -Obsoletes: drbd-utils < %{version} BuildRoot: %{_tmppath}/%{name}-%{version}-build ExcludeArch: i586 s390 @@ -85,15 +70,6 @@ installed kernel. %prep %setup -q -n drbd-%{version} %patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 %build rm -rf obj