blob: 59158858b17ab336153361fc11faee3b1fe7030c [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>
28#include <linux/sched.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:
46 * drbd_md_io_complete (defined here)
Andreas Gruenbacherfcefa622011-02-17 16:46:59 +010047 * drbd_request_endio (defined here)
48 * drbd_peer_request_endio (defined here)
Andreas Gruenbacherc5a91612011-01-25 17:33:38 +010049 * bm_async_io_complete (defined in drbd_bitmap.c)
50 *
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
58
59/* About the global_state_lock
60 Each state transition on an device holds a read lock. In case we have
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +020061 to evaluate the resync after dependencies, we grab a write lock, because
Philipp Reisnerb411b362009-09-25 16:07:19 -070062 we need stable states on all devices for that. */
63rwlock_t global_state_lock;
64
65/* used for synchronous meta data and bitmap IO
66 * submitted by drbd_md_sync_page_io()
67 */
68void drbd_md_io_complete(struct bio *bio, int error)
69{
70 struct drbd_md_io *md_io;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020071 struct drbd_device *device;
Philipp Reisnerb411b362009-09-25 16:07:19 -070072
73 md_io = (struct drbd_md_io *)bio->bi_private;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020074 device = container_of(md_io, struct drbd_device, md_io);
Philipp Reisnercdfda632011-07-05 15:38:59 +020075
Philipp Reisnerb411b362009-09-25 16:07:19 -070076 md_io->error = error;
77
Philipp Reisner0cfac5d2011-11-10 12:12:52 +010078 /* We grabbed an extra reference in _drbd_md_sync_page_io() to be able
79 * to timeout on the lower level device, and eventually detach from it.
80 * If this io completion runs after that timeout expired, this
81 * drbd_md_put_buffer() may allow us to finally try and re-attach.
82 * During normal operation, this only puts that extra reference
83 * down to 1 again.
84 * Make sure we first drop the reference, and only then signal
85 * completion, or we may (in drbd_al_read_log()) cycle so fast into the
86 * next drbd_md_sync_page_io(), that we trigger the
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020087 * ASSERT(atomic_read(&device->md_io_in_use) == 1) there.
Philipp Reisner0cfac5d2011-11-10 12:12:52 +010088 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020089 drbd_md_put_buffer(device);
Philipp Reisnercdfda632011-07-05 15:38:59 +020090 md_io->done = 1;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020091 wake_up(&device->misc_wait);
Philipp Reisnercdfda632011-07-05 15:38:59 +020092 bio_put(bio);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +020093 if (device->ldev) /* special case: drbd_md_read() during drbd_adm_attach() */
94 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -070095}
96
97/* reads on behalf of the partner,
98 * "submitted" by the receiver
99 */
Rashika Kheriaa186e472013-12-19 15:06:10 +0530100static void drbd_endio_read_sec_final(struct drbd_peer_request *peer_req) __releases(local)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700101{
102 unsigned long flags = 0;
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200103 struct drbd_peer_device *peer_device = peer_req->peer_device;
104 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700105
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200106 spin_lock_irqsave(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200107 device->read_cnt += peer_req->i.size >> 9;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200108 list_del(&peer_req->w.list);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200109 if (list_empty(&device->read_ee))
110 wake_up(&device->ee_wait);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100111 if (test_bit(__EE_WAS_ERROR, &peer_req->flags))
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200112 __drbd_chk_io_error(device, DRBD_READ_ERROR);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200113 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700114
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200115 drbd_queue_work(&peer_device->connection->sender_work, &peer_req->w);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200116 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700117}
118
119/* writes on behalf of the partner, or resync writes,
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200120 * "submitted" by the receiver, final stage. */
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200121void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __releases(local)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700122{
123 unsigned long flags = 0;
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200124 struct drbd_peer_device *peer_device = peer_req->peer_device;
125 struct drbd_device *device = peer_device->device;
Lars Ellenberg181286a2011-03-31 15:18:56 +0200126 struct drbd_interval i;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700127 int do_wake;
Andreas Gruenbacher579b57e2011-01-13 18:40:57 +0100128 u64 block_id;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700129 int do_al_complete_io;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700130
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100131 /* after we moved peer_req to done_ee,
Philipp Reisnerb411b362009-09-25 16:07:19 -0700132 * we may no longer access it,
133 * it may be freed/reused already!
134 * (as soon as we release the req_lock) */
Lars Ellenberg181286a2011-03-31 15:18:56 +0200135 i = peer_req->i;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100136 do_al_complete_io = peer_req->flags & EE_CALL_AL_COMPLETE_IO;
137 block_id = peer_req->block_id;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700138
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200139 spin_lock_irqsave(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200140 device->writ_cnt += peer_req->i.size >> 9;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200141 list_move_tail(&peer_req->w.list, &device->done_ee);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700142
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100143 /*
Andreas Gruenbacher5e472262011-01-27 14:42:51 +0100144 * Do not remove from the write_requests tree here: we did not send the
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100145 * Ack yet and did not wake possibly waiting conflicting requests.
146 * Removed from the tree from "drbd_process_done_ee" within the
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200147 * appropriate dw.cb (e_end_block/e_end_resync_block) or from
Andreas Gruenbacherbb3bfe92011-01-21 15:59:23 +0100148 * _drbd_clear_done_ee.
149 */
Philipp Reisnerb411b362009-09-25 16:07:19 -0700150
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200151 do_wake = list_empty(block_id == ID_SYNCER ? &device->sync_ee : &device->active_ee);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700152
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200153 /* FIXME do we want to detach for failed REQ_DISCARD?
154 * ((peer_req->flags & (EE_WAS_ERROR|EE_IS_TRIM)) == EE_WAS_ERROR) */
155 if (peer_req->flags & EE_WAS_ERROR)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200156 __drbd_chk_io_error(device, DRBD_WRITE_ERROR);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200157 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700158
Andreas Gruenbacher579b57e2011-01-13 18:40:57 +0100159 if (block_id == ID_SYNCER)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200160 drbd_rs_complete_io(device, i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700161
162 if (do_wake)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200163 wake_up(&device->ee_wait);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700164
165 if (do_al_complete_io)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200166 drbd_al_complete_io(device, &i);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700167
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200168 wake_asender(peer_device->connection);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200169 put_ldev(device);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200170}
Philipp Reisnerb411b362009-09-25 16:07:19 -0700171
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200172/* writes on behalf of the partner, or resync writes,
173 * "submitted" by the receiver.
174 */
Andreas Gruenbacherfcefa622011-02-17 16:46:59 +0100175void drbd_peer_request_endio(struct bio *bio, int error)
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200176{
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100177 struct drbd_peer_request *peer_req = bio->bi_private;
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200178 struct drbd_device *device = peer_req->peer_device->device;
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200179 int uptodate = bio_flagged(bio, BIO_UPTODATE);
180 int is_write = bio_data_dir(bio) == WRITE;
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200181 int is_discard = !!(bio->bi_rw & REQ_DISCARD);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200182
Lars Ellenberg07194272010-12-20 15:38:07 +0100183 if (error && __ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200184 drbd_warn(device, "%s: error=%d s=%llus\n",
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200185 is_write ? (is_discard ? "discard" : "write")
186 : "read", error,
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100187 (unsigned long long)peer_req->i.sector);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200188 if (!error && !uptodate) {
Lars Ellenberg07194272010-12-20 15:38:07 +0100189 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200190 drbd_warn(device, "%s: setting error to -EIO s=%llus\n",
Lars Ellenberg07194272010-12-20 15:38:07 +0100191 is_write ? "write" : "read",
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100192 (unsigned long long)peer_req->i.sector);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200193 /* strange behavior of some lower level drivers...
194 * fail the request by clearing the uptodate flag,
195 * but do not return any error?! */
196 error = -EIO;
197 }
198
199 if (error)
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100200 set_bit(__EE_WAS_ERROR, &peer_req->flags);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200201
202 bio_put(bio); /* no need for the bio anymore */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100203 if (atomic_dec_and_test(&peer_req->pending_bios)) {
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200204 if (is_write)
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100205 drbd_endio_write_sec_final(peer_req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200206 else
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100207 drbd_endio_read_sec_final(peer_req);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200208 }
Philipp Reisnerb411b362009-09-25 16:07:19 -0700209}
210
211/* read, readA or write requests on R_PRIMARY coming from drbd_make_request
212 */
Andreas Gruenbacherfcefa622011-02-17 16:46:59 +0100213void drbd_request_endio(struct bio *bio, int error)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700214{
Lars Ellenberga1154132010-11-13 20:42:29 +0100215 unsigned long flags;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700216 struct drbd_request *req = bio->bi_private;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200217 struct drbd_device *device = req->device;
Lars Ellenberga1154132010-11-13 20:42:29 +0100218 struct bio_and_error m;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700219 enum drbd_req_event what;
220 int uptodate = bio_flagged(bio, BIO_UPTODATE);
221
Philipp Reisnerb411b362009-09-25 16:07:19 -0700222 if (!error && !uptodate) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200223 drbd_warn(device, "p %s: setting error to -EIO\n",
Philipp Reisnerb411b362009-09-25 16:07:19 -0700224 bio_data_dir(bio) == WRITE ? "write" : "read");
225 /* strange behavior of some lower level drivers...
226 * fail the request by clearing the uptodate flag,
227 * but do not return any error?! */
228 error = -EIO;
229 }
230
Philipp Reisner1b6dd252012-09-04 15:16:20 +0200231
232 /* If this request was aborted locally before,
233 * but now was completed "successfully",
234 * chances are that this caused arbitrary data corruption.
235 *
236 * "aborting" requests, or force-detaching the disk, is intended for
237 * completely blocked/hung local backing devices which do no longer
238 * complete requests at all, not even do error completions. In this
239 * situation, usually a hard-reset and failover is the only way out.
240 *
241 * By "aborting", basically faking a local error-completion,
242 * we allow for a more graceful swichover by cleanly migrating services.
243 * Still the affected node has to be rebooted "soon".
244 *
245 * By completing these requests, we allow the upper layers to re-use
246 * the associated data pages.
247 *
248 * If later the local backing device "recovers", and now DMAs some data
249 * from disk into the original request pages, in the best case it will
250 * just put random data into unused pages; but typically it will corrupt
251 * meanwhile completely unrelated data, causing all sorts of damage.
252 *
253 * Which means delayed successful completion,
254 * especially for READ requests,
255 * is a reason to panic().
256 *
257 * We assume that a delayed *error* completion is OK,
258 * though we still will complain noisily about it.
259 */
260 if (unlikely(req->rq_state & RQ_LOCAL_ABORTED)) {
261 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200262 drbd_emerg(device, "delayed completion of aborted local request; disk-timeout may be too aggressive\n");
Philipp Reisner1b6dd252012-09-04 15:16:20 +0200263
264 if (!error)
265 panic("possible random memory corruption caused by delayed completion of aborted local request\n");
266 }
267
Philipp Reisnerb411b362009-09-25 16:07:19 -0700268 /* to avoid recursion in __req_mod */
269 if (unlikely(error)) {
Lars Ellenberg2f632ae2014-04-28 18:43:24 +0200270 if (bio->bi_rw & REQ_DISCARD)
271 what = (error == -EOPNOTSUPP)
272 ? DISCARD_COMPLETED_NOTSUPP
273 : DISCARD_COMPLETED_WITH_ERROR;
274 else
275 what = (bio_data_dir(bio) == WRITE)
Andreas Gruenbacher8554df12011-01-25 15:37:43 +0100276 ? WRITE_COMPLETED_WITH_ERROR
Lars Ellenberg5c3c7e62010-04-10 02:10:09 +0200277 : (bio_rw(bio) == READ)
Andreas Gruenbacher8554df12011-01-25 15:37:43 +0100278 ? READ_COMPLETED_WITH_ERROR
279 : READ_AHEAD_COMPLETED_WITH_ERROR;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700280 } else
Andreas Gruenbacher8554df12011-01-25 15:37:43 +0100281 what = COMPLETED_OK;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700282
283 bio_put(req->private_bio);
284 req->private_bio = ERR_PTR(error);
285
Lars Ellenberga1154132010-11-13 20:42:29 +0100286 /* not req_mod(), we need irqsave here! */
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200287 spin_lock_irqsave(&device->resource->req_lock, flags);
Lars Ellenberga1154132010-11-13 20:42:29 +0100288 __req_mod(req, what, &m);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200289 spin_unlock_irqrestore(&device->resource->req_lock, flags);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200290 put_ldev(device);
Lars Ellenberga1154132010-11-13 20:42:29 +0100291
292 if (m.bio)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200293 complete_master_bio(device, &m);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700294}
295
Andreas Gruenbacher79a3c8d2011-08-09 02:49:01 +0200296void drbd_csum_ee(struct crypto_hash *tfm, struct drbd_peer_request *peer_req, void *digest)
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200297{
298 struct hash_desc desc;
299 struct scatterlist sg;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100300 struct page *page = peer_req->pages;
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200301 struct page *tmp;
302 unsigned len;
303
304 desc.tfm = tfm;
305 desc.flags = 0;
306
307 sg_init_table(&sg, 1);
308 crypto_hash_init(&desc);
309
310 while ((tmp = page_chain_next(page))) {
311 /* all but the last page will be fully used */
312 sg_set_page(&sg, page, PAGE_SIZE, 0);
313 crypto_hash_update(&desc, &sg, sg.length);
314 page = tmp;
315 }
316 /* and now the last, possibly only partially used page */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100317 len = peer_req->i.size & (PAGE_SIZE - 1);
Lars Ellenberg45bb9122010-05-14 17:10:48 +0200318 sg_set_page(&sg, page, len ?: PAGE_SIZE, 0);
319 crypto_hash_update(&desc, &sg, sg.length);
320 crypto_hash_final(&desc, digest);
321}
322
Andreas Gruenbacher79a3c8d2011-08-09 02:49:01 +0200323void drbd_csum_bio(struct crypto_hash *tfm, struct bio *bio, void *digest)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700324{
325 struct hash_desc desc;
326 struct scatterlist sg;
Kent Overstreet79886132013-11-23 17:19:00 -0800327 struct bio_vec bvec;
328 struct bvec_iter iter;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700329
330 desc.tfm = tfm;
331 desc.flags = 0;
332
333 sg_init_table(&sg, 1);
334 crypto_hash_init(&desc);
335
Kent Overstreet79886132013-11-23 17:19:00 -0800336 bio_for_each_segment(bvec, bio, iter) {
337 sg_set_page(&sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700338 crypto_hash_update(&desc, &sg, sg.length);
339 }
340 crypto_hash_final(&desc, digest);
341}
342
Lars Ellenberg9676c762011-02-22 14:02:31 +0100343/* MAYBE merge common code with w_e_end_ov_req */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100344static int w_e_send_csum(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700345{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200346 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200347 struct drbd_peer_device *peer_device = peer_req->peer_device;
348 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700349 int digest_size;
350 void *digest;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100351 int err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700352
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100353 if (unlikely(cancel))
354 goto out;
355
Lars Ellenberg9676c762011-02-22 14:02:31 +0100356 if (unlikely((peer_req->flags & EE_WAS_ERROR) != 0))
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100357 goto out;
358
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200359 digest_size = crypto_hash_digestsize(peer_device->connection->csums_tfm);
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100360 digest = kmalloc(digest_size, GFP_NOIO);
361 if (digest) {
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100362 sector_t sector = peer_req->i.sector;
363 unsigned int size = peer_req->i.size;
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200364 drbd_csum_ee(peer_device->connection->csums_tfm, peer_req, digest);
Lars Ellenberg9676c762011-02-22 14:02:31 +0100365 /* Free peer_req and pages before send.
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100366 * In case we block on congestion, we could otherwise run into
367 * some distributed deadlock, if the other side blocks on
368 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +0200369 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200370 drbd_free_peer_req(device, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100371 peer_req = NULL;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200372 inc_rs_pending(device);
Andreas Gruenbacher67801392011-09-13 10:39:41 +0200373 err = drbd_send_drequest_csum(peer_device, sector, size,
Andreas Gruenbacherdb1b0b72011-03-16 01:37:21 +0100374 digest, digest_size,
375 P_CSUM_RS_REQUEST);
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100376 kfree(digest);
377 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200378 drbd_err(device, "kmalloc() of digest failed.\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100379 err = -ENOMEM;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700380 }
381
Lars Ellenberg53ea4332011-03-08 17:11:40 +0100382out:
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100383 if (peer_req)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200384 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700385
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100386 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200387 drbd_err(device, "drbd_send_drequest(..., csum) failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100388 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700389}
390
391#define GFP_TRY (__GFP_HIGHMEM | __GFP_NOWARN)
392
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200393static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, int size)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700394{
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200395 struct drbd_device *device = peer_device->device;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100396 struct drbd_peer_request *peer_req;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700397
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200398 if (!get_ldev(device))
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200399 return -EIO;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700400
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200401 if (drbd_rs_should_slow_down(device, sector))
Lars Ellenberg0f0601f2010-08-11 23:40:24 +0200402 goto defer;
403
Philipp Reisnerb411b362009-09-25 16:07:19 -0700404 /* GFP_TRY, because if there is no memory available right now, this may
405 * be rescheduled for later. It is "only" background resync, after all. */
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200406 peer_req = drbd_alloc_peer_req(peer_device, ID_SYNCER /* unused */, sector,
Lars Ellenberga0fb3c42014-04-28 18:43:23 +0200407 size, true /* has real payload */, GFP_TRY);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100408 if (!peer_req)
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200409 goto defer;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700410
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200411 peer_req->w.cb = w_e_send_csum;
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200412 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200413 list_add(&peer_req->w.list, &device->read_ee);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200414 spin_unlock_irq(&device->resource->req_lock);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700415
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200416 atomic_add(size >> 9, &device->rs_sect_ev);
417 if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0)
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200418 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700419
Lars Ellenberg10f6d9922011-01-24 14:47:09 +0100420 /* If it failed because of ENOMEM, retry should help. If it failed
421 * because bio_add_page failed (probably broken lower level driver),
422 * retry may or may not help.
423 * If it does not, you may need to force disconnect. */
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200424 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +0200425 list_del(&peer_req->w.list);
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200426 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg22cc37a2010-09-14 20:40:41 +0200427
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200428 drbd_free_peer_req(device, peer_req);
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200429defer:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200430 put_ldev(device);
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200431 return -EAGAIN;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700432}
433
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100434int w_resync_timer(struct drbd_work *w, int cancel)
Philipp Reisner794abb72010-12-27 11:51:23 +0100435{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200436 struct drbd_device *device =
437 container_of(w, struct drbd_device, resync_work);
438
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200439 switch (device->state.conn) {
Philipp Reisner794abb72010-12-27 11:51:23 +0100440 case C_VERIFY_S:
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200441 make_ov_request(device, cancel);
Philipp Reisner794abb72010-12-27 11:51:23 +0100442 break;
443 case C_SYNC_TARGET:
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200444 make_resync_request(device, cancel);
Philipp Reisner794abb72010-12-27 11:51:23 +0100445 break;
446 }
447
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100448 return 0;
Philipp Reisner794abb72010-12-27 11:51:23 +0100449}
450
Philipp Reisnerb411b362009-09-25 16:07:19 -0700451void resync_timer_fn(unsigned long data)
452{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200453 struct drbd_device *device = (struct drbd_device *) data;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700454
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200455 if (list_empty(&device->resync_work.list))
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200456 drbd_queue_work(&first_peer_device(device)->connection->sender_work,
457 &device->resync_work);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700458}
459
Philipp Reisner778f2712010-07-06 11:14:00 +0200460static void fifo_set(struct fifo_buffer *fb, int value)
461{
462 int i;
463
464 for (i = 0; i < fb->size; i++)
Philipp Reisnerf10f2622010-10-05 16:50:17 +0200465 fb->values[i] = value;
Philipp Reisner778f2712010-07-06 11:14:00 +0200466}
467
468static int fifo_push(struct fifo_buffer *fb, int value)
469{
470 int ov;
471
472 ov = fb->values[fb->head_index];
473 fb->values[fb->head_index++] = value;
474
475 if (fb->head_index >= fb->size)
476 fb->head_index = 0;
477
478 return ov;
479}
480
481static void fifo_add_val(struct fifo_buffer *fb, int value)
482{
483 int i;
484
485 for (i = 0; i < fb->size; i++)
486 fb->values[i] += value;
487}
488
Philipp Reisner9958c852011-05-03 16:19:31 +0200489struct fifo_buffer *fifo_alloc(int fifo_size)
490{
491 struct fifo_buffer *fb;
492
Lars Ellenberg8747d302012-09-26 14:22:40 +0200493 fb = kzalloc(sizeof(struct fifo_buffer) + sizeof(int) * fifo_size, GFP_NOIO);
Philipp Reisner9958c852011-05-03 16:19:31 +0200494 if (!fb)
495 return NULL;
496
497 fb->head_index = 0;
498 fb->size = fifo_size;
499 fb->total = 0;
500
501 return fb;
502}
503
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200504static int drbd_rs_controller(struct drbd_device *device, unsigned int sect_in)
Philipp Reisner778f2712010-07-06 11:14:00 +0200505{
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200506 struct disk_conf *dc;
Philipp Reisner778f2712010-07-06 11:14:00 +0200507 unsigned int want; /* The number of sectors we want in the proxy */
508 int req_sect; /* Number of sectors to request in this turn */
509 int correction; /* Number of sectors more we need in the proxy*/
510 int cps; /* correction per invocation of drbd_rs_controller() */
511 int steps; /* Number of time steps to plan ahead */
512 int curr_corr;
513 int max_sect;
Philipp Reisner813472c2011-05-03 16:47:02 +0200514 struct fifo_buffer *plan;
Philipp Reisner778f2712010-07-06 11:14:00 +0200515
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200516 dc = rcu_dereference(device->ldev->disk_conf);
517 plan = rcu_dereference(device->rs_plan_s);
Philipp Reisner778f2712010-07-06 11:14:00 +0200518
Philipp Reisner813472c2011-05-03 16:47:02 +0200519 steps = plan->size; /* (dc->c_plan_ahead * 10 * SLEEP_TIME) / HZ; */
Philipp Reisner778f2712010-07-06 11:14:00 +0200520
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200521 if (device->rs_in_flight + sect_in == 0) { /* At start of resync */
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200522 want = ((dc->resync_rate * 2 * SLEEP_TIME) / HZ) * steps;
Philipp Reisner778f2712010-07-06 11:14:00 +0200523 } else { /* normal path */
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200524 want = dc->c_fill_target ? dc->c_fill_target :
525 sect_in * dc->c_delay_target * HZ / (SLEEP_TIME * 10);
Philipp Reisner778f2712010-07-06 11:14:00 +0200526 }
527
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200528 correction = want - device->rs_in_flight - plan->total;
Philipp Reisner778f2712010-07-06 11:14:00 +0200529
530 /* Plan ahead */
531 cps = correction / steps;
Philipp Reisner813472c2011-05-03 16:47:02 +0200532 fifo_add_val(plan, cps);
533 plan->total += cps * steps;
Philipp Reisner778f2712010-07-06 11:14:00 +0200534
535 /* What we do in this step */
Philipp Reisner813472c2011-05-03 16:47:02 +0200536 curr_corr = fifo_push(plan, 0);
537 plan->total -= curr_corr;
Philipp Reisner778f2712010-07-06 11:14:00 +0200538
539 req_sect = sect_in + curr_corr;
540 if (req_sect < 0)
541 req_sect = 0;
542
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +0200543 max_sect = (dc->c_max_rate * 2 * SLEEP_TIME) / HZ;
Philipp Reisner778f2712010-07-06 11:14:00 +0200544 if (req_sect > max_sect)
545 req_sect = max_sect;
546
547 /*
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200548 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 +0200549 sect_in, device->rs_in_flight, want, correction,
550 steps, cps, device->rs_planed, curr_corr, req_sect);
Philipp Reisner778f2712010-07-06 11:14:00 +0200551 */
552
553 return req_sect;
554}
555
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200556static int drbd_rs_number_requests(struct drbd_device *device)
Lars Ellenberge65f4402010-11-05 10:04:07 +0100557{
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200558 unsigned int sect_in; /* Number of sectors that came in since the last turn */
559 int number, mxb;
560
561 sect_in = atomic_xchg(&device->rs_sect_in, 0);
562 device->rs_in_flight -= sect_in;
Philipp Reisner813472c2011-05-03 16:47:02 +0200563
564 rcu_read_lock();
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200565 mxb = drbd_get_max_buffers(device) / 2;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200566 if (rcu_dereference(device->rs_plan_s)->size) {
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200567 number = drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200568 device->c_sync_rate = number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIME;
Lars Ellenberge65f4402010-11-05 10:04:07 +0100569 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200570 device->c_sync_rate = rcu_dereference(device->ldev->disk_conf)->resync_rate;
571 number = SLEEP_TIME * device->c_sync_rate / ((BM_BLOCK_SIZE / 1024) * HZ);
Lars Ellenberge65f4402010-11-05 10:04:07 +0100572 }
Philipp Reisner813472c2011-05-03 16:47:02 +0200573 rcu_read_unlock();
Lars Ellenberge65f4402010-11-05 10:04:07 +0100574
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200575 /* Don't have more than "max-buffers"/2 in-flight.
576 * Otherwise we may cause the remote site to stall on drbd_alloc_pages(),
577 * potentially causing a distributed deadlock on congestion during
578 * online-verify or (checksum-based) resync, if max-buffers,
579 * socket buffer sizes and resync rate settings are mis-configured. */
580 if (mxb - device->rs_in_flight < number)
581 number = mxb - device->rs_in_flight;
582
Lars Ellenberge65f4402010-11-05 10:04:07 +0100583 return number;
584}
585
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100586static int make_resync_request(struct drbd_device *const device, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700587{
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100588 struct drbd_peer_device *const peer_device = first_peer_device(device);
589 struct drbd_connection *const connection = peer_device ? peer_device->connection : NULL;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700590 unsigned long bit;
591 sector_t sector;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200592 const sector_t capacity = drbd_get_capacity(device->this_bdev);
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100593 int max_bio_size;
Lars Ellenberge65f4402010-11-05 10:04:07 +0100594 int number, rollback_i, size;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700595 int align, queued, sndbuf;
Lars Ellenberg0f0601f2010-08-11 23:40:24 +0200596 int i = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700597
598 if (unlikely(cancel))
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100599 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700600
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200601 if (device->rs_total == 0) {
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200602 /* empty resync? */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200603 drbd_resync_finished(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100604 return 0;
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200605 }
606
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200607 if (!get_ldev(device)) {
608 /* Since we only need to access device->rsync a
609 get_ldev_if_state(device,D_FAILED) would be sufficient, but
Philipp Reisnerb411b362009-09-25 16:07:19 -0700610 to continue resync with a broken disk makes no sense at
611 all */
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200612 drbd_err(device, "Disk broke down during resync!\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100613 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700614 }
615
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200616 max_bio_size = queue_max_hw_sectors(device->rq_queue) << 9;
617 number = drbd_rs_number_requests(device);
Lars Ellenberg0e49d7b2014-04-28 18:43:18 +0200618 if (number <= 0)
Lars Ellenberg0f0601f2010-08-11 23:40:24 +0200619 goto requeue;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700620
Philipp Reisnerb411b362009-09-25 16:07:19 -0700621 for (i = 0; i < number; i++) {
622 /* Stop generating RS requests, when half of the send buffer is filled */
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100623 mutex_lock(&connection->data.mutex);
624 if (connection->data.socket) {
625 queued = connection->data.socket->sk->sk_wmem_queued;
626 sndbuf = connection->data.socket->sk->sk_sndbuf;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700627 } else {
628 queued = 1;
629 sndbuf = 0;
630 }
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100631 mutex_unlock(&connection->data.mutex);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700632 if (queued > sndbuf / 2)
633 goto requeue;
634
635next_sector:
636 size = BM_BLOCK_SIZE;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200637 bit = drbd_bm_find_next(device, device->bm_resync_fo);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700638
Lars Ellenberg4b0715f2010-12-14 15:13:04 +0100639 if (bit == DRBD_END_OF_BITMAP) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200640 device->bm_resync_fo = drbd_bm_bits(device);
641 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100642 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700643 }
644
645 sector = BM_BIT_TO_SECT(bit);
646
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200647 if (drbd_rs_should_slow_down(device, sector) ||
648 drbd_try_rs_begin_io(device, sector)) {
649 device->bm_resync_fo = bit;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700650 goto requeue;
651 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200652 device->bm_resync_fo = bit + 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700653
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200654 if (unlikely(drbd_bm_test_bit(device, bit) == 0)) {
655 drbd_rs_complete_io(device, sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700656 goto next_sector;
657 }
658
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100659#if DRBD_MAX_BIO_SIZE > BM_BLOCK_SIZE
Philipp Reisnerb411b362009-09-25 16:07:19 -0700660 /* try to find some adjacent bits.
661 * we stop if we have already the maximum req size.
662 *
663 * Additionally always align bigger requests, in order to
664 * be prepared for all stripe sizes of software RAIDs.
Philipp Reisnerb411b362009-09-25 16:07:19 -0700665 */
666 align = 1;
Philipp Reisnerd2074502010-07-22 15:27:27 +0200667 rollback_i = i;
Lars Ellenberg6377b922014-04-28 18:43:17 +0200668 while (i < number) {
Lars Ellenberg1816a2b2010-11-11 15:19:07 +0100669 if (size + BM_BLOCK_SIZE > max_bio_size)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700670 break;
671
672 /* Be always aligned */
673 if (sector & ((1<<(align+3))-1))
674 break;
675
676 /* do not cross extent boundaries */
677 if (((bit+1) & BM_BLOCKS_PER_BM_EXT_MASK) == 0)
678 break;
679 /* now, is it actually dirty, after all?
680 * caution, drbd_bm_test_bit is tri-state for some
681 * obscure reason; ( b == 0 ) would get the out-of-band
682 * only accidentally right because of the "oddly sized"
683 * adjustment below */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200684 if (drbd_bm_test_bit(device, bit+1) != 1)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700685 break;
686 bit++;
687 size += BM_BLOCK_SIZE;
688 if ((BM_BLOCK_SIZE << align) <= size)
689 align++;
690 i++;
691 }
692 /* if we merged some,
693 * reset the offset to start the next drbd_bm_find_next from */
694 if (size > BM_BLOCK_SIZE)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200695 device->bm_resync_fo = bit + 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700696#endif
697
698 /* adjust very last sectors, in case we are oddly sized */
699 if (sector + (size>>9) > capacity)
700 size = (capacity-sector)<<9;
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100701 if (connection->agreed_pro_version >= 89 &&
702 connection->csums_tfm) {
703 switch (read_for_csum(peer_device, sector, size)) {
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200704 case -EIO: /* Disk failure */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200705 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100706 return -EIO;
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200707 case -EAGAIN: /* allocation failed, or ldev busy */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200708 drbd_rs_complete_io(device, sector);
709 device->bm_resync_fo = BM_SECT_TO_BIT(sector);
Philipp Reisnerd2074502010-07-22 15:27:27 +0200710 i = rollback_i;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700711 goto requeue;
Lars Ellenberg80a40e42010-08-11 23:28:00 +0200712 case 0:
713 /* everything ok */
714 break;
715 default:
716 BUG();
Philipp Reisnerb411b362009-09-25 16:07:19 -0700717 }
718 } else {
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100719 int err;
720
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200721 inc_rs_pending(device);
Lars Ellenberg44a4d552013-11-22 12:40:58 +0100722 err = drbd_send_drequest(peer_device, P_RS_DATA_REQUEST,
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100723 sector, size, ID_SYNCER);
724 if (err) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200725 drbd_err(device, "drbd_send_drequest() failed, aborting...\n");
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200726 dec_rs_pending(device);
727 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100728 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700729 }
730 }
731 }
732
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200733 if (device->bm_resync_fo >= drbd_bm_bits(device)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700734 /* last syncer _request_ was sent,
735 * but the P_RS_DATA_REPLY not yet received. sync will end (and
736 * next sync group will resume), as soon as we receive the last
737 * resync data block, and the last bit is cleared.
738 * until then resync "work" is "inactive" ...
739 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200740 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100741 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700742 }
743
744 requeue:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200745 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9));
746 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME);
747 put_ldev(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100748 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700749}
750
Andreas Gruenbacherd448a2e2011-08-25 16:59:58 +0200751static int make_ov_request(struct drbd_device *device, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700752{
753 int number, i, size;
754 sector_t sector;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200755 const sector_t capacity = drbd_get_capacity(device->this_bdev);
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200756 bool stop_sector_reached = false;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700757
758 if (unlikely(cancel))
759 return 1;
760
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200761 number = drbd_rs_number_requests(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700762
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200763 sector = device->ov_position;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700764 for (i = 0; i < number; i++) {
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200765 if (sector >= capacity)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700766 return 1;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200767
768 /* We check for "finished" only in the reply path:
769 * w_e_end_ov_reply().
770 * We need to send at least one request out. */
771 stop_sector_reached = i > 0
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200772 && verify_can_do_stop_sector(device)
773 && sector >= device->ov_stop_sector;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200774 if (stop_sector_reached)
775 break;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700776
777 size = BM_BLOCK_SIZE;
778
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200779 if (drbd_rs_should_slow_down(device, sector) ||
780 drbd_try_rs_begin_io(device, sector)) {
781 device->ov_position = sector;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700782 goto requeue;
783 }
784
785 if (sector + (size>>9) > capacity)
786 size = (capacity-sector)<<9;
787
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200788 inc_rs_pending(device);
Andreas Gruenbacher69a22772011-08-09 00:47:13 +0200789 if (drbd_send_ov_request(first_peer_device(device), sector, size)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200790 dec_rs_pending(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700791 return 0;
792 }
793 sector += BM_SECT_PER_BIT;
794 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200795 device->ov_position = sector;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700796
797 requeue:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200798 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9));
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200799 if (i == 0 || !stop_sector_reached)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200800 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700801 return 1;
802}
803
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100804int w_ov_finished(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700805{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200806 struct drbd_device_work *dw =
807 container_of(w, struct drbd_device_work, w);
808 struct drbd_device *device = dw->device;
809 kfree(dw);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200810 ov_out_of_sync_print(device);
811 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700812
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100813 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700814}
815
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100816static int w_resync_finished(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700817{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200818 struct drbd_device_work *dw =
819 container_of(w, struct drbd_device_work, w);
820 struct drbd_device *device = dw->device;
821 kfree(dw);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700822
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200823 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700824
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +0100825 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700826}
827
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200828static void ping_peer(struct drbd_device *device)
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200829{
Andreas Gruenbachera6b32bc2011-05-31 14:33:49 +0200830 struct drbd_connection *connection = first_peer_device(device)->connection;
Philipp Reisner2a67d8b2011-02-09 14:10:32 +0100831
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +0200832 clear_bit(GOT_PING_ACK, &connection->flags);
833 request_ping(connection);
834 wait_event(connection->ping_wait,
835 test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_CONNECTED);
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200836}
837
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200838int drbd_resync_finished(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700839{
840 unsigned long db, dt, dbdt;
841 unsigned long n_oos;
842 union drbd_state os, ns;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200843 struct drbd_device_work *dw;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700844 char *khelper_cmd = NULL;
Lars Ellenberg26525612010-11-05 09:56:33 +0100845 int verify_done = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700846
847 /* Remove all elements from the resync LRU. Since future actions
848 * might set bits in the (main) bitmap, then the entries in the
849 * resync LRU would be wrong. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200850 if (drbd_rs_del_all(device)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700851 /* In case this is not possible now, most probably because
852 * there are P_RS_DATA_REPLY Packets lingering on the worker's
853 * queue (or even the read operations for those packets
854 * is not finished by now). Retry in 100ms. */
855
Philipp Reisner20ee6392011-01-18 15:28:59 +0100856 schedule_timeout_interruptible(HZ / 10);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200857 dw = kmalloc(sizeof(struct drbd_device_work), GFP_ATOMIC);
858 if (dw) {
859 dw->w.cb = w_resync_finished;
860 dw->device = device;
861 drbd_queue_work(&first_peer_device(device)->connection->sender_work,
862 &dw->w);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700863 return 1;
864 }
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200865 drbd_err(device, "Warn failed to drbd_rs_del_all() and to kmalloc(dw).\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -0700866 }
867
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200868 dt = (jiffies - device->rs_start - device->rs_paused) / HZ;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700869 if (dt <= 0)
870 dt = 1;
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +0200871
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200872 db = device->rs_total;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200873 /* adjust for verify start and stop sectors, respective reached position */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200874 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T)
875 db -= device->ov_left;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200876
Philipp Reisnerb411b362009-09-25 16:07:19 -0700877 dbdt = Bit2KB(db/dt);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200878 device->rs_paused /= HZ;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700879
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200880 if (!get_ldev(device))
Philipp Reisnerb411b362009-09-25 16:07:19 -0700881 goto out;
882
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200883 ping_peer(device);
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +0200884
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200885 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200886 os = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700887
Lars Ellenberg26525612010-11-05 09:56:33 +0100888 verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T);
889
Philipp Reisnerb411b362009-09-25 16:07:19 -0700890 /* This protects us against multiple calls (that can happen in the presence
891 of application IO), and against connectivity loss just before we arrive here. */
892 if (os.conn <= C_CONNECTED)
893 goto out_unlock;
894
895 ns = os;
896 ns.conn = C_CONNECTED;
897
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200898 drbd_info(device, "%s done (total %lu sec; paused %lu sec; %lu K/sec)\n",
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200899 verify_done ? "Online verify" : "Resync",
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200900 dt + device->rs_paused, device->rs_paused, dbdt);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700901
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200902 n_oos = drbd_bm_total_weight(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700903
904 if (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) {
905 if (n_oos) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200906 drbd_alert(device, "Online verify found %lu %dk block out of sync!\n",
Philipp Reisnerb411b362009-09-25 16:07:19 -0700907 n_oos, Bit2KB(1));
908 khelper_cmd = "out-of-sync";
909 }
910 } else {
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +0200911 D_ASSERT(device, (n_oos - device->rs_failed) == 0);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700912
913 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T)
914 khelper_cmd = "after-resync-target";
915
Andreas Gruenbachera6b32bc2011-05-31 14:33:49 +0200916 if (first_peer_device(device)->connection->csums_tfm && device->rs_total) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200917 const unsigned long s = device->rs_same_csum;
918 const unsigned long t = device->rs_total;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700919 const int ratio =
920 (t == 0) ? 0 :
921 (t < 100000) ? ((s*100)/t) : (s/(t/100));
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200922 drbd_info(device, "%u %% had equal checksums, eliminated: %luK; "
Philipp Reisnerb411b362009-09-25 16:07:19 -0700923 "transferred %luK total %luK\n",
924 ratio,
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200925 Bit2KB(device->rs_same_csum),
926 Bit2KB(device->rs_total - device->rs_same_csum),
927 Bit2KB(device->rs_total));
Philipp Reisnerb411b362009-09-25 16:07:19 -0700928 }
929 }
930
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200931 if (device->rs_failed) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200932 drbd_info(device, " %lu failed blocks\n", device->rs_failed);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700933
934 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
935 ns.disk = D_INCONSISTENT;
936 ns.pdsk = D_UP_TO_DATE;
937 } else {
938 ns.disk = D_UP_TO_DATE;
939 ns.pdsk = D_INCONSISTENT;
940 }
941 } else {
942 ns.disk = D_UP_TO_DATE;
943 ns.pdsk = D_UP_TO_DATE;
944
945 if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200946 if (device->p_uuid) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700947 int i;
948 for (i = UI_BITMAP ; i <= UI_HISTORY_END ; i++)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200949 _drbd_uuid_set(device, i, device->p_uuid[i]);
950 drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_CURRENT]);
951 _drbd_uuid_set(device, UI_CURRENT, device->p_uuid[UI_CURRENT]);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700952 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +0200953 drbd_err(device, "device->p_uuid is NULL! BUG\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -0700954 }
955 }
956
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100957 if (!(os.conn == C_VERIFY_S || os.conn == C_VERIFY_T)) {
958 /* for verify runs, we don't update uuids here,
959 * so there would be nothing to report. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200960 drbd_uuid_set_bm(device, 0UL);
961 drbd_print_uuids(device, "updated UUIDs");
962 if (device->p_uuid) {
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100963 /* Now the two UUID sets are equal, update what we
964 * know of the peer. */
965 int i;
966 for (i = UI_CURRENT ; i <= UI_HISTORY_END ; i++)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200967 device->p_uuid[i] = device->ldev->md.uuid[i];
Lars Ellenberg62b0da32011-01-20 13:25:21 +0100968 }
Philipp Reisnerb411b362009-09-25 16:07:19 -0700969 }
970 }
971
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200972 _drbd_set_state(device, ns, CS_VERBOSE, NULL);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700973out_unlock:
Andreas Gruenbacher05008132011-07-07 14:19:42 +0200974 spin_unlock_irq(&device->resource->req_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200975 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700976out:
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200977 device->rs_total = 0;
978 device->rs_failed = 0;
979 device->rs_paused = 0;
Lars Ellenberg58ffa582012-07-26 14:09:49 +0200980
981 /* reset start sector, if we reached end of device */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200982 if (verify_done && device->ov_left == 0)
983 device->ov_start_sector = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -0700984
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200985 drbd_md_sync(device);
Lars Ellenberg13d42682010-10-13 17:37:54 +0200986
Philipp Reisnerb411b362009-09-25 16:07:19 -0700987 if (khelper_cmd)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200988 drbd_khelper(device, khelper_cmd);
Philipp Reisnerb411b362009-09-25 16:07:19 -0700989
990 return 1;
991}
992
993/* helper */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200994static void move_to_net_ee_or_free(struct drbd_device *device, struct drbd_peer_request *peer_req)
Philipp Reisnerb411b362009-09-25 16:07:19 -0700995{
Andreas Gruenbacher045417f2011-04-07 21:34:24 +0200996 if (drbd_peer_req_has_active_page(peer_req)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -0700997 /* This might happen if sendpage() has not finished */
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +0100998 int i = (peer_req->i.size + PAGE_SIZE -1) >> PAGE_SHIFT;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +0200999 atomic_add(i, &device->pp_in_use_by_net);
1000 atomic_sub(i, &device->pp_in_use);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001001 spin_lock_irq(&device->resource->req_lock);
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001002 list_add_tail(&peer_req->w.list, &device->net_ee);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001003 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg435f0742010-09-06 12:30:25 +02001004 wake_up(&drbd_pp_wait);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001005 } else
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001006 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001007}
1008
1009/**
1010 * w_e_end_data_req() - Worker callback, to send a P_DATA_REPLY packet in response to a P_DATA_REQUEST
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001011 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001012 * @w: work object.
1013 * @cancel: The connection will be closed anyways
1014 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001015int w_e_end_data_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001016{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001017 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001018 struct drbd_peer_device *peer_device = peer_req->peer_device;
1019 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001020 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001021
1022 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001023 drbd_free_peer_req(device, peer_req);
1024 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001025 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001026 }
1027
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001028 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001029 err = drbd_send_block(peer_device, P_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001030 } else {
1031 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001032 drbd_err(device, "Sending NegDReply. sector=%llus.\n",
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001033 (unsigned long long)peer_req->i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001034
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001035 err = drbd_send_ack(peer_device, P_NEG_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001036 }
1037
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001038 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001039
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001040 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001041
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001042 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001043 drbd_err(device, "drbd_send_block() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001044 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001045}
1046
1047/**
Andreas Gruenbachera209b4a2011-08-17 12:43:25 +02001048 * 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 -07001049 * @w: work object.
1050 * @cancel: The connection will be closed anyways
1051 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001052int w_e_end_rsdata_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001053{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001054 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001055 struct drbd_peer_device *peer_device = peer_req->peer_device;
1056 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001057 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001058
1059 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001060 drbd_free_peer_req(device, peer_req);
1061 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001062 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001063 }
1064
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001065 if (get_ldev_if_state(device, D_FAILED)) {
1066 drbd_rs_complete_io(device, peer_req->i.sector);
1067 put_ldev(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001068 }
1069
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001070 if (device->state.conn == C_AHEAD) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001071 err = drbd_send_ack(peer_device, P_RS_CANCEL, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001072 } else if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001073 if (likely(device->state.pdsk >= D_INCONSISTENT)) {
1074 inc_rs_pending(device);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001075 err = drbd_send_block(peer_device, P_RS_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001076 } else {
1077 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001078 drbd_err(device, "Not sending RSDataReply, "
Philipp Reisnerb411b362009-09-25 16:07:19 -07001079 "partner DISKLESS!\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001080 err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001081 }
1082 } else {
1083 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001084 drbd_err(device, "Sending NegRSDReply. sector %llus.\n",
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001085 (unsigned long long)peer_req->i.sector);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001086
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001087 err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001088
1089 /* update resync data with failure */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001090 drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001091 }
1092
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001093 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001094
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001095 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001096
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001097 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001098 drbd_err(device, "drbd_send_block() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001099 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001100}
1101
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001102int w_e_end_csum_rs_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001103{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001104 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001105 struct drbd_peer_device *peer_device = peer_req->peer_device;
1106 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001107 struct digest_info *di;
1108 int digest_size;
1109 void *digest = NULL;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001110 int err, eq = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001111
1112 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001113 drbd_free_peer_req(device, peer_req);
1114 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001115 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001116 }
1117
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001118 if (get_ldev(device)) {
1119 drbd_rs_complete_io(device, peer_req->i.sector);
1120 put_ldev(device);
Lars Ellenberg1d53f092010-09-05 01:13:24 +02001121 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001122
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001123 di = peer_req->digest;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001124
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001125 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001126 /* quick hack to try to avoid a race against reconfiguration.
1127 * a real fix would be much more involved,
1128 * introducing more locking mechanisms */
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001129 if (peer_device->connection->csums_tfm) {
1130 digest_size = crypto_hash_digestsize(peer_device->connection->csums_tfm);
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02001131 D_ASSERT(device, digest_size == di->digest_size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001132 digest = kmalloc(digest_size, GFP_NOIO);
1133 }
1134 if (digest) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001135 drbd_csum_ee(peer_device->connection->csums_tfm, peer_req, digest);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001136 eq = !memcmp(digest, di->digest, digest_size);
1137 kfree(digest);
1138 }
1139
1140 if (eq) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001141 drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size);
Lars Ellenberg676396d2010-03-03 02:08:22 +01001142 /* rs_same_csums unit is BM_BLOCK_SIZE */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001143 device->rs_same_csum += peer_req->i.size >> BM_BLOCK_SHIFT;
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001144 err = drbd_send_ack(peer_device, P_RS_IS_IN_SYNC, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001145 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001146 inc_rs_pending(device);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001147 peer_req->block_id = ID_SYNCER; /* By setting block_id, digest pointer becomes invalid! */
1148 peer_req->flags &= ~EE_HAS_DIGEST; /* This peer request no longer has a digest pointer */
Philipp Reisner204bba92010-08-23 16:17:13 +02001149 kfree(di);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001150 err = drbd_send_block(peer_device, P_RS_DATA_REPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001151 }
1152 } else {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001153 err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001154 if (__ratelimit(&drbd_ratelimit_state))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001155 drbd_err(device, "Sending NegDReply. I guess it gets messy.\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07001156 }
1157
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001158 dec_unacked(device);
1159 move_to_net_ee_or_free(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001160
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001161 if (unlikely(err))
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001162 drbd_err(device, "drbd_send_block/ack() failed\n");
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001163 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001164}
1165
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001166int w_e_end_ov_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001167{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001168 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001169 struct drbd_peer_device *peer_device = peer_req->peer_device;
1170 struct drbd_device *device = peer_device->device;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001171 sector_t sector = peer_req->i.sector;
1172 unsigned int size = peer_req->i.size;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001173 int digest_size;
1174 void *digest;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001175 int err = 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001176
1177 if (unlikely(cancel))
1178 goto out;
1179
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001180 digest_size = crypto_hash_digestsize(peer_device->connection->verify_tfm);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001181 digest = kmalloc(digest_size, GFP_NOIO);
Philipp Reisner8f214202011-03-01 15:52:35 +01001182 if (!digest) {
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001183 err = 1; /* terminate the connection in case the allocation failed */
Philipp Reisner8f214202011-03-01 15:52:35 +01001184 goto out;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001185 }
1186
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001187 if (likely(!(peer_req->flags & EE_WAS_ERROR)))
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001188 drbd_csum_ee(peer_device->connection->verify_tfm, peer_req, digest);
Philipp Reisner8f214202011-03-01 15:52:35 +01001189 else
1190 memset(digest, 0, digest_size);
1191
Lars Ellenberg53ea4332011-03-08 17:11:40 +01001192 /* Free e and pages before send.
1193 * In case we block on congestion, we could otherwise run into
1194 * some distributed deadlock, if the other side blocks on
1195 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +02001196 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001197 drbd_free_peer_req(device, peer_req);
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001198 peer_req = NULL;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001199 inc_rs_pending(device);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001200 err = drbd_send_drequest_csum(peer_device, sector, size, digest, digest_size, P_OV_REPLY);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001201 if (err)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001202 dec_rs_pending(device);
Philipp Reisner8f214202011-03-01 15:52:35 +01001203 kfree(digest);
1204
Philipp Reisnerb411b362009-09-25 16:07:19 -07001205out:
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001206 if (peer_req)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001207 drbd_free_peer_req(device, peer_req);
1208 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001209 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001210}
1211
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001212void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector, int size)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001213{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001214 if (device->ov_last_oos_start + device->ov_last_oos_size == sector) {
1215 device->ov_last_oos_size += size>>9;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001216 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001217 device->ov_last_oos_start = sector;
1218 device->ov_last_oos_size = size>>9;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001219 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001220 drbd_set_out_of_sync(device, sector, size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001221}
1222
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001223int w_e_end_ov_reply(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001224{
Andreas Gruenbachera8cd15b2011-08-25 15:49:40 +02001225 struct drbd_peer_request *peer_req = container_of(w, struct drbd_peer_request, w);
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001226 struct drbd_peer_device *peer_device = peer_req->peer_device;
1227 struct drbd_device *device = peer_device->device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001228 struct digest_info *di;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001229 void *digest;
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001230 sector_t sector = peer_req->i.sector;
1231 unsigned int size = peer_req->i.size;
Lars Ellenberg53ea4332011-03-08 17:11:40 +01001232 int digest_size;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001233 int err, eq = 0;
Lars Ellenberg58ffa582012-07-26 14:09:49 +02001234 bool stop_sector_reached = false;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001235
1236 if (unlikely(cancel)) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001237 drbd_free_peer_req(device, peer_req);
1238 dec_unacked(device);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001239 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001240 }
1241
1242 /* after "cancel", because after drbd_disconnect/drbd_rs_cancel_all
1243 * the resync lru has been cleaned up already */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001244 if (get_ldev(device)) {
1245 drbd_rs_complete_io(device, peer_req->i.sector);
1246 put_ldev(device);
Lars Ellenberg1d53f092010-09-05 01:13:24 +02001247 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001248
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001249 di = peer_req->digest;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001250
Andreas Gruenbacherdb830c42011-02-04 15:57:48 +01001251 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001252 digest_size = crypto_hash_digestsize(peer_device->connection->verify_tfm);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001253 digest = kmalloc(digest_size, GFP_NOIO);
1254 if (digest) {
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001255 drbd_csum_ee(peer_device->connection->verify_tfm, peer_req, digest);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001256
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02001257 D_ASSERT(device, digest_size == di->digest_size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001258 eq = !memcmp(digest, di->digest, digest_size);
1259 kfree(digest);
1260 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001261 }
1262
Lars Ellenberg9676c762011-02-22 14:02:31 +01001263 /* Free peer_req and pages before send.
1264 * In case we block on congestion, we could otherwise run into
1265 * some distributed deadlock, if the other side blocks on
1266 * congestion as well, because our receiver blocks in
Andreas Gruenbacherc37c8ec2011-04-07 21:02:09 +02001267 * drbd_alloc_pages due to pp_in_use > max_buffers. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001268 drbd_free_peer_req(device, peer_req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001269 if (!eq)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001270 drbd_ov_out_of_sync_found(device, sector, size);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001271 else
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001272 ov_out_of_sync_print(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001273
Andreas Gruenbacher67801392011-09-13 10:39:41 +02001274 err = drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size,
Andreas Gruenbacherfa79abd2011-03-16 01:31:39 +01001275 eq ? ID_IN_SYNC : ID_OUT_OF_SYNC);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001276
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001277 dec_unacked(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001278
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001279 --device->ov_left;
Lars Ellenbergea5442a2010-11-05 09:48:01 +01001280
1281 /* let's advance progress step marks only for every other megabyte */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001282 if ((device->ov_left & 0x200) == 0x200)
1283 drbd_advance_rs_marks(device, device->ov_left);
Lars Ellenbergea5442a2010-11-05 09:48:01 +01001284
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001285 stop_sector_reached = verify_can_do_stop_sector(device) &&
1286 (sector + (size>>9)) >= device->ov_stop_sector;
Lars Ellenberg58ffa582012-07-26 14:09:49 +02001287
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001288 if (device->ov_left == 0 || stop_sector_reached) {
1289 ov_out_of_sync_print(device);
1290 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001291 }
1292
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001293 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001294}
1295
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001296/* FIXME
1297 * We need to track the number of pending barrier acks,
1298 * and to be able to wait for them.
1299 * See also comment in drbd_adm_attach before drbd_suspend_io.
1300 */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001301static int drbd_send_barrier(struct drbd_connection *connection)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001302{
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001303 struct p_barrier *p;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001304 struct drbd_socket *sock;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001305
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001306 sock = &connection->data;
1307 p = conn_prepare_command(connection, sock);
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001308 if (!p)
1309 return -EIO;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001310 p->barrier = connection->send.current_epoch_nr;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001311 p->pad = 0;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001312 connection->send.current_epoch_writes = 0;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001313
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001314 return conn_send_command(connection, sock, P_BARRIER, sizeof(*p), NULL, 0);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001315}
1316
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001317int w_send_write_hint(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001318{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001319 struct drbd_device *device =
1320 container_of(w, struct drbd_device, unplug_work);
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001321 struct drbd_socket *sock;
1322
Philipp Reisnerb411b362009-09-25 16:07:19 -07001323 if (cancel)
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001324 return 0;
Andreas Gruenbachera6b32bc2011-05-31 14:33:49 +02001325 sock = &first_peer_device(device)->connection->data;
Andreas Gruenbacher69a22772011-08-09 00:47:13 +02001326 if (!drbd_prepare_command(first_peer_device(device), sock))
Andreas Gruenbacher9f5bdc32011-03-28 14:23:08 +02001327 return -EIO;
Andreas Gruenbacher69a22772011-08-09 00:47:13 +02001328 return drbd_send_command(first_peer_device(device), sock, P_UNPLUG_REMOTE, 0, NULL, 0);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001329}
1330
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001331static void re_init_if_first_write(struct drbd_connection *connection, unsigned int epoch)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001332{
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001333 if (!connection->send.seen_any_write_yet) {
1334 connection->send.seen_any_write_yet = true;
1335 connection->send.current_epoch_nr = epoch;
1336 connection->send.current_epoch_writes = 0;
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001337 }
1338}
1339
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001340static void maybe_send_barrier(struct drbd_connection *connection, unsigned int epoch)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001341{
1342 /* re-init if first write on this connection */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001343 if (!connection->send.seen_any_write_yet)
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001344 return;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001345 if (connection->send.current_epoch_nr != epoch) {
1346 if (connection->send.current_epoch_writes)
1347 drbd_send_barrier(connection);
1348 connection->send.current_epoch_nr = epoch;
Lars Ellenberg4eb9b3c2012-08-20 11:05:23 +02001349 }
1350}
1351
Andreas Gruenbacher8f7bed72010-12-19 23:53:14 +01001352int w_send_out_of_sync(struct drbd_work *w, int cancel)
Philipp Reisner73a01a12010-10-27 14:33:00 +02001353{
1354 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001355 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001356 struct drbd_peer_device *const peer_device = first_peer_device(device);
1357 struct drbd_connection *const connection = peer_device->connection;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001358 int err;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001359
1360 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001361 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001362 return 0;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001363 }
1364
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001365 /* this time, no connection->send.current_epoch_writes++;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001366 * If it was sent, it was the closing barrier for the last
1367 * replicated epoch, before we went into AHEAD mode.
1368 * No more barriers will be sent, until we leave AHEAD mode again. */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001369 maybe_send_barrier(connection, req->epoch);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001370
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001371 err = drbd_send_out_of_sync(peer_device, req);
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001372 req_mod(req, OOS_HANDED_TO_NETWORK);
Philipp Reisner73a01a12010-10-27 14:33:00 +02001373
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001374 return err;
Philipp Reisner73a01a12010-10-27 14:33:00 +02001375}
1376
Philipp Reisnerb411b362009-09-25 16:07:19 -07001377/**
1378 * 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 -07001379 * @w: work object.
1380 * @cancel: The connection will be closed anyways
1381 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001382int w_send_dblock(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001383{
1384 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001385 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001386 struct drbd_peer_device *const peer_device = first_peer_device(device);
1387 struct drbd_connection *connection = peer_device->connection;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001388 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001389
1390 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001391 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001392 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001393 }
1394
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001395 re_init_if_first_write(connection, req->epoch);
1396 maybe_send_barrier(connection, req->epoch);
1397 connection->send.current_epoch_writes++;
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001398
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001399 err = drbd_send_dblock(peer_device, req);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001400 req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001401
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001402 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001403}
1404
1405/**
1406 * w_send_read_req() - Worker callback to send a read request (P_DATA_REQUEST) packet
Philipp Reisnerb411b362009-09-25 16:07:19 -07001407 * @w: work object.
1408 * @cancel: The connection will be closed anyways
1409 */
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001410int w_send_read_req(struct drbd_work *w, int cancel)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001411{
1412 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001413 struct drbd_device *device = req->device;
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001414 struct drbd_peer_device *const peer_device = first_peer_device(device);
1415 struct drbd_connection *connection = peer_device->connection;
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001416 int err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001417
1418 if (unlikely(cancel)) {
Andreas Gruenbacher8554df12011-01-25 15:37:43 +01001419 req_mod(req, SEND_CANCELED);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001420 return 0;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001421 }
1422
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001423 /* Even read requests may close a write epoch,
1424 * if there was any yet. */
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001425 maybe_send_barrier(connection, req->epoch);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001426
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001427 err = drbd_send_drequest(peer_device, P_DATA_REQUEST, req->i.sector, req->i.size,
Andreas Gruenbacher6c1005e2011-03-16 01:34:24 +01001428 (unsigned long)req);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001429
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001430 req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001431
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001432 return err;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001433}
1434
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001435int w_restart_disk_io(struct drbd_work *w, int cancel)
Philipp Reisner265be2d2010-05-31 10:14:17 +02001436{
1437 struct drbd_request *req = container_of(w, struct drbd_request, w);
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001438 struct drbd_device *device = req->device;
Philipp Reisner265be2d2010-05-31 10:14:17 +02001439
Philipp Reisner07782862010-08-31 12:00:50 +02001440 if (bio_data_dir(req->master_bio) == WRITE && req->rq_state & RQ_IN_ACT_LOG)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001441 drbd_al_begin_io(device, &req->i, false);
Philipp Reisner265be2d2010-05-31 10:14:17 +02001442
1443 drbd_req_make_private_bio(req, req->master_bio);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001444 req->private_bio->bi_bdev = device->ldev->backing_bdev;
Philipp Reisner265be2d2010-05-31 10:14:17 +02001445 generic_make_request(req->private_bio);
1446
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001447 return 0;
Philipp Reisner265be2d2010-05-31 10:14:17 +02001448}
1449
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001450static int _drbd_may_sync_now(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001451{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001452 struct drbd_device *odev = device;
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001453 int resync_after;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001454
1455 while (1) {
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001456 if (!odev->ldev || odev->state.disk == D_DISKLESS)
Philipp Reisner438c8372011-03-28 14:48:01 +02001457 return 1;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001458 rcu_read_lock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001459 resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001460 rcu_read_unlock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001461 if (resync_after == -1)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001462 return 1;
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001463 odev = minor_to_device(resync_after);
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001464 if (!odev)
Andreas Gruenbacher841ce242010-12-15 19:31:20 +01001465 return 1;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001466 if ((odev->state.conn >= C_SYNC_SOURCE &&
1467 odev->state.conn <= C_PAUSED_SYNC_T) ||
1468 odev->state.aftr_isp || odev->state.peer_isp ||
1469 odev->state.user_isp)
1470 return 0;
1471 }
1472}
1473
1474/**
1475 * _drbd_pause_after() - Pause resync on all devices that may not resync now
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001476 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001477 *
1478 * Called from process context only (admin command and after_state_ch).
1479 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001480static int _drbd_pause_after(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001481{
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001482 struct drbd_device *odev;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001483 int i, rv = 0;
1484
Philipp Reisner695d08f2011-04-11 22:53:32 -07001485 rcu_read_lock();
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02001486 idr_for_each_entry(&drbd_devices, odev, i) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001487 if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1488 continue;
1489 if (!_drbd_may_sync_now(odev))
1490 rv |= (__drbd_set_state(_NS(odev, aftr_isp, 1), CS_HARD, NULL)
1491 != SS_NOTHING_TO_DO);
1492 }
Philipp Reisner695d08f2011-04-11 22:53:32 -07001493 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001494
1495 return rv;
1496}
1497
1498/**
1499 * _drbd_resume_next() - Resume resync on all devices that may resync now
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001500 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001501 *
1502 * Called from process context only (admin command and worker).
1503 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001504static int _drbd_resume_next(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001505{
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001506 struct drbd_device *odev;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001507 int i, rv = 0;
1508
Philipp Reisner695d08f2011-04-11 22:53:32 -07001509 rcu_read_lock();
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02001510 idr_for_each_entry(&drbd_devices, odev, i) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001511 if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1512 continue;
1513 if (odev->state.aftr_isp) {
1514 if (_drbd_may_sync_now(odev))
1515 rv |= (__drbd_set_state(_NS(odev, aftr_isp, 0),
1516 CS_HARD, NULL)
1517 != SS_NOTHING_TO_DO) ;
1518 }
1519 }
Philipp Reisner695d08f2011-04-11 22:53:32 -07001520 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001521 return rv;
1522}
1523
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001524void resume_next_sg(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001525{
1526 write_lock_irq(&global_state_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001527 _drbd_resume_next(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001528 write_unlock_irq(&global_state_lock);
1529}
1530
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001531void suspend_other_sg(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001532{
1533 write_lock_irq(&global_state_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001534 _drbd_pause_after(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001535 write_unlock_irq(&global_state_lock);
1536}
1537
Philipp Reisnerdc97b702011-05-03 14:27:15 +02001538/* caller must hold global_state_lock */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001539enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001540{
Andreas Gruenbacher54761692011-05-30 16:15:21 +02001541 struct drbd_device *odev;
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001542 int resync_after;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001543
1544 if (o_minor == -1)
1545 return NO_ERROR;
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001546 if (o_minor < -1 || o_minor > MINORMASK)
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001547 return ERR_RESYNC_AFTER;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001548
1549 /* check for loops */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001550 odev = minor_to_device(o_minor);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001551 while (1) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001552 if (odev == device)
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001553 return ERR_RESYNC_AFTER_CYCLE;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001554
Lars Ellenberga3f8f7d2013-03-27 14:08:43 +01001555 /* You are free to depend on diskless, non-existing,
1556 * or not yet/no longer existing minors.
1557 * We only reject dependency loops.
1558 * We cannot follow the dependency chain beyond a detached or
1559 * missing minor.
1560 */
1561 if (!odev || !odev->ldev || odev->state.disk == D_DISKLESS)
1562 return NO_ERROR;
1563
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001564 rcu_read_lock();
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001565 resync_after = rcu_dereference(odev->ldev->disk_conf)->resync_after;
Philipp Reisnerdaeda1c2011-05-03 15:00:55 +02001566 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07001567 /* dependency chain ends here, no cycles. */
Andreas Gruenbacher95f8efd2011-05-12 11:15:34 +02001568 if (resync_after == -1)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001569 return NO_ERROR;
1570
1571 /* follow the dependency chain */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001572 odev = minor_to_device(resync_after);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001573 }
1574}
1575
Philipp Reisnerdc97b702011-05-03 14:27:15 +02001576/* caller must hold global_state_lock */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001577void drbd_resync_after_changed(struct drbd_device *device)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001578{
1579 int changes;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001580
Philipp Reisnerdc97b702011-05-03 14:27:15 +02001581 do {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001582 changes = _drbd_pause_after(device);
1583 changes |= _drbd_resume_next(device);
Philipp Reisnerdc97b702011-05-03 14:27:15 +02001584 } while (changes);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001585}
1586
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001587void drbd_rs_controller_reset(struct drbd_device *device)
Lars Ellenberg9bd28d32010-11-05 09:55:18 +01001588{
Philipp Reisner813472c2011-05-03 16:47:02 +02001589 struct fifo_buffer *plan;
1590
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001591 atomic_set(&device->rs_sect_in, 0);
1592 atomic_set(&device->rs_sect_ev, 0);
1593 device->rs_in_flight = 0;
Philipp Reisner813472c2011-05-03 16:47:02 +02001594
1595 /* Updating the RCU protected object in place is necessary since
1596 this function gets called from atomic context.
1597 It is valid since all other updates also lead to an completely
1598 empty fifo */
1599 rcu_read_lock();
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001600 plan = rcu_dereference(device->rs_plan_s);
Philipp Reisner813472c2011-05-03 16:47:02 +02001601 plan->total = 0;
1602 fifo_set(plan, 0);
1603 rcu_read_unlock();
Lars Ellenberg9bd28d32010-11-05 09:55:18 +01001604}
1605
Philipp Reisner1f04af32011-02-07 11:33:59 +01001606void start_resync_timer_fn(unsigned long data)
1607{
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001608 struct drbd_device *device = (struct drbd_device *) data;
Philipp Reisner1f04af32011-02-07 11:33:59 +01001609
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001610 drbd_queue_work(&first_peer_device(device)->connection->sender_work,
1611 &device->start_resync_work);
Philipp Reisner1f04af32011-02-07 11:33:59 +01001612}
1613
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001614int w_start_resync(struct drbd_work *w, int cancel)
Philipp Reisner1f04af32011-02-07 11:33:59 +01001615{
Andreas Gruenbacher84b8c062011-07-28 15:27:51 +02001616 struct drbd_device *device =
1617 container_of(w, struct drbd_device, start_resync_work);
Philipp Reisner00d56942011-02-09 18:09:48 +01001618
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001619 if (atomic_read(&device->unacked_cnt) || atomic_read(&device->rs_pending_cnt)) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001620 drbd_warn(device, "w_start_resync later...\n");
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001621 device->start_resync_timer.expires = jiffies + HZ/10;
1622 add_timer(&device->start_resync_timer);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001623 return 0;
Philipp Reisner1f04af32011-02-07 11:33:59 +01001624 }
1625
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001626 drbd_start_resync(device, C_SYNC_SOURCE);
1627 clear_bit(AHEAD_TO_SYNC_SOURCE, &device->flags);
Andreas Gruenbacher99920dc2011-03-16 15:31:39 +01001628 return 0;
Philipp Reisner1f04af32011-02-07 11:33:59 +01001629}
1630
Philipp Reisnerb411b362009-09-25 16:07:19 -07001631/**
1632 * drbd_start_resync() - Start the resync process
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001633 * @device: DRBD device.
Philipp Reisnerb411b362009-09-25 16:07:19 -07001634 * @side: Either C_SYNC_SOURCE or C_SYNC_TARGET
1635 *
1636 * This function might bring you directly into one of the
1637 * C_PAUSED_SYNC_* states.
1638 */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001639void drbd_start_resync(struct drbd_device *device, enum drbd_conns side)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001640{
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001641 struct drbd_peer_device *peer_device = first_peer_device(device);
1642 struct drbd_connection *connection = peer_device ? peer_device->connection : NULL;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001643 union drbd_state ns;
1644 int r;
1645
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001646 if (device->state.conn >= C_SYNC_SOURCE && device->state.conn < C_AHEAD) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001647 drbd_err(device, "Resync already running!\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07001648 return;
1649 }
1650
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001651 if (!test_bit(B_RS_H_DONE, &device->flags)) {
Philipp Reisnere64a3292011-02-05 17:34:11 +01001652 if (side == C_SYNC_TARGET) {
1653 /* Since application IO was locked out during C_WF_BITMAP_T and
1654 C_WF_SYNC_UUID we are still unmodified. Before going to C_SYNC_TARGET
1655 we check that we might make the data inconsistent. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001656 r = drbd_khelper(device, "before-resync-target");
Philipp Reisnere64a3292011-02-05 17:34:11 +01001657 r = (r >> 8) & 0xff;
1658 if (r > 0) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001659 drbd_info(device, "before-resync-target handler returned %d, "
Philipp Reisner09b9e792010-12-03 16:04:24 +01001660 "dropping connection.\n", r);
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001661 conn_request_state(connection, NS(conn, C_DISCONNECTING), CS_HARD);
Philipp Reisner09b9e792010-12-03 16:04:24 +01001662 return;
1663 }
Philipp Reisnere64a3292011-02-05 17:34:11 +01001664 } else /* C_SYNC_SOURCE */ {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001665 r = drbd_khelper(device, "before-resync-source");
Philipp Reisnere64a3292011-02-05 17:34:11 +01001666 r = (r >> 8) & 0xff;
1667 if (r > 0) {
1668 if (r == 3) {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001669 drbd_info(device, "before-resync-source handler returned %d, "
Philipp Reisnere64a3292011-02-05 17:34:11 +01001670 "ignoring. Old userland tools?", r);
1671 } else {
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001672 drbd_info(device, "before-resync-source handler returned %d, "
Philipp Reisnere64a3292011-02-05 17:34:11 +01001673 "dropping connection.\n", r);
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001674 conn_request_state(connection,
Andreas Gruenbachera6b32bc2011-05-31 14:33:49 +02001675 NS(conn, C_DISCONNECTING), CS_HARD);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001676 return;
1677 }
1678 }
Philipp Reisner09b9e792010-12-03 16:04:24 +01001679 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001680 }
1681
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001682 if (current == connection->worker.task) {
Philipp Reisnerdad20552011-02-11 19:43:55 +01001683 /* The worker should not sleep waiting for state_mutex,
Philipp Reisnere64a3292011-02-05 17:34:11 +01001684 that can take long */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001685 if (!mutex_trylock(device->state_mutex)) {
1686 set_bit(B_RS_H_DONE, &device->flags);
1687 device->start_resync_timer.expires = jiffies + HZ/5;
1688 add_timer(&device->start_resync_timer);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001689 return;
1690 }
1691 } else {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001692 mutex_lock(device->state_mutex);
Philipp Reisnere64a3292011-02-05 17:34:11 +01001693 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001694 clear_bit(B_RS_H_DONE, &device->flags);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001695
Lars Ellenberg074f4af2014-04-28 18:43:26 +02001696 /* req_lock: serialize with drbd_send_and_submit() and others
1697 * global_state_lock: for stable sync-after dependencies */
1698 spin_lock_irq(&device->resource->req_lock);
1699 write_lock(&global_state_lock);
Philipp Reisnera7004712013-03-27 14:08:35 +01001700 /* Did some connection breakage or IO error race with us? */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001701 if (device->state.conn < C_CONNECTED
1702 || !get_ldev_if_state(device, D_NEGOTIATING)) {
Lars Ellenberg074f4af2014-04-28 18:43:26 +02001703 write_unlock(&global_state_lock);
1704 spin_unlock_irq(&device->resource->req_lock);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001705 mutex_unlock(device->state_mutex);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001706 return;
1707 }
1708
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001709 ns = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001710
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001711 ns.aftr_isp = !_drbd_may_sync_now(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001712
1713 ns.conn = side;
1714
1715 if (side == C_SYNC_TARGET)
1716 ns.disk = D_INCONSISTENT;
1717 else /* side == C_SYNC_SOURCE */
1718 ns.pdsk = D_INCONSISTENT;
1719
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001720 r = __drbd_set_state(device, ns, CS_VERBOSE, NULL);
1721 ns = drbd_read_state(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001722
1723 if (ns.conn < C_CONNECTED)
1724 r = SS_UNKNOWN_ERROR;
1725
1726 if (r == SS_SUCCESS) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001727 unsigned long tw = drbd_bm_total_weight(device);
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001728 unsigned long now = jiffies;
1729 int i;
1730
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001731 device->rs_failed = 0;
1732 device->rs_paused = 0;
1733 device->rs_same_csum = 0;
1734 device->rs_last_events = 0;
1735 device->rs_last_sect_ev = 0;
1736 device->rs_total = tw;
1737 device->rs_start = now;
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001738 for (i = 0; i < DRBD_SYNC_MARKS; i++) {
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001739 device->rs_mark_left[i] = tw;
1740 device->rs_mark_time[i] = now;
Lars Ellenberg1d7734a2010-08-11 21:21:50 +02001741 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001742 _drbd_pause_after(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001743 }
Lars Ellenberg074f4af2014-04-28 18:43:26 +02001744 write_unlock(&global_state_lock);
1745 spin_unlock_irq(&device->resource->req_lock);
Lars Ellenberg5a22db82010-12-17 21:14:23 +01001746
Philipp Reisnerb411b362009-09-25 16:07:19 -07001747 if (r == SS_SUCCESS) {
Philipp Reisner328e0f12012-10-19 14:37:47 +02001748 /* reset rs_last_bcast when a resync or verify is started,
1749 * to deal with potential jiffies wrap. */
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001750 device->rs_last_bcast = jiffies - HZ;
Philipp Reisner328e0f12012-10-19 14:37:47 +02001751
Andreas Gruenbacherd0180172011-07-03 17:53:52 +02001752 drbd_info(device, "Began resync as %s (will sync %lu KB [%lu bits set]).\n",
Philipp Reisnerb411b362009-09-25 16:07:19 -07001753 drbd_conn_str(ns.conn),
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001754 (unsigned long) device->rs_total << (BM_BLOCK_SHIFT-10),
1755 (unsigned long) device->rs_total);
Lars Ellenberg6c922ed2011-01-12 11:51:13 +01001756 if (side == C_SYNC_TARGET)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001757 device->bm_resync_fo = 0;
Lars Ellenberg6c922ed2011-01-12 11:51:13 +01001758
1759 /* Since protocol 96, we must serialize drbd_gen_and_send_sync_uuid
1760 * with w_send_oos, or the sync target will get confused as to
1761 * how much bits to resync. We cannot do that always, because for an
1762 * empty resync and protocol < 95, we need to do it here, as we call
1763 * drbd_resync_finished from here in that case.
1764 * We drbd_gen_and_send_sync_uuid here for protocol < 96,
1765 * and from after_state_ch otherwise. */
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001766 if (side == C_SYNC_SOURCE && connection->agreed_pro_version < 96)
1767 drbd_gen_and_send_sync_uuid(peer_device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001768
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001769 if (connection->agreed_pro_version < 95 && device->rs_total == 0) {
Lars Ellenbergaf85e8e2010-10-07 16:07:55 +02001770 /* This still has a race (about when exactly the peers
1771 * detect connection loss) that can lead to a full sync
1772 * on next handshake. In 8.3.9 we fixed this with explicit
1773 * resync-finished notifications, but the fix
1774 * introduces a protocol change. Sleeping for some
1775 * time longer than the ping interval + timeout on the
1776 * SyncSource, to give the SyncTarget the chance to
1777 * detect connection loss, then waiting for a ping
1778 * response (implicit in drbd_resync_finished) reduces
1779 * the race considerably, but does not solve it. */
Philipp Reisner44ed1672011-04-19 17:10:19 +02001780 if (side == C_SYNC_SOURCE) {
1781 struct net_conf *nc;
1782 int timeo;
1783
1784 rcu_read_lock();
Lars Ellenberg44a4d552013-11-22 12:40:58 +01001785 nc = rcu_dereference(connection->net_conf);
Philipp Reisner44ed1672011-04-19 17:10:19 +02001786 timeo = nc->ping_int * HZ + nc->ping_timeo * HZ / 9;
1787 rcu_read_unlock();
1788 schedule_timeout_interruptible(timeo);
1789 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001790 drbd_resync_finished(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001791 }
1792
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001793 drbd_rs_controller_reset(device);
1794 /* ns.conn may already be != device->state.conn,
Philipp Reisnerb411b362009-09-25 16:07:19 -07001795 * we may have been paused in between, or become paused until
1796 * the timer triggers.
1797 * No matter, that is handled in resync_timer_fn() */
1798 if (ns.conn == C_SYNC_TARGET)
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001799 mod_timer(&device->resync_timer, jiffies);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001800
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001801 drbd_md_sync(device);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001802 }
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02001803 put_ldev(device);
1804 mutex_unlock(device->state_mutex);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001805}
1806
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01001807static void update_on_disk_bitmap(struct drbd_device *device)
1808{
1809 struct sib_info sib = { .sib_reason = SIB_SYNC_PROGRESS, };
1810 device->rs_last_bcast = jiffies;
1811
1812 if (!get_ldev(device))
1813 return;
1814
1815 drbd_bm_write_lazy(device, 0);
1816 if (drbd_bm_total_weight(device) <= device->rs_failed)
1817 drbd_resync_finished(device);
1818 drbd_bcast_event(device, &sib);
1819 /* update timestamp, in case it took a while to write out stuff */
1820 device->rs_last_bcast = jiffies;
1821 put_ldev(device);
1822}
1823
1824bool wants_lazy_bitmap_update(struct drbd_device *device)
1825{
1826 enum drbd_conns connection_state = device->state.conn;
1827 return
1828 /* only do a lazy writeout, if device is in some resync state */
1829 (connection_state == C_SYNC_SOURCE
1830 || connection_state == C_SYNC_TARGET
1831 || connection_state == C_PAUSED_SYNC_S
1832 || connection_state == C_PAUSED_SYNC_T) &&
1833 /* AND
1834 * either we just finished, or the last lazy update
1835 * was some time ago already. */
1836 (drbd_bm_total_weight(device) <= device->rs_failed
1837 || time_after(jiffies, device->rs_last_bcast + 2*HZ));
1838}
1839
1840static void try_update_all_on_disk_bitmaps(struct drbd_connection *connection)
1841{
1842 struct drbd_peer_device *peer_device;
1843 int vnr;
1844
1845 rcu_read_lock();
1846 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
1847 struct drbd_device *device = peer_device->device;
1848 if (!wants_lazy_bitmap_update(device))
1849 continue;
1850 kref_get(&device->kref);
1851 rcu_read_unlock();
1852 update_on_disk_bitmap(device);
1853 kref_put(&device->kref, drbd_destroy_device);
1854 rcu_read_lock();
1855 }
1856 rcu_read_unlock();
1857}
1858
Rashika Kheriaa186e472013-12-19 15:06:10 +05301859static bool dequeue_work_batch(struct drbd_work_queue *queue, struct list_head *work_list)
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001860{
1861 spin_lock_irq(&queue->q_lock);
1862 list_splice_init(&queue->q, work_list);
1863 spin_unlock_irq(&queue->q_lock);
1864 return !list_empty(work_list);
1865}
1866
Rashika Kheriaa186e472013-12-19 15:06:10 +05301867static bool dequeue_work_item(struct drbd_work_queue *queue, struct list_head *work_list)
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001868{
1869 spin_lock_irq(&queue->q_lock);
1870 if (!list_empty(&queue->q))
1871 list_move(queue->q.next, work_list);
1872 spin_unlock_irq(&queue->q_lock);
1873 return !list_empty(work_list);
1874}
1875
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001876static void wait_for_work(struct drbd_connection *connection, struct list_head *work_list)
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001877{
1878 DEFINE_WAIT(wait);
1879 struct net_conf *nc;
1880 int uncork, cork;
1881
1882 dequeue_work_item(&connection->sender_work, work_list);
1883 if (!list_empty(work_list))
1884 return;
1885
1886 /* Still nothing to do?
1887 * Maybe we still need to close the current epoch,
1888 * even if no new requests are queued yet.
1889 *
1890 * Also, poke TCP, just in case.
1891 * Then wait for new work (or signal). */
1892 rcu_read_lock();
1893 nc = rcu_dereference(connection->net_conf);
1894 uncork = nc ? nc->tcp_cork : 0;
1895 rcu_read_unlock();
1896 if (uncork) {
1897 mutex_lock(&connection->data.mutex);
1898 if (connection->data.socket)
1899 drbd_tcp_uncork(connection->data.socket);
1900 mutex_unlock(&connection->data.mutex);
1901 }
1902
1903 for (;;) {
1904 int send_barrier;
1905 prepare_to_wait(&connection->sender_work.q_wait, &wait, TASK_INTERRUPTIBLE);
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001906 spin_lock_irq(&connection->resource->req_lock);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001907 spin_lock(&connection->sender_work.q_lock); /* FIXME get rid of this one? */
Lars Ellenbergbc317a92012-08-22 11:47:14 +02001908 /* dequeue single item only,
1909 * we still use drbd_queue_work_front() in some places */
1910 if (!list_empty(&connection->sender_work.q))
1911 list_move(connection->sender_work.q.next, work_list);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001912 spin_unlock(&connection->sender_work.q_lock); /* FIXME get rid of this one? */
1913 if (!list_empty(work_list) || signal_pending(current)) {
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001914 spin_unlock_irq(&connection->resource->req_lock);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001915 break;
1916 }
Lars Ellenbergf9c78122014-04-28 18:43:29 +02001917
1918 /* We found nothing new to do, no to-be-communicated request,
1919 * no other work item. We may still need to close the last
1920 * epoch. Next incoming request epoch will be connection ->
1921 * current transfer log epoch number. If that is different
1922 * from the epoch of the last request we communicated, it is
1923 * safe to send the epoch separating barrier now.
1924 */
1925 send_barrier =
1926 atomic_read(&connection->current_tle_nr) !=
1927 connection->send.current_epoch_nr;
Andreas Gruenbacher05008132011-07-07 14:19:42 +02001928 spin_unlock_irq(&connection->resource->req_lock);
Lars Ellenbergf9c78122014-04-28 18:43:29 +02001929
1930 if (send_barrier)
1931 maybe_send_barrier(connection,
1932 connection->send.current_epoch_nr + 1);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001933 schedule();
1934 /* may be woken up for other things but new work, too,
1935 * e.g. if the current epoch got closed.
1936 * In which case we send the barrier above. */
Lars Ellenbergc7a58db2013-12-20 11:39:48 +01001937
1938 try_update_all_on_disk_bitmaps(connection);
Lars Ellenbergb6dd1a82011-11-28 15:04:49 +01001939 }
1940 finish_wait(&connection->sender_work.q_wait, &wait);
1941
1942 /* someone may have changed the config while we have been waiting above. */
1943 rcu_read_lock();
1944 nc = rcu_dereference(connection->net_conf);
1945 cork = nc ? nc->tcp_cork : 0;
1946 rcu_read_unlock();
1947 mutex_lock(&connection->data.mutex);
1948 if (connection->data.socket) {
1949 if (cork)
1950 drbd_tcp_cork(connection->data.socket);
1951 else if (!uncork)
1952 drbd_tcp_uncork(connection->data.socket);
1953 }
1954 mutex_unlock(&connection->data.mutex);
1955}
1956
Philipp Reisnerb411b362009-09-25 16:07:19 -07001957int drbd_worker(struct drbd_thread *thi)
1958{
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001959 struct drbd_connection *connection = thi->connection;
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02001960 struct drbd_work *w = NULL;
Andreas Gruenbacherc06ece62011-06-21 17:23:59 +02001961 struct drbd_peer_device *peer_device;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001962 LIST_HEAD(work_list);
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001963 int vnr;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001964
Andreas Gruenbachere77a0a52011-01-25 15:43:39 +01001965 while (get_t_state(thi) == RUNNING) {
Philipp Reisner80822282011-02-08 12:46:30 +01001966 drbd_thread_current_set_cpu(thi);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001967
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001968 /* as long as we use drbd_queue_work_front(),
1969 * we may only dequeue single work items here, not batches. */
1970 if (list_empty(&work_list))
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001971 wait_for_work(connection, &work_list);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001972
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001973 if (signal_pending(current)) {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001974 flush_signals(current);
Philipp Reisner19393e12011-02-09 10:09:07 +01001975 if (get_t_state(thi) == RUNNING) {
Andreas Gruenbacher1ec861e2011-07-06 11:01:44 +02001976 drbd_warn(connection, "Worker got an unexpected signal\n");
Philipp Reisnerb411b362009-09-25 16:07:19 -07001977 continue;
Philipp Reisner19393e12011-02-09 10:09:07 +01001978 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001979 break;
1980 }
1981
Andreas Gruenbachere77a0a52011-01-25 15:43:39 +01001982 if (get_t_state(thi) != RUNNING)
Philipp Reisnerb411b362009-09-25 16:07:19 -07001983 break;
Philipp Reisnerb411b362009-09-25 16:07:19 -07001984
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001985 while (!list_empty(&work_list)) {
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02001986 w = list_first_entry(&work_list, struct drbd_work, list);
1987 list_del_init(&w->list);
1988 if (w->cb(w, connection->cstate < C_WF_REPORT_PARAMS) == 0)
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001989 continue;
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02001990 if (connection->cstate >= C_WF_REPORT_PARAMS)
1991 conn_request_state(connection, NS(conn, C_NETWORK_FAILURE), CS_HARD);
Philipp Reisnerb411b362009-09-25 16:07:19 -07001992 }
1993 }
Philipp Reisnerb411b362009-09-25 16:07:19 -07001994
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02001995 do {
Philipp Reisnerb411b362009-09-25 16:07:19 -07001996 while (!list_empty(&work_list)) {
Andreas Gruenbacher6db7e502011-08-26 23:50:08 +02001997 w = list_first_entry(&work_list, struct drbd_work, list);
1998 list_del_init(&w->list);
1999 w->cb(w, 1);
Philipp Reisnerb411b362009-09-25 16:07:19 -07002000 }
Andreas Gruenbacherbde89a92011-05-30 16:32:41 +02002001 dequeue_work_batch(&connection->sender_work, &work_list);
Lars Ellenberg8c0785a2011-10-19 11:50:57 +02002002 } while (!list_empty(&work_list));
Philipp Reisnerb411b362009-09-25 16:07:19 -07002003
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002004 rcu_read_lock();
Andreas Gruenbacherc06ece62011-06-21 17:23:59 +02002005 idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
2006 struct drbd_device *device = peer_device->device;
Andreas Gruenbacher0b0ba1e2011-06-27 16:23:33 +02002007 D_ASSERT(device, device->state.disk == D_DISKLESS && device->state.conn == C_STANDALONE);
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02002008 kref_get(&device->kref);
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002009 rcu_read_unlock();
Andreas Gruenbacherb30ab792011-07-03 13:26:43 +02002010 drbd_device_cleanup(device);
Andreas Gruenbacher05a10ec2011-06-07 22:54:17 +02002011 kref_put(&device->kref, drbd_destroy_device);
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002012 rcu_read_lock();
Philipp Reisner0e29d162011-02-18 14:23:11 +01002013 }
Philipp Reisnerc141ebd2011-05-05 16:13:10 +02002014 rcu_read_unlock();
Philipp Reisnerb411b362009-09-25 16:07:19 -07002015
2016 return 0;
2017}