blob: 5e793dd7adfbd096239f4d0994d2f20e24b2b596 [file] [log] [blame]
Philipp Reisnerb411b362009-09-25 16:07:19 -07001/*
2 drbd_worker.c
3
4 This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
5
6 Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
7 Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
8 Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
9
10 drbd is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 drbd is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with drbd; see the file COPYING. If not, write to
22 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +020024*/
Philipp Reisnerb411b362009-09-25 16:07:19 -070025
Philipp Reisnerb411b362009-09-25 16:07:19 -070026#include <linux/module.h>
Philipp Reisnerb411b362009-09-25 16:07:19 -070027#include <linux/drbd.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010028#include <linux/sched/signal.h>
Philipp Reisnerb411b362009-09-25 16:07:19 -070029#include <linux/wait.h>
30#include <linux/mm.h>
31#include <linux/memcontrol.h>
32#include <linux/mm_inline.h>
33#include <linux/slab.h>
34#include <linux/random.h>
Philipp Reisnerb411b362009-09-25 16:07:19 -070035#include <linux/string.h>
36#include <linux/scatterlist.h>
37
38#include "drbd_int.h"
Andreas Gruenbachera3603a62011-05-30 11:47:37 +020039#include "drbd_protocol.h"
Philipp Reisnerb411b362009-09-25 16:07:19 -070040#include "drbd_req.h"
Philipp Reisnerb411b362009-09-25 16:07:19 -070041
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +020042static int make_ov_request(struct drbd_device *, int);
43static int make_resync_request(struct drbd_device *, int);
Philipp Reisnerb411b362009-09-25 16:07:19 -070044
Andreas Gruenbacherc5a91612011-01-25 17:33:38 +010045/* endio handlers:
Andreas Gruenbachered15b792014-09-11 14:29:06 +020046 * drbd_md_endio (defined here)
Andreas Gruenbacherfcefa622011-02-17 16:46:59 +010047 * drbd_request_endio (defined here)
48 * drbd_peer_request_endio (defined here)
Andreas Gruenbachered15b792014-09-11 14:29:06 +020049 * drbd_bm_endio (defined in drbd_bitmap.c)
Andreas Gruenbacherc5a91612011-01-25 17:33:38 +010050 *
Philipp Reisnerb411b362009-09-25 16:07:19 -070051 * For all these callbacks, note the following:
52 * The callbacks will be called in irq context by the IDE drivers,
53 * and in Softirqs/Tasklets/BH context by the SCSI drivers.
54 * Try to get the locking right :)
55 *
56 */
57
Philipp Reisnerb411b362009-09-25 16:07:19 -070058/* used for synchronous meta data and bitmap IO
59 * submitted by drbd_md_sync_page_io()
60 */
Christoph Hellwig4246a0b2015-07-20 15:29:37 +020061void drbd_md_endio(struct bio *bio)
Philipp Reisnerb411b362009-09-25 16:07:19 -070062{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020063 struct drbd_device *device;
Philipp Reisnerb411b362009-09-25 16:07:19 -070064
Lars Ellenberge37d2432014-04-01 23:53:30 +020065 device = bio->bi_private;
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +020066 device->md_io.error = blk_status_to_errno(bio->bi_status);
Philipp Reisnerb411b362009-09-25 16:07:19 -070067
Lars Ellenberg7c752ed2017-08-29 10:20:39 +020068 /* special case: drbd_md_read() during drbd_adm_attach() */
69 if (device->ldev)
70 put_ldev(device);
71 bio_put(bio);
72
Philipp Reisner0cfac5d2011-11-10 12:12:52 +010073 /* We grabbed an extra reference in _drbd_md_sync_page_io() to be able
74 * to timeout on the lower level device, and eventually detach from it.
75 * If this io completion runs after that timeout expired, this
76 * drbd_md_put_buffer() may allow us to finally try and re-attach.
77 * During normal operation, this only puts that extra reference
78 * down to 1 again.
79 * Make sure we first drop the reference, and only then signal
80 * completion, or we may (in drbd_al_read_log()) cycle so fast into the
81 * next drbd_md_sync_page_io(), that we trigger the
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020082 * ASSERT(atomic_read(&device->md_io_in_use) == 1) there.
Philipp Reisner0cfac5d2011-11-10 12:12:52 +010083 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020084 drbd_md_put_buffer(device);
Lars Ellenberge37d2432014-04-01 23:53:30 +020085 device->md_io.done = 1;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020086 wake_up(&device->misc_wait);
Philipp Reisnerb411b362009-09-25 16:07:19 -070087}
88
89/* reads on behalf of the partner,
90 * "submitted" by the receiver
91 */
Rashika Kheriaa186e472013-12-19 15:06:10 +053092static void drbd_endio_read_sec_final(struct drbd_peer_request *peer_req) __releases(local)
Philipp Reisnerb411b362009-09-25 16:07:19 -070093{
94 unsigned long flags = 0;
Andreas Gruenbacher67801392011-09-13 10:39:41 +020095 struct drbd_peer_device *peer_device = peer_req->peer_device;
96 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -070097
Andreas Gruenbacher05008132011-07-07 14:19:42 +020098 spin_lock_irqsave(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020099 device->read_cnt += peer_req->i.size >> 9;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200100 list_del(&peer_req->w.list);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200101 if (list_empty(&device->read_ee))
102 wake_up(&device->ee_wait);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100103 if (test_bit(__EE_WAS_ERROR, &peer_req->flags))
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200104 __drbd_chk_io_error(device, DRBD_READ_ERROR);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200105 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700106
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200107 drbd_queue_work(&peer_device->connection->sender_work, &peer_req->w);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200108 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700109}
110
111/* writes on behalf of the partner, or resync writes,
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200112 * "submitted" by the receiver, final stage. */
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200113void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __releases(local)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700114{
115 unsigned long flags = 0;
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200116 struct drbd_peer_device *peer_device = peer_req->peer_device;
117 struct drbd_device *device = peer_device->device;
Philipp Reisner668700b2015-03-16 16:08:29 +0100118 struct drbd_connection *connection = peer_device->connection;
Lars Ellenberg181286a2011-03-31 15:18:56 +0200119 struct drbd_interval i;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700120 int do_wake;
Andreas Gruenbacher579b57e2011-01-13 18:40:57 +0100121 u64 block_id;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700122 int do_al_complete_io;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700123
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100124 /* after we moved peer_req to done_ee,
Philipp Reisnerb411b362009-09-25 16:07:19 -0700125 * we may no longer access it,
126 * it may be freed/reused already!
127 * (as soon as we release the req_lock) */
Lars Ellenberg181286a2011-03-31 15:18:56 +0200128 i = peer_req->i;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100129 do_al_complete_io = peer_req->flags & EE_CALL_AL_COMPLETE_IO;
130 block_id = peer_req->block_id;
Lars Ellenberg21ae5d72014-05-05 23:42:24 +0200131 peer_req->flags &= ~EE_CALL_AL_COMPLETE_IO;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700132
Lars Ellenberge1fbc4c2017-08-29 10:20:35 +0200133 if (peer_req->flags & EE_WAS_ERROR) {
134 /* In protocol != C, we usually do not send write acks.
135 * In case of a write error, send the neg ack anyways. */
136 if (!__test_and_set_bit(__EE_SEND_WRITE_ACK, &peer_req->flags))
137 inc_unacked(device);
138 drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size);
139 }
140
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200141 spin_lock_irqsave(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200142 device->writ_cnt += peer_req->i.size >> 9;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200143 list_move_tail(&peer_req->w.list, &device->done_ee);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700144
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100145 /*
Andreas Gruenbacher5e472262011-01-27 14:42:51 +0100146 * Do not remove from the write_requests tree here: we did not send the
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100147 * Ack yet and did not wake possibly waiting conflicting requests.
148 * Removed from the tree from "drbd_process_done_ee" within the
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200149 * appropriate dw.cb (e_end_block/e_end_resync_block) or from
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100150 * _drbd_clear_done_ee.
151 */
Philipp Reisnerb411b362009-09-25 16:07:19 -0700152
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200153 do_wake = list_empty(block_id == ID_SYNCER ? &device->sync_ee : &device->active_ee);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700154
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200155 /* FIXME do we want to detach for failed REQ_DISCARD?
156 * ((peer_req->flags & (EE_WAS_ERROR|EE_IS_TRIM)) == EE_WAS_ERROR) */
157 if (peer_req->flags & EE_WAS_ERROR)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200158 __drbd_chk_io_error(device, DRBD_WRITE_ERROR);
Philipp Reisner668700b2015-03-16 16:08:29 +0100159
160 if (connection->cstate >= C_WF_REPORT_PARAMS) {
161 kref_get(&device->kref); /* put is in drbd_send_acks_wf() */
162 if (!queue_work(connection->ack_sender, &peer_device->send_acks_work))
163 kref_put(&device->kref, drbd_destroy_device);
164 }
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200165 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700166
Andreas Gruenbacher579b57e2011-01-13 18:40:57 +0100167 if (block_id == ID_SYNCER)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200168 drbd_rs_complete_io(device, i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700169
170 if (do_wake)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200171 wake_up(&device->ee_wait);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700172
173 if (do_al_complete_io)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200174 drbd_al_complete_io(device, &i);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700175
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200176 put_ldev(device);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200177}
Philipp Reisnerb411b362009-09-25 16:07:19 -0700178
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200179/* writes on behalf of the partner, or resync writes,
180 * "submitted" by the receiver.
181 */
Christoph Hellwig4246a0b2015-07-20 15:29:37 +0200182void drbd_peer_request_endio(struct bio *bio)
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200183{
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100184 struct drbd_peer_request *peer_req = bio->bi_private;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200185 struct drbd_device *device = peer_req->peer_device->device;
Fabian Frederick7e5fec32016-06-14 00:26:35 +0200186 bool is_write = bio_data_dir(bio) == WRITE;
Christoph Hellwig45c21792017-04-05 19:21:22 +0200187 bool is_discard = bio_op(bio) == REQ_OP_WRITE_ZEROES ||
188 bio_op(bio) == REQ_OP_DISCARD;
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200189
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200190 if (bio->bi_status && __ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200191 drbd_warn(device, "%s: error=%d s=%llus\n",
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200192 is_write ? (is_discard ? "discard" : "write")
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200193 : "read", bio->bi_status,
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100194 (unsigned long long)peer_req->i.sector);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200195
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200196 if (bio->bi_status)
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100197 set_bit(__EE_WAS_ERROR, &peer_req->flags);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200198
199 bio_put(bio); /* no need for the bio anymore */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100200 if (atomic_dec_and_test(&peer_req->pending_bios)) {
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200201 if (is_write)
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100202 drbd_endio_write_sec_final(peer_req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200203 else
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100204 drbd_endio_read_sec_final(peer_req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200205 }
Philipp Reisnerb411b362009-09-25 16:07:19 -0700206}
207
Baoyou Xie1ffa7bf2017-08-29 10:20:36 +0200208static void
209drbd_panic_after_delayed_completion_of_aborted_request(struct drbd_device *device)
Lars Ellenberg142207f2015-02-19 13:48:59 +0100210{
211 panic("drbd%u %s/%u potential random memory corruption caused by delayed completion of aborted local request\n",
212 device->minor, device->resource->name, device->vnr);
213}
214
Philipp Reisnerb411b362009-09-25 16:07:19 -0700215/* read, readA or write requests on R_PRIMARY coming from drbd_make_request
216 */
Christoph Hellwig4246a0b2015-07-20 15:29:37 +0200217void drbd_request_endio(struct bio *bio)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700218{
Lars Ellenberga1154132010-11-13 20:42:29 +0100219 unsigned long flags;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700220 struct drbd_request *req = bio->bi_private;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200221 struct drbd_device *device = req->device;
Lars Ellenberga1154132010-11-13 20:42:29 +0100222 struct bio_and_error m;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700223 enum drbd_req_event what;
Philipp Reisner1b6dd252012-09-04 15:16:20 +0200224
225 /* If this request was aborted locally before,
226 * but now was completed "successfully",
227 * chances are that this caused arbitrary data corruption.
228 *
229 * "aborting" requests, or force-detaching the disk, is intended for
230 * completely blocked/hung local backing devices which do no longer
231 * complete requests at all, not even do error completions. In this
232 * situation, usually a hard-reset and failover is the only way out.
233 *
234 * By "aborting", basically faking a local error-completion,
235 * we allow for a more graceful swichover by cleanly migrating services.
236 * Still the affected node has to be rebooted "soon".
237 *
238 * By completing these requests, we allow the upper layers to re-use
239 * the associated data pages.
240 *
241 * If later the local backing device "recovers", and now DMAs some data
242 * from disk into the original request pages, in the best case it will
243 * just put random data into unused pages; but typically it will corrupt
244 * meanwhile completely unrelated data, causing all sorts of damage.
245 *
246 * Which means delayed successful completion,
247 * especially for READ requests,
248 * is a reason to panic().
249 *
250 * We assume that a delayed *error* completion is OK,
251 * though we still will complain noisily about it.
252 */
253 if (unlikely(req->rq_state & RQ_LOCAL_ABORTED)) {
254 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200255 drbd_emerg(device, "delayed completion of aborted local request; disk-timeout may be too aggressive\n");
Philipp Reisner1b6dd252012-09-04 15:16:20 +0200256
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200257 if (!bio->bi_status)
Lars Ellenberg142207f2015-02-19 13:48:59 +0100258 drbd_panic_after_delayed_completion_of_aborted_request(device);
Philipp Reisner1b6dd252012-09-04 15:16:20 +0200259 }
260
Philipp Reisnerb411b362009-09-25 16:07:19 -0700261 /* to avoid recursion in __req_mod */
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200262 if (unlikely(bio->bi_status)) {
Christoph Hellwig70246282016-07-19 11:28:41 +0200263 switch (bio_op(bio)) {
Christoph Hellwig45c21792017-04-05 19:21:22 +0200264 case REQ_OP_WRITE_ZEROES:
Christoph Hellwig70246282016-07-19 11:28:41 +0200265 case REQ_OP_DISCARD:
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200266 if (bio->bi_status == BLK_STS_NOTSUPP)
Christoph Hellwig70246282016-07-19 11:28:41 +0200267 what = DISCARD_COMPLETED_NOTSUPP;
268 else
269 what = DISCARD_COMPLETED_WITH_ERROR;
270 break;
271 case REQ_OP_READ:
Jens Axboe1eff9d32016-08-05 15:35:16 -0600272 if (bio->bi_opf & REQ_RAHEAD)
Christoph Hellwig70246282016-07-19 11:28:41 +0200273 what = READ_AHEAD_COMPLETED_WITH_ERROR;
274 else
275 what = READ_COMPLETED_WITH_ERROR;
276 break;
277 default:
278 what = WRITE_COMPLETED_WITH_ERROR;
279 break;
280 }
281 } else {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +0100282 what = COMPLETED_OK;
Christoph Hellwig70246282016-07-19 11:28:41 +0200283 }
Philipp Reisnerb411b362009-09-25 16:07:19 -0700284
Christoph Hellwig4e4cbee2017-06-03 09:38:06 +0200285 req->private_bio = ERR_PTR(blk_status_to_errno(bio->bi_status));
Lars Ellenberg64dafbc2018-06-25 11:39:52 +0200286 bio_put(bio);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700287
Lars Ellenberga1154132010-11-13 20:42:29 +0100288 /* not req_mod(), we need irqsave here! */
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200289 spin_lock_irqsave(&device->resource->req_lock, flags);
Lars Ellenberga1154132010-11-13 20:42:29 +0100290 __req_mod(req, what, &m);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200291 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200292 put_ldev(device);
Lars Ellenberga1154132010-11-13 20:42:29 +0100293
294 if (m.bio)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200295 complete_master_bio(device, &m);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700296}
297
Herbert Xu9534d672016-01-24 21:19:21 +0800298void drbd_csum_ee(struct crypto_ahash *tfm, struct drbd_peer_request *peer_req, void *digest)
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200299{
Herbert Xu9534d672016-01-24 21:19:21 +0800300 AHASH_REQUEST_ON_STACK(req, tfm);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200301 struct scatterlist sg;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100302 struct page *page = peer_req->pages;
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200303 struct page *tmp;
304 unsigned len;
305
Herbert Xu9534d672016-01-24 21:19:21 +0800306 ahash_request_set_tfm(req, tfm);
307 ahash_request_set_callback(req, 0, NULL, NULL);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200308
309 sg_init_table(&sg, 1);
Herbert Xu9534d672016-01-24 21:19:21 +0800310 crypto_ahash_init(req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200311
312 while ((tmp = page_chain_next(page))) {
313 /* all but the last page will be fully used */
314 sg_set_page(&sg, page, PAGE_SIZE, 0);
Herbert Xu9534d672016-01-24 21:19:21 +0800315 ahash_request_set_crypt(req, &sg, NULL, sg.length);
316 crypto_ahash_update(req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200317 page = tmp;
318 }
319 /* and now the last, possibly only partially used page */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100320 len = peer_req->i.size & (PAGE_SIZE - 1);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200321 sg_set_page(&sg, page, len ?: PAGE_SIZE, 0);
Herbert Xu9534d672016-01-24 21:19:21 +0800322 ahash_request_set_crypt(req, &sg, digest, sg.length);
323 crypto_ahash_finup(req);
324 ahash_request_zero(req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200325}
326
Herbert Xu9534d672016-01-24 21:19:21 +0800327void drbd_csum_bio(struct crypto_ahash *tfm, struct bio *bio, void *digest)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700328{
Herbert Xu9534d672016-01-24 21:19:21 +0800329 AHASH_REQUEST_ON_STACK(req, tfm);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700330 struct scatterlist sg;
Kent Overstreet79886132013-11-23 17:19:00 -0800331 struct bio_vec bvec;
332 struct bvec_iter iter;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700333
Herbert Xu9534d672016-01-24 21:19:21 +0800334 ahash_request_set_tfm(req, tfm);
335 ahash_request_set_callback(req, 0, NULL, NULL);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700336
337 sg_init_table(&sg, 1);
Herbert Xu9534d672016-01-24 21:19:21 +0800338 crypto_ahash_init(req);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700339
Kent Overstreet79886132013-11-23 17:19:00 -0800340 bio_for_each_segment(bvec, bio, iter) {
341 sg_set_page(&sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset);
Herbert Xu9534d672016-01-24 21:19:21 +0800342 ahash_request_set_crypt(req, &sg, NULL, sg.length);
343 crypto_ahash_update(req);
Lars Ellenberg9104d312016-06-14 00:26:31 +0200344 /* REQ_OP_WRITE_SAME has only one segment,
345 * checksum the payload only once. */
346 if (bio_op(bio) == REQ_OP_WRITE_SAME)
347 break;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700348 }
Herbert Xu9534d672016-01-24 21:19:21 +0800349 ahash_request_set_crypt(req, NULL, digest, 0);
350 crypto_ahash_final(req);
351 ahash_request_zero(req);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700352}
353
Lars Ellenberg9676c762011-02-22 14:02:31 +0100354/* MAYBE merge common code with w_e_end_ov_req */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100355static int w_e_send_csum(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700356{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200357 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200358 struct drbd_peer_device *peer_device = peer_req->peer_device;
359 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700360 int digest_size;
361 void *digest;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100362 int err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700363
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100364 if (unlikely(cancel))
365 goto out;
366
Lars Ellenberg9676c762011-02-22 14:02:31 +0100367 if (unlikely((peer_req->flags & EE_WAS_ERROR) != 0))
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100368 goto out;
369
Herbert Xu9534d672016-01-24 21:19:21 +0800370 digest_size = crypto_ahash_digestsize(peer_device->connection->csums_tfm);
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100371 digest = kmalloc(digest_size, GFP_NOIO);
372 if (digest) {
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100373 sector_t sector = peer_req->i.sector;
374 unsigned int size = peer_req->i.size;
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200375 drbd_csum_ee(peer_device->connection->csums_tfm, peer_req, digest);
Lars Ellenberg9676c762011-02-22 14:02:31 +0100376 /* Free peer_req and pages before send.
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100377 * In case we block on congestion, we could otherwise run into
378 * some distributed deadlock, if the other side blocks on
379 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +0200380 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200381 drbd_free_peer_req(device, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100382 peer_req = NULL;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200383 inc_rs_pending(device);
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200384 err = drbd_send_drequest_csum(peer_device, sector, size,
Andreas Gruenbacherdb1b0b72011-03-16 01:37:21 +0100385 digest, digest_size,
386 P_CSUM_RS_REQUEST);
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100387 kfree(digest);
388 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200389 drbd_err(device, "kmalloc() of digest failed.\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100390 err = -ENOMEM;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700391 }
392
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100393out:
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100394 if (peer_req)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200395 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700396
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100397 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200398 drbd_err(device, "drbd_send_drequest(..., csum) failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100399 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700400}
401
402#define GFP_TRY (__GFP_HIGHMEM | __GFP_NOWARN)
403
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200404static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, int size)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700405{
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200406 struct drbd_device *device = peer_device->device;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100407 struct drbd_peer_request *peer_req;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700408
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200409 if (!get_ldev(device))
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200410 return -EIO;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700411
412 /* GFP_TRY, because if there is no memory available right now, this may
413 * be rescheduled for later. It is "only" background resync, after all. */
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200414 peer_req = drbd_alloc_peer_req(peer_device, ID_SYNCER /* unused */, sector,
Lars Ellenberg9104d312016-06-14 00:26:31 +0200415 size, size, GFP_TRY);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100416 if (!peer_req)
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200417 goto defer;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700418
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200419 peer_req->w.cb = w_e_send_csum;
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200420 spin_lock_irq(&device->resource->req_lock);
Lars Ellenbergb9ed7082014-04-23 12:15:35 +0200421 list_add_tail(&peer_req->w.list, &device->read_ee);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200422 spin_unlock_irq(&device->resource->req_lock);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700423
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200424 atomic_add(size >> 9, &device->rs_sect_ev);
Mike Christiebb3cc852016-06-05 14:32:06 -0500425 if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0,
426 DRBD_FAULT_RS_RD) == 0)
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200427 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700428
Lars Ellenberg10f6d9922011-01-24 14:47:09 +0100429 /* If it failed because of ENOMEM, retry should help. If it failed
430 * because bio_add_page failed (probably broken lower level driver),
431 * retry may or may not help.
432 * If it does not, you may need to force disconnect. */
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200433 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200434 list_del(&peer_req->w.list);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200435 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg22cc37a2010-09-14 20:40:41 +0200436
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200437 drbd_free_peer_req(device, peer_req);
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200438defer:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200439 put_ldev(device);
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200440 return -EAGAIN;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700441}
442
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100443int w_resync_timer(struct drbd_work *w, int cancel)
Philipp Reisner794abb72010-12-27 11:51:23 +0100444{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200445 struct drbd_device *device =
446 container_of(w, struct drbd_device, resync_work);
447
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200448 switch (device->state.conn) {
Philipp Reisner794abb72010-12-27 11:51:23 +0100449 case C_VERIFY_S:
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200450 make_ov_request(device, cancel);
Philipp Reisner794abb72010-12-27 11:51:23 +0100451 break;
452 case C_SYNC_TARGET:
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200453 make_resync_request(device, cancel);
Philipp Reisner794abb72010-12-27 11:51:23 +0100454 break;
455 }
456
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100457 return 0;
Philipp Reisner794abb72010-12-27 11:51:23 +0100458}
459
Kees Cook2bccef32017-10-17 20:33:01 -0700460void resync_timer_fn(struct timer_list *t)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700461{
Kees Cook2bccef32017-10-17 20:33:01 -0700462 struct drbd_device *device = from_timer(device, t, resync_timer);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700463
Lars Ellenberg15e26f6a2014-04-28 11:43:21 +0200464 drbd_queue_work_if_unqueued(
465 &first_peer_device(device)->connection->sender_work,
466 &device->resync_work);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700467}
468
Philipp Reisner778f2712010-07-06 11:14:00 +0200469static void fifo_set(struct fifo_buffer *fb, int value)
470{
471 int i;
472
473 for (i = 0; i < fb->size; i++)
Philipp Reisnerf10f2622010-10-05 16:50:17 +0200474 fb->values[i] = value;
Philipp Reisner778f2712010-07-06 11:14:00 +0200475}
476
477static int fifo_push(struct fifo_buffer *fb, int value)
478{
479 int ov;
480
481 ov = fb->values[fb->head_index];
482 fb->values[fb->head_index++] = value;
483
484 if (fb->head_index >= fb->size)
485 fb->head_index = 0;
486
487 return ov;
488}
489
490static void fifo_add_val(struct fifo_buffer *fb, int value)
491{
492 int i;
493
494 for (i = 0; i < fb->size; i++)
495 fb->values[i] += value;
496}
497
Philipp Reisner9958c852011-05-03 16:19:31 +0200498struct fifo_buffer *fifo_alloc(int fifo_size)
499{
500 struct fifo_buffer *fb;
501
Lars Ellenberg8747d302012-09-26 14:22:40 +0200502 fb = kzalloc(sizeof(struct fifo_buffer) + sizeof(int) * fifo_size, GFP_NOIO);
Philipp Reisner9958c852011-05-03 16:19:31 +0200503 if (!fb)
504 return NULL;
505
506 fb->head_index = 0;
507 fb->size = fifo_size;
508 fb->total = 0;
509
510 return fb;
511}
512
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200513static int drbd_rs_controller(struct drbd_device *device, unsigned int sect_in)
Philipp Reisner778f2712010-07-06 11:14:00 +0200514{
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200515 struct disk_conf *dc;
Lars Ellenberg7f34f612014-04-22 16:37:16 +0200516 unsigned int want; /* The number of sectors we want in-flight */
Philipp Reisner778f2712010-07-06 11:14:00 +0200517 int req_sect; /* Number of sectors to request in this turn */
Lars Ellenberg7f34f612014-04-22 16:37:16 +0200518 int correction; /* Number of sectors more we need in-flight */
Philipp Reisner778f2712010-07-06 11:14:00 +0200519 int cps; /* correction per invocation of drbd_rs_controller() */
520 int steps; /* Number of time steps to plan ahead */
521 int curr_corr;
522 int max_sect;
Philipp Reisner813472c2011-05-03 16:47:02 +0200523 struct fifo_buffer *plan;
Philipp Reisner778f2712010-07-06 11:14:00 +0200524
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200525 dc = rcu_dereference(device->ldev->disk_conf);
526 plan = rcu_dereference(device->rs_plan_s);
Philipp Reisner778f2712010-07-06 11:14:00 +0200527
Philipp Reisner813472c2011-05-03 16:47:02 +0200528 steps = plan->size; /* (dc->c_plan_ahead * 10 * SLEEP_TIME) / HZ; */
Philipp Reisner778f2712010-07-06 11:14:00 +0200529
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200530 if (device->rs_in_flight + sect_in == 0) { /* At start of resync */
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200531 want = ((dc->resync_rate * 2 * SLEEP_TIME) / HZ) * steps;
Philipp Reisner778f2712010-07-06 11:14:00 +0200532 } else { /* normal path */
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200533 want = dc->c_fill_target ? dc->c_fill_target :
534 sect_in * dc->c_delay_target * HZ / (SLEEP_TIME * 10);
Philipp Reisner778f2712010-07-06 11:14:00 +0200535 }
536
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200537 correction = want - device->rs_in_flight - plan->total;
Philipp Reisner778f2712010-07-06 11:14:00 +0200538
539 /* Plan ahead */
540 cps = correction / steps;
Philipp Reisner813472c2011-05-03 16:47:02 +0200541 fifo_add_val(plan, cps);
542 plan->total += cps * steps;
Philipp Reisner778f2712010-07-06 11:14:00 +0200543
544 /* What we do in this step */
Philipp Reisner813472c2011-05-03 16:47:02 +0200545 curr_corr = fifo_push(plan, 0);
546 plan->total -= curr_corr;
Philipp Reisner778f2712010-07-06 11:14:00 +0200547
548 req_sect = sect_in + curr_corr;
549 if (req_sect < 0)
550 req_sect = 0;
551
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200552 max_sect = (dc->c_max_rate * 2 * SLEEP_TIME) / HZ;
Philipp Reisner778f2712010-07-06 11:14:00 +0200553 if (req_sect > max_sect)
554 req_sect = max_sect;
555
556 /*
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200557 drbd_warn(device, "si=%u if=%d wa=%u co=%d st=%d cps=%d pl=%d cc=%d rs=%d\n",
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200558 sect_in, device->rs_in_flight, want, correction,
559 steps, cps, device->rs_planed, curr_corr, req_sect);
Philipp Reisner778f2712010-07-06 11:14:00 +0200560 */
561
562 return req_sect;
563}
564
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200565static int drbd_rs_number_requests(struct drbd_device *device)
Lars Ellenberge65f4402010-11-05 10:04:07 +0100566{
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200567 unsigned int sect_in; /* Number of sectors that came in since the last turn */
568 int number, mxb;
569
570 sect_in = atomic_xchg(&device->rs_sect_in, 0);
571 device->rs_in_flight -= sect_in;
Philipp Reisner813472c2011-05-03 16:47:02 +0200572
573 rcu_read_lock();
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200574 mxb = drbd_get_max_buffers(device) / 2;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200575 if (rcu_dereference(device->rs_plan_s)->size) {
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200576 number = drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200577 device->c_sync_rate = number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIME;
Lars Ellenberge65f4402010-11-05 10:04:07 +0100578 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200579 device->c_sync_rate = rcu_dereference(device->ldev->disk_conf)->resync_rate;
580 number = SLEEP_TIME * device->c_sync_rate / ((BM_BLOCK_SIZE / 1024) * HZ);
Lars Ellenberge65f4402010-11-05 10:04:07 +0100581 }
Philipp Reisner813472c2011-05-03 16:47:02 +0200582 rcu_read_unlock();
Lars Ellenberge65f4402010-11-05 10:04:07 +0100583
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200584 /* Don't have more than "max-buffers"/2 in-flight.
585 * Otherwise we may cause the remote site to stall on drbd_alloc_pages(),
586 * potentially causing a distributed deadlock on congestion during
587 * online-verify or (checksum-based) resync, if max-buffers,
588 * socket buffer sizes and resync rate settings are mis-configured. */
Lars Ellenberg7f34f612014-04-22 16:37:16 +0200589
590 /* note that "number" is in units of "BM_BLOCK_SIZE" (which is 4k),
591 * mxb (as used here, and in drbd_alloc_pages on the peer) is
592 * "number of pages" (typically also 4k),
593 * but "rs_in_flight" is in "sectors" (512 Byte). */
594 if (mxb - device->rs_in_flight/8 < number)
595 number = mxb - device->rs_in_flight/8;
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200596
Lars Ellenberge65f4402010-11-05 10:04:07 +0100597 return number;
598}
599
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100600static int make_resync_request(struct drbd_device *const device, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700601{
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100602 struct drbd_peer_device *const peer_device = first_peer_device(device);
603 struct drbd_connection *const connection = peer_device ? peer_device->connection : NULL;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700604 unsigned long bit;
605 sector_t sector;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200606 const sector_t capacity = drbd_get_capacity(device->this_bdev);
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100607 int max_bio_size;
Lars Ellenberge65f4402010-11-05 10:04:07 +0100608 int number, rollback_i, size;
Lars Ellenberg506afb62014-01-31 14:55:12 +0100609 int align, requeue = 0;
Lars Ellenberg0f0601f2010-08-11 23:40:24 +0200610 int i = 0;
Philipp Reisner92d94ae2016-06-14 00:26:15 +0200611 int discard_granularity = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700612
613 if (unlikely(cancel))
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100614 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700615
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200616 if (device->rs_total == 0) {
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200617 /* empty resync? */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200618 drbd_resync_finished(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100619 return 0;
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200620 }
621
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200622 if (!get_ldev(device)) {
623 /* Since we only need to access device->rsync a
624 get_ldev_if_state(device,D_FAILED) would be sufficient, but
Philipp Reisnerb411b362009-09-25 16:07:19 -0700625 to continue resync with a broken disk makes no sense at
626 all */
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200627 drbd_err(device, "Disk broke down during resync!\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100628 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700629 }
630
Lars Ellenberg9104d312016-06-14 00:26:31 +0200631 if (connection->agreed_features & DRBD_FF_THIN_RESYNC) {
Philipp Reisner92d94ae2016-06-14 00:26:15 +0200632 rcu_read_lock();
633 discard_granularity = rcu_dereference(device->ldev->disk_conf)->rs_discard_granularity;
634 rcu_read_unlock();
635 }
636
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200637 max_bio_size = queue_max_hw_sectors(device->rq_queue) << 9;
638 number = drbd_rs_number_requests(device);
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200639 if (number <= 0)
Lars Ellenberg0f0601f2010-08-11 23:40:24 +0200640 goto requeue;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700641
Philipp Reisnerb411b362009-09-25 16:07:19 -0700642 for (i = 0; i < number; i++) {
Lars Ellenberg506afb62014-01-31 14:55:12 +0100643 /* Stop generating RS requests when half of the send buffer is filled,
644 * but notify TCP that we'd like to have more space. */
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100645 mutex_lock(&connection->data.mutex);
646 if (connection->data.socket) {
Lars Ellenberg506afb62014-01-31 14:55:12 +0100647 struct sock *sk = connection->data.socket->sk;
648 int queued = sk->sk_wmem_queued;
649 int sndbuf = sk->sk_sndbuf;
650 if (queued > sndbuf / 2) {
651 requeue = 1;
652 if (sk->sk_socket)
653 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
654 }
655 } else
656 requeue = 1;
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100657 mutex_unlock(&connection->data.mutex);
Lars Ellenberg506afb62014-01-31 14:55:12 +0100658 if (requeue)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700659 goto requeue;
660
661next_sector:
662 size = BM_BLOCK_SIZE;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200663 bit = drbd_bm_find_next(device, device->bm_resync_fo);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700664
Lars Ellenberg4b0715f2010-12-14 15:13:04 +0100665 if (bit == DRBD_END_OF_BITMAP) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200666 device->bm_resync_fo = drbd_bm_bits(device);
667 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100668 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700669 }
670
671 sector = BM_BIT_TO_SECT(bit);
672
Lars Ellenbergad3fee72013-12-20 11:22:13 +0100673 if (drbd_try_rs_begin_io(device, sector)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200674 device->bm_resync_fo = bit;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700675 goto requeue;
676 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200677 device->bm_resync_fo = bit + 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700678
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200679 if (unlikely(drbd_bm_test_bit(device, bit) == 0)) {
680 drbd_rs_complete_io(device, sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700681 goto next_sector;
682 }
683
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100684#if DRBD_MAX_BIO_SIZE > BM_BLOCK_SIZE
Philipp Reisnerb411b362009-09-25 16:07:19 -0700685 /* try to find some adjacent bits.
686 * we stop if we have already the maximum req size.
687 *
688 * Additionally always align bigger requests, in order to
689 * be prepared for all stripe sizes of software RAIDs.
Philipp Reisnerb411b362009-09-25 16:07:19 -0700690 */
691 align = 1;
Philipp Reisnerd2074502010-07-22 15:27:27 +0200692 rollback_i = i;
Lars Ellenberg6377b922014-04-28 18:43:17 +0200693 while (i < number) {
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100694 if (size + BM_BLOCK_SIZE > max_bio_size)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700695 break;
696
697 /* Be always aligned */
698 if (sector & ((1<<(align+3))-1))
699 break;
700
Philipp Reisner92d94ae2016-06-14 00:26:15 +0200701 if (discard_granularity && size == discard_granularity)
702 break;
703
Philipp Reisnerb411b362009-09-25 16:07:19 -0700704 /* do not cross extent boundaries */
705 if (((bit+1) & BM_BLOCKS_PER_BM_EXT_MASK) == 0)
706 break;
707 /* now, is it actually dirty, after all?
708 * caution, drbd_bm_test_bit is tri-state for some
709 * obscure reason; ( b == 0 ) would get the out-of-band
710 * only accidentally right because of the "oddly sized"
711 * adjustment below */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200712 if (drbd_bm_test_bit(device, bit+1) != 1)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700713 break;
714 bit++;
715 size += BM_BLOCK_SIZE;
716 if ((BM_BLOCK_SIZE << align) <= size)
717 align++;
718 i++;
719 }
720 /* if we merged some,
721 * reset the offset to start the next drbd_bm_find_next from */
722 if (size > BM_BLOCK_SIZE)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200723 device->bm_resync_fo = bit + 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700724#endif
725
726 /* adjust very last sectors, in case we are oddly sized */
727 if (sector + (size>>9) > capacity)
728 size = (capacity-sector)<<9;
Lars Ellenbergaaaba342014-03-18 12:30:09 +0100729
730 if (device->use_csums) {
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100731 switch (read_for_csum(peer_device, sector, size)) {
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200732 case -EIO: /* Disk failure */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200733 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100734 return -EIO;
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200735 case -EAGAIN: /* allocation failed, or ldev busy */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200736 drbd_rs_complete_io(device, sector);
737 device->bm_resync_fo = BM_SECT_TO_BIT(sector);
Philipp Reisnerd2074502010-07-22 15:27:27 +0200738 i = rollback_i;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700739 goto requeue;
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200740 case 0:
741 /* everything ok */
742 break;
743 default:
744 BUG();
Philipp Reisnerb411b362009-09-25 16:07:19 -0700745 }
746 } else {
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100747 int err;
748
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200749 inc_rs_pending(device);
Philipp Reisner92d94ae2016-06-14 00:26:15 +0200750 err = drbd_send_drequest(peer_device,
751 size == discard_granularity ? P_RS_THIN_REQ : P_RS_DATA_REQUEST,
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100752 sector, size, ID_SYNCER);
753 if (err) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200754 drbd_err(device, "drbd_send_drequest() failed, aborting...\n");
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200755 dec_rs_pending(device);
756 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100757 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700758 }
759 }
760 }
761
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200762 if (device->bm_resync_fo >= drbd_bm_bits(device)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700763 /* last syncer _request_ was sent,
764 * but the P_RS_DATA_REPLY not yet received. sync will end (and
765 * next sync group will resume), as soon as we receive the last
766 * resync data block, and the last bit is cleared.
767 * until then resync "work" is "inactive" ...
768 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200769 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100770 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700771 }
772
773 requeue:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200774 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9));
775 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME);
776 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100777 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700778}
779
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200780static int make_ov_request(struct drbd_device *device, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700781{
782 int number, i, size;
783 sector_t sector;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200784 const sector_t capacity = drbd_get_capacity(device->this_bdev);
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200785 bool stop_sector_reached = false;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700786
787 if (unlikely(cancel))
788 return 1;
789
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200790 number = drbd_rs_number_requests(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700791
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200792 sector = device->ov_position;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700793 for (i = 0; i < number; i++) {
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200794 if (sector >= capacity)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700795 return 1;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200796
797 /* We check for "finished" only in the reply path:
798 * w_e_end_ov_reply().
799 * We need to send at least one request out. */
800 stop_sector_reached = i > 0
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200801 && verify_can_do_stop_sector(device)
802 && sector >= device->ov_stop_sector;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200803 if (stop_sector_reached)
804 break;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700805
806 size = BM_BLOCK_SIZE;
807
Lars Ellenbergad3fee72013-12-20 11:22:13 +0100808 if (drbd_try_rs_begin_io(device, sector)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200809 device->ov_position = sector;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700810 goto requeue;
811 }
812
813 if (sector + (size>>9) > capacity)
814 size = (capacity-sector)<<9;
815
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200816 inc_rs_pending(device);
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200817 if (drbd_send_ov_request(first_peer_device(device), sector, size)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200818 dec_rs_pending(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700819 return 0;
820 }
821 sector += BM_SECT_PER_BIT;
822 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200823 device->ov_position = sector;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700824
825 requeue:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200826 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9));
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200827 if (i == 0 || !stop_sector_reached)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200828 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700829 return 1;
830}
831
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100832int w_ov_finished(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700833{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200834 struct drbd_device_work *dw =
835 container_of(w, struct drbd_device_work, w);
836 struct drbd_device *device = dw->device;
837 kfree(dw);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200838 ov_out_of_sync_print(device);
839 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700840
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100841 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700842}
843
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100844static int w_resync_finished(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700845{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200846 struct drbd_device_work *dw =
847 container_of(w, struct drbd_device_work, w);
848 struct drbd_device *device = dw->device;
849 kfree(dw);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700850
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200851 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700852
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100853 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700854}
855
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200856static void ping_peer(struct drbd_device *device)
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200857{
Andreas Gruenbachera6b32bc32011-05-31 14:33:49 +0200858 struct drbd_connection *connection = first_peer_device(device)->connection;
Philipp Reisner2a67d8b2011-02-09 14:10:32 +0100859
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +0200860 clear_bit(GOT_PING_ACK, &connection->flags);
861 request_ping(connection);
862 wait_event(connection->ping_wait,
863 test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_CONNECTED);
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200864}
865
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200866int drbd_resync_finished(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700867{
Lars Ellenberg26a96112016-06-14 00:26:25 +0200868 struct drbd_connection *connection = first_peer_device(device)->connection;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700869 unsigned long db, dt, dbdt;
870 unsigned long n_oos;
871 union drbd_state os, ns;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200872 struct drbd_device_work *dw;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700873 char *khelper_cmd = NULL;
Lars Ellenberg26525612010-11-05 09:56:33 +0100874 int verify_done = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700875
876 /* Remove all elements from the resync LRU. Since future actions
877 * might set bits in the (main) bitmap, then the entries in the
878 * resync LRU would be wrong. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200879 if (drbd_rs_del_all(device)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700880 /* In case this is not possible now, most probably because
881 * there are P_RS_DATA_REPLY Packets lingering on the worker's
882 * queue (or even the read operations for those packets
883 * is not finished by now). Retry in 100ms. */
884
Philipp Reisner20ee6392011-01-18 15:28:59 +0100885 schedule_timeout_interruptible(HZ / 10);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200886 dw = kmalloc(sizeof(struct drbd_device_work), GFP_ATOMIC);
887 if (dw) {
888 dw->w.cb = w_resync_finished;
889 dw->device = device;
Lars Ellenberg26a96112016-06-14 00:26:25 +0200890 drbd_queue_work(&connection->sender_work, &dw->w);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700891 return 1;
892 }
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200893 drbd_err(device, "Warn failed to drbd_rs_del_all() and to kmalloc(dw).\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -0700894 }
895
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200896 dt = (jiffies - device->rs_start - device->rs_paused) / HZ;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700897 if (dt <= 0)
898 dt = 1;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200899
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200900 db = device->rs_total;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200901 /* adjust for verify start and stop sectors, respective reached position */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200902 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T)
903 db -= device->ov_left;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200904
Philipp Reisnerb411b362009-09-25 16:07:19 -0700905 dbdt = Bit2KB(db/dt);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200906 device->rs_paused /= HZ;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700907
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200908 if (!get_ldev(device))
Philipp Reisnerb411b362009-09-25 16:07:19 -0700909 goto out;
910
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200911 ping_peer(device);
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200912
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200913 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200914 os = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700915
Lars Ellenberg26525612010-11-05 09:56:33 +0100916 verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T);
917
Philipp Reisnerb411b362009-09-25 16:07:19 -0700918 /* This protects us against multiple calls (that can happen in the presence
919 of application IO), and against connectivity loss just before we arrive here. */
920 if (os.conn <= C_CONNECTED)
921 goto out_unlock;
922
923 ns = os;
924 ns.conn = C_CONNECTED;
925
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200926 drbd_info(device, "%s done (total %lu sec; paused %lu sec; %lu K/sec)\n",
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200927 verify_done ? "Online verify" : "Resync",
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200928 dt + device->rs_paused, device->rs_paused, dbdt);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700929
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200930 n_oos = drbd_bm_total_weight(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700931
932 if (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) {
933 if (n_oos) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200934 drbd_alert(device, "Online verify found %lu %dk block out of sync!\n",
Philipp Reisnerb411b362009-09-25 16:07:19 -0700935 n_oos, Bit2KB(1));
936 khelper_cmd = "out-of-sync";
937 }
938 } else {
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +0200939 D_ASSERT(device, (n_oos - device->rs_failed) == 0);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700940
941 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T)
942 khelper_cmd = "after-resync-target";
943
Lars Ellenbergaaaba342014-03-18 12:30:09 +0100944 if (device->use_csums && device->rs_total) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200945 const unsigned long s = device->rs_same_csum;
946 const unsigned long t = device->rs_total;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700947 const int ratio =
948 (t == 0) ? 0 :
949 (t < 100000) ? ((s*100)/t) : (s/(t/100));
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200950 drbd_info(device, "%u %% had equal checksums, eliminated: %luK; "
Philipp Reisnerb411b362009-09-25 16:07:19 -0700951 "transferred %luK total %luK\n",
952 ratio,
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200953 Bit2KB(device->rs_same_csum),
954 Bit2KB(device->rs_total - device->rs_same_csum),
955 Bit2KB(device->rs_total));
Philipp Reisnerb411b362009-09-25 16:07:19 -0700956 }
957 }
958
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200959 if (device->rs_failed) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200960 drbd_info(device, " %lu failed blocks\n", device->rs_failed);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700961
962 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
963 ns.disk = D_INCONSISTENT;
964 ns.pdsk = D_UP_TO_DATE;
965 } else {
966 ns.disk = D_UP_TO_DATE;
967 ns.pdsk = D_INCONSISTENT;
968 }
969 } else {
970 ns.disk = D_UP_TO_DATE;
971 ns.pdsk = D_UP_TO_DATE;
972
973 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200974 if (device->p_uuid) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700975 int i;
976 for (i = UI_BITMAP ; i <= UI_HISTORY_END ; i++)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200977 _drbd_uuid_set(device, i, device->p_uuid[i]);
978 drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_CURRENT]);
979 _drbd_uuid_set(device, UI_CURRENT, device->p_uuid[UI_CURRENT]);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700980 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200981 drbd_err(device, "device->p_uuid is NULL! BUG\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -0700982 }
983 }
984
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100985 if (!(os.conn == C_VERIFY_S || os.conn == C_VERIFY_T)) {
986 /* for verify runs, we don't update uuids here,
987 * so there would be nothing to report. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200988 drbd_uuid_set_bm(device, 0UL);
989 drbd_print_uuids(device, "updated UUIDs");
990 if (device->p_uuid) {
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100991 /* Now the two UUID sets are equal, update what we
992 * know of the peer. */
993 int i;
994 for (i = UI_CURRENT ; i <= UI_HISTORY_END ; i++)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200995 device->p_uuid[i] = device->ldev->md.uuid[i];
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100996 }
Philipp Reisnerb411b362009-09-25 16:07:19 -0700997 }
998 }
999
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001000 _drbd_set_state(device, ns, CS_VERBOSE, NULL);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001001out_unlock:
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001002 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg26a96112016-06-14 00:26:25 +02001003
1004 /* If we have been sync source, and have an effective fencing-policy,
1005 * once *all* volumes are back in sync, call "unfence". */
1006 if (os.conn == C_SYNC_SOURCE) {
1007 enum drbd_disk_state disk_state = D_MASK;
1008 enum drbd_disk_state pdsk_state = D_MASK;
1009 enum drbd_fencing_p fp = FP_DONT_CARE;
1010
1011 rcu_read_lock();
1012 fp = rcu_dereference(device->ldev->disk_conf)->fencing;
1013 if (fp != FP_DONT_CARE) {
1014 struct drbd_peer_device *peer_device;
1015 int vnr;
1016 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
1017 struct drbd_device *device = peer_device->device;
1018 disk_state = min_t(enum drbd_disk_state, disk_state, device->state.disk);
1019 pdsk_state = min_t(enum drbd_disk_state, pdsk_state, device->state.pdsk);
1020 }
1021 }
1022 rcu_read_unlock();
1023 if (disk_state == D_UP_TO_DATE && pdsk_state == D_UP_TO_DATE)
1024 conn_khelper(connection, "unfence-peer");
1025 }
1026
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001027 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001028out:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001029 device->rs_total = 0;
1030 device->rs_failed = 0;
1031 device->rs_paused = 0;
Lars Ellenberg58ffa582012-07-26 14:09:49 +02001032
1033 /* reset start sector, if we reached end of device */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001034 if (verify_done && device->ov_left == 0)
1035 device->ov_start_sector = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001036
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001037 drbd_md_sync(device);
Lars Ellenberg13d42682010-10-13 17:37:54 +02001038
Philipp Reisnerb411b362009-09-25 16:07:19 -07001039 if (khelper_cmd)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001040 drbd_khelper(device, khelper_cmd);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001041
1042 return 1;
1043}
1044
1045/* helper */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001046static void move_to_net_ee_or_free(struct drbd_device *device, struct drbd_peer_request *peer_req)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001047{
Andreas Gruenbacher045417f2011-04-07 21:34:24 +02001048 if (drbd_peer_req_has_active_page(peer_req)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001049 /* This might happen if sendpage() has not finished */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001050 int i = (peer_req->i.size + PAGE_SIZE -1) >> PAGE_SHIFT;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001051 atomic_add(i, &device->pp_in_use_by_net);
1052 atomic_sub(i, &device->pp_in_use);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001053 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001054 list_add_tail(&peer_req->w.list, &device->net_ee);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001055 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg435f0742010-09-06 12:30:25 +02001056 wake_up(&drbd_pp_wait);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001057 } else
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001058 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001059}
1060
1061/**
1062 * w_e_end_data_req() - Worker callback, to send a P_DATA_REPLY packet in response to a P_DATA_REQUEST
Philipp Reisnerb411b362009-09-25 16:07:19 -07001063 * @w: work object.
1064 * @cancel: The connection will be closed anyways
1065 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001066int w_e_end_data_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001067{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001068 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001069 struct drbd_peer_device *peer_device = peer_req->peer_device;
1070 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001071 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001072
1073 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001074 drbd_free_peer_req(device, peer_req);
1075 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001076 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001077 }
1078
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001079 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001080 err = drbd_send_block(peer_device, P_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001081 } else {
1082 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001083 drbd_err(device, "Sending NegDReply. sector=%llus.\n",
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001084 (unsigned long long)peer_req->i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001085
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001086 err = drbd_send_ack(peer_device, P_NEG_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001087 }
1088
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001089 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001090
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001091 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001092
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001093 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001094 drbd_err(device, "drbd_send_block() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001095 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001096}
1097
Philipp Reisner700ca8c2016-06-14 00:26:13 +02001098static bool all_zero(struct drbd_peer_request *peer_req)
1099{
1100 struct page *page = peer_req->pages;
1101 unsigned int len = peer_req->i.size;
1102
1103 page_chain_for_each(page) {
1104 unsigned int l = min_t(unsigned int, len, PAGE_SIZE);
1105 unsigned int i, words = l / sizeof(long);
1106 unsigned long *d;
1107
1108 d = kmap_atomic(page);
1109 for (i = 0; i < words; i++) {
1110 if (d[i]) {
1111 kunmap_atomic(d);
1112 return false;
1113 }
1114 }
1115 kunmap_atomic(d);
1116 len -= l;
1117 }
1118
1119 return true;
1120}
1121
Philipp Reisnerb411b362009-09-25 16:07:19 -07001122/**
Andreas Gruenbachera209b4a2011-08-17 12:43:25 +02001123 * w_e_end_rsdata_req() - Worker callback to send a P_RS_DATA_REPLY packet in response to a P_RS_DATA_REQUEST
Philipp Reisnerb411b362009-09-25 16:07:19 -07001124 * @w: work object.
1125 * @cancel: The connection will be closed anyways
1126 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001127int w_e_end_rsdata_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001128{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001129 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001130 struct drbd_peer_device *peer_device = peer_req->peer_device;
1131 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001132 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001133
1134 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001135 drbd_free_peer_req(device, peer_req);
1136 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001137 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001138 }
1139
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001140 if (get_ldev_if_state(device, D_FAILED)) {
1141 drbd_rs_complete_io(device, peer_req->i.sector);
1142 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001143 }
1144
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001145 if (device->state.conn == C_AHEAD) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001146 err = drbd_send_ack(peer_device, P_RS_CANCEL, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001147 } else if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001148 if (likely(device->state.pdsk >= D_INCONSISTENT)) {
1149 inc_rs_pending(device);
Philipp Reisner700ca8c2016-06-14 00:26:13 +02001150 if (peer_req->flags & EE_RS_THIN_REQ && all_zero(peer_req))
1151 err = drbd_send_rs_deallocated(peer_device, peer_req);
1152 else
1153 err = drbd_send_block(peer_device, P_RS_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001154 } else {
1155 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001156 drbd_err(device, "Not sending RSDataReply, "
Philipp Reisnerb411b362009-09-25 16:07:19 -07001157 "partner DISKLESS!\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001158 err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001159 }
1160 } else {
1161 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001162 drbd_err(device, "Sending NegRSDReply. sector %llus.\n",
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001163 (unsigned long long)peer_req->i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001164
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001165 err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001166
1167 /* update resync data with failure */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001168 drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001169 }
1170
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001171 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001172
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001173 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001174
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001175 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001176 drbd_err(device, "drbd_send_block() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001177 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001178}
1179
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001180int w_e_end_csum_rs_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001181{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001182 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001183 struct drbd_peer_device *peer_device = peer_req->peer_device;
1184 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001185 struct digest_info *di;
1186 int digest_size;
1187 void *digest = NULL;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001188 int err, eq = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001189
1190 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001191 drbd_free_peer_req(device, peer_req);
1192 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001193 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001194 }
1195
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001196 if (get_ldev(device)) {
1197 drbd_rs_complete_io(device, peer_req->i.sector);
1198 put_ldev(device);
Lars Ellenberg1d53f092010-09-05 01:13:24 +02001199 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001200
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001201 di = peer_req->digest;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001202
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001203 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001204 /* quick hack to try to avoid a race against reconfiguration.
1205 * a real fix would be much more involved,
1206 * introducing more locking mechanisms */
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001207 if (peer_device->connection->csums_tfm) {
Herbert Xu9534d672016-01-24 21:19:21 +08001208 digest_size = crypto_ahash_digestsize(peer_device->connection->csums_tfm);
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02001209 D_ASSERT(device, digest_size == di->digest_size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001210 digest = kmalloc(digest_size, GFP_NOIO);
1211 }
1212 if (digest) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001213 drbd_csum_ee(peer_device->connection->csums_tfm, peer_req, digest);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001214 eq = !memcmp(digest, di->digest, digest_size);
1215 kfree(digest);
1216 }
1217
1218 if (eq) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001219 drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size);
Lars Ellenberg676396d2010-03-03 02:08:22 +01001220 /* rs_same_csums unit is BM_BLOCK_SIZE */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001221 device->rs_same_csum += peer_req->i.size >> BM_BLOCK_SHIFT;
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001222 err = drbd_send_ack(peer_device, P_RS_IS_IN_SYNC, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001223 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001224 inc_rs_pending(device);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001225 peer_req->block_id = ID_SYNCER; /* By setting block_id, digest pointer becomes invalid! */
1226 peer_req->flags &= ~EE_HAS_DIGEST; /* This peer request no longer has a digest pointer */
Philipp Reisner204bba92010-08-23 16:17:13 +02001227 kfree(di);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001228 err = drbd_send_block(peer_device, P_RS_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001229 }
1230 } else {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001231 err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001232 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001233 drbd_err(device, "Sending NegDReply. I guess it gets messy.\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07001234 }
1235
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001236 dec_unacked(device);
1237 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001238
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001239 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001240 drbd_err(device, "drbd_send_block/ack() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001241 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001242}
1243
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001244int w_e_end_ov_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001245{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001246 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001247 struct drbd_peer_device *peer_device = peer_req->peer_device;
1248 struct drbd_device *device = peer_device->device;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001249 sector_t sector = peer_req->i.sector;
1250 unsigned int size = peer_req->i.size;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001251 int digest_size;
1252 void *digest;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001253 int err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001254
1255 if (unlikely(cancel))
1256 goto out;
1257
Herbert Xu9534d672016-01-24 21:19:21 +08001258 digest_size = crypto_ahash_digestsize(peer_device->connection->verify_tfm);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001259 digest = kmalloc(digest_size, GFP_NOIO);
Philipp Reisner8f214202011-03-01 15:52:35 +01001260 if (!digest) {
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001261 err = 1; /* terminate the connection in case the allocation failed */
Philipp Reisner8f214202011-03-01 15:52:35 +01001262 goto out;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001263 }
1264
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001265 if (likely(!(peer_req->flags & EE_WAS_ERROR)))
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001266 drbd_csum_ee(peer_device->connection->verify_tfm, peer_req, digest);
Philipp Reisner8f214202011-03-01 15:52:35 +01001267 else
1268 memset(digest, 0, digest_size);
1269
Lars Ellenberg53ea4332011-03-08 17:11:40 +01001270 /* Free e and pages before send.
1271 * In case we block on congestion, we could otherwise run into
1272 * some distributed deadlock, if the other side blocks on
1273 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +02001274 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001275 drbd_free_peer_req(device, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001276 peer_req = NULL;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001277 inc_rs_pending(device);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001278 err = drbd_send_drequest_csum(peer_device, sector, size, digest, digest_size, P_OV_REPLY);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001279 if (err)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001280 dec_rs_pending(device);
Philipp Reisner8f214202011-03-01 15:52:35 +01001281 kfree(digest);
1282
Philipp Reisnerb411b362009-09-25 16:07:19 -07001283out:
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001284 if (peer_req)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001285 drbd_free_peer_req(device, peer_req);
1286 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001287 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001288}
1289
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001290void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector, int size)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001291{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001292 if (device->ov_last_oos_start + device->ov_last_oos_size == sector) {
1293 device->ov_last_oos_size += size>>9;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001294 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001295 device->ov_last_oos_start = sector;
1296 device->ov_last_oos_size = size>>9;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001297 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001298 drbd_set_out_of_sync(device, sector, size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001299}
1300
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001301int w_e_end_ov_reply(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001302{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001303 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001304 struct drbd_peer_device *peer_device = peer_req->peer_device;
1305 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001306 struct digest_info *di;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001307 void *digest;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001308 sector_t sector = peer_req->i.sector;
1309 unsigned int size = peer_req->i.size;
Lars Ellenberg53ea4332011-03-08 17:11:40 +01001310 int digest_size;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001311 int err, eq = 0;
Lars Ellenberg58ffa582012-07-26 14:09:49 +02001312 bool stop_sector_reached = false;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001313
1314 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001315 drbd_free_peer_req(device, peer_req);
1316 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001317 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001318 }
1319
1320 /* after "cancel", because after drbd_disconnect/drbd_rs_cancel_all
1321 * the resync lru has been cleaned up already */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001322 if (get_ldev(device)) {
1323 drbd_rs_complete_io(device, peer_req->i.sector);
1324 put_ldev(device);
Lars Ellenberg1d53f092010-09-05 01:13:24 +02001325 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001326
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001327 di = peer_req->digest;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001328
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001329 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Herbert Xu9534d672016-01-24 21:19:21 +08001330 digest_size = crypto_ahash_digestsize(peer_device->connection->verify_tfm);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001331 digest = kmalloc(digest_size, GFP_NOIO);
1332 if (digest) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001333 drbd_csum_ee(peer_device->connection->verify_tfm, peer_req, digest);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001334
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02001335 D_ASSERT(device, digest_size == di->digest_size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001336 eq = !memcmp(digest, di->digest, digest_size);
1337 kfree(digest);
1338 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001339 }
1340
Lars Ellenberg9676c762011-02-22 14:02:31 +01001341 /* Free peer_req and pages before send.
1342 * In case we block on congestion, we could otherwise run into
1343 * some distributed deadlock, if the other side blocks on
1344 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +02001345 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001346 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001347 if (!eq)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001348 drbd_ov_out_of_sync_found(device, sector, size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001349 else
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001350 ov_out_of_sync_print(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001351
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001352 err = drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size,
Andreas Gruenbacherfa79abd2011-03-16 01:31:39 +01001353 eq ? ID_IN_SYNC : ID_OUT_OF_SYNC);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001354
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001355 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001356
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001357 --device->ov_left;
Lars Ellenbergea5442a2010-11-05 09:48:01 +01001358
1359 /* let's advance progress step marks only for every other megabyte */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001360 if ((device->ov_left & 0x200) == 0x200)
1361 drbd_advance_rs_marks(device, device->ov_left);
Lars Ellenbergea5442a2010-11-05 09:48:01 +01001362
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001363 stop_sector_reached = verify_can_do_stop_sector(device) &&
1364 (sector + (size>>9)) >= device->ov_stop_sector;
Lars Ellenberg58ffa582012-07-26 14:09:49 +02001365
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001366 if (device->ov_left == 0 || stop_sector_reached) {
1367 ov_out_of_sync_print(device);
1368 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001369 }
1370
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001371 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001372}
1373
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001374/* FIXME
1375 * We need to track the number of pending barrier acks,
1376 * and to be able to wait for them.
1377 * See also comment in drbd_adm_attach before drbd_suspend_io.
1378 */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001379static int drbd_send_barrier(struct drbd_connection *connection)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001380{
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001381 struct p_barrier *p;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001382 struct drbd_socket *sock;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001383
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001384 sock = &connection->data;
1385 p = conn_prepare_command(connection, sock);
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001386 if (!p)
1387 return -EIO;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001388 p->barrier = connection->send.current_epoch_nr;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001389 p->pad = 0;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001390 connection->send.current_epoch_writes = 0;
Lars Ellenberg84d34f22015-02-19 13:54:11 +01001391 connection->send.last_sent_barrier_jif = jiffies;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001392
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001393 return conn_send_command(connection, sock, P_BARRIER, sizeof(*p), NULL, 0);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001394}
1395
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001396static int pd_send_unplug_remote(struct drbd_peer_device *pd)
1397{
1398 struct drbd_socket *sock = &pd->connection->data;
1399 if (!drbd_prepare_command(pd, sock))
1400 return -EIO;
1401 return drbd_send_command(pd, sock, P_UNPLUG_REMOTE, 0, NULL, 0);
1402}
1403
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001404int w_send_write_hint(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001405{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001406 struct drbd_device *device =
1407 container_of(w, struct drbd_device, unplug_work);
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001408
Philipp Reisnerb411b362009-09-25 16:07:19 -07001409 if (cancel)
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001410 return 0;
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001411 return pd_send_unplug_remote(first_peer_device(device));
Philipp Reisnerb411b362009-09-25 16:07:19 -07001412}
1413
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001414static void re_init_if_first_write(struct drbd_connection *connection, unsigned int epoch)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001415{
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001416 if (!connection->send.seen_any_write_yet) {
1417 connection->send.seen_any_write_yet = true;
1418 connection->send.current_epoch_nr = epoch;
1419 connection->send.current_epoch_writes = 0;
Lars Ellenberg84d34f22015-02-19 13:54:11 +01001420 connection->send.last_sent_barrier_jif = jiffies;
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001421 }
1422}
1423
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001424static void maybe_send_barrier(struct drbd_connection *connection, unsigned int epoch)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001425{
1426 /* re-init if first write on this connection */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001427 if (!connection->send.seen_any_write_yet)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001428 return;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001429 if (connection->send.current_epoch_nr != epoch) {
1430 if (connection->send.current_epoch_writes)
1431 drbd_send_barrier(connection);
1432 connection->send.current_epoch_nr = epoch;
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001433 }
1434}
1435
Andreas Gruenbacher8f7bed72010-12-19 23:53:14 +01001436int w_send_out_of_sync(struct drbd_work *w, int cancel)
Philipp Reisner73a01a12010-10-27 14:33:00 +02001437{
1438 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001439 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001440 struct drbd_peer_device *const peer_device = first_peer_device(device);
1441 struct drbd_connection *const connection = peer_device->connection;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001442 int err;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001443
1444 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001445 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001446 return 0;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001447 }
Lars Ellenberge5f891b2013-11-22 12:32:01 +01001448 req->pre_send_jif = jiffies;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001449
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001450 /* this time, no connection->send.current_epoch_writes++;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001451 * If it was sent, it was the closing barrier for the last
1452 * replicated epoch, before we went into AHEAD mode.
1453 * No more barriers will be sent, until we leave AHEAD mode again. */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001454 maybe_send_barrier(connection, req->epoch);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001455
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001456 err = drbd_send_out_of_sync(peer_device, req);
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001457 req_mod(req, OOS_HANDED_TO_NETWORK);
Philipp Reisner73a01a12010-10-27 14:33:00 +02001458
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001459 return err;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001460}
1461
Philipp Reisnerb411b362009-09-25 16:07:19 -07001462/**
1463 * w_send_dblock() - Worker callback to send a P_DATA packet in order to mirror a write request
Philipp Reisnerb411b362009-09-25 16:07:19 -07001464 * @w: work object.
1465 * @cancel: The connection will be closed anyways
1466 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001467int w_send_dblock(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001468{
1469 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001470 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001471 struct drbd_peer_device *const peer_device = first_peer_device(device);
1472 struct drbd_connection *connection = peer_device->connection;
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001473 bool do_send_unplug = req->rq_state & RQ_UNPLUG;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001474 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001475
1476 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001477 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001478 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001479 }
Lars Ellenberge5f891b2013-11-22 12:32:01 +01001480 req->pre_send_jif = jiffies;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001481
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001482 re_init_if_first_write(connection, req->epoch);
1483 maybe_send_barrier(connection, req->epoch);
1484 connection->send.current_epoch_writes++;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001485
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001486 err = drbd_send_dblock(peer_device, req);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001487 req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001488
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001489 if (do_send_unplug && !err)
1490 pd_send_unplug_remote(peer_device);
1491
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001492 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001493}
1494
1495/**
1496 * w_send_read_req() - Worker callback to send a read request (P_DATA_REQUEST) packet
Philipp Reisnerb411b362009-09-25 16:07:19 -07001497 * @w: work object.
1498 * @cancel: The connection will be closed anyways
1499 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001500int w_send_read_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001501{
1502 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001503 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001504 struct drbd_peer_device *const peer_device = first_peer_device(device);
1505 struct drbd_connection *connection = peer_device->connection;
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001506 bool do_send_unplug = req->rq_state & RQ_UNPLUG;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001507 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001508
1509 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001510 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001511 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001512 }
Lars Ellenberge5f891b2013-11-22 12:32:01 +01001513 req->pre_send_jif = jiffies;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001514
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001515 /* Even read requests may close a write epoch,
1516 * if there was any yet. */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001517 maybe_send_barrier(connection, req->epoch);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001518
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001519 err = drbd_send_drequest(peer_device, P_DATA_REQUEST, req->i.sector, req->i.size,
Andreas Gruenbacher6c1005e2011-03-16 01:34:24 +01001520 (unsigned long)req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001521
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001522 req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001523
Lars Ellenbergc51a0ef2017-08-29 10:20:32 +02001524 if (do_send_unplug && !err)
1525 pd_send_unplug_remote(peer_device);
1526
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001527 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001528}
1529
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001530int w_restart_disk_io(struct drbd_work *w, int cancel)
Philipp Reisner265be2d2010-05-31 10:14:17 +02001531{
1532 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001533 struct drbd_device *device = req->device;
Philipp Reisner265be2d2010-05-31 10:14:17 +02001534
Philipp Reisner07782862010-08-31 12:00:50 +02001535 if (bio_data_dir(req->master_bio) == WRITE && req->rq_state & RQ_IN_ACT_LOG)
Lars Ellenberg4dd726f2014-02-11 11:15:36 +01001536 drbd_al_begin_io(device, &req->i);
Philipp Reisner265be2d2010-05-31 10:14:17 +02001537
1538 drbd_req_make_private_bio(req, req->master_bio);
Christoph Hellwig74d46992017-08-23 19:10:32 +02001539 bio_set_dev(req->private_bio, device->ldev->backing_bdev);
Philipp Reisner265be2d2010-05-31 10:14:17 +02001540 generic_make_request(req->private_bio);
1541
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001542 return 0;
Philipp Reisner265be2d2010-05-31 10:14:17 +02001543}
1544
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001545static int _drbd_may_sync_now(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001546{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001547 struct drbd_device *odev = device;
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001548 int resync_after;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001549
1550 while (1) {
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001551 if (!odev->ldev || odev->state.disk == D_DISKLESS)
Philipp Reisner438c8372011-03-28 14:48:01 +02001552 return 1;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001553 rcu_read_lock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001554 resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001555 rcu_read_unlock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001556 if (resync_after == -1)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001557 return 1;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001558 odev = minor_to_device(resync_after);
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001559 if (!odev)
Andreas Gruenbacher841ce242010-12-15 19:31:20 +01001560 return 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001561 if ((odev->state.conn >= C_SYNC_SOURCE &&
1562 odev->state.conn <= C_PAUSED_SYNC_T) ||
1563 odev->state.aftr_isp || odev->state.peer_isp ||
1564 odev->state.user_isp)
1565 return 0;
1566 }
1567}
1568
1569/**
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001570 * drbd_pause_after() - Pause resync on all devices that may not resync now
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001571 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001572 *
1573 * Called from process context only (admin command and after_state_ch).
1574 */
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001575static bool drbd_pause_after(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001576{
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001577 bool changed = false;
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001578 struct drbd_device *odev;
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001579 int i;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001580
Philipp Reisner695d08f2011-04-11 22:53:32 -07001581 rcu_read_lock();
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02001582 idr_for_each_entry(&drbd_devices, odev, i) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001583 if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1584 continue;
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001585 if (!_drbd_may_sync_now(odev) &&
1586 _drbd_set_state(_NS(odev, aftr_isp, 1),
1587 CS_HARD, NULL) != SS_NOTHING_TO_DO)
1588 changed = true;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001589 }
Philipp Reisner695d08f2011-04-11 22:53:32 -07001590 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001591
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001592 return changed;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001593}
1594
1595/**
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001596 * drbd_resume_next() - Resume resync on all devices that may resync now
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001597 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001598 *
1599 * Called from process context only (admin command and worker).
1600 */
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001601static bool drbd_resume_next(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001602{
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001603 bool changed = false;
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001604 struct drbd_device *odev;
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001605 int i;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001606
Philipp Reisner695d08f2011-04-11 22:53:32 -07001607 rcu_read_lock();
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02001608 idr_for_each_entry(&drbd_devices, odev, i) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001609 if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1610 continue;
1611 if (odev->state.aftr_isp) {
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001612 if (_drbd_may_sync_now(odev) &&
1613 _drbd_set_state(_NS(odev, aftr_isp, 0),
1614 CS_HARD, NULL) != SS_NOTHING_TO_DO)
1615 changed = true;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001616 }
1617 }
Philipp Reisner695d08f2011-04-11 22:53:32 -07001618 rcu_read_unlock();
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001619 return changed;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001620}
1621
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001622void resume_next_sg(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001623{
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001624 lock_all_resources();
1625 drbd_resume_next(device);
1626 unlock_all_resources();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001627}
1628
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001629void suspend_other_sg(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001630{
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001631 lock_all_resources();
1632 drbd_pause_after(device);
1633 unlock_all_resources();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001634}
1635
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001636/* caller must lock_all_resources() */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001637enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001638{
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001639 struct drbd_device *odev;
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001640 int resync_after;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001641
1642 if (o_minor == -1)
1643 return NO_ERROR;
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001644 if (o_minor < -1 || o_minor > MINORMASK)
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001645 return ERR_RESYNC_AFTER;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001646
1647 /* check for loops */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001648 odev = minor_to_device(o_minor);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001649 while (1) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001650 if (odev == device)
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001651 return ERR_RESYNC_AFTER_CYCLE;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001652
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001653 /* You are free to depend on diskless, non-existing,
1654 * or not yet/no longer existing minors.
1655 * We only reject dependency loops.
1656 * We cannot follow the dependency chain beyond a detached or
1657 * missing minor.
1658 */
1659 if (!odev || !odev->ldev || odev->state.disk == D_DISKLESS)
1660 return NO_ERROR;
1661
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001662 rcu_read_lock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001663 resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001664 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001665 /* dependency chain ends here, no cycles. */
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001666 if (resync_after == -1)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001667 return NO_ERROR;
1668
1669 /* follow the dependency chain */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001670 odev = minor_to_device(resync_after);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001671 }
1672}
1673
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001674/* caller must lock_all_resources() */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001675void drbd_resync_after_changed(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001676{
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001677 int changed;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001678
Philipp Reisnerdc97b702011-05-03 14:27:15 +02001679 do {
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001680 changed = drbd_pause_after(device);
1681 changed |= drbd_resume_next(device);
1682 } while (changed);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001683}
1684
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001685void drbd_rs_controller_reset(struct drbd_device *device)
Lars Ellenberg9bd28d32010-11-05 09:55:18 +01001686{
Lars Ellenbergff8bd882014-11-10 17:21:12 +01001687 struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk;
Philipp Reisner813472c2011-05-03 16:47:02 +02001688 struct fifo_buffer *plan;
1689
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001690 atomic_set(&device->rs_sect_in, 0);
1691 atomic_set(&device->rs_sect_ev, 0);
1692 device->rs_in_flight = 0;
Lars Ellenbergff8bd882014-11-10 17:21:12 +01001693 device->rs_last_events =
1694 (int)part_stat_read(&disk->part0, sectors[0]) +
1695 (int)part_stat_read(&disk->part0, sectors[1]);
Philipp Reisner813472c2011-05-03 16:47:02 +02001696
1697 /* Updating the RCU protected object in place is necessary since
1698 this function gets called from atomic context.
1699 It is valid since all other updates also lead to an completely
1700 empty fifo */
1701 rcu_read_lock();
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001702 plan = rcu_dereference(device->rs_plan_s);
Philipp Reisner813472c2011-05-03 16:47:02 +02001703 plan->total = 0;
1704 fifo_set(plan, 0);
1705 rcu_read_unlock();
Lars Ellenberg9bd28d32010-11-05 09:55:18 +01001706}
1707
Kees Cook2bccef32017-10-17 20:33:01 -07001708void start_resync_timer_fn(struct timer_list *t)
Philipp Reisner1f04af32011-02-07 11:33:59 +01001709{
Kees Cook2bccef32017-10-17 20:33:01 -07001710 struct drbd_device *device = from_timer(device, t, start_resync_timer);
Lars Ellenbergac0acb92014-02-11 09:47:58 +01001711 drbd_device_post_work(device, RS_START);
Philipp Reisner1f04af32011-02-07 11:33:59 +01001712}
1713
Lars Ellenbergac0acb92014-02-11 09:47:58 +01001714static void do_start_resync(struct drbd_device *device)
Philipp Reisner1f04af32011-02-07 11:33:59 +01001715{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001716 if (atomic_read(&device->unacked_cnt) || atomic_read(&device->rs_pending_cnt)) {
Lars Ellenbergac0acb92014-02-11 09:47:58 +01001717 drbd_warn(device, "postponing start_resync ...\n");
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001718 device->start_resync_timer.expires = jiffies + HZ/10;
1719 add_timer(&device->start_resync_timer);
Lars Ellenbergac0acb92014-02-11 09:47:58 +01001720 return;
Philipp Reisner1f04af32011-02-07 11:33:59 +01001721 }
1722
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001723 drbd_start_resync(device, C_SYNC_SOURCE);
1724 clear_bit(AHEAD_TO_SYNC_SOURCE, &device->flags);
Philipp Reisner1f04af32011-02-07 11:33:59 +01001725}
1726
Lars Ellenbergaaaba342014-03-18 12:30:09 +01001727static bool use_checksum_based_resync(struct drbd_connection *connection, struct drbd_device *device)
1728{
1729 bool csums_after_crash_only;
1730 rcu_read_lock();
1731 csums_after_crash_only = rcu_dereference(connection->net_conf)->csums_after_crash_only;
1732 rcu_read_unlock();
1733 return connection->agreed_pro_version >= 89 && /* supported? */
1734 connection->csums_tfm && /* configured? */
Fabian Frederick7e5fec32016-06-14 00:26:35 +02001735 (csums_after_crash_only == false /* use for each resync? */
Lars Ellenbergaaaba342014-03-18 12:30:09 +01001736 || test_bit(CRASHED_PRIMARY, &device->flags)); /* or only after Primary crash? */
1737}
1738
Philipp Reisnerb411b362009-09-25 16:07:19 -07001739/**
1740 * drbd_start_resync() - Start the resync process
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001741 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001742 * @side: Either C_SYNC_SOURCE or C_SYNC_TARGET
1743 *
1744 * This function might bring you directly into one of the
1745 * C_PAUSED_SYNC_* states.
1746 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001747void drbd_start_resync(struct drbd_device *device, enum drbd_conns side)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001748{
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001749 struct drbd_peer_device *peer_device = first_peer_device(device);
1750 struct drbd_connection *connection = peer_device ? peer_device->connection : NULL;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001751 union drbd_state ns;
1752 int r;
1753
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001754 if (device->state.conn >= C_SYNC_SOURCE && device->state.conn < C_AHEAD) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001755 drbd_err(device, "Resync already running!\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07001756 return;
1757 }
1758
Roland Kammererd3d29482017-08-29 10:20:47 +02001759 if (!connection) {
1760 drbd_err(device, "No connection to peer, aborting!\n");
1761 return;
1762 }
1763
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001764 if (!test_bit(B_RS_H_DONE, &device->flags)) {
Philipp Reisnere64a3292011-02-05 17:34:11 +01001765 if (side == C_SYNC_TARGET) {
1766 /* Since application IO was locked out during C_WF_BITMAP_T and
1767 C_WF_SYNC_UUID we are still unmodified. Before going to C_SYNC_TARGET
1768 we check that we might make the data inconsistent. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001769 r = drbd_khelper(device, "before-resync-target");
Philipp Reisnere64a3292011-02-05 17:34:11 +01001770 r = (r >> 8) & 0xff;
1771 if (r > 0) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001772 drbd_info(device, "before-resync-target handler returned %d, "
Philipp Reisner09b9e792010-12-03 16:04:24 +01001773 "dropping connection.\n", r);
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001774 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD);
Philipp Reisner09b9e792010-12-03 16:04:24 +01001775 return;
1776 }
Philipp Reisnere64a3292011-02-05 17:34:11 +01001777 } else /* C_SYNC_SOURCE */ {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001778 r = drbd_khelper(device, "before-resync-source");
Philipp Reisnere64a3292011-02-05 17:34:11 +01001779 r = (r >> 8) & 0xff;
1780 if (r > 0) {
1781 if (r == 3) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001782 drbd_info(device, "before-resync-source handler returned %d, "
Philipp Reisnere64a3292011-02-05 17:34:11 +01001783 "ignoring. Old userland tools?", r);
1784 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001785 drbd_info(device, "before-resync-source handler returned %d, "
Philipp Reisnere64a3292011-02-05 17:34:11 +01001786 "dropping connection.\n", r);
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001787 conn_request_state(connection,
Andreas Gruenbachera6b32bc32011-05-31 14:33:49 +02001788 NS(conn, C_DISCONNECTING), CS_HARD);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001789 return;
1790 }
1791 }
Philipp Reisner09b9e792010-12-03 16:04:24 +01001792 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001793 }
1794
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001795 if (current == connection->worker.task) {
Philipp Reisnerdad20552011-02-11 19:43:55 +01001796 /* The worker should not sleep waiting for state_mutex,
Philipp Reisnere64a3292011-02-05 17:34:11 +01001797 that can take long */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001798 if (!mutex_trylock(device->state_mutex)) {
1799 set_bit(B_RS_H_DONE, &device->flags);
1800 device->start_resync_timer.expires = jiffies + HZ/5;
1801 add_timer(&device->start_resync_timer);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001802 return;
1803 }
1804 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001805 mutex_lock(device->state_mutex);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001806 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001807
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001808 lock_all_resources();
1809 clear_bit(B_RS_H_DONE, &device->flags);
Philipp Reisnera7004712013-03-27 14:08:35 +01001810 /* Did some connection breakage or IO error race with us? */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001811 if (device->state.conn < C_CONNECTED
1812 || !get_ldev_if_state(device, D_NEGOTIATING)) {
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001813 unlock_all_resources();
1814 goto out;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001815 }
1816
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001817 ns = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001818
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001819 ns.aftr_isp = !_drbd_may_sync_now(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001820
1821 ns.conn = side;
1822
1823 if (side == C_SYNC_TARGET)
1824 ns.disk = D_INCONSISTENT;
1825 else /* side == C_SYNC_SOURCE */
1826 ns.pdsk = D_INCONSISTENT;
1827
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001828 r = _drbd_set_state(device, ns, CS_VERBOSE, NULL);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001829 ns = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001830
1831 if (ns.conn < C_CONNECTED)
1832 r = SS_UNKNOWN_ERROR;
1833
1834 if (r == SS_SUCCESS) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001835 unsigned long tw = drbd_bm_total_weight(device);
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001836 unsigned long now = jiffies;
1837 int i;
1838
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001839 device->rs_failed = 0;
1840 device->rs_paused = 0;
1841 device->rs_same_csum = 0;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001842 device->rs_last_sect_ev = 0;
1843 device->rs_total = tw;
1844 device->rs_start = now;
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001845 for (i = 0; i < DRBD_SYNC_MARKS; i++) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001846 device->rs_mark_left[i] = tw;
1847 device->rs_mark_time[i] = now;
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001848 }
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001849 drbd_pause_after(device);
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01001850 /* Forget potentially stale cached per resync extent bit-counts.
1851 * Open coded drbd_rs_cancel_all(device), we already have IRQs
1852 * disabled, and know the disk state is ok. */
1853 spin_lock(&device->al_lock);
1854 lc_reset(device->resync);
1855 device->resync_locked = 0;
1856 device->resync_wenr = LC_FREE;
1857 spin_unlock(&device->al_lock);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001858 }
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001859 unlock_all_resources();
Lars Ellenberg5a22db82010-12-17 21:14:23 +01001860
Philipp Reisnerb411b362009-09-25 16:07:19 -07001861 if (r == SS_SUCCESS) {
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01001862 wake_up(&device->al_wait); /* for lc_reset() above */
Philipp Reisner328e0f12012-10-19 14:37:47 +02001863 /* reset rs_last_bcast when a resync or verify is started,
1864 * to deal with potential jiffies wrap. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001865 device->rs_last_bcast = jiffies - HZ;
Philipp Reisner328e0f12012-10-19 14:37:47 +02001866
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001867 drbd_info(device, "Began resync as %s (will sync %lu KB [%lu bits set]).\n",
Philipp Reisnerb411b362009-09-25 16:07:19 -07001868 drbd_conn_str(ns.conn),
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001869 (unsigned long) device->rs_total << (BM_BLOCK_SHIFT-10),
1870 (unsigned long) device->rs_total);
Lars Ellenbergaaaba342014-03-18 12:30:09 +01001871 if (side == C_SYNC_TARGET) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001872 device->bm_resync_fo = 0;
Lars Ellenbergaaaba342014-03-18 12:30:09 +01001873 device->use_csums = use_checksum_based_resync(connection, device);
1874 } else {
Fabian Frederick7e5fec32016-06-14 00:26:35 +02001875 device->use_csums = false;
Lars Ellenbergaaaba342014-03-18 12:30:09 +01001876 }
Lars Ellenberg6c922ed2011-01-12 11:51:13 +01001877
1878 /* Since protocol 96, we must serialize drbd_gen_and_send_sync_uuid
1879 * with w_send_oos, or the sync target will get confused as to
1880 * how much bits to resync. We cannot do that always, because for an
1881 * empty resync and protocol < 95, we need to do it here, as we call
1882 * drbd_resync_finished from here in that case.
1883 * We drbd_gen_and_send_sync_uuid here for protocol < 96,
1884 * and from after_state_ch otherwise. */
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001885 if (side == C_SYNC_SOURCE && connection->agreed_pro_version < 96)
1886 drbd_gen_and_send_sync_uuid(peer_device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001887
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001888 if (connection->agreed_pro_version < 95 && device->rs_total == 0) {
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +02001889 /* This still has a race (about when exactly the peers
1890 * detect connection loss) that can lead to a full sync
1891 * on next handshake. In 8.3.9 we fixed this with explicit
1892 * resync-finished notifications, but the fix
1893 * introduces a protocol change. Sleeping for some
1894 * time longer than the ping interval + timeout on the
1895 * SyncSource, to give the SyncTarget the chance to
1896 * detect connection loss, then waiting for a ping
1897 * response (implicit in drbd_resync_finished) reduces
1898 * the race considerably, but does not solve it. */
Philipp Reisner44ed1672011-04-19 17:10:19 +02001899 if (side == C_SYNC_SOURCE) {
1900 struct net_conf *nc;
1901 int timeo;
1902
1903 rcu_read_lock();
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001904 nc = rcu_dereference(connection->net_conf);
Philipp Reisner44ed1672011-04-19 17:10:19 +02001905 timeo = nc->ping_int * HZ + nc->ping_timeo * HZ / 9;
1906 rcu_read_unlock();
1907 schedule_timeout_interruptible(timeo);
1908 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001909 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001910 }
1911
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001912 drbd_rs_controller_reset(device);
1913 /* ns.conn may already be != device->state.conn,
Philipp Reisnerb411b362009-09-25 16:07:19 -07001914 * we may have been paused in between, or become paused until
1915 * the timer triggers.
1916 * No matter, that is handled in resync_timer_fn() */
1917 if (ns.conn == C_SYNC_TARGET)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001918 mod_timer(&device->resync_timer, jiffies);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001919
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001920 drbd_md_sync(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001921 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001922 put_ldev(device);
Andreas Gruenbacher28bc3b82014-08-14 18:33:30 +02001923out:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001924 mutex_unlock(device->state_mutex);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001925}
1926
Lars Ellenberge334f552014-02-11 09:30:49 +01001927static void update_on_disk_bitmap(struct drbd_device *device, bool resync_done)
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01001928{
1929 struct sib_info sib = { .sib_reason = SIB_SYNC_PROGRESS, };
1930 device->rs_last_bcast = jiffies;
1931
1932 if (!get_ldev(device))
1933 return;
1934
1935 drbd_bm_write_lazy(device, 0);
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01001936 if (resync_done && is_sync_state(device->state.conn))
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01001937 drbd_resync_finished(device);
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01001938
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01001939 drbd_bcast_event(device, &sib);
1940 /* update timestamp, in case it took a while to write out stuff */
1941 device->rs_last_bcast = jiffies;
1942 put_ldev(device);
1943}
1944
Lars Ellenberge334f552014-02-11 09:30:49 +01001945static void drbd_ldev_destroy(struct drbd_device *device)
1946{
1947 lc_destroy(device->resync);
1948 device->resync = NULL;
1949 lc_destroy(device->act_log);
1950 device->act_log = NULL;
Andreas Gruenbacherd1b80852014-09-11 14:29:09 +02001951
1952 __acquire(local);
Lars Ellenberg63a7c8a2015-03-26 20:53:55 +01001953 drbd_backing_dev_free(device, device->ldev);
Andreas Gruenbacherd1b80852014-09-11 14:29:09 +02001954 device->ldev = NULL;
1955 __release(local);
1956
Lars Ellenberge334f552014-02-11 09:30:49 +01001957 clear_bit(GOING_DISKLESS, &device->flags);
1958 wake_up(&device->misc_wait);
1959}
1960
1961static void go_diskless(struct drbd_device *device)
1962{
1963 D_ASSERT(device, device->state.disk == D_FAILED);
1964 /* we cannot assert local_cnt == 0 here, as get_ldev_if_state will
1965 * inc/dec it frequently. Once we are D_DISKLESS, no one will touch
1966 * the protected members anymore, though, so once put_ldev reaches zero
1967 * again, it will be safe to free them. */
1968
1969 /* Try to write changed bitmap pages, read errors may have just
1970 * set some bits outside the area covered by the activity log.
1971 *
1972 * If we have an IO error during the bitmap writeout,
1973 * we will want a full sync next time, just in case.
1974 * (Do we want a specific meta data flag for this?)
1975 *
1976 * If that does not make it to stable storage either,
1977 * we cannot do anything about that anymore.
1978 *
1979 * We still need to check if both bitmap and ldev are present, we may
1980 * end up here after a failed attach, before ldev was even assigned.
1981 */
1982 if (device->bitmap && device->ldev) {
1983 /* An interrupted resync or similar is allowed to recounts bits
1984 * while we detach.
1985 * Any modifications would not be expected anymore, though.
1986 */
1987 if (drbd_bitmap_io_from_worker(device, drbd_bm_write,
1988 "detach", BM_LOCKED_TEST_ALLOWED)) {
1989 if (test_bit(WAS_READ_ERROR, &device->flags)) {
1990 drbd_md_set_flag(device, MDF_FULL_SYNC);
1991 drbd_md_sync(device);
1992 }
1993 }
1994 }
1995
1996 drbd_force_state(device, NS(disk, D_DISKLESS));
1997}
1998
Lars Ellenbergac0acb92014-02-11 09:47:58 +01001999static int do_md_sync(struct drbd_device *device)
2000{
2001 drbd_warn(device, "md_sync_timer expired! Worker calls drbd_md_sync().\n");
2002 drbd_md_sync(device);
2003 return 0;
2004}
2005
Lars Ellenberg944410e2014-05-06 15:02:05 +02002006/* only called from drbd_worker thread, no locking */
2007void __update_timing_details(
2008 struct drbd_thread_timing_details *tdp,
2009 unsigned int *cb_nr,
2010 void *cb,
2011 const char *fn, const unsigned int line)
2012{
2013 unsigned int i = *cb_nr % DRBD_THREAD_DETAILS_HIST;
2014 struct drbd_thread_timing_details *td = tdp + i;
2015
2016 td->start_jif = jiffies;
2017 td->cb_addr = cb;
2018 td->caller_fn = fn;
2019 td->line = line;
2020 td->cb_nr = *cb_nr;
2021
2022 i = (i+1) % DRBD_THREAD_DETAILS_HIST;
2023 td = tdp + i;
2024 memset(td, 0, sizeof(*td));
2025
2026 ++(*cb_nr);
2027}
2028
Lars Ellenberge334f552014-02-11 09:30:49 +01002029static void do_device_work(struct drbd_device *device, const unsigned long todo)
2030{
Andreas Gruenbacherb47a06d2014-09-11 14:29:10 +02002031 if (test_bit(MD_SYNC, &todo))
Lars Ellenbergac0acb92014-02-11 09:47:58 +01002032 do_md_sync(device);
Andreas Gruenbacherb47a06d2014-09-11 14:29:10 +02002033 if (test_bit(RS_DONE, &todo) ||
2034 test_bit(RS_PROGRESS, &todo))
2035 update_on_disk_bitmap(device, test_bit(RS_DONE, &todo));
2036 if (test_bit(GO_DISKLESS, &todo))
Lars Ellenberge334f552014-02-11 09:30:49 +01002037 go_diskless(device);
Andreas Gruenbacherb47a06d2014-09-11 14:29:10 +02002038 if (test_bit(DESTROY_DISK, &todo))
Lars Ellenberge334f552014-02-11 09:30:49 +01002039 drbd_ldev_destroy(device);
Andreas Gruenbacherb47a06d2014-09-11 14:29:10 +02002040 if (test_bit(RS_START, &todo))
Lars Ellenbergac0acb92014-02-11 09:47:58 +01002041 do_start_resync(device);
Lars Ellenberge334f552014-02-11 09:30:49 +01002042}
2043
2044#define DRBD_DEVICE_WORK_MASK \
2045 ((1UL << GO_DISKLESS) \
2046 |(1UL << DESTROY_DISK) \
Lars Ellenbergac0acb92014-02-11 09:47:58 +01002047 |(1UL << MD_SYNC) \
2048 |(1UL << RS_START) \
Lars Ellenberge334f552014-02-11 09:30:49 +01002049 |(1UL << RS_PROGRESS) \
2050 |(1UL << RS_DONE) \
2051 )
2052
2053static unsigned long get_work_bits(unsigned long *flags)
2054{
2055 unsigned long old, new;
2056 do {
2057 old = *flags;
2058 new = old & ~DRBD_DEVICE_WORK_MASK;
2059 } while (cmpxchg(flags, old, new) != old);
2060 return old & DRBD_DEVICE_WORK_MASK;
2061}
2062
2063static void do_unqueued_work(struct drbd_connection *connection)
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01002064{
2065 struct drbd_peer_device *peer_device;
2066 int vnr;
2067
2068 rcu_read_lock();
2069 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
2070 struct drbd_device *device = peer_device->device;
Lars Ellenberge334f552014-02-11 09:30:49 +01002071 unsigned long todo = get_work_bits(&device->flags);
2072 if (!todo)
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01002073 continue;
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01002074
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01002075 kref_get(&device->kref);
2076 rcu_read_unlock();
Lars Ellenberge334f552014-02-11 09:30:49 +01002077 do_device_work(device, todo);
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01002078 kref_put(&device->kref, drbd_destroy_device);
2079 rcu_read_lock();
2080 }
2081 rcu_read_unlock();
2082}
2083
Rashika Kheriaa186e472013-12-19 15:06:10 +05302084static bool dequeue_work_batch(struct drbd_work_queue *queue, struct list_head *work_list)
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002085{
2086 spin_lock_irq(&queue->q_lock);
Lars Ellenberg15e26f6a2014-04-28 11:43:21 +02002087 list_splice_tail_init(&queue->q, work_list);
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002088 spin_unlock_irq(&queue->q_lock);
2089 return !list_empty(work_list);
2090}
2091
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02002092static void wait_for_work(struct drbd_connection *connection, struct list_head *work_list)
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002093{
2094 DEFINE_WAIT(wait);
2095 struct net_conf *nc;
2096 int uncork, cork;
2097
Lars Ellenbergabde9cc2014-09-11 14:29:11 +02002098 dequeue_work_batch(&connection->sender_work, work_list);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002099 if (!list_empty(work_list))
2100 return;
2101
2102 /* Still nothing to do?
2103 * Maybe we still need to close the current epoch,
2104 * even if no new requests are queued yet.
2105 *
2106 * Also, poke TCP, just in case.
2107 * Then wait for new work (or signal). */
2108 rcu_read_lock();
2109 nc = rcu_dereference(connection->net_conf);
2110 uncork = nc ? nc->tcp_cork : 0;
2111 rcu_read_unlock();
2112 if (uncork) {
2113 mutex_lock(&connection->data.mutex);
2114 if (connection->data.socket)
2115 drbd_tcp_uncork(connection->data.socket);
2116 mutex_unlock(&connection->data.mutex);
2117 }
2118
2119 for (;;) {
2120 int send_barrier;
2121 prepare_to_wait(&connection->sender_work.q_wait, &wait, TASK_INTERRUPTIBLE);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02002122 spin_lock_irq(&connection->resource->req_lock);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002123 spin_lock(&connection->sender_work.q_lock); /* FIXME get rid of this one? */
Lars Ellenbergbc317a92012-08-22 11:47:14 +02002124 if (!list_empty(&connection->sender_work.q))
Lars Ellenberg4dd726f2014-02-11 11:15:36 +01002125 list_splice_tail_init(&connection->sender_work.q, work_list);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002126 spin_unlock(&connection->sender_work.q_lock); /* FIXME get rid of this one? */
2127 if (!list_empty(work_list) || signal_pending(current)) {
Andreas Gruenbacher05008132011-07-07 14:19:42 +02002128 spin_unlock_irq(&connection->resource->req_lock);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002129 break;
2130 }
Lars Ellenbergf9c78122014-04-28 18:43:29 +02002131
2132 /* We found nothing new to do, no to-be-communicated request,
2133 * no other work item. We may still need to close the last
2134 * epoch. Next incoming request epoch will be connection ->
2135 * current transfer log epoch number. If that is different
2136 * from the epoch of the last request we communicated, it is
2137 * safe to send the epoch separating barrier now.
2138 */
2139 send_barrier =
2140 atomic_read(&connection->current_tle_nr) !=
2141 connection->send.current_epoch_nr;
Andreas Gruenbacher05008132011-07-07 14:19:42 +02002142 spin_unlock_irq(&connection->resource->req_lock);
Lars Ellenbergf9c78122014-04-28 18:43:29 +02002143
2144 if (send_barrier)
2145 maybe_send_barrier(connection,
2146 connection->send.current_epoch_nr + 1);
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01002147
Lars Ellenberge334f552014-02-11 09:30:49 +01002148 if (test_bit(DEVICE_WORK_PENDING, &connection->flags))
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01002149 break;
2150
Lars Ellenberga80ca1a2013-12-27 17:17:25 +01002151 /* drbd_send() may have called flush_signals() */
2152 if (get_t_state(&connection->worker) != RUNNING)
2153 break;
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01002154
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01002155 schedule();
2156 /* may be woken up for other things but new work, too,
2157 * e.g. if the current epoch got closed.
2158 * In which case we send the barrier above. */
2159 }
2160 finish_wait(&connection->sender_work.q_wait, &wait);
2161
2162 /* someone may have changed the config while we have been waiting above. */
2163 rcu_read_lock();
2164 nc = rcu_dereference(connection->net_conf);
2165 cork = nc ? nc->tcp_cork : 0;
2166 rcu_read_unlock();
2167 mutex_lock(&connection->data.mutex);
2168 if (connection->data.socket) {
2169 if (cork)
2170 drbd_tcp_cork(connection->data.socket);
2171 else if (!uncork)
2172 drbd_tcp_uncork(connection->data.socket);
2173 }
2174 mutex_unlock(&connection->data.mutex);
2175}
2176
Philipp Reisnerb411b362009-09-25 16:07:19 -07002177int drbd_worker(struct drbd_thread *thi)
2178{
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02002179 struct drbd_connection *connection = thi->connection;
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02002180 struct drbd_work *w = NULL;
Andreas Gruenbacherc06ece62011-06-21 17:23:59 +02002181 struct drbd_peer_device *peer_device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07002182 LIST_HEAD(work_list);
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002183 int vnr;
Philipp Reisnerb411b362009-09-25 16:07:19 -07002184
Andreas Gruenbachere77a0a52011-01-25 15:43:39 +01002185 while (get_t_state(thi) == RUNNING) {
Philipp Reisner80822282011-02-08 12:46:30 +01002186 drbd_thread_current_set_cpu(thi);
Philipp Reisnerb411b362009-09-25 16:07:19 -07002187
Lars Ellenberg944410e2014-05-06 15:02:05 +02002188 if (list_empty(&work_list)) {
2189 update_worker_timing_details(connection, wait_for_work);
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02002190 wait_for_work(connection, &work_list);
Lars Ellenberg944410e2014-05-06 15:02:05 +02002191 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07002192
Lars Ellenberg944410e2014-05-06 15:02:05 +02002193 if (test_and_clear_bit(DEVICE_WORK_PENDING, &connection->flags)) {
2194 update_worker_timing_details(connection, do_unqueued_work);
Lars Ellenberge334f552014-02-11 09:30:49 +01002195 do_unqueued_work(connection);
Lars Ellenberg944410e2014-05-06 15:02:05 +02002196 }
Lars Ellenberg5ab7d2c2014-01-27 15:58:22 +01002197
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002198 if (signal_pending(current)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07002199 flush_signals(current);
Philipp Reisner19393e12011-02-09 10:09:07 +01002200 if (get_t_state(thi) == RUNNING) {
Andreas Gruenbacher1ec861e2011-07-06 11:01:44 +02002201 drbd_warn(connection, "Worker got an unexpected signal\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07002202 continue;
Philipp Reisner19393e12011-02-09 10:09:07 +01002203 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07002204 break;
2205 }
2206
Andreas Gruenbachere77a0a52011-01-25 15:43:39 +01002207 if (get_t_state(thi) != RUNNING)
Philipp Reisnerb411b362009-09-25 16:07:19 -07002208 break;
Philipp Reisnerb411b362009-09-25 16:07:19 -07002209
Lars Ellenberg729e8b82014-09-11 14:29:12 +02002210 if (!list_empty(&work_list)) {
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02002211 w = list_first_entry(&work_list, struct drbd_work, list);
2212 list_del_init(&w->list);
Lars Ellenberg944410e2014-05-06 15:02:05 +02002213 update_worker_timing_details(connection, w->cb);
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02002214 if (w->cb(w, connection->cstate < C_WF_REPORT_PARAMS) == 0)
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002215 continue;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02002216 if (connection->cstate >= C_WF_REPORT_PARAMS)
2217 conn_request_state(connection, NS(conn, C_NETWORK_FAILURE), CS_HARD);
Philipp Reisnerb411b362009-09-25 16:07:19 -07002218 }
2219 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07002220
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002221 do {
Lars Ellenberg944410e2014-05-06 15:02:05 +02002222 if (test_and_clear_bit(DEVICE_WORK_PENDING, &connection->flags)) {
2223 update_worker_timing_details(connection, do_unqueued_work);
Lars Ellenberge334f552014-02-11 09:30:49 +01002224 do_unqueued_work(connection);
Lars Ellenberg944410e2014-05-06 15:02:05 +02002225 }
Lars Ellenberg729e8b82014-09-11 14:29:12 +02002226 if (!list_empty(&work_list)) {
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02002227 w = list_first_entry(&work_list, struct drbd_work, list);
2228 list_del_init(&w->list);
Lars Ellenberg944410e2014-05-06 15:02:05 +02002229 update_worker_timing_details(connection, w->cb);
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02002230 w->cb(w, 1);
Lars Ellenberg729e8b82014-09-11 14:29:12 +02002231 } else
2232 dequeue_work_batch(&connection->sender_work, &work_list);
Lars Ellenberge334f552014-02-11 09:30:49 +01002233 } while (!list_empty(&work_list) || test_bit(DEVICE_WORK_PENDING, &connection->flags));
Philipp Reisnerb411b362009-09-25 16:07:19 -07002234
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002235 rcu_read_lock();
Andreas Gruenbacherc06ece62011-06-21 17:23:59 +02002236 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
2237 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02002238 D_ASSERT(device, device->state.disk == D_DISKLESS && device->state.conn == C_STANDALONE);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02002239 kref_get(&device->kref);
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002240 rcu_read_unlock();
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02002241 drbd_device_cleanup(device);
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02002242 kref_put(&device->kref, drbd_destroy_device);
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002243 rcu_read_lock();
Philipp Reisner0e29d162011-02-18 14:23:11 +01002244 }
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002245 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07002246
2247 return 0;
2248}