aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/block/dasd_eckd.c58
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
2389static int 2389/*
2390dasd_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) 2392static struct dasd_ccw_req *
2393dasd_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 */
2402static 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 */
2441static 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
2523static 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
2495static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr) 2529static void dasd_eckd_handle_terminated_request(struct dasd_ccw_req *cqr)
2496{ 2530{
2497 if (cqr->retries < 0) { 2531 if (cqr->retries < 0) {