From nobody Fri Sep 12 00:48:03 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 782A7C636CC for ; Wed, 15 Feb 2023 16:33:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229622AbjBOQcn (ORCPT ); Wed, 15 Feb 2023 11:32:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229734AbjBOQcU (ORCPT ); Wed, 15 Feb 2023 11:32:20 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F0C93B3C4 for ; Wed, 15 Feb 2023 08:32:15 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id a2so19771220wrd.6 for ; Wed, 15 Feb 2023 08:32:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7MAfmHWVYv+FmYzTDGo2VhDMYgUiJEm0gHKz+y+Cigg=; b=NlNU3QJVZHJ6xGmLLdgajoLoGYApmItKz/9nTlg4PGHAAkypjvP2R85vcbA38YKj3V QFTlObB2PwNCtCx/ZqB8Fjns4R5dnO0aQbBijU6rlhJXNjSev00k2jRWfYMsvmby4aru lc+Gu+EaOTOME3/cGgPhcI7fdHlLlvkKVfa13iSUhngH3v7kHfEgVJrGr23JBfZBtfOW fZ6risqsP9JHg8j1DXpvF9Vc4BiJWzIMoOn1hnl+J3mD8jU1aEauawEmIJ3XYJZUtHnX D9YSe+NHSvviGPiTFdfAv8wI8qsEBk8CP/xK0jfjktTgKTgQbarPnh9eS26chLlYOvre jPHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7MAfmHWVYv+FmYzTDGo2VhDMYgUiJEm0gHKz+y+Cigg=; b=yGdUAGM8qJilBmw6lgWjDG0pAf5jrc4PDng+j0mQgG0cfV3if4xU1Uo9S9SzjZd3rc k1/MOAHKhPx755KrNzZdyqAvanDeGu2TEWVh19zOP88J3/lUp4qR9Z2PLRno7wqy+eO1 ZJTbemTUQ5De0cA9zC31vFO+CQTfMhbWdY2TvaNc0fjgPhMLqLeKbBVHYO0QuE+6LCrY DAcVoCIHFHwN1z4Luf4f4ADrhrBPG5mezp9JvuHACwAREaZ+BshzJhVCij80lD+gqHzT RWh3zkSoHy3OyvpXkVKg2eIOww2R6NGIlwb30Ci4/K3fxOf4E8J9/9wnAkn2jbQ4tN0H +wPA== X-Gm-Message-State: AO0yUKU1qLPql2HnQ/NzwavfuQIkHuMUO6oO9psgwD/pePYyPF1K52FV OTwSrcTqvpgb8tY7PpYxG1BUWJm921YYF0WQVIeulw== X-Google-Smtp-Source: AK7set+FAIpRi2l2Gf0GSufFClEqLZ6Fl4vUFVS7KMs+eZeLSHphBcnTcWJEgesyEVrKxCdISaW/Dw== X-Received: by 2002:adf:f210:0:b0:2c5:6046:9244 with SMTP id p16-20020adff210000000b002c560469244mr2204156wro.53.1676478734408; Wed, 15 Feb 2023 08:32:14 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id n4-20020a5d67c4000000b002c56287bd2csm4865055wrw.114.2023.02.15.08.32.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Feb 2023 08:32:14 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH 7/7] drbd: Pass a peer device to the resync and online verify functions Date: Wed, 15 Feb 2023 17:32:04 +0100 Message-Id: <20230215163204.2856631-8-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230215163204.2856631-1-christoph.boehmwalder@linbit.com> References: <20230215163204.2856631-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Originally-from: Andreas Gr=C3=BCnbacher Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_actlog.c | 13 ++-- drivers/block/drbd/drbd_int.h | 46 +++++++------- drivers/block/drbd/drbd_receiver.c | 59 +++++++++--------- drivers/block/drbd/drbd_req.c | 9 +-- drivers/block/drbd/drbd_state.c | 10 +-- drivers/block/drbd/drbd_worker.c | 97 ++++++++++++++++-------------- 6 files changed, 126 insertions(+), 108 deletions(-) diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_act= log.c index 429255876800..64b3a1c76f03 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -735,8 +735,9 @@ static bool update_rs_extent(struct drbd_device *device, return false; } =20 -void drbd_advance_rs_marks(struct drbd_device *device, unsigned long still= _to_go) +void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, unsigned = long still_to_go) { + struct drbd_device *device =3D peer_device->device; unsigned long now =3D jiffies; unsigned long last =3D device->rs_mark_time[device->rs_last_mark]; int next =3D (device->rs_last_mark + 1) % DRBD_SYNC_MARKS; @@ -819,7 +820,7 @@ static int update_sync_bits(struct drbd_device *device, if (mode =3D=3D SET_IN_SYNC) { unsigned long still_to_go =3D drbd_bm_total_weight(device); bool rs_is_done =3D (still_to_go <=3D device->rs_failed); - drbd_advance_rs_marks(device, still_to_go); + drbd_advance_rs_marks(first_peer_device(device), still_to_go); if (cleared || rs_is_done) maybe_schedule_on_disk_bitmap_update(device, rs_is_done); } else if (mode =3D=3D RECORD_RS_FAILED) @@ -843,10 +844,11 @@ static bool plausible_request_size(int size) * called by worker on C_SYNC_TARGET and receiver on SyncSource. * */ -int __drbd_change_sync(struct drbd_device *device, sector_t sector, int si= ze, +int __drbd_change_sync(struct drbd_peer_device *peer_device, sector_t sect= or, int size, enum update_sync_bits_mode mode) { /* Is called from worker and receiver context _only_ */ + struct drbd_device *device =3D peer_device->device; unsigned long sbnr, ebnr, lbnr; unsigned long count =3D 0; sector_t esector, nr_sectors; @@ -1009,14 +1011,15 @@ int drbd_rs_begin_io(struct drbd_device *device, se= ctor_t sector) * tries to set it to BME_LOCKED. Returns 0 upon success, and -EAGAIN * if there is still application IO going on in this area. */ -int drbd_try_rs_begin_io(struct drbd_device *device, sector_t sector) +int drbd_try_rs_begin_io(struct drbd_peer_device *peer_device, sector_t se= ctor) { + struct drbd_device *device =3D peer_device->device; unsigned int enr =3D BM_SECT_TO_EXT(sector); const unsigned int al_enr =3D enr*AL_EXT_PER_BM_SECT; struct lc_element *e; struct bm_extent *bm_ext; int i; - bool throttle =3D drbd_rs_should_slow_down(device, sector, true); + bool throttle =3D drbd_rs_should_slow_down(peer_device, sector, true); =20 /* If we need to throttle, a half-locked (only marked BME_NO_WRITES, * not yet BME_LOCKED) extent needs to be kicked out explicitly if we diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 345e96ceb47c..8bd9f49c472a 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1432,21 +1432,24 @@ void drbd_resync_after_changed(struct drbd_device *= device); extern void drbd_start_resync(struct drbd_device *device, enum drbd_conns = side); extern void resume_next_sg(struct drbd_device *device); extern void suspend_other_sg(struct drbd_device *device); -extern int drbd_resync_finished(struct drbd_device *device); +extern int drbd_resync_finished(struct drbd_peer_device *peer_device); /* maybe rather drbd_main.c ? */ extern void *drbd_md_get_buffer(struct drbd_device *device, const char *in= tent); extern void drbd_md_put_buffer(struct drbd_device *device); extern int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, sector_t sector, enum req_op op); -extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); +extern void drbd_ov_out_of_sync_found(struct drbd_peer_device *peer_device, + sector_t sector, int size); extern void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done); -extern void drbd_rs_controller_reset(struct drbd_device *device); +extern void drbd_rs_controller_reset(struct drbd_peer_device *peer_device); =20 -static inline void ov_out_of_sync_print(struct drbd_device *device) +static inline void ov_out_of_sync_print(struct drbd_peer_device *peer_devi= ce) { + struct drbd_device *device =3D peer_device->device; + if (device->ov_last_oos_size) { - drbd_err(device, "Out of sync: start=3D%llu, size=3D%lu (sectors)\n", + drbd_err(peer_device, "Out of sync: start=3D%llu, size=3D%lu (sectors)\n= ", (unsigned long long)device->ov_last_oos_start, (unsigned long)device->ov_last_oos_size); } @@ -1485,7 +1488,7 @@ extern int drbd_ack_receiver(struct drbd_thread *thi); extern void drbd_send_ping_wf(struct work_struct *ws); 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, +extern bool drbd_rs_should_slow_down(struct drbd_peer_device *peer_device,= sector_t sector, bool throttle_if_app_is_waiting); extern int drbd_submit_peer_request(struct drbd_peer_request *peer_req); extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); @@ -1541,22 +1544,22 @@ extern void drbd_al_begin_io(struct drbd_device *de= vice, struct drbd_interval *i extern void drbd_al_complete_io(struct drbd_device *device, struct drbd_in= terval *i); extern void drbd_rs_complete_io(struct drbd_device *device, sector_t secto= r); extern int drbd_rs_begin_io(struct drbd_device *device, sector_t sector); -extern int drbd_try_rs_begin_io(struct drbd_device *device, sector_t secto= r); +extern int drbd_try_rs_begin_io(struct drbd_peer_device *peer_device, sect= or_t sector); extern void drbd_rs_cancel_all(struct drbd_device *device); extern int drbd_rs_del_all(struct drbd_device *device); -extern void drbd_rs_failed_io(struct drbd_device *device, +extern void drbd_rs_failed_io(struct drbd_peer_device *peer_device, sector_t sector, int size); -extern void drbd_advance_rs_marks(struct drbd_device *device, unsigned lon= g still_to_go); +extern void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, un= signed long still_to_go); =20 enum update_sync_bits_mode { RECORD_RS_FAILED, SET_OUT_OF_SYNC, SET_IN_SYN= C }; -extern int __drbd_change_sync(struct drbd_device *device, sector_t sector,= int size, +extern int __drbd_change_sync(struct drbd_peer_device *peer_device, sector= _t sector, int size, enum update_sync_bits_mode mode); -#define drbd_set_in_sync(device, sector, size) \ - __drbd_change_sync(device, sector, size, SET_IN_SYNC) -#define drbd_set_out_of_sync(device, sector, size) \ - __drbd_change_sync(device, sector, size, SET_OUT_OF_SYNC) -#define drbd_rs_failed_io(device, sector, size) \ - __drbd_change_sync(device, sector, size, RECORD_RS_FAILED) +#define drbd_set_in_sync(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, SET_IN_SYNC) +#define drbd_set_out_of_sync(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, SET_OUT_OF_SYNC) +#define drbd_rs_failed_io(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, RECORD_RS_FAILED) extern void drbd_al_shrink(struct drbd_device *device); extern int drbd_al_initialize(struct drbd_device *, void *); =20 @@ -1944,15 +1947,16 @@ static inline int __dec_ap_pending(struct drbd_devi= ce *device) * C_SYNC_SOURCE sends P_RS_DATA_REPLY (and expects P_WRITE_ACK with ID_= SYNCER) * (or P_NEG_ACK with ID_SYNCER) */ -static inline void inc_rs_pending(struct drbd_device *device) +static inline void inc_rs_pending(struct drbd_peer_device *peer_device) { - atomic_inc(&device->rs_pending_cnt); + atomic_inc(&peer_device->device->rs_pending_cnt); } =20 -#define dec_rs_pending(device) ((void)expect((device), __dec_rs_pending(de= vice) >=3D 0)) -static inline int __dec_rs_pending(struct drbd_device *device) +#define dec_rs_pending(peer_device) \ + ((void)expect((peer_device), __dec_rs_pending(peer_device) >=3D 0)) +static inline int __dec_rs_pending(struct drbd_peer_device *peer_device) { - return atomic_dec_return(&device->rs_pending_cnt); + return atomic_dec_return(&peer_device->device->rs_pending_cnt); } =20 /* counts how many answers we still need to send to the peer. diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index 856c0e3a6630..e54404c632e7 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2044,11 +2044,11 @@ static int e_end_resync_block(struct drbd_work *w, = int unused) D_ASSERT(device, drbd_interval_empty(&peer_req->i)); =20 if (likely((peer_req->flags & EE_WAS_ERROR) =3D=3D 0)) { - drbd_set_in_sync(device, sector, peer_req->i.size); + drbd_set_in_sync(peer_device, sector, peer_req->i.size); err =3D drbd_send_ack(peer_device, P_RS_WRITE_ACK, peer_req); } else { /* Record failure to sync */ - drbd_rs_failed_io(device, sector, peer_req->i.size); + drbd_rs_failed_io(peer_device, sector, peer_req->i.size); =20 err =3D drbd_send_ack(peer_device, P_NEG_ACK, peer_req); } @@ -2067,7 +2067,7 @@ static int recv_resync_read(struct drbd_peer_device *= peer_device, sector_t secto if (!peer_req) goto fail; =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 inc_unacked(device); /* corresponding dec_unacked() in e_end_resync_block() @@ -2220,7 +2220,7 @@ static int e_end_block(struct drbd_work *w, int cance= l) P_RS_WRITE_ACK : P_WRITE_ACK; err =3D drbd_send_ack(peer_device, pcmd, peer_req); if (pcmd =3D=3D P_RS_WRITE_ACK) - drbd_set_in_sync(device, sector, peer_req->i.size); + drbd_set_in_sync(peer_device, sector, peer_req->i.size); } else { err =3D drbd_send_ack(peer_device, P_NEG_ACK, peer_req); /* we expect it to be marked out of sync anyways... @@ -2691,7 +2691,7 @@ static int receive_Data(struct drbd_connection *conne= ction, struct packet_info * =20 if (device->state.pdsk < D_INCONSISTENT) { /* In case we have the only disk of the cluster, */ - drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_out_of_sync(peer_device, peer_req->i.sector, peer_req->i.size); peer_req->flags &=3D ~EE_MAY_SET_IN_SYNC; drbd_al_begin_io(device, &peer_req->i); peer_req->flags |=3D EE_CALL_AL_COMPLETE_IO; @@ -2730,9 +2730,10 @@ static int receive_Data(struct drbd_connection *conn= ection, struct packet_info * * The current sync rate used here uses only the most recent two step mark= s, * to have a short time average so we can react faster. */ -bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector, +bool drbd_rs_should_slow_down(struct drbd_peer_device *peer_device, sector= _t sector, bool throttle_if_app_is_waiting) { + struct drbd_device *device =3D peer_device->device; struct lc_element *tmp; bool throttle =3D drbd_rs_c_min_rate_throttle(device); =20 @@ -2844,7 +2845,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet break; case P_OV_REPLY: verb =3D 0; - dec_rs_pending(device); + dec_rs_pending(peer_device); drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size, ID_IN_SYNC); break; default: @@ -2915,7 +2916,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet /* track progress, we may need to throttle */ atomic_add(size >> 9, &device->rs_sect_in); peer_req->w.cb =3D w_e_end_ov_reply; - dec_rs_pending(device); + dec_rs_pending(peer_device); /* drbd_rs_begin_io done when we sent this request, * but accounting still needs to be done. */ goto submit_for_resync; @@ -2978,7 +2979,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet =20 update_receiver_timing_details(connection, drbd_rs_should_slow_down); if (device->state.peer !=3D R_PRIMARY - && drbd_rs_should_slow_down(device, sector, false)) + && drbd_rs_should_slow_down(peer_device, sector, false)) schedule_timeout_uninterruptible(HZ/10); update_receiver_timing_details(connection, drbd_rs_begin_io); if (drbd_rs_begin_io(device, sector)) @@ -4450,7 +4451,7 @@ static int receive_state(struct drbd_connection *conn= ection, struct packet_info else if (os.conn >=3D C_SYNC_SOURCE && peer_state.conn =3D=3D C_CONNECTED) { if (drbd_bm_total_weight(device) <=3D device->rs_failed) - drbd_resync_finished(device); + drbd_resync_finished(peer_device); return 0; } } @@ -4458,8 +4459,8 @@ static int receive_state(struct drbd_connection *conn= ection, struct packet_info /* explicit verify finished notification, stop sector reached. */ if (os.conn =3D=3D C_VERIFY_T && os.disk =3D=3D D_UP_TO_DATE && peer_state.conn =3D=3D C_CONNECTED && real_peer_disk =3D=3D D_UP_TO_D= ATE) { - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); return 0; } =20 @@ -4937,7 +4938,7 @@ static int receive_out_of_sync(struct drbd_connection= *connection, struct packet drbd_conn_str(device->state.conn)); } =20 - drbd_set_out_of_sync(device, be64_to_cpu(p->sector), be32_to_cpu(p->blksi= ze)); + drbd_set_out_of_sync(peer_device, be64_to_cpu(p->sector), be32_to_cpu(p->= blksize)); =20 return 0; } @@ -4958,7 +4959,7 @@ static int receive_rs_deallocated(struct drbd_connect= ion *connection, struct pac sector =3D be64_to_cpu(p->sector); size =3D be32_to_cpu(p->blksize); =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 if (get_ldev(device)) { struct drbd_peer_request *peer_req; @@ -5650,12 +5651,12 @@ static int got_IsInSync(struct drbd_connection *con= nection, struct packet_info * =20 if (get_ldev(device)) { drbd_rs_complete_io(device, sector); - drbd_set_in_sync(device, sector, blksize); + drbd_set_in_sync(peer_device, sector, blksize); /* rs_same_csums is supposed to count in units of BM_BLOCK_SIZE */ device->rs_same_csum +=3D (blksize >> BM_BLOCK_SHIFT); put_ldev(device); } - dec_rs_pending(device); + dec_rs_pending(peer_device); atomic_add(blksize >> 9, &device->rs_sect_in); =20 return 0; @@ -5701,8 +5702,8 @@ static int got_BlockAck(struct drbd_connection *conne= ction, struct packet_info * update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (p->block_id =3D=3D ID_SYNCER) { - drbd_set_in_sync(device, sector, blksize); - dec_rs_pending(device); + drbd_set_in_sync(peer_device, sector, blksize); + dec_rs_pending(peer_device); return 0; } switch (pi->cmd) { @@ -5747,8 +5748,8 @@ static int got_NegAck(struct drbd_connection *connect= ion, struct packet_info *pi update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (p->block_id =3D=3D ID_SYNCER) { - dec_rs_pending(device); - drbd_rs_failed_io(device, sector, size); + dec_rs_pending(peer_device); + drbd_rs_failed_io(peer_device, sector, size); return 0; } =20 @@ -5761,7 +5762,7 @@ static int got_NegAck(struct drbd_connection *connect= ion, struct packet_info *pi request is no longer in the collision hash. */ /* In Protocol B we might already have got a P_RECV_ACK but then get a P_NEG_ACK afterwards. */ - drbd_set_out_of_sync(device, sector, size); + drbd_set_out_of_sync(peer_device, sector, size); } return 0; } @@ -5806,13 +5807,13 @@ static int got_NegRSDReply(struct drbd_connection *= connection, struct packet_inf =20 update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 if (get_ldev_if_state(device, D_FAILED)) { drbd_rs_complete_io(device, sector); switch (pi->cmd) { case P_NEG_RS_DREPLY: - drbd_rs_failed_io(device, sector, size); + drbd_rs_failed_io(peer_device, sector, size); break; case P_RS_CANCEL: break; @@ -5869,21 +5870,21 @@ static int got_OVResult(struct drbd_connection *con= nection, struct packet_info * update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (be64_to_cpu(p->block_id) =3D=3D ID_OUT_OF_SYNC) - drbd_ov_out_of_sync_found(device, sector, size); + drbd_ov_out_of_sync_found(peer_device, sector, size); else - ov_out_of_sync_print(device); + ov_out_of_sync_print(peer_device); =20 if (!get_ldev(device)) return 0; =20 drbd_rs_complete_io(device, sector); - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 --device->ov_left; =20 /* let's advance progress step marks only for every other megabyte */ if ((device->ov_left & 0x200) =3D=3D 0x200) - drbd_advance_rs_marks(device, device->ov_left); + drbd_advance_rs_marks(peer_device, device->ov_left); =20 if (device->ov_left =3D=3D 0) { dw =3D kmalloc(sizeof(*dw), GFP_NOIO); @@ -5893,8 +5894,8 @@ static int got_OVResult(struct drbd_connection *conne= ction, struct packet_info * drbd_queue_work(&peer_device->connection->sender_work, &dw->w); } else { drbd_err(device, "kmalloc(dw) failed."); - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); } } put_ldev(device); diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 528f29ebf369..380e6584a4ee 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -122,12 +122,13 @@ void drbd_req_destroy(struct kref *kref) * before it even was submitted or sent. * In that case we do not want to touch the bitmap at all. */ + struct drbd_peer_device *peer_device =3D first_peer_device(device); if ((s & (RQ_POSTPONED|RQ_LOCAL_MASK|RQ_NET_MASK)) !=3D RQ_POSTPONED) { if (!(s & RQ_NET_OK) || !(s & RQ_LOCAL_OK)) - drbd_set_out_of_sync(device, req->i.sector, req->i.size); + drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size); =20 if ((s & RQ_NET_OK) && (s & RQ_LOCAL_OK) && (s & RQ_NET_SIS)) - drbd_set_in_sync(device, req->i.sector, req->i.size); + drbd_set_in_sync(peer_device, req->i.sector, req->i.size); } =20 /* one might be tempted to move the drbd_al_complete_io @@ -620,7 +621,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_e= vent what, break; =20 case READ_COMPLETED_WITH_ERROR: - drbd_set_out_of_sync(device, req->i.sector, req->i.size); + drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size); drbd_report_io_error(device, req); __drbd_chk_io_error(device, DRBD_READ_ERROR); fallthrough; @@ -1131,7 +1132,7 @@ static int drbd_process_write_request(struct drbd_req= uest *req) if (remote) { _req_mod(req, TO_BE_SENT, peer_device); _req_mod(req, QUEUE_FOR_NET_WRITE, peer_device); - } else if (drbd_set_out_of_sync(device, req->i.sector, req->i.size)) + } else if (drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size)) _req_mod(req, QUEUE_FOR_SEND_OOS, peer_device); =20 return remote; diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_stat= e.c index c92dc6093b0a..563e67f1ead9 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -1222,9 +1222,11 @@ void drbd_resume_al(struct drbd_device *device) } =20 /* helper for _drbd_set_state */ -static void set_ov_position(struct drbd_device *device, enum drbd_conns cs) +static void set_ov_position(struct drbd_peer_device *peer_device, enum drb= d_conns cs) { - if (first_peer_device(device)->connection->agreed_pro_version < 90) + struct drbd_device *device =3D peer_device->device; + + if (peer_device->connection->agreed_pro_version < 90) device->ov_start_sector =3D 0; device->rs_total =3D drbd_bm_bits(device); device->ov_position =3D 0; @@ -1387,7 +1389,7 @@ _drbd_set_state(struct drbd_device *device, union drb= d_state ns, unsigned long now =3D jiffies; int i; =20 - set_ov_position(device, ns.conn); + set_ov_position(peer_device, ns.conn); device->rs_start =3D now; device->rs_last_sect_ev =3D 0; device->ov_last_oos_size =3D 0; @@ -1398,7 +1400,7 @@ _drbd_set_state(struct drbd_device *device, union drb= d_state ns, device->rs_mark_time[i] =3D now; } =20 - drbd_rs_controller_reset(device); + drbd_rs_controller_reset(peer_device); =20 if (ns.conn =3D=3D C_VERIFY_S) { drbd_info(device, "Starting Online Verify from sector %llu\n", diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_wor= ker.c index 6455edca7aa9..4352a50fbb3f 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -28,8 +28,8 @@ #include "drbd_protocol.h" #include "drbd_req.h" =20 -static int make_ov_request(struct drbd_device *, int); -static int make_resync_request(struct drbd_device *, int); +static int make_ov_request(struct drbd_peer_device *, int); +static int make_resync_request(struct drbd_peer_device *, int); =20 /* endio handlers: * drbd_md_endio (defined here) @@ -124,7 +124,7 @@ void drbd_endio_write_sec_final(struct drbd_peer_reques= t *peer_req) __releases(l * In case of a write error, send the neg ack anyways. */ if (!__test_and_set_bit(__EE_SEND_WRITE_ACK, &peer_req->flags)) inc_unacked(device); - drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_out_of_sync(peer_device, peer_req->i.sector, peer_req->i.size); } =20 spin_lock_irqsave(&device->resource->req_lock, flags); @@ -363,7 +363,7 @@ static int w_e_send_csum(struct drbd_work *w, int cance= l) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); peer_req =3D NULL; - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest_csum(peer_device, sector, size, digest, digest_size, P_CSUM_RS_REQUEST); @@ -430,10 +430,10 @@ int w_resync_timer(struct drbd_work *w, int cancel) =20 switch (device->state.conn) { case C_VERIFY_S: - make_ov_request(device, cancel); + make_ov_request(first_peer_device(device), cancel); break; case C_SYNC_TARGET: - make_resync_request(device, cancel); + make_resync_request(first_peer_device(device), cancel); break; } =20 @@ -493,8 +493,9 @@ struct fifo_buffer *fifo_alloc(unsigned int fifo_size) return fb; } =20 -static int drbd_rs_controller(struct drbd_device *device, unsigned int sec= t_in) +static int drbd_rs_controller(struct drbd_peer_device *peer_device, unsign= ed int sect_in) { + struct drbd_device *device =3D peer_device->device; struct disk_conf *dc; unsigned int want; /* The number of sectors we want in-flight */ int req_sect; /* Number of sectors to request in this turn */ @@ -545,8 +546,9 @@ static int drbd_rs_controller(struct drbd_device *devic= e, unsigned int sect_in) return req_sect; } =20 -static int drbd_rs_number_requests(struct drbd_device *device) +static int drbd_rs_number_requests(struct drbd_peer_device *peer_device) { + struct drbd_device *device =3D peer_device->device; unsigned int sect_in; /* Number of sectors that came in since the last t= urn */ int number, mxb; =20 @@ -556,7 +558,7 @@ static int drbd_rs_number_requests(struct drbd_device *= device) rcu_read_lock(); mxb =3D drbd_get_max_buffers(device) / 2; if (rcu_dereference(device->rs_plan_s)->size) { - number =3D drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9); + number =3D drbd_rs_controller(peer_device, sect_in) >> (BM_BLOCK_SHIFT -= 9); device->c_sync_rate =3D number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIM= E; } else { device->c_sync_rate =3D rcu_dereference(device->ldev->disk_conf)->resync= _rate; @@ -580,9 +582,9 @@ static int drbd_rs_number_requests(struct drbd_device *= device) return number; } =20 -static int make_resync_request(struct drbd_device *const device, int cance= l) +static int make_resync_request(struct drbd_peer_device *const peer_device,= int cancel) { - struct drbd_peer_device *const peer_device =3D first_peer_device(device); + struct drbd_device *const device =3D peer_device->device; struct drbd_connection *const connection =3D peer_device ? peer_device->c= onnection : NULL; unsigned long bit; sector_t sector; @@ -598,7 +600,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) =20 if (device->rs_total =3D=3D 0) { /* empty resync? */ - drbd_resync_finished(device); + drbd_resync_finished(peer_device); return 0; } =20 @@ -618,7 +620,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) } =20 max_bio_size =3D queue_max_hw_sectors(device->rq_queue) << 9; - number =3D drbd_rs_number_requests(device); + number =3D drbd_rs_number_requests(peer_device); if (number <=3D 0) goto requeue; =20 @@ -653,7 +655,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) =20 sector =3D BM_BIT_TO_SECT(bit); =20 - if (drbd_try_rs_begin_io(device, sector)) { + if (drbd_try_rs_begin_io(peer_device, sector)) { device->bm_resync_fo =3D bit; goto requeue; } @@ -729,13 +731,13 @@ static int make_resync_request(struct drbd_device *co= nst device, int cancel) } else { int err; =20 - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest(peer_device, size =3D=3D discard_granularity ? P_RS_THIN_REQ : P_RS_DATA_REQUEST, sector, size, ID_SYNCER); if (err) { drbd_err(device, "drbd_send_drequest() failed, aborting...\n"); - dec_rs_pending(device); + dec_rs_pending(peer_device); put_ldev(device); return err; } @@ -760,8 +762,9 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) return 0; } =20 -static int make_ov_request(struct drbd_device *device, int cancel) +static int make_ov_request(struct drbd_peer_device *peer_device, int cance= l) { + struct drbd_device *device =3D peer_device->device; int number, i, size; sector_t sector; const sector_t capacity =3D get_capacity(device->vdisk); @@ -770,7 +773,7 @@ static int make_ov_request(struct drbd_device *device, = int cancel) if (unlikely(cancel)) return 1; =20 - number =3D drbd_rs_number_requests(device); + number =3D drbd_rs_number_requests(peer_device); =20 sector =3D device->ov_position; for (i =3D 0; i < number; i++) { @@ -788,7 +791,7 @@ static int make_ov_request(struct drbd_device *device, = int cancel) =20 size =3D BM_BLOCK_SIZE; =20 - if (drbd_try_rs_begin_io(device, sector)) { + if (drbd_try_rs_begin_io(peer_device, sector)) { device->ov_position =3D sector; goto requeue; } @@ -796,9 +799,9 @@ static int make_ov_request(struct drbd_device *device, = int cancel) if (sector + (size>>9) > capacity) size =3D (capacity-sector)<<9; =20 - inc_rs_pending(device); + inc_rs_pending(peer_device); if (drbd_send_ov_request(first_peer_device(device), sector, size)) { - dec_rs_pending(device); + dec_rs_pending(peer_device); return 0; } sector +=3D BM_SECT_PER_BIT; @@ -818,8 +821,8 @@ int w_ov_finished(struct drbd_work *w, int cancel) container_of(w, struct drbd_device_work, w); struct drbd_device *device =3D dw->device; kfree(dw); - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(first_peer_device(device)); + drbd_resync_finished(first_peer_device(device)); =20 return 0; } @@ -831,7 +834,7 @@ static int w_resync_finished(struct drbd_work *w, int c= ancel) struct drbd_device *device =3D dw->device; kfree(dw); =20 - drbd_resync_finished(device); + drbd_resync_finished(first_peer_device(device)); =20 return 0; } @@ -846,9 +849,10 @@ static void ping_peer(struct drbd_device *device) test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_= CONNECTED); } =20 -int drbd_resync_finished(struct drbd_device *device) +int drbd_resync_finished(struct drbd_peer_device *peer_device) { - struct drbd_connection *connection =3D first_peer_device(device)->connect= ion; + struct drbd_device *device =3D peer_device->device; + struct drbd_connection *connection =3D peer_device->connection; unsigned long db, dt, dbdt; unsigned long n_oos; union drbd_state os, ns; @@ -1129,7 +1133,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cance= l) err =3D drbd_send_ack(peer_device, P_RS_CANCEL, peer_req); } else if (likely((peer_req->flags & EE_WAS_ERROR) =3D=3D 0)) { if (likely(device->state.pdsk >=3D D_INCONSISTENT)) { - inc_rs_pending(device); + inc_rs_pending(peer_device); if (peer_req->flags & EE_RS_THIN_REQ && all_zero(peer_req)) err =3D drbd_send_rs_deallocated(peer_device, peer_req); else @@ -1148,7 +1152,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cance= l) err =3D drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req); =20 /* update resync data with failure */ - drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size); + drbd_rs_failed_io(peer_device, peer_req->i.sector, peer_req->i.size); } =20 dec_unacked(device); @@ -1199,12 +1203,12 @@ int w_e_end_csum_rs_req(struct drbd_work *w, int ca= ncel) } =20 if (eq) { - drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_in_sync(peer_device, peer_req->i.sector, peer_req->i.size); /* rs_same_csums unit is BM_BLOCK_SIZE */ device->rs_same_csum +=3D peer_req->i.size >> BM_BLOCK_SHIFT; err =3D drbd_send_ack(peer_device, P_RS_IS_IN_SYNC, peer_req); } else { - inc_rs_pending(device); + inc_rs_pending(peer_device); peer_req->block_id =3D ID_SYNCER; /* By setting block_id, digest pointe= r becomes invalid! */ peer_req->flags &=3D ~EE_HAS_DIGEST; /* This peer request no longer has= a digest pointer */ kfree(di); @@ -1257,10 +1261,10 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); peer_req =3D NULL; - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest_csum(peer_device, sector, size, digest, digest= _size, P_OV_REPLY); if (err) - dec_rs_pending(device); + dec_rs_pending(peer_device); kfree(digest); =20 out: @@ -1270,15 +1274,16 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) return err; } =20 -void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector= , int size) +void drbd_ov_out_of_sync_found(struct drbd_peer_device *peer_device, secto= r_t sector, int size) { + struct drbd_device *device =3D peer_device->device; if (device->ov_last_oos_start + device->ov_last_oos_size =3D=3D sector) { device->ov_last_oos_size +=3D size>>9; } else { device->ov_last_oos_start =3D sector; device->ov_last_oos_size =3D size>>9; } - drbd_set_out_of_sync(device, sector, size); + drbd_set_out_of_sync(peer_device, sector, size); } =20 int w_e_end_ov_reply(struct drbd_work *w, int cancel) @@ -1328,9 +1333,9 @@ int w_e_end_ov_reply(struct drbd_work *w, int cancel) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); if (!eq) - drbd_ov_out_of_sync_found(device, sector, size); + drbd_ov_out_of_sync_found(peer_device, sector, size); else - ov_out_of_sync_print(device); + ov_out_of_sync_print(peer_device); =20 err =3D drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size, eq ? ID_IN_SYNC : ID_OUT_OF_SYNC); @@ -1341,14 +1346,14 @@ int w_e_end_ov_reply(struct drbd_work *w, int cance= l) =20 /* let's advance progress step marks only for every other megabyte */ if ((device->ov_left & 0x200) =3D=3D 0x200) - drbd_advance_rs_marks(device, device->ov_left); + drbd_advance_rs_marks(peer_device, device->ov_left); =20 stop_sector_reached =3D verify_can_do_stop_sector(device) && (sector + (size>>9)) >=3D device->ov_stop_sector; =20 if (device->ov_left =3D=3D 0 || stop_sector_reached) { - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); } =20 return err; @@ -1668,8 +1673,9 @@ void drbd_resync_after_changed(struct drbd_device *de= vice) } while (changed); } =20 -void drbd_rs_controller_reset(struct drbd_device *device) +void drbd_rs_controller_reset(struct drbd_peer_device *peer_device) { + struct drbd_device *device =3D peer_device->device; struct gendisk *disk =3D device->ldev->backing_bdev->bd_disk; struct fifo_buffer *plan; =20 @@ -1891,10 +1897,10 @@ void drbd_start_resync(struct drbd_device *device, = enum drbd_conns side) rcu_read_unlock(); schedule_timeout_interruptible(timeo); } - drbd_resync_finished(device); + drbd_resync_finished(peer_device); } =20 - drbd_rs_controller_reset(device); + drbd_rs_controller_reset(peer_device); /* ns.conn may already be !=3D device->state.conn, * we may have been paused in between, or become paused until * the timer triggers. @@ -1909,8 +1915,9 @@ void drbd_start_resync(struct drbd_device *device, en= um drbd_conns side) mutex_unlock(device->state_mutex); } =20 -static void update_on_disk_bitmap(struct drbd_device *device, bool resync_= done) +static void update_on_disk_bitmap(struct drbd_peer_device *peer_device, bo= ol resync_done) { + struct drbd_device *device =3D peer_device->device; struct sib_info sib =3D { .sib_reason =3D SIB_SYNC_PROGRESS, }; device->rs_last_bcast =3D jiffies; =20 @@ -1919,7 +1926,7 @@ static void update_on_disk_bitmap(struct drbd_device = *device, bool resync_done) =20 drbd_bm_write_lazy(device, 0); if (resync_done && is_sync_state(device->state.conn)) - drbd_resync_finished(device); + drbd_resync_finished(peer_device); =20 drbd_bcast_event(device, &sib); /* update timestamp, in case it took a while to write out stuff */ @@ -2018,7 +2025,7 @@ static void do_device_work(struct drbd_device *device= , const unsigned long todo) do_md_sync(device); if (test_bit(RS_DONE, &todo) || test_bit(RS_PROGRESS, &todo)) - update_on_disk_bitmap(device, test_bit(RS_DONE, &todo)); + update_on_disk_bitmap(first_peer_device(device), test_bit(RS_DONE, &todo= )); if (test_bit(GO_DISKLESS, &todo)) go_diskless(device); if (test_bit(DESTROY_DISK, &todo)) --=20 2.39.1