diff options
author | Stefan Haberland <stefan.haberland@de.ibm.com> | 2014-11-24 09:04:09 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-11-28 03:47:42 -0500 |
commit | 6ebdf1c79d09ad3d65c714a79db0a0c141a013ba (patch) | |
tree | fd9d6e09519f82f7035eb636f7fd8bcefc4b6741 /drivers/s390 | |
parent | 932f0549f872cde022eed200910ee3291b1d3c69 (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.c | 26 |
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) | |||
99 | int dasd_scan_partitions(struct dasd_block *block) | 99 | int 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 |