forked from luck/tmp_suning_uos_patched
03cadd36d5
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" (
|
||
---|---|---|
.. | ||
con3215.c | ||
con3270.c | ||
ctrlchar.c | ||
ctrlchar.h | ||
defkeymap.c | ||
defkeymap.map | ||
fs3270.c | ||
Kconfig | ||
keyboard.c | ||
keyboard.h | ||
Makefile | ||
monreader.c | ||
monwriter.c | ||
raw3270.c | ||
raw3270.h | ||
sclp_async.c | ||
sclp_cmd.c | ||
sclp_con.c | ||
sclp_config.c | ||
sclp_cpi_sys.c | ||
sclp_cpi_sys.h | ||
sclp_cpi.c | ||
sclp_quiesce.c | ||
sclp_rw.c | ||
sclp_rw.h | ||
sclp_sdias.c | ||
sclp_tty.c | ||
sclp_tty.h | ||
sclp_vt220.c | ||
sclp.c | ||
sclp.h | ||
tape_34xx.c | ||
tape_3590.c | ||
tape_3590.h | ||
tape_block.c | ||
tape_char.c | ||
tape_class.c | ||
tape_class.h | ||
tape_core.c | ||
tape_proc.c | ||
tape_std.c | ||
tape_std.h | ||
tape.h | ||
tty3270.c | ||
tty3270.h | ||
vmcp.c | ||
vmcp.h | ||
vmlogrdr.c | ||
vmur.c | ||
vmur.h | ||
vmwatchdog.c | ||
zcore.c |