drbd_worker.c revision b411b3637fa71fce9cf2acf0639009500f5892fe
1b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/*
2b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_worker.c
3b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
4b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
5b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
6b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
7b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
8b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
9b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
10b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd is free software; you can redistribute it and/or modify
11b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   it under the terms of the GNU General Public License as published by
12b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   the Free Software Foundation; either version 2, or (at your option)
13b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   any later version.
14b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
15b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd is distributed in the hope that it will be useful,
16b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   but WITHOUT ANY WARRANTY; without even the implied warranty of
17b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   GNU General Public License for more details.
19b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
20b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   You should have received a copy of the GNU General Public License
21b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   along with drbd; see the file COPYING.  If not, write to
22b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
24b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
25b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
26b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/autoconf.h>
27b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/module.h>
28b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/version.h>
29b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/drbd.h>
30b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/sched.h>
31b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/smp_lock.h>
32b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/wait.h>
33b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/mm.h>
34b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/memcontrol.h>
35b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/mm_inline.h>
36b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/slab.h>
37b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/random.h>
38b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/mm.h>
39b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/string.h>
40b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include <linux/scatterlist.h>
41b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
42b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include "drbd_int.h"
43b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include "drbd_req.h"
44b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#include "drbd_tracing.h"
45b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
46b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#define SLEEP_TIME (HZ/10)
47b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
48b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel);
49b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
50b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
51b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
52b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* defined here:
53b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_md_io_complete
54b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_endio_write_sec
55b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_endio_read_sec
56b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_endio_pri
57b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
58b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * more endio handlers:
59b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   atodb_endio in drbd_actlog.c
60b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   drbd_bm_async_io_complete in drbd_bitmap.c
61b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
62b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * For all these callbacks, note the following:
63b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * The callbacks will be called in irq context by the IDE drivers,
64b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * and in Softirqs/Tasklets/BH context by the SCSI drivers.
65b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * Try to get the locking right :)
66b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner *
67b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
68b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
69b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
70b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* About the global_state_lock
71b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   Each state transition on an device holds a read lock. In case we have
72b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   to evaluate the sync after dependencies, we grab a write lock, because
73b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner   we need stable states on all devices for that.  */
74b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerrwlock_t global_state_lock;
75b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
76b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* used for synchronous meta data and bitmap IO
77b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * submitted by drbd_md_sync_page_io()
78b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
79b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_md_io_complete(struct bio *bio, int error)
80b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
81b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_md_io *md_io;
82b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
83b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	md_io = (struct drbd_md_io *)bio->bi_private;
84b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	md_io->error = error;
85b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
86b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_bio(md_io->mdev, "Md", bio, 1, NULL);
87b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
88b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	complete(&md_io->event);
89b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
90b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
91b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* reads on behalf of the partner,
92b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * "submitted" by the receiver
93b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
94b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_endio_read_sec(struct bio *bio, int error) __releases(local)
95b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
96b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long flags = 0;
97b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = NULL;
98b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *mdev;
99b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int uptodate = bio_flagged(bio, BIO_UPTODATE);
100b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
101b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e = bio->bi_private;
102b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev = e->mdev;
103b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
104b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (error)
105b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "read: error=%d s=%llus\n", error,
106b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(unsigned long long)e->sector);
107b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!error && !uptodate) {
108b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "read: setting error to -EIO s=%llus\n",
109b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(unsigned long long)e->sector);
110b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* strange behavior of some lower level drivers...
111b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * fail the request by clearing the uptodate flag,
112b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * but do not return any error?! */
113b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		error = -EIO;
114b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
115b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
116b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(e->block_id != ID_VACANT);
117b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
118b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_bio(mdev, "Sec", bio, 1, NULL);
119b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
120b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irqsave(&mdev->req_lock, flags);
121b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->read_cnt += e->size >> 9;
122b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	list_del(&e->w.list);
123b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (list_empty(&mdev->read_ee))
124b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		wake_up(&mdev->ee_wait);
125b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irqrestore(&mdev->req_lock, flags);
126b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
127b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_chk_io_error(mdev, error, FALSE);
128b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_queue_work(&mdev->data.work, &e->w);
129b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	put_ldev(mdev);
130b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
131b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_ee(mdev, e, "read completed");
132b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
133b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
134b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* writes on behalf of the partner, or resync writes,
135b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * "submitted" by the receiver.
136b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
137b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_endio_write_sec(struct bio *bio, int error) __releases(local)
138b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
139b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long flags = 0;
140b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = NULL;
141b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *mdev;
142b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sector_t e_sector;
143b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int do_wake;
144b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int is_syncer_req;
145b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int do_al_complete_io;
146b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int uptodate = bio_flagged(bio, BIO_UPTODATE);
147b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int is_barrier = bio_rw_flagged(bio, BIO_RW_BARRIER);
148b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
149b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e = bio->bi_private;
150b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev = e->mdev;
151b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
152b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (error)
153b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "write: error=%d s=%llus\n", error,
154b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(unsigned long long)e->sector);
155b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!error && !uptodate) {
156b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "write: setting error to -EIO s=%llus\n",
157b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(unsigned long long)e->sector);
158b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* strange behavior of some lower level drivers...
159b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * fail the request by clearing the uptodate flag,
160b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * but do not return any error?! */
161b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		error = -EIO;
162b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
163b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
164b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* error == -ENOTSUPP would be a better test,
165b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * alas it is not reliable */
166b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (error && is_barrier && e->flags & EE_IS_BARRIER) {
167b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_bump_write_ordering(mdev, WO_bdev_flush);
168b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_lock_irqsave(&mdev->req_lock, flags);
169b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		list_del(&e->w.list);
170b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		e->w.cb = w_e_reissue;
171b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* put_ldev actually happens below, once we come here again. */
172b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		__release(local);
173b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_unlock_irqrestore(&mdev->req_lock, flags);
174b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_queue_work(&mdev->data.work, &e->w);
175b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return;
176b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
177b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
178b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(e->block_id != ID_VACANT);
179b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
180b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_bio(mdev, "Sec", bio, 1, NULL);
181b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
182b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irqsave(&mdev->req_lock, flags);
183b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->writ_cnt += e->size >> 9;
184b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	is_syncer_req = is_syncer_block_id(e->block_id);
185b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
186b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* after we moved e to done_ee,
187b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * we may no longer access it,
188b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * it may be freed/reused already!
189b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * (as soon as we release the req_lock) */
190b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e_sector = e->sector;
191b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	do_al_complete_io = e->flags & EE_CALL_AL_COMPLETE_IO;
192b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
193b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	list_del(&e->w.list); /* has been on active_ee or sync_ee */
194b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	list_add_tail(&e->w.list, &mdev->done_ee);
195b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
196b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_ee(mdev, e, "write completed");
197b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
198b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* No hlist_del_init(&e->colision) here, we did not send the Ack yet,
199b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * neither did we wake possibly waiting conflicting requests.
200b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * done from "drbd_process_done_ee" within the appropriate w.cb
201b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * (e_end_block/e_end_resync_block) or from _drbd_clear_done_ee */
202b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
203b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	do_wake = is_syncer_req
204b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		? list_empty(&mdev->sync_ee)
205b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		: list_empty(&mdev->active_ee);
206b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
207b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (error)
208b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		__drbd_chk_io_error(mdev, FALSE);
209b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irqrestore(&mdev->req_lock, flags);
210b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
211b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (is_syncer_req)
212b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_rs_complete_io(mdev, e_sector);
213b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
214b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (do_wake)
215b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		wake_up(&mdev->ee_wait);
216b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
217b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (do_al_complete_io)
218b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_al_complete_io(mdev, e_sector);
219b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
220b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	wake_asender(mdev);
221b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	put_ldev(mdev);
222b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
223b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
224b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
225b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* read, readA or write requests on R_PRIMARY coming from drbd_make_request
226b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
227b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_endio_pri(struct bio *bio, int error)
228b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
229b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long flags;
230b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_request *req = bio->bi_private;
231b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *mdev = req->mdev;
232b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct bio_and_error m;
233b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	enum drbd_req_event what;
234b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int uptodate = bio_flagged(bio, BIO_UPTODATE);
235b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
236b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (error)
237b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "p %s: error=%d\n",
238b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 bio_data_dir(bio) == WRITE ? "write" : "read", error);
239b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!error && !uptodate) {
240b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "p %s: setting error to -EIO\n",
241b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 bio_data_dir(bio) == WRITE ? "write" : "read");
242b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* strange behavior of some lower level drivers...
243b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * fail the request by clearing the uptodate flag,
244b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * but do not return any error?! */
245b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		error = -EIO;
246b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
247b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
248b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_bio(mdev, "Pri", bio, 1, NULL);
249b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
250b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* to avoid recursion in __req_mod */
251b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(error)) {
252b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		what = (bio_data_dir(bio) == WRITE)
253b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			? write_completed_with_error
254b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			: (bio_rw(bio) == READA)
255b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			  ? read_completed_with_error
256b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			  : read_ahead_completed_with_error;
257b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else
258b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		what = completed_ok;
259b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
260b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	bio_put(req->private_bio);
261b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	req->private_bio = ERR_PTR(error);
262b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
263b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irqsave(&mdev->req_lock, flags);
264b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	__req_mod(req, what, &m);
265b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irqrestore(&mdev->req_lock, flags);
266b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
267b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (m.bio)
268b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		complete_master_bio(mdev, &m);
269b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
270b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
271b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_io_error(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
272b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
273b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_request *req = container_of(w, struct drbd_request, w);
274b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
275b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* NOTE: mdev->ldev can be NULL by the time we get here! */
276b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* D_ASSERT(mdev->ldev->dc.on_io_error != EP_PASS_ON); */
277b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
278b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* the only way this callback is scheduled is from _req_may_be_done,
279b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * when it is done and had a local write error, see comments there */
280b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_req_free(req);
281b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
282b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return TRUE;
283b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
284b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
285b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_read_retry_remote(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
286b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
287b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_request *req = container_of(w, struct drbd_request, w);
288b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
289b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* We should not detach for read io-error,
290b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * but try to WRITE the P_DATA_REPLY to the failed location,
291b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * to give the disk the chance to relocate that block */
292b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
293b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irq(&mdev->req_lock);
294b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (cancel ||
295b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	    mdev->state.conn < C_CONNECTED ||
296b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	    mdev->state.pdsk <= D_INCONSISTENT) {
297b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		_req_mod(req, send_canceled);
298b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_unlock_irq(&mdev->req_lock);
299b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_alert(DEV, "WE ARE LOST. Local IO failure, no peer.\n");
300b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
301b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
302b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irq(&mdev->req_lock);
303b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
304b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return w_send_read_req(mdev, w, 0);
305b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
306b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
307b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_resync_inactive(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
308b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
309b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ERR_IF(cancel) return 1;
310b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dev_err(DEV, "resync inactive, but callback triggered??\n");
311b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1; /* Simply ignore this! */
312b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
313b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
314b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_csum(struct drbd_conf *mdev, struct crypto_hash *tfm, struct bio *bio, void *digest)
315b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
316b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct hash_desc desc;
317b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct scatterlist sg;
318b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct bio_vec *bvec;
319b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int i;
320b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
321b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	desc.tfm = tfm;
322b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	desc.flags = 0;
323b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
324b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sg_init_table(&sg, 1);
325b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	crypto_hash_init(&desc);
326b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
327b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	__bio_for_each_segment(bvec, bio, i, 0) {
328b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		sg_set_page(&sg, bvec->bv_page, bvec->bv_len, bvec->bv_offset);
329b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		crypto_hash_update(&desc, &sg, sg.length);
330b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
331b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	crypto_hash_final(&desc, digest);
332b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
333b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
334b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int w_e_send_csum(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
335b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
336b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
337b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int digest_size;
338b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	void *digest;
339b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok;
340b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
341b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(e->block_id == DRBD_MAGIC + 0xbeef);
342b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
343b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
344b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
345b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
346b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
347b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
348b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(drbd_bio_uptodate(e->private_bio))) {
349b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		digest_size = crypto_hash_digestsize(mdev->csums_tfm);
350b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		digest = kmalloc(digest_size, GFP_NOIO);
351b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (digest) {
352b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_csum(mdev, mdev->csums_tfm, e->private_bio, digest);
353b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
354b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			inc_rs_pending(mdev);
355b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = drbd_send_drequest_csum(mdev,
356b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						     e->sector,
357b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						     e->size,
358b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						     digest,
359b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						     digest_size,
360b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						     P_CSUM_RS_REQUEST);
361b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			kfree(digest);
362b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
363b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_err(DEV, "kmalloc() of digest failed.\n");
364b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = 0;
365b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
366b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else
367b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = 1;
368b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
369b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_free_ee(mdev, e);
370b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
371b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(!ok))
372b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "drbd_send_drequest(..., csum) failed\n");
373b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
374b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
375b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
376b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#define GFP_TRY	(__GFP_HIGHMEM | __GFP_NOWARN)
377b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
378b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int read_for_csum(struct drbd_conf *mdev, sector_t sector, int size)
379b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
380b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e;
381b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
382b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!get_ldev(mdev))
383b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 0;
384b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
385b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* GFP_TRY, because if there is no memory available right now, this may
386b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * be rescheduled for later. It is "only" background resync, after all. */
387b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e = drbd_alloc_ee(mdev, DRBD_MAGIC+0xbeef, sector, size, GFP_TRY);
388b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!e) {
389b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		put_ldev(mdev);
390b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 2;
391b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
392b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
393b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irq(&mdev->req_lock);
394b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	list_add(&e->w.list, &mdev->read_ee);
395b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irq(&mdev->req_lock);
396b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
397b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e->private_bio->bi_end_io = drbd_endio_read_sec;
398b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e->private_bio->bi_rw = READ;
399b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	e->w.cb = w_e_send_csum;
400b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
401b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->read_cnt += size >> 9;
402b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_generic_make_request(mdev, DRBD_FAULT_RS_RD, e->private_bio);
403b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
404b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
405b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
406b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
407b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid resync_timer_fn(unsigned long data)
408b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
409b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long flags;
410b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *mdev = (struct drbd_conf *) data;
411b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int queue;
412b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
413b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irqsave(&mdev->req_lock, flags);
414b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
415b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(!test_and_clear_bit(STOP_SYNC_TIMER, &mdev->flags))) {
416b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		queue = 1;
417b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->state.conn == C_VERIFY_S)
418b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->resync_work.cb = w_make_ov_request;
419b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		else
420b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->resync_work.cb = w_make_resync_request;
421b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
422b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		queue = 0;
423b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->resync_work.cb = w_resync_inactive;
424b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
425b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
426b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irqrestore(&mdev->req_lock, flags);
427b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
428b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* harmless race: list_empty outside data.work.q_lock */
429b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (list_empty(&mdev->resync_work.list) && queue)
430b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_queue_work(&mdev->data.work, &mdev->resync_work);
431b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
432b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
433b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_make_resync_request(struct drbd_conf *mdev,
434b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		struct drbd_work *w, int cancel)
435b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
436b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long bit;
437b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sector_t sector;
438b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	const sector_t capacity = drbd_get_capacity(mdev->this_bdev);
439b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int max_segment_size = queue_max_segment_size(mdev->rq_queue);
440b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int number, i, size, pe, mx;
441b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int align, queued, sndbuf;
442b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
443b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel))
444b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
445b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
446b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(mdev->state.conn < C_CONNECTED)) {
447b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "Confused in w_make_resync_request()! cstate < Connected");
448b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 0;
449b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
450b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
451b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->state.conn != C_SYNC_TARGET)
452b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "%s in w_make_resync_request\n",
453b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_conn_str(mdev->state.conn));
454b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
455b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!get_ldev(mdev)) {
456b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* Since we only need to access mdev->rsync a
457b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   get_ldev_if_state(mdev,D_FAILED) would be sufficient, but
458b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   to continue resync with a broken disk makes no sense at
459b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   all */
460b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "Disk broke down during resync!\n");
461b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->resync_work.cb = w_resync_inactive;
462b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
463b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
464b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
465b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	number = SLEEP_TIME * mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
466b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	pe = atomic_read(&mdev->rs_pending_cnt);
467b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
468b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mutex_lock(&mdev->data.mutex);
469b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->data.socket)
470b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mx = mdev->data.socket->sk->sk_rcvbuf / sizeof(struct p_block_req);
471b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	else
472b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mx = 1;
473b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mutex_unlock(&mdev->data.mutex);
474b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
475b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* For resync rates >160MB/sec, allow more pending RS requests */
476b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (number > mx)
477b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mx = number;
478b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
479b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* Limit the number of pending RS requests to no more than the peer's receive buffer */
480b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if ((pe + number) > mx) {
481b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		number = mx - pe;
482b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
483b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
484b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	for (i = 0; i < number; i++) {
485b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* Stop generating RS requests, when half of the send buffer is filled */
486b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mutex_lock(&mdev->data.mutex);
487b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->data.socket) {
488b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			queued = mdev->data.socket->sk->sk_wmem_queued;
489b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			sndbuf = mdev->data.socket->sk->sk_sndbuf;
490b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
491b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			queued = 1;
492b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			sndbuf = 0;
493b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
494b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mutex_unlock(&mdev->data.mutex);
495b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (queued > sndbuf / 2)
496b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			goto requeue;
497b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
498b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnernext_sector:
499b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		size = BM_BLOCK_SIZE;
500b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		bit  = drbd_bm_find_next(mdev, mdev->bm_resync_fo);
501b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
502b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (bit == -1UL) {
503b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->bm_resync_fo = drbd_bm_bits(mdev);
504b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->resync_work.cb = w_resync_inactive;
505b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			put_ldev(mdev);
506b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 1;
507b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
508b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
509b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		sector = BM_BIT_TO_SECT(bit);
510b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
511b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (drbd_try_rs_begin_io(mdev, sector)) {
512b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->bm_resync_fo = bit;
513b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			goto requeue;
514b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
515b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->bm_resync_fo = bit + 1;
516b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
517b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (unlikely(drbd_bm_test_bit(mdev, bit) == 0)) {
518b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_rs_complete_io(mdev, sector);
519b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			goto next_sector;
520b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
521b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
522b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#if DRBD_MAX_SEGMENT_SIZE > BM_BLOCK_SIZE
523b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* try to find some adjacent bits.
524b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * we stop if we have already the maximum req size.
525b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 *
526b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * Additionally always align bigger requests, in order to
527b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * be prepared for all stripe sizes of software RAIDs.
528b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 *
529b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * we _do_ care about the agreed-upon q->max_segment_size
530b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * here, as splitting up the requests on the other side is more
531b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * difficult.  the consequence is, that on lvm and md and other
532b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * "indirect" devices, this is dead code, since
533b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * q->max_segment_size will be PAGE_SIZE.
534b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 */
535b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		align = 1;
536b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		for (;;) {
537b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (size + BM_BLOCK_SIZE > max_segment_size)
538b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				break;
539b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
540b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* Be always aligned */
541b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (sector & ((1<<(align+3))-1))
542b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				break;
543b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
544b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* do not cross extent boundaries */
545b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (((bit+1) & BM_BLOCKS_PER_BM_EXT_MASK) == 0)
546b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				break;
547b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* now, is it actually dirty, after all?
548b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * caution, drbd_bm_test_bit is tri-state for some
549b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * obscure reason; ( b == 0 ) would get the out-of-band
550b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * only accidentally right because of the "oddly sized"
551b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * adjustment below */
552b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (drbd_bm_test_bit(mdev, bit+1) != 1)
553b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				break;
554b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			bit++;
555b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			size += BM_BLOCK_SIZE;
556b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if ((BM_BLOCK_SIZE << align) <= size)
557b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				align++;
558b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			i++;
559b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
560b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* if we merged some,
561b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * reset the offset to start the next drbd_bm_find_next from */
562b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (size > BM_BLOCK_SIZE)
563b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->bm_resync_fo = bit + 1;
564b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner#endif
565b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
566b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* adjust very last sectors, in case we are oddly sized */
567b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (sector + (size>>9) > capacity)
568b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			size = (capacity-sector)<<9;
569b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->agreed_pro_version >= 89 && mdev->csums_tfm) {
570b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			switch (read_for_csum(mdev, sector, size)) {
571b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			case 0: /* Disk failure*/
572b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				put_ldev(mdev);
573b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				return 0;
574b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			case 2: /* Allocation failed */
575b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				drbd_rs_complete_io(mdev, sector);
576b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				mdev->bm_resync_fo = BM_SECT_TO_BIT(sector);
577b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				goto requeue;
578b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* case 1: everything ok */
579b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			}
580b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
581b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			inc_rs_pending(mdev);
582b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (!drbd_send_drequest(mdev, P_RS_DATA_REQUEST,
583b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner					       sector, size, ID_SYNCER)) {
584b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				dev_err(DEV, "drbd_send_drequest() failed, aborting...\n");
585b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				dec_rs_pending(mdev);
586b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				put_ldev(mdev);
587b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				return 0;
588b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			}
589b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
590b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
591b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
592b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->bm_resync_fo >= drbd_bm_bits(mdev)) {
593b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* last syncer _request_ was sent,
594b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * but the P_RS_DATA_REPLY not yet received.  sync will end (and
595b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * next sync group will resume), as soon as we receive the last
596b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * resync data block, and the last bit is cleared.
597b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * until then resync "work" is "inactive" ...
598b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 */
599b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->resync_work.cb = w_resync_inactive;
600b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		put_ldev(mdev);
601b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
602b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
603b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
604b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner requeue:
605b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mod_timer(&mdev->resync_timer, jiffies + SLEEP_TIME);
606b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	put_ldev(mdev);
607b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
608b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
609b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
610b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
611b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
612b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int number, i, size;
613b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sector_t sector;
614b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	const sector_t capacity = drbd_get_capacity(mdev->this_bdev);
615b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
616b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel))
617b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
618b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
619b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(mdev->state.conn < C_CONNECTED)) {
620b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "Confused in w_make_ov_request()! cstate < Connected");
621b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 0;
622b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
623b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
624b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	number = SLEEP_TIME*mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
625b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (atomic_read(&mdev->rs_pending_cnt) > number)
626b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		goto requeue;
627b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
628b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	number -= atomic_read(&mdev->rs_pending_cnt);
629b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
630b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sector = mdev->ov_position;
631b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	for (i = 0; i < number; i++) {
632b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (sector >= capacity) {
633b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->resync_work.cb = w_resync_inactive;
634b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 1;
635b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
636b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
637b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		size = BM_BLOCK_SIZE;
638b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
639b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (drbd_try_rs_begin_io(mdev, sector)) {
640b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->ov_position = sector;
641b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			goto requeue;
642b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
643b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
644b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (sector + (size>>9) > capacity)
645b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			size = (capacity-sector)<<9;
646b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
647b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		inc_rs_pending(mdev);
648b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!drbd_send_ov_request(mdev, sector, size)) {
649b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dec_rs_pending(mdev);
650b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 0;
651b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
652b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		sector += BM_SECT_PER_BIT;
653b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
654b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->ov_position = sector;
655b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
656b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner requeue:
657b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mod_timer(&mdev->resync_timer, jiffies + SLEEP_TIME);
658b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
659b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
660b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
661b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
662b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_ov_finished(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
663b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
664b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	kfree(w);
665b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ov_oos_print(mdev);
666b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_resync_finished(mdev);
667b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
668b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
669b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
670b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
671b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int w_resync_finished(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
672b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
673b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	kfree(w);
674b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
675b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_resync_finished(mdev);
676b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
677b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
678b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
679b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
680b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint drbd_resync_finished(struct drbd_conf *mdev)
681b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
682b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long db, dt, dbdt;
683b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	unsigned long n_oos;
684b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	union drbd_state os, ns;
685b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_work *w;
686b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	char *khelper_cmd = NULL;
687b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
688b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* Remove all elements from the resync LRU. Since future actions
689b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * might set bits in the (main) bitmap, then the entries in the
690b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * resync LRU would be wrong. */
691b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (drbd_rs_del_all(mdev)) {
692b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* In case this is not possible now, most probably because
693b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * there are P_RS_DATA_REPLY Packets lingering on the worker's
694b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * queue (or even the read operations for those packets
695b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * is not finished by now).   Retry in 100ms. */
696b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
697b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_kick_lo(mdev);
698b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		__set_current_state(TASK_INTERRUPTIBLE);
699b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		schedule_timeout(HZ / 10);
700b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		w = kmalloc(sizeof(struct drbd_work), GFP_ATOMIC);
701b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (w) {
702b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			w->cb = w_resync_finished;
703b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_queue_work(&mdev->data.work, w);
704b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 1;
705b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
706b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "Warn failed to drbd_rs_del_all() and to kmalloc(w).\n");
707b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
708b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
709b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
710b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (dt <= 0)
711b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dt = 1;
712b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	db = mdev->rs_total;
713b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dbdt = Bit2KB(db/dt);
714b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->rs_paused /= HZ;
715b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
716b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!get_ldev(mdev))
717b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		goto out;
718b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
719b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irq(&mdev->req_lock);
720b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	os = mdev->state;
721b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
722b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* This protects us against multiple calls (that can happen in the presence
723b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	   of application IO), and against connectivity loss just before we arrive here. */
724b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (os.conn <= C_CONNECTED)
725b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		goto out_unlock;
726b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
727b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns = os;
728b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns.conn = C_CONNECTED;
729b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
730b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dev_info(DEV, "%s done (total %lu sec; paused %lu sec; %lu K/sec)\n",
731b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	     (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) ?
732b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	     "Online verify " : "Resync",
733b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	     dt + mdev->rs_paused, mdev->rs_paused, dbdt);
734b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
735b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	n_oos = drbd_bm_total_weight(mdev);
736b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
737b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) {
738b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (n_oos) {
739b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_alert(DEV, "Online verify found %lu %dk block out of sync!\n",
740b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			      n_oos, Bit2KB(1));
741b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			khelper_cmd = "out-of-sync";
742b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
743b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
744b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		D_ASSERT((n_oos - mdev->rs_failed) == 0);
745b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
746b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T)
747b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			khelper_cmd = "after-resync-target";
748b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
749b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->csums_tfm && mdev->rs_total) {
750b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			const unsigned long s = mdev->rs_same_csum;
751b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			const unsigned long t = mdev->rs_total;
752b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			const int ratio =
753b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(t == 0)     ? 0 :
754b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			(t < 100000) ? ((s*100)/t) : (s/(t/100));
755b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_info(DEV, "%u %% had equal check sums, eliminated: %luK; "
756b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     "transferred %luK total %luK\n",
757b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     ratio,
758b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     Bit2KB(mdev->rs_same_csum),
759b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     Bit2KB(mdev->rs_total - mdev->rs_same_csum),
760b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     Bit2KB(mdev->rs_total));
761b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
762b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
763b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
764b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->rs_failed) {
765b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_info(DEV, "            %lu failed blocks\n", mdev->rs_failed);
766b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
767b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
768b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ns.disk = D_INCONSISTENT;
769b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ns.pdsk = D_UP_TO_DATE;
770b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
771b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ns.disk = D_UP_TO_DATE;
772b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ns.pdsk = D_INCONSISTENT;
773b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
774b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
775b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ns.disk = D_UP_TO_DATE;
776b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ns.pdsk = D_UP_TO_DATE;
777b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
778b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) {
779b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (mdev->p_uuid) {
780b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				int i;
781b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				for (i = UI_BITMAP ; i <= UI_HISTORY_END ; i++)
782b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner					_drbd_uuid_set(mdev, i, mdev->p_uuid[i]);
783b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				drbd_uuid_set(mdev, UI_BITMAP, mdev->ldev->md.uuid[UI_CURRENT]);
784b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				_drbd_uuid_set(mdev, UI_CURRENT, mdev->p_uuid[UI_CURRENT]);
785b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			} else {
786b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				dev_err(DEV, "mdev->p_uuid is NULL! BUG\n");
787b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			}
788b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
789b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
790b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_uuid_set_bm(mdev, 0UL);
791b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
792b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->p_uuid) {
793b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* Now the two UUID sets are equal, update what we
794b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * know of the peer. */
795b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			int i;
796b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			for (i = UI_CURRENT ; i <= UI_HISTORY_END ; i++)
797b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				mdev->p_uuid[i] = mdev->ldev->md.uuid[i];
798b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
799b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
800b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
801b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	_drbd_set_state(mdev, ns, CS_VERBOSE, NULL);
802b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerout_unlock:
803b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irq(&mdev->req_lock);
804b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	put_ldev(mdev);
805b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerout:
806b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->rs_total  = 0;
807b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->rs_failed = 0;
808b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->rs_paused = 0;
809b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	mdev->ov_start_sector = 0;
810b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
811b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (test_and_clear_bit(WRITE_BM_AFTER_RESYNC, &mdev->flags)) {
812b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_warn(DEV, "Writing the whole bitmap, due to failed kmalloc\n");
813b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_queue_bitmap_io(mdev, &drbd_bm_write, NULL, "write from resync_finished");
814b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
815b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
816b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (khelper_cmd)
817b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_khelper(mdev, khelper_cmd);
818b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
819b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
820b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
821b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
822b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/* helper */
823b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic void move_to_net_ee_or_free(struct drbd_conf *mdev, struct drbd_epoch_entry *e)
824b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
825b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (drbd_bio_has_active_page(e->private_bio)) {
826b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* This might happen if sendpage() has not finished */
827b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_lock_irq(&mdev->req_lock);
828b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		list_add_tail(&e->w.list, &mdev->net_ee);
829b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_unlock_irq(&mdev->req_lock);
830b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else
831b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
832b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
833b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
834b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
835b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * w_e_end_data_req() - Worker callback, to send a P_DATA_REPLY packet in response to a P_DATA_REQUEST
836b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
837b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @w:		work object.
838b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @cancel:	The connection will be closed anyways
839b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
840b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_e_end_data_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
841b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
842b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
843b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok;
844b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
845b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
846b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
847b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dec_unacked(mdev);
848b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
849b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
850b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
851b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(drbd_bio_uptodate(e->private_bio))) {
852b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_block(mdev, P_DATA_REPLY, e);
853b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
854b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (__ratelimit(&drbd_ratelimit_state))
855b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_err(DEV, "Sending NegDReply. sector=%llus.\n",
856b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			    (unsigned long long)e->sector);
857b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
858b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_ack(mdev, P_NEG_DREPLY, e);
859b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
860b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
861b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dec_unacked(mdev);
862b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
863b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	move_to_net_ee_or_free(mdev, e);
864b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
865b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(!ok))
866b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "drbd_send_block() failed\n");
867b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
868b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
869b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
870b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
871b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * w_e_end_rsdata_req() - Worker callback to send a P_RS_DATA_REPLY packet in response to a P_RS_DATA_REQUESTRS
872b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
873b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @w:		work object.
874b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @cancel:	The connection will be closed anyways
875b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
876b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_e_end_rsdata_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
877b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
878b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
879b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok;
880b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
881b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
882b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
883b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dec_unacked(mdev);
884b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
885b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
886b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
887b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (get_ldev_if_state(mdev, D_FAILED)) {
888b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_rs_complete_io(mdev, e->sector);
889b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		put_ldev(mdev);
890b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
891b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
892b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(drbd_bio_uptodate(e->private_bio))) {
893b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (likely(mdev->state.pdsk >= D_INCONSISTENT)) {
894b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			inc_rs_pending(mdev);
895b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = drbd_send_block(mdev, P_RS_DATA_REPLY, e);
896b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
897b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (__ratelimit(&drbd_ratelimit_state))
898b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				dev_err(DEV, "Not sending RSDataReply, "
899b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				    "partner DISKLESS!\n");
900b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = 1;
901b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
902b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
903b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (__ratelimit(&drbd_ratelimit_state))
904b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_err(DEV, "Sending NegRSDReply. sector %llus.\n",
905b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			    (unsigned long long)e->sector);
906b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
907b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_ack(mdev, P_NEG_RS_DREPLY, e);
908b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
909b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* update resync data with failure */
910b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_rs_failed_io(mdev, e->sector, e->size);
911b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
912b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
913b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dec_unacked(mdev);
914b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
915b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	move_to_net_ee_or_free(mdev, e);
916b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
917b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(!ok))
918b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "drbd_send_block() failed\n");
919b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
920b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
921b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
922b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_e_end_csum_rs_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
923b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
924b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
925b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct digest_info *di;
926b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int digest_size;
927b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	void *digest = NULL;
928b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok, eq = 0;
929b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
930b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
931b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
932b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dec_unacked(mdev);
933b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
934b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
935b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
936b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_rs_complete_io(mdev, e->sector);
937b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
938b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	di = (struct digest_info *)(unsigned long)e->block_id;
939b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
940b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(drbd_bio_uptodate(e->private_bio))) {
941b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* quick hack to try to avoid a race against reconfiguration.
942b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * a real fix would be much more involved,
943b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * introducing more locking mechanisms */
944b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->csums_tfm) {
945b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			digest_size = crypto_hash_digestsize(mdev->csums_tfm);
946b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			D_ASSERT(digest_size == di->digest_size);
947b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			digest = kmalloc(digest_size, GFP_NOIO);
948b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
949b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (digest) {
950b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_csum(mdev, mdev->csums_tfm, e->private_bio, digest);
951b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			eq = !memcmp(digest, di->digest, digest_size);
952b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			kfree(digest);
953b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
954b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
955b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (eq) {
956b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_set_in_sync(mdev, e->sector, e->size);
957b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mdev->rs_same_csum++;
958b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = drbd_send_ack(mdev, P_RS_IS_IN_SYNC, e);
959b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} else {
960b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			inc_rs_pending(mdev);
961b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			e->block_id = ID_SYNCER;
962b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ok = drbd_send_block(mdev, P_RS_DATA_REPLY, e);
963b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
964b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
965b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_ack(mdev, P_NEG_RS_DREPLY, e);
966b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (__ratelimit(&drbd_ratelimit_state))
967b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_err(DEV, "Sending NegDReply. I guess it gets messy.\n");
968b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
969b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
970b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dec_unacked(mdev);
971b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
972b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	kfree(di);
973b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
974b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	move_to_net_ee_or_free(mdev, e);
975b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
976b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(!ok))
977b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "drbd_send_block/ack() failed\n");
978b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
979b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
980b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
981b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_e_end_ov_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
982b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
983b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
984b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int digest_size;
985b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	void *digest;
986b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok = 1;
987b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
988b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel))
989b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		goto out;
990b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
991b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(!drbd_bio_uptodate(e->private_bio)))
992b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		goto out;
993b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
994b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	digest_size = crypto_hash_digestsize(mdev->verify_tfm);
995b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* FIXME if this allocation fails, online verify will not terminate! */
996b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	digest = kmalloc(digest_size, GFP_NOIO);
997b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (digest) {
998b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_csum(mdev, mdev->verify_tfm, e->private_bio, digest);
999b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		inc_rs_pending(mdev);
1000b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_drequest_csum(mdev, e->sector, e->size,
1001b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner					     digest, digest_size, P_OV_REPLY);
1002b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!ok)
1003b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dec_rs_pending(mdev);
1004b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		kfree(digest);
1005b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1006b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1007b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerout:
1008b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_free_ee(mdev, e);
1009b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1010b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dec_unacked(mdev);
1011b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1012b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
1013b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1014b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1015b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_ov_oos_found(struct drbd_conf *mdev, sector_t sector, int size)
1016b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1017b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->ov_last_oos_start + mdev->ov_last_oos_size == sector) {
1018b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->ov_last_oos_size += size>>9;
1019b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
1020b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->ov_last_oos_start = sector;
1021b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->ov_last_oos_size = size>>9;
1022b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1023b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_set_out_of_sync(mdev, sector, size);
1024b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	set_bit(WRITE_BM_AFTER_RESYNC, &mdev->flags);
1025b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1026b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1027b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_e_end_ov_reply(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1028b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1029b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_epoch_entry *e = container_of(w, struct drbd_epoch_entry, w);
1030b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct digest_info *di;
1031b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int digest_size;
1032b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	void *digest;
1033b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok, eq = 0;
1034b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1035b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
1036b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_free_ee(mdev, e);
1037b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dec_unacked(mdev);
1038b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
1039b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1040b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1041b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* after "cancel", because after drbd_disconnect/drbd_rs_cancel_all
1042b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * the resync lru has been cleaned up already */
1043b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_rs_complete_io(mdev, e->sector);
1044b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1045b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	di = (struct digest_info *)(unsigned long)e->block_id;
1046b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1047b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (likely(drbd_bio_uptodate(e->private_bio))) {
1048b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		digest_size = crypto_hash_digestsize(mdev->verify_tfm);
1049b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		digest = kmalloc(digest_size, GFP_NOIO);
1050b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (digest) {
1051b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_csum(mdev, mdev->verify_tfm, e->private_bio, digest);
1052b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1053b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			D_ASSERT(digest_size == di->digest_size);
1054b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			eq = !memcmp(digest, di->digest, digest_size);
1055b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			kfree(digest);
1056b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1057b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else {
1058b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ok = drbd_send_ack(mdev, P_NEG_RS_DREPLY, e);
1059b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (__ratelimit(&drbd_ratelimit_state))
1060b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_err(DEV, "Sending NegDReply. I guess it gets messy.\n");
1061b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1062b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1063b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dec_unacked(mdev);
1064b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1065b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	kfree(di);
1066b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1067b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!eq)
1068b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_ov_oos_found(mdev, e->sector, e->size);
1069b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	else
1070b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ov_oos_print(mdev);
1071b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1072b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ok = drbd_send_ack_ex(mdev, P_OV_RESULT, e->sector, e->size,
1073b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			      eq ? ID_IN_SYNC : ID_OUT_OF_SYNC);
1074b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1075b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_free_ee(mdev, e);
1076b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1077b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (--mdev->ov_left == 0) {
1078b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ov_oos_print(mdev);
1079b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_resync_finished(mdev);
1080b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1081b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1082b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
1083b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1084b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1085b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_prev_work_done(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1086b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1087b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_wq_barrier *b = container_of(w, struct drbd_wq_barrier, w);
1088b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	complete(&b->done);
1089b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 1;
1090b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1091b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1092b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_send_barrier(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1093b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1094b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_tl_epoch *b = container_of(w, struct drbd_tl_epoch, w);
1095b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct p_barrier *p = &mdev->data.sbuf.barrier;
1096b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok = 1;
1097b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1098b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* really avoid racing with tl_clear.  w.cb may have been referenced
1099b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * just before it was reassigned and re-queued, so double check that.
1100b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * actually, this race was harmless, since we only try to send the
1101b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * barrier packet here, and otherwise do nothing with the object.
1102b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * but compare with the head of w_clear_epoch */
1103b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irq(&mdev->req_lock);
1104b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (w->cb != w_send_barrier || mdev->state.conn < C_CONNECTED)
1105b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		cancel = 1;
1106b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irq(&mdev->req_lock);
1107b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (cancel)
1108b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
1109b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1110b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!drbd_get_data_sock(mdev))
1111b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 0;
1112b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	p->barrier = b->br_number;
1113b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* inc_ap_pending was done where this was queued.
1114b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * dec_ap_pending will be done in got_BarrierAck
1115b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * or (on connection loss) in w_clear_epoch.  */
1116b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ok = _drbd_send_cmd(mdev, mdev->data.socket, P_BARRIER,
1117b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(struct p_header *)p, sizeof(*p), 0);
1118b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_put_data_sock(mdev);
1119b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1120b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
1121b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1122b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1123b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_send_write_hint(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1124b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1125b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (cancel)
1126b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
1127b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return drbd_send_short_cmd(mdev, P_UNPLUG_REMOTE);
1128b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1129b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1130b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
1131b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * w_send_dblock() - Worker callback to send a P_DATA packet in order to mirror a write request
1132b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
1133b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @w:		work object.
1134b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @cancel:	The connection will be closed anyways
1135b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
1136b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_send_dblock(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1137b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1138b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_request *req = container_of(w, struct drbd_request, w);
1139b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok;
1140b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1141b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
1142b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		req_mod(req, send_canceled);
1143b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
1144b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1145b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1146b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ok = drbd_send_dblock(mdev, req);
1147b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	req_mod(req, ok ? handed_over_to_network : send_failed);
1148b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1149b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
1150b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1151b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1152b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
1153b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * w_send_read_req() - Worker callback to send a read request (P_DATA_REQUEST) packet
1154b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
1155b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @w:		work object.
1156b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @cancel:	The connection will be closed anyways
1157b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
1158b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint w_send_read_req(struct drbd_conf *mdev, struct drbd_work *w, int cancel)
1159b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1160b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_request *req = container_of(w, struct drbd_request, w);
1161b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int ok;
1162b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1163b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (unlikely(cancel)) {
1164b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		req_mod(req, send_canceled);
1165b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return 1;
1166b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1167b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1168b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ok = drbd_send_drequest(mdev, P_DATA_REQUEST, req->sector, req->size,
1169b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				(unsigned long)req);
1170b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1171b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!ok) {
1172b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* ?? we set C_TIMEOUT or C_BROKEN_PIPE in drbd_send();
1173b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * so this is probably redundant */
1174b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->state.conn >= C_CONNECTED)
1175b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_force_state(mdev, NS(conn, C_NETWORK_FAILURE));
1176b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1177b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	req_mod(req, ok ? handed_over_to_network : send_failed);
1178b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1179b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return ok;
1180b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1181b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1182b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int _drbd_may_sync_now(struct drbd_conf *mdev)
1183b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1184b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *odev = mdev;
1185b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1186b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	while (1) {
1187b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev->sync_conf.after == -1)
1188b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 1;
1189b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		odev = minor_to_mdev(odev->sync_conf.after);
1190b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ERR_IF(!odev) return 1;
1191b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if ((odev->state.conn >= C_SYNC_SOURCE &&
1192b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		     odev->state.conn <= C_PAUSED_SYNC_T) ||
1193b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		    odev->state.aftr_isp || odev->state.peer_isp ||
1194b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		    odev->state.user_isp)
1195b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return 0;
1196b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1197b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1198b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1199b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
1200b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * _drbd_pause_after() - Pause resync on all devices that may not resync now
1201b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
1202b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner *
1203b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * Called from process context only (admin command and after_state_ch).
1204b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
1205b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int _drbd_pause_after(struct drbd_conf *mdev)
1206b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1207b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *odev;
1208b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int i, rv = 0;
1209b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1210b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	for (i = 0; i < minor_count; i++) {
1211b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		odev = minor_to_mdev(i);
1212b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!odev)
1213b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			continue;
1214b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1215b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			continue;
1216b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!_drbd_may_sync_now(odev))
1217b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			rv |= (__drbd_set_state(_NS(odev, aftr_isp, 1), CS_HARD, NULL)
1218b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			       != SS_NOTHING_TO_DO);
1219b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1220b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1221b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return rv;
1222b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1223b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1224b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
1225b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * _drbd_resume_next() - Resume resync on all devices that may resync now
1226b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
1227b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner *
1228b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * Called from process context only (admin command and worker).
1229b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
1230b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int _drbd_resume_next(struct drbd_conf *mdev)
1231b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1232b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *odev;
1233b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int i, rv = 0;
1234b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1235b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	for (i = 0; i < minor_count; i++) {
1236b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		odev = minor_to_mdev(i);
1237b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!odev)
1238b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			continue;
1239b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev->state.conn == C_STANDALONE && odev->state.disk == D_DISKLESS)
1240b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			continue;
1241b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev->state.aftr_isp) {
1242b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (_drbd_may_sync_now(odev))
1243b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				rv |= (__drbd_set_state(_NS(odev, aftr_isp, 0),
1244b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner							CS_HARD, NULL)
1245b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				       != SS_NOTHING_TO_DO) ;
1246b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1247b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1248b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return rv;
1249b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1250b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1251b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid resume_next_sg(struct drbd_conf *mdev)
1252b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1253b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_lock_irq(&global_state_lock);
1254b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	_drbd_resume_next(mdev);
1255b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_unlock_irq(&global_state_lock);
1256b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1257b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1258b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid suspend_other_sg(struct drbd_conf *mdev)
1259b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1260b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_lock_irq(&global_state_lock);
1261b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	_drbd_pause_after(mdev);
1262b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_unlock_irq(&global_state_lock);
1263b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1264b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1265b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerstatic int sync_after_error(struct drbd_conf *mdev, int o_minor)
1266b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1267b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *odev;
1268b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1269b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (o_minor == -1)
1270b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return NO_ERROR;
1271b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (o_minor < -1 || minor_to_mdev(o_minor) == NULL)
1272b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return ERR_SYNC_AFTER;
1273b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1274b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* check for loops */
1275b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	odev = minor_to_mdev(o_minor);
1276b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	while (1) {
1277b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev == mdev)
1278b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return ERR_SYNC_AFTER_CYCLE;
1279b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1280b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* dependency chain ends here, no cycles. */
1281b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (odev->sync_conf.after == -1)
1282b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return NO_ERROR;
1283b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1284b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* follow the dependency chain */
1285b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		odev = minor_to_mdev(odev->sync_conf.after);
1286b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1287b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1288b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1289b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint drbd_alter_sa(struct drbd_conf *mdev, int na)
1290b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1291b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int changes;
1292b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int retcode;
1293b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1294b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_lock_irq(&global_state_lock);
1295b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	retcode = sync_after_error(mdev, na);
1296b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (retcode == NO_ERROR) {
1297b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->sync_conf.after = na;
1298b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		do {
1299b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			changes  = _drbd_pause_after(mdev);
1300b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			changes |= _drbd_resume_next(mdev);
1301b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		} while (changes);
1302b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1303b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_unlock_irq(&global_state_lock);
1304b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return retcode;
1305b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1306b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1307b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner/**
1308b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * drbd_start_resync() - Start the resync process
1309b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @mdev:	DRBD device.
1310b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * @side:	Either C_SYNC_SOURCE or C_SYNC_TARGET
1311b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner *
1312b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * This function might bring you directly into one of the
1313b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner * C_PAUSED_SYNC_* states.
1314b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner */
1315b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnervoid drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
1316b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1317b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	union drbd_state ns;
1318b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int r;
1319b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1320b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (mdev->state.conn >= C_SYNC_SOURCE) {
1321b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_err(DEV, "Resync already running!\n");
1322b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return;
1323b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1324b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1325b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	trace_drbd_resync(mdev, TRACE_LVL_SUMMARY, "Resync starting: side=%s\n",
1326b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			  side == C_SYNC_TARGET ? "SyncTarget" : "SyncSource");
1327b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1328b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* In case a previous resync run was aborted by an IO error/detach on the peer. */
1329b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_rs_cancel_all(mdev);
1330b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1331b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (side == C_SYNC_TARGET) {
1332b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* Since application IO was locked out during C_WF_BITMAP_T and
1333b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   C_WF_SYNC_UUID we are still unmodified. Before going to C_SYNC_TARGET
1334b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   we check that we might make the data inconsistent. */
1335b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		r = drbd_khelper(mdev, "before-resync-target");
1336b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		r = (r >> 8) & 0xff;
1337b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (r > 0) {
1338b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			dev_info(DEV, "before-resync-target handler returned %d, "
1339b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			     "dropping connection.\n", r);
1340b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_force_state(mdev, NS(conn, C_DISCONNECTING));
1341b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return;
1342b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1343b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1344b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1345b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_state_lock(mdev);
1346b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1347b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
1348b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_state_unlock(mdev);
1349b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		return;
1350b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1351b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1352b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (side == C_SYNC_TARGET) {
1353b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->bm_resync_fo = 0;
1354b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	} else /* side == C_SYNC_SOURCE */ {
1355b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		u64 uuid;
1356b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1357b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		get_random_bytes(&uuid, sizeof(u64));
1358b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_uuid_set(mdev, UI_BITMAP, uuid);
1359b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_send_sync_uuid(mdev, uuid);
1360b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1361b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		D_ASSERT(mdev->state.disk == D_UP_TO_DATE);
1362b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1363b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1364b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_lock_irq(&global_state_lock);
1365b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns = mdev->state;
1366b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1367b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns.aftr_isp = !_drbd_may_sync_now(mdev);
1368b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1369b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns.conn = side;
1370b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1371b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (side == C_SYNC_TARGET)
1372b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ns.disk = D_INCONSISTENT;
1373b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	else /* side == C_SYNC_SOURCE */
1374b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ns.pdsk = D_INCONSISTENT;
1375b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1376b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	r = __drbd_set_state(mdev, ns, CS_VERBOSE, NULL);
1377b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	ns = mdev->state;
1378b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1379b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (ns.conn < C_CONNECTED)
1380b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		r = SS_UNKNOWN_ERROR;
1381b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1382b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (r == SS_SUCCESS) {
1383b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_total     =
1384b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_mark_left = drbd_bm_total_weight(mdev);
1385b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_failed    = 0;
1386b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_paused    = 0;
1387b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_start     =
1388b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_mark_time = jiffies;
1389b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		mdev->rs_same_csum = 0;
1390b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		_drbd_pause_after(mdev);
1391b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1392b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	write_unlock_irq(&global_state_lock);
1393b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_state_unlock(mdev);
1394b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	put_ldev(mdev);
1395b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1396b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	if (r == SS_SUCCESS) {
1397b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		dev_info(DEV, "Began resync as %s (will sync %lu KB [%lu bits set]).\n",
1398b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		     drbd_conn_str(ns.conn),
1399b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		     (unsigned long) mdev->rs_total << (BM_BLOCK_SHIFT-10),
1400b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		     (unsigned long) mdev->rs_total);
1401b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1402b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (mdev->rs_total == 0) {
1403b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* Peer still reachable? Beware of failing before-resync-target handlers! */
1404b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			request_ping(mdev);
1405b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			__set_current_state(TASK_INTERRUPTIBLE);
1406b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			schedule_timeout(mdev->net_conf->ping_timeo*HZ/9); /* 9 instead 10 */
1407b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			drbd_resync_finished(mdev);
1408b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			return;
1409b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1410b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1411b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* ns.conn may already be != mdev->state.conn,
1412b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * we may have been paused in between, or become paused until
1413b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * the timer triggers.
1414b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		 * No matter, that is handled in resync_timer_fn() */
1415b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (ns.conn == C_SYNC_TARGET)
1416b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mod_timer(&mdev->resync_timer, jiffies);
1417b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1418b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_md_sync(mdev);
1419b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1420b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1421b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1422b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisnerint drbd_worker(struct drbd_thread *thi)
1423b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner{
1424b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_conf *mdev = thi->mdev;
1425b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	struct drbd_work *w = NULL;
1426b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	LIST_HEAD(work_list);
1427b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	int intr = 0, i;
1428b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1429b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sprintf(current->comm, "drbd%d_worker", mdev_to_minor(mdev));
1430b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1431b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	while (get_t_state(thi) == Running) {
1432b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		drbd_thread_current_set_cpu(mdev);
1433b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1434b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (down_trylock(&mdev->data.work.s)) {
1435b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mutex_lock(&mdev->data.mutex);
1436b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (mdev->data.socket && !mdev->net_conf->no_cork)
1437b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				drbd_tcp_uncork(mdev->data.socket);
1438b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mutex_unlock(&mdev->data.mutex);
1439b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1440b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			intr = down_interruptible(&mdev->data.work.s);
1441b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1442b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mutex_lock(&mdev->data.mutex);
1443b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (mdev->data.socket  && !mdev->net_conf->no_cork)
1444b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				drbd_tcp_cork(mdev->data.socket);
1445b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			mutex_unlock(&mdev->data.mutex);
1446b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1447b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1448b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (intr) {
1449b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			D_ASSERT(intr == -EINTR);
1450b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			flush_signals(current);
1451b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			ERR_IF (get_t_state(thi) == Running)
1452b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				continue;
1453b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			break;
1454b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1455b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1456b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (get_t_state(thi) != Running)
1457b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			break;
1458b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		/* With this break, we have done a down() but not consumed
1459b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   the entry from the list. The cleanup code takes care of
1460b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		   this...   */
1461b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1462b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		w = NULL;
1463b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_lock_irq(&mdev->data.work.q_lock);
1464b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		ERR_IF(list_empty(&mdev->data.work.q)) {
1465b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* something terribly wrong in our logic.
1466b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * we were able to down() the semaphore,
1467b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * but the list is empty... doh.
1468b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 *
1469b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * what is the best thing to do now?
1470b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * try again from scratch, restarting the receiver,
1471b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * asender, whatnot? could break even more ugly,
1472b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * e.g. when we are primary, but no good local data.
1473b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 *
1474b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 * I'll try to get away just starting over this loop.
1475b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			 */
1476b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			spin_unlock_irq(&mdev->data.work.q_lock);
1477b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			continue;
1478b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1479b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		w = list_entry(mdev->data.work.q.next, struct drbd_work, list);
1480b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		list_del_init(&w->list);
1481b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_unlock_irq(&mdev->data.work.q_lock);
1482b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1483b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		if (!w->cb(mdev, w, mdev->state.conn < C_CONNECTED)) {
1484b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			/* dev_warn(DEV, "worker: a callback failed! \n"); */
1485b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			if (mdev->state.conn >= C_CONNECTED)
1486b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner				drbd_force_state(mdev,
1487b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner						NS(conn, C_NETWORK_FAILURE));
1488b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1489b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1490b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(test_bit(DEVICE_DYING, &mdev->flags));
1491b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(test_bit(CONFIG_PENDING, &mdev->flags));
1492b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1493b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_lock_irq(&mdev->data.work.q_lock);
1494b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	i = 0;
1495b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	while (!list_empty(&mdev->data.work.q)) {
1496b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		list_splice_init(&mdev->data.work.q, &work_list);
1497b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_unlock_irq(&mdev->data.work.q_lock);
1498b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1499b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		while (!list_empty(&work_list)) {
1500b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			w = list_entry(work_list.next, struct drbd_work, list);
1501b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			list_del_init(&w->list);
1502b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			w->cb(mdev, w, 1);
1503b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner			i++; /* dead debugging code */
1504b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		}
1505b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1506b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner		spin_lock_irq(&mdev->data.work.q_lock);
1507b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	}
1508b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	sema_init(&mdev->data.work.s, 0);
1509b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* DANGEROUS race: if someone did queue his work within the spinlock,
1510b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * but up() ed outside the spinlock, we could get an up() on the
1511b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * semaphore without corresponding list entry.
1512b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * So don't do that.
1513b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 */
1514b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	spin_unlock_irq(&mdev->data.work.q_lock);
1515b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1516b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	D_ASSERT(mdev->state.disk == D_DISKLESS && mdev->state.conn == C_STANDALONE);
1517b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	/* _drbd_set_state only uses stop_nowait.
1518b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	 * wait here for the Exiting receiver. */
1519b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_thread_stop(&mdev->receiver);
1520b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	drbd_mdev_cleanup(mdev);
1521b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1522b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	dev_info(DEV, "worker terminated\n");
1523b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1524b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	clear_bit(DEVICE_DYING, &mdev->flags);
1525b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	clear_bit(CONFIG_PENDING, &mdev->flags);
1526b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	wake_up(&mdev->state_wait);
1527b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner
1528b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner	return 0;
1529b411b3637fa71fce9cf2acf0639009500f5892fePhilipp Reisner}
1530