• A
    [PATCH] blockdev.c: check driver layer errors · 4d7dd8fd
    Andrew Morton 提交于
    Check driver layer errors.
    
    Fix from: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>
    
    In blockdevc-check-errors.patch, add_bd_holder() is modified to return error
    values when some of its operation failed.  Among them, it returns -EEXIST when
    a given bd_holder object already exists in the list.
    
    However, in this case, the function completed its work successfully and need
    no action by its caller other than freeing unused bd_holder object.  So I
    think it's better to return success after freeing by itself.
    
    Otherwise, bd_claim-ing with same claim pointer will fail.
    Typically, lvresize will fails with following message:
      device-mapper: reload ioctl failed: Invalid argument
    and you'll see messages like below in kernel log:
      device-mapper: table: 254:13: linear: dm-linear: Device lookup failed
      device-mapper: ioctl: error adding target to table
    
    Similarly, it should not add bd_holder to the list if either one of symlinking
    fails.  I don't have a test case for this to happen but it should cause
    dereference of freed pointer.
    
    If a matching bd_holder is found in bd_holder_list, add_bd_holder() completes
    its job by just incrementing the reference count.  In this case, it should be
    considered as success but it used to return 'fail' to let the caller free
    temporary bd_holder.  Fixed it to return success and free given object by
    itself.
    
    Also, if either one of symlinking fails, the bd_holder should not be added to
    the list so that it can be discarded later.  Otherwise, the caller will free
    bd_holder which is in the list.
    Signed-off-by: NJun'ichi Nomura <j-nomura@ce.jp.nec.com>
    Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    4d7dd8fd
block_dev.c 31.5 KB