From 5dfb5d658ac3b3137ef59bf7f950893d4172f4cb Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 13 Aug 2009 10:06:24 +1000 Subject: [PATCH] --- yaml --- r: 156693 b: refs/heads/master c: 67ac6011db5d2b0c853d573ff474b25c85dfb644 h: refs/heads/master i: 156691: 55f672945024eaa920ac961c0f3ff068b643462e v: v3 --- [refs] | 2 +- trunk/drivers/md/raid5.c | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 27f74952b863..2a51b0115fcd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 51d5668cb2e3fd1827a55184e48606fff054c5be +refs/heads/master: 67ac6011db5d2b0c853d573ff474b25c85dfb644 diff --git a/trunk/drivers/md/raid5.c b/trunk/drivers/md/raid5.c index 2b521ee67dfa..b8a22a2205cf 100644 --- a/trunk/drivers/md/raid5.c +++ b/trunk/drivers/md/raid5.c @@ -4509,7 +4509,26 @@ static int run(mddev_t *mddev) (old_disks-max_degraded)); /* here_old is the first stripe that we might need to read * from */ - if (here_new >= here_old) { + if (mddev->delta_disks == 0) { + /* We cannot be sure it is safe to start an in-place + * reshape. It is only safe if user-space if monitoring + * and taking constant backups. + * mdadm always starts a situation like this in + * readonly mode so it can take control before + * allowing any writes. So just check for that. + */ + if ((here_new * mddev->new_chunk_sectors != + here_old * mddev->chunk_sectors) || + mddev->ro == 0) { + printk(KERN_ERR "raid5: in-place reshape must be started" + " in read-only mode - aborting\n"); + return -EINVAL; + } + } else if (mddev->delta_disks < 0 + ? (here_new * mddev->new_chunk_sectors <= + here_old * mddev->chunk_sectors) + : (here_new * mddev->new_chunk_sectors >= + here_old * mddev->chunk_sectors)) { /* Reading from the same stripe as writing to - bad */ printk(KERN_ERR "raid5: reshape_position too early for " "auto-recovery - aborting.\n");