diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2009-04-09 14:30:09 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2009-07-29 10:19:47 +0200 |
commit | ed73f72420ee77afa39313df13d79f16c7e4f79c (patch) | |
tree | d159968bf28485434de1f1ba773cce548a71c5ee /drivers/block | |
parent | f83a37888aeeadddfa3c7d4cfa477bd156b3bbe6 (diff) |
Tracking DRBD mainline
782b1ed1e3582393381e1f3f1cb80020f027ca06 Merge branch 'drbd-8.0' into drbd-8.3
80de0d362ffd9906412ce7b602db7c9cd550b678 Adjusted the drbd_congested() function to work on kernels >= 2.6.30
f484da549b3375ef7e7d9d08d5bf2c95745c8eaa Correct exapnsion of "device minor %d" statements for upper resources.
4cecefe99336e911425e390f115cf32a9036679f Fixed the res_by_minor() function
10d77c7a0d08257a19f8d67fdda3af71bf415b1d Do not do state changes on unconfigured devices (bugz 214)
706b35dc7ada32cf9cc47d331733514a52c5a820 double :: typo
3ced685cd6ae4179d77e09945a4951f4c997d2db Merge branch 'drbd-8.2' into drbd-8.3
70339fe8d52ee93696aa975b9ed14cbaa61d0e0c Merge branch 'drbd-8.0' into drbd-8.2
864141476a52d5e174dcbb03fa9f98b6da6f9689 Fixing the error code path in case the bitmap allocation failes.
8126b2adf618924c1d00407bd56b8b4f3976e198 Fault injection for the bitmap allocation
c091e4513f805f9a2118f01ee87e6ec7a419126a proc/drbd: catch uninitialized congestion flag
d30881451c988619e243d6294a899139eed1183d Preparing 8.0.16
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 1 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 25 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 6 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_proc.c | 2 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 2 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_wrappers.h | 1 |
7 files changed, 29 insertions, 16 deletions
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index fed1d1ebb7eb..bfc695a6d6e6 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -509,8 +509,12 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity) if (want == have) { D_ASSERT(b->bm_pages != NULL); npages = b->bm_pages; - } else - npages = bm_realloc_pages(b->bm_pages, have, want); + } else { + if (FAULT_ACTIVE(mdev, DRBD_FAULT_BM_ALLOC)) + npages = NULL; + else + npages = bm_realloc_pages(b->bm_pages, have, want); + } if (!npages) { err = -ENOMEM; diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 01e55d959fcd..3c9a0fa2051e 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -152,6 +152,7 @@ enum { DRBD_FAULT_DT_WR, /* data */ DRBD_FAULT_DT_RD, DRBD_FAULT_DT_RA, /* data read ahead */ + DRBD_FAULT_BM_ALLOC, /* bitmap allocation */ DRBD_FAULT_AL_EE, /* alloc ee */ DRBD_FAULT_MAX, diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 9ca38a06fdf1..c2cc18260776 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -792,6 +792,10 @@ int __drbd_set_state(struct drbd_conf *mdev, ns.pdsk = DUnknown; } + /* Clear the aftr_isp when becomming Unconfigured */ + if (ns.conn == StandAlone && ns.disk == Diskless && ns.role == Secondary) + ns.aftr_isp = 0; + if (ns.conn <= Disconnecting && ns.disk == Diskless) ns.pdsk = DUnknown; @@ -1215,8 +1219,11 @@ STATIC void after_state_ch(struct drbd_conf *mdev, union drbd_state_t os, /* Terminate worker thread if we are unconfigured - it will be restarted as needed... */ - if (ns.disk == Diskless && ns.conn == StandAlone && ns.role == Secondary) + if (ns.disk == Diskless && ns.conn == StandAlone && ns.role == Secondary) { + if (os.aftr_isp != ns.aftr_isp) + resume_next_sg(mdev); drbd_thread_stop_nowait(&mdev->worker); + } drbd_md_sync(mdev); } @@ -2856,8 +2863,8 @@ STATIC void drbd_cleanup(void) } /** - * drbd_congested: Returns 1<<BDI_write_congested and/or - * 1<<BDI_read_congested if we are congested. This interface is known + * drbd_congested: Returns 1<<BDI_async_congested and/or + * 1<<BDI_sync_congested if we are congested. This interface is known * to be used by pdflush. */ static int drbd_congested(void *congested_data, int bdi_bits) @@ -2878,15 +2885,13 @@ static int drbd_congested(void *congested_data, int bdi_bits) q = bdev_get_queue(mdev->bc->backing_bdev); r = bdi_congested(&q->backing_dev_info, bdi_bits); dec_local(mdev); - if (r) { + if (r) reason = 'b'; - goto out; - } } - if (bdi_bits & (1 << BDI_write_congested) && test_bit(NET_CONGESTED, &mdev->flags)) { - r = (1 << BDI_write_congested); - reason = 'n'; + if (bdi_bits & (1 << BDI_async_congested) && test_bit(NET_CONGESTED, &mdev->flags)) { + r |= (1 << BDI_async_congested); + reason = reason == 'b' ? 'a' : 'n'; } out: @@ -3593,6 +3598,8 @@ _drbd_fault_str(unsigned int type) { "Data write", "Data read", "Data read ahead", + "BM allocation", + "EE allocation" }; return (type < DRBD_FAULT_MAX) ? _faults[type] : "**Unknown**"; diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index ee45093d2546..eddfcae9052d 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -561,7 +561,7 @@ enum determin_dev_size_enum drbd_determin_dev_size(struct drbd_conf *mdev) __mus size = drbd_bm_capacity(mdev)>>1; if (size == 0) { ERR("OUT OF MEMORY! " - "Could not allocate bitmap! "); + "Could not allocate bitmap!\n"); } else { ERR("BM resizing failed. " "Leaving size unchanged at size = %lu KB\n", @@ -886,13 +886,13 @@ STATIC int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp resync_lru = lc_alloc("resync", 61, sizeof(struct bm_extent), mdev); if (!resync_lru) { retcode = KMallocFailed; - goto fail; + goto release_bdev_fail; } if (!mdev->bitmap) { if (drbd_bm_init(mdev)) { retcode = KMallocFailed; - goto fail; + goto release_bdev_fail; } } diff --git a/drivers/block/drbd/drbd_proc.c b/drivers/block/drbd/drbd_proc.c index 6dc93edfb646..0e271975c0bf 100644 --- a/drivers/block/drbd/drbd_proc.c +++ b/drivers/block/drbd/drbd_proc.c @@ -215,7 +215,7 @@ STATIC int drbd_seq_show(struct seq_file *seq, void *v) mdev->state.aftr_isp ? 'a' : '-', mdev->state.peer_isp ? 'p' : '-', mdev->state.user_isp ? 'u' : '-', - mdev->congestion_reason, + mdev->congestion_reason ?: '-', mdev->send_cnt/2, mdev->recv_cnt/2, mdev->writ_cnt/2, diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index a9421dc104bf..57cc537b43d1 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -1212,6 +1212,8 @@ STATIC int _drbd_resume_next(struct drbd_conf *mdev) odev = minor_to_mdev(i); if (!odev) continue; + if (odev->state.conn == StandAlone && odev->state.disk == Diskless) + continue; if (odev->state.aftr_isp) { if (_drbd_may_sync_now(odev)) rv |= (__drbd_set_state(_NS(odev, aftr_isp, 0), diff --git a/drivers/block/drbd/drbd_wrappers.h b/drivers/block/drbd/drbd_wrappers.h index e1dc3af1ddff..49ff68d11e8c 100644 --- a/drivers/block/drbd/drbd_wrappers.h +++ b/drivers/block/drbd/drbd_wrappers.h @@ -114,4 +114,3 @@ static inline void drbd_plug_device(struct drbd_conf *mdev) # undef __cond_lock # define __cond_lock(x,c) (c) #endif - |