lkml.org 
[lkml]   [2017]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 181/306] md: be careful not lot leak internal curr_resync value into metadata. -- (all)
    3.16.40-rc1 review patch.  If anyone has any objections, please let me know.

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

    From: NeilBrown <neilb@suse.com>

    commit 1217e1d1999ed6c9c1e1b1acae0a74ab70464ae2 upstream.

    mddev->curr_resync usually records where the current resync is up to,
    but during the starting phase it has some "magic" values.

    1 - means that the array is trying to start a resync, but has yielded
    to another array which shares physical devices, and also needs to
    start a resync
    2 - means the array is trying to start resync, but has found another
    array which shares physical devices and has already started resync.

    3 - means that resync has commensed, but it is possible that nothing
    has actually been resynced yet.

    It is important that this value not be visible to user-space and
    particularly that it doesn't get written to the metadata, as the
    resync or recovery checkpoint. In part, this is because it may be
    slightly higher than the correct value, though this is very rare.
    In part, because it is not a multiple of 4K, and some devices only
    support 4K aligned accesses.

    There are two places where this value is propagates into either
    ->curr_resync_completed or ->recovery_cp or ->recovery_offset.
    These currently avoid the propagation of values 1 and 3, but will
    allow 3 to leak through.

    Change them to only propagate the value if it is > 3.

    As this can cause an array to fail, the patch is suitable for -stable.

    Reported-by: Viswesh <viswesh.vichu@gmail.com>
    Signed-off-by: NeilBrown <neilb@suse.com>
    Signed-off-by: Shaohua Li <shli@fb.com>
    [bwh: Backported to 3.16: there is only one comparison to fix]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/md/md.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/drivers/md/md.c
    +++ b/drivers/md/md.c
    @@ -7682,7 +7682,7 @@ void md_do_sync(struct md_thread *thread
    mddev->pers->sync_request(mddev, max_sectors, &skipped, 1);

    if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) &&
    - mddev->curr_resync > 2) {
    + mddev->curr_resync > 3) {
    if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
    if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
    if (mddev->curr_resync >= mddev->recovery_cp) {
    \
     
     \ /
      Last update: 2017-02-16 00:45    [W:4.135 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site