diff options
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 8181d6724942..e679209755cf 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -2386,22 +2386,26 @@ dasd_eckd_build_format(struct dasd_device *base, | |||
2386 | return fcp; | 2386 | return fcp; |
2387 | } | 2387 | } |
2388 | 2388 | ||
2389 | static int | 2389 | /* |
2390 | dasd_eckd_format_device(struct dasd_device *base, | 2390 | * Wrapper function to build a CCW request depending on input data |
2391 | struct format_data_t *fdata, | 2391 | */ |
2392 | int enable_pav) | 2392 | static struct dasd_ccw_req * |
2393 | dasd_eckd_format_build_ccw_req(struct dasd_device *base, | ||
2394 | struct format_data_t *fdata, int enable_pav) | ||
2395 | { | ||
2396 | return dasd_eckd_build_format(base, fdata, enable_pav); | ||
2397 | } | ||
2398 | |||
2399 | /* | ||
2400 | * Sanity checks on format_data | ||
2401 | */ | ||
2402 | static int dasd_eckd_format_sanity_checks(struct dasd_device *base, | ||
2403 | struct format_data_t *fdata) | ||
2393 | { | 2404 | { |
2394 | struct dasd_ccw_req *cqr, *n; | ||
2395 | struct dasd_eckd_private *private; | 2405 | struct dasd_eckd_private *private; |
2396 | struct list_head format_queue; | ||
2397 | struct dasd_device *device; | ||
2398 | int old_start, old_stop, format_step; | ||
2399 | int step, retry; | ||
2400 | int rc = 0; | ||
2401 | 2406 | ||
2402 | private = (struct dasd_eckd_private *) base->private; | 2407 | private = (struct dasd_eckd_private *) base->private; |
2403 | 2408 | ||
2404 | /* Sanity checks. */ | ||
2405 | if (fdata->start_unit >= | 2409 | if (fdata->start_unit >= |
2406 | (private->real_cyl * private->rdc_data.trk_per_cyl)) { | 2410 | (private->real_cyl * private->rdc_data.trk_per_cyl)) { |
2407 | dev_warn(&base->cdev->dev, | 2411 | dev_warn(&base->cdev->dev, |
@@ -2428,6 +2432,29 @@ dasd_eckd_format_device(struct dasd_device *base, | |||
2428 | fdata->blksize); | 2432 | fdata->blksize); |
2429 | return -EINVAL; | 2433 | return -EINVAL; |
2430 | } | 2434 | } |
2435 | return 0; | ||
2436 | } | ||
2437 | |||
2438 | /* | ||
2439 | * This function will process format_data originally coming from an IOCTL | ||
2440 | */ | ||
2441 | static int dasd_eckd_format_process_data(struct dasd_device *base, | ||
2442 | struct format_data_t *fdata, | ||
2443 | int enable_pav) | ||
2444 | { | ||
2445 | struct dasd_ccw_req *cqr, *n; | ||
2446 | struct dasd_eckd_private *private; | ||
2447 | struct list_head format_queue; | ||
2448 | struct dasd_device *device; | ||
2449 | int old_start, old_stop, format_step; | ||
2450 | int step, retry; | ||
2451 | int rc; | ||
2452 | |||
2453 | private = (struct dasd_eckd_private *) base->private; | ||
2454 | |||
2455 | rc = dasd_eckd_format_sanity_checks(base, fdata); | ||
2456 | if (rc) | ||
2457 | return rc; | ||
2431 | 2458 | ||
2432 | INIT_LIST_HEAD(&format_queue); | 2459 | INIT_LIST_HEAD(&format_queue); |
2433 | 2460 | ||
@@ -2445,7 +2472,8 @@ dasd_eckd_format_device(struct dasd_device *base, | |||
2445 | fdata->start_unit + format_step - 1; | 2472 | fdata->start_unit + format_step - 1; |
2446 | } | 2473 | } |
2447 | 2474 | ||
2448 | cqr = dasd_eckd_build_format(base, fdata, enable_pav); | 2475 | cqr = dasd_eckd_format_build_ccw_req(base, fdata, |
2476 | enable_pav); | ||
2449 | if (IS_ERR(cqr)) { | 2477 | if (IS_ERR(cqr)) { |
2450 | rc = PTR_ERR(cqr); | 2478 | rc = PTR_ERR(cqr); |
2451 | if (rc == -ENOMEM) { | 2479 | if (rc == -ENOMEM) { |
@@ -2492,6 +2520,12 @@ out: | |||
2492 | return rc; | 2520 | return rc; |
2493 | } | 2521 | } |
2494 | 2522 | ||
2523 | static int dasd_eckd_format_device(struct dasd_device *base, | ||
2524 | struct format_data_t *fdata, int enable_pav) | ||
2525 | { | ||
2526 | return dasd_eckd_format_process_data(base, fdata, enable_pav); | ||
2527 | } | ||
2528 | |||
2495 | static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr) | 2529 | static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr) |
2496 | { | 2530 | { |
2497 | if (cqr->retries < 0) { | 2531 | if (cqr->retries < 0) { |