Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[S390] dasd: prevent IO error during reserve/release loop

The termination of running CQR caused by reserve/release operations
may lead to an IO error if reserve/release is done in a tight loop.
Prevent this by increasing the retry counter after termination.

Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Stefan Haberland and committed by
Martin Schwidefsky
aade6c0d fdb1bb15

+10 -1
+10 -1
drivers/s390/block/dasd.c
··· 1742 1742 static inline int _dasd_term_running_cqr(struct dasd_device *device) 1743 1743 { 1744 1744 struct dasd_ccw_req *cqr; 1745 + int rc; 1745 1746 1746 1747 if (list_empty(&device->ccw_queue)) 1747 1748 return 0; 1748 1749 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); 1749 - return device->discipline->term_IO(cqr); 1750 + rc = device->discipline->term_IO(cqr); 1751 + if (!rc) 1752 + /* 1753 + * CQR terminated because a more important request is pending. 1754 + * Undo decreasing of retry counter because this is 1755 + * not an error case. 1756 + */ 1757 + cqr->retries++; 1758 + return rc; 1750 1759 } 1751 1760 1752 1761 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)