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