• Michael Holzheu's avatar
    [S390] tape390: Fix request queue handling in block driver · 03cadd36
    Michael Holzheu authored
    When setting a channel attached tape online under Linux 2.6.31, the
    
    "vol_id" process from udev hangs in sync_page():
     2 sync_page+144 [0x1dfaac]
     3 __wait_on_bit_lock+194 [0x58c23e]
     4 __lock_page+116 [0x1df9dc]
     5 truncate_inode_pages_range+728 [0x1ed7cc]
     6 __blkdev_put+244 [0x25f738]
     7 __fput+300 [0x229c4c]
     8 filp_close+122 [0x225a3a]
    
    The reason for that is an error in the request queue handling. It can
    happen that we fetch a request, but do not process it further because
    the number of queued requests exceeds TAPEBLOCK_MIN_REQUEUE.
    To fix this, we should call blk_peek_request() instead of
    blk_fetch_request() in the while condition and fetch the request in
    the loop body afterwards.
    
    This bug was introduced with the patch "block: implement and enforce
    request peek/start/fetch" (9934c8c0)
    Signed-off-by: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    03cadd36
tape_block.c 11.4 KB