aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2014-11-24 09:04:09 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-11-28 03:47:42 -0500
commit6ebdf1c79d09ad3d65c714a79db0a0c141a013ba (patch)
treefd9d6e09519f82f7035eb636f7fd8bcefc4b6741 /drivers/s390
parent932f0549f872cde022eed200910ee3291b1d3c69 (diff)
s390/dasd: retry partition detection
In case somebody attempted to open the device during online processing the partition detection ioctl may have failed. Added a retry loop to avoid not detected partitions. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/block/dasd_genhd.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c
index f224d59c4b6b..90f39f79f5d7 100644
--- a/drivers/s390/block/dasd_genhd.c
+++ b/drivers/s390/block/dasd_genhd.c
@@ -99,15 +99,37 @@ void dasd_gendisk_free(struct dasd_block *block)
99int dasd_scan_partitions(struct dasd_block *block) 99int dasd_scan_partitions(struct dasd_block *block)
100{ 100{
101 struct block_device *bdev; 101 struct block_device *bdev;
102 int retry, rc;
102 103
104 retry = 5;
103 bdev = bdget_disk(block->gdp, 0); 105 bdev = bdget_disk(block->gdp, 0);
104 if (!bdev || blkdev_get(bdev, FMODE_READ, NULL) < 0) 106 if (!bdev) {
107 DBF_DEV_EVENT(DBF_ERR, block->base, "%s",
108 "scan partitions error, bdget returned NULL");
105 return -ENODEV; 109 return -ENODEV;
110 }
111
112 rc = blkdev_get(bdev, FMODE_READ, NULL);
113 if (rc < 0) {
114 DBF_DEV_EVENT(DBF_ERR, block->base,
115 "scan partitions error, blkdev_get returned %d",
116 rc);
117 return -ENODEV;
118 }
106 /* 119 /*
107 * See fs/partition/check.c:register_disk,rescan_partitions 120 * See fs/partition/check.c:register_disk,rescan_partitions
108 * Can't call rescan_partitions directly. Use ioctl. 121 * Can't call rescan_partitions directly. Use ioctl.
109 */ 122 */
110 ioctl_by_bdev(bdev, BLKRRPART, 0); 123 rc = ioctl_by_bdev(bdev, BLKRRPART, 0);
124 while (rc == -EBUSY && retry > 0) {
125 schedule();
126 rc = ioctl_by_bdev(bdev, BLKRRPART, 0);
127 retry--;
128 DBF_DEV_EVENT(DBF_ERR, block->base,
129 "scan partitions error, retry %d rc %d",
130 retry, rc);
131 }
132
111 /* 133 /*
112 * Since the matching blkdev_put call to the blkdev_get in 134 * Since the matching blkdev_put call to the blkdev_get in
113 * this function is not called before dasd_destroy_partitions 135 * this function is not called before dasd_destroy_partitions