lkml.org 
[lkml]   [2014]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 219/238] md/raid1: count resync requests in nr_pending.
    Date
    3.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: NeilBrown <neilb@suse.de>

    commit 34e97f170149bfa14979581c4c748bc9b4b79d5b upstream.

    Both normal IO and resync IO can be retried with reschedule_retry()
    and so be counted into ->nr_queued, but only normal IO gets counted in
    ->nr_pending.

    Before the recent improvement to RAID1 resync there could only
    possibly have been one or the other on the queue. When handling a
    read failure it could only be normal IO. So when handle_read_error()
    called freeze_array() the fact that freeze_array only compares
    ->nr_queued against ->nr_pending was safe.

    But now that these two types can interleave, we can have both normal
    and resync IO requests queued, so we need to count them both in
    nr_pending.

    This error can lead to freeze_array() hanging if there is a read
    error, so it is suitable for -stable.

    Fixes: 79ef3a8aa1cb1523cc231c9a90a278333c21f761
    Reported-by: Brassow Jonathan <jbrassow@redhat.com>
    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/raid1.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/drivers/md/raid1.c
    +++ b/drivers/md/raid1.c
    @@ -856,6 +856,7 @@ static void raise_barrier(struct r1conf
    conf->next_resync + RESYNC_SECTORS),
    conf->resync_lock);

    + conf->nr_pending++;
    spin_unlock_irq(&conf->resync_lock);
    }

    @@ -865,6 +866,7 @@ static void lower_barrier(struct r1conf
    BUG_ON(conf->barrier <= 0);
    spin_lock_irqsave(&conf->resync_lock, flags);
    conf->barrier--;
    + conf->nr_pending--;
    spin_unlock_irqrestore(&conf->resync_lock, flags);
    wake_up(&conf->wait_barrier);
    }



    \
     
     \ /
      Last update: 2014-10-04 01:41    [W:4.032 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site