@@ -2335,8 +2335,7 @@ dasd_eckd_build_check_tcw(struct dasd_device *base, struct format_data_t *fdata,
2335
2335
*/
2336
2336
itcw_size = itcw_calc_size (0 , count , 0 );
2337
2337
2338
- cqr = dasd_smalloc_request (DASD_ECKD_MAGIC , 0 , itcw_size , startdev ,
2339
- NULL );
2338
+ cqr = dasd_fmalloc_request (DASD_ECKD_MAGIC , 0 , itcw_size , startdev );
2340
2339
if (IS_ERR (cqr ))
2341
2340
return cqr ;
2342
2341
@@ -2429,8 +2428,7 @@ dasd_eckd_build_check(struct dasd_device *base, struct format_data_t *fdata,
2429
2428
}
2430
2429
cplength += count ;
2431
2430
2432
- cqr = dasd_smalloc_request (DASD_ECKD_MAGIC , cplength , datasize ,
2433
- startdev , NULL );
2431
+ cqr = dasd_fmalloc_request (DASD_ECKD_MAGIC , cplength , datasize , startdev );
2434
2432
if (IS_ERR (cqr ))
2435
2433
return cqr ;
2436
2434
@@ -2477,13 +2475,11 @@ dasd_eckd_build_check(struct dasd_device *base, struct format_data_t *fdata,
2477
2475
}
2478
2476
2479
2477
static struct dasd_ccw_req *
2480
- dasd_eckd_build_format (struct dasd_device * base ,
2481
- struct format_data_t * fdata ,
2482
- int enable_pav )
2478
+ dasd_eckd_build_format (struct dasd_device * base , struct dasd_device * startdev ,
2479
+ struct format_data_t * fdata , int enable_pav )
2483
2480
{
2484
2481
struct dasd_eckd_private * base_priv ;
2485
2482
struct dasd_eckd_private * start_priv ;
2486
- struct dasd_device * startdev = NULL ;
2487
2483
struct dasd_ccw_req * fcp ;
2488
2484
struct eckd_count * ect ;
2489
2485
struct ch_t address ;
@@ -2574,9 +2570,8 @@ dasd_eckd_build_format(struct dasd_device *base,
2574
2570
fdata -> intensity );
2575
2571
return ERR_PTR (- EINVAL );
2576
2572
}
2577
- /* Allocate the format ccw request. */
2578
- fcp = dasd_smalloc_request (DASD_ECKD_MAGIC , cplength ,
2579
- datasize , startdev , NULL );
2573
+
2574
+ fcp = dasd_fmalloc_request (DASD_ECKD_MAGIC , cplength , datasize , startdev );
2580
2575
if (IS_ERR (fcp ))
2581
2576
return fcp ;
2582
2577
@@ -2749,7 +2744,7 @@ dasd_eckd_format_build_ccw_req(struct dasd_device *base,
2749
2744
struct dasd_ccw_req * ccw_req ;
2750
2745
2751
2746
if (!fmt_buffer ) {
2752
- ccw_req = dasd_eckd_build_format (base , fdata , enable_pav );
2747
+ ccw_req = dasd_eckd_build_format (base , NULL , fdata , enable_pav );
2753
2748
} else {
2754
2749
if (tpm )
2755
2750
ccw_req = dasd_eckd_build_check_tcw (base , fdata ,
@@ -2895,7 +2890,7 @@ static int dasd_eckd_format_process_data(struct dasd_device *base,
2895
2890
rc = - EIO ;
2896
2891
}
2897
2892
list_del_init (& cqr -> blocklist );
2898
- dasd_sfree_request (cqr , device );
2893
+ dasd_ffree_request (cqr , device );
2899
2894
private -> count -- ;
2900
2895
}
2901
2896
@@ -2934,6 +2929,96 @@ static int dasd_eckd_format_device(struct dasd_device *base,
2934
2929
0 , NULL );
2935
2930
}
2936
2931
2932
+ /*
2933
+ * Callback function to free ESE format requests.
2934
+ */
2935
+ static void dasd_eckd_ese_format_cb (struct dasd_ccw_req * cqr , void * data )
2936
+ {
2937
+ struct dasd_device * device = cqr -> startdev ;
2938
+ struct dasd_eckd_private * private = device -> private ;
2939
+
2940
+ private -> count -- ;
2941
+ dasd_ffree_request (cqr , device );
2942
+ }
2943
+
2944
+ static struct dasd_ccw_req *
2945
+ dasd_eckd_ese_format (struct dasd_device * startdev , struct dasd_ccw_req * cqr )
2946
+ {
2947
+ struct dasd_eckd_private * private ;
2948
+ struct format_data_t fdata ;
2949
+ unsigned int recs_per_trk ;
2950
+ struct dasd_ccw_req * fcqr ;
2951
+ struct dasd_device * base ;
2952
+ struct dasd_block * block ;
2953
+ unsigned int blksize ;
2954
+ struct request * req ;
2955
+ sector_t first_trk ;
2956
+ sector_t last_trk ;
2957
+ int rc ;
2958
+
2959
+ req = cqr -> callback_data ;
2960
+ base = cqr -> block -> base ;
2961
+ private = base -> private ;
2962
+ block = base -> block ;
2963
+ blksize = block -> bp_block ;
2964
+ recs_per_trk = recs_per_track (& private -> rdc_data , 0 , blksize );
2965
+
2966
+ first_trk = blk_rq_pos (req ) >> block -> s2b_shift ;
2967
+ sector_div (first_trk , recs_per_trk );
2968
+ last_trk =
2969
+ (blk_rq_pos (req ) + blk_rq_sectors (req ) - 1 ) >> block -> s2b_shift ;
2970
+ sector_div (last_trk , recs_per_trk );
2971
+
2972
+ fdata .start_unit = first_trk ;
2973
+ fdata .stop_unit = last_trk ;
2974
+ fdata .blksize = blksize ;
2975
+ fdata .intensity = private -> uses_cdl ? DASD_FMT_INT_COMPAT : 0 ;
2976
+
2977
+ rc = dasd_eckd_format_sanity_checks (base , & fdata );
2978
+ if (rc )
2979
+ return ERR_PTR (- EINVAL );
2980
+
2981
+ /*
2982
+ * We're building the request with PAV disabled as we're reusing
2983
+ * the former startdev.
2984
+ */
2985
+ fcqr = dasd_eckd_build_format (base , startdev , & fdata , 0 );
2986
+ if (IS_ERR (fcqr ))
2987
+ return fcqr ;
2988
+
2989
+ fcqr -> callback = dasd_eckd_ese_format_cb ;
2990
+
2991
+ return fcqr ;
2992
+ }
2993
+
2994
+ /*
2995
+ * When data is read from an unformatted area of an ESE volume, this function
2996
+ * returns zeroed data and thereby mimics a read of zero data.
2997
+ */
2998
+ static void dasd_eckd_ese_read (struct dasd_ccw_req * cqr )
2999
+ {
3000
+ unsigned int blksize , off ;
3001
+ struct dasd_device * base ;
3002
+ struct req_iterator iter ;
3003
+ struct request * req ;
3004
+ struct bio_vec bv ;
3005
+ char * dst ;
3006
+
3007
+ req = (struct request * ) cqr -> callback_data ;
3008
+ base = cqr -> block -> base ;
3009
+ blksize = base -> block -> bp_block ;
3010
+
3011
+ rq_for_each_segment (bv , req , iter ) {
3012
+ dst = page_address (bv .bv_page ) + bv .bv_offset ;
3013
+ for (off = 0 ; off < bv .bv_len ; off += blksize ) {
3014
+ if (dst && rq_data_dir (req ) == READ ) {
3015
+ dst += off ;
3016
+ memset (dst , 0 , blksize );
3017
+ }
3018
+ }
3019
+ }
3020
+ }
3021
+
2937
3022
/*
2938
3023
* Helper function to count consecutive records of a single track.
2939
3024
*/
@@ -3450,6 +3535,14 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_single(
3450
3535
cqr -> retries = startdev -> default_retries ;
3451
3536
cqr -> buildclk = get_tod_clock ();
3452
3537
cqr -> status = DASD_CQR_FILLED ;
3538
+
3539
+ /* Set flags to suppress output for expected errors */
3540
+ if (dasd_eckd_is_ese (basedev )) {
3541
+ set_bit (DASD_CQR_SUPPRESS_FP , & cqr -> flags );
3542
+ set_bit (DASD_CQR_SUPPRESS_IL , & cqr -> flags );
3543
+ set_bit (DASD_CQR_SUPPRESS_NRF , & cqr -> flags );
3544
+ }
3545
+
3453
3546
return cqr ;
3454
3547
}
3455
3548
@@ -3621,6 +3714,11 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_track(
3621
3714
cqr -> retries = startdev -> default_retries ;
3622
3715
cqr -> buildclk = get_tod_clock ();
3623
3716
cqr -> status = DASD_CQR_FILLED ;
3717
+
3718
+ /* Set flags to suppress output for expected errors */
3719
+ if (dasd_eckd_is_ese (basedev ))
3720
+ set_bit (DASD_CQR_SUPPRESS_NRF , & cqr -> flags );
3721
+
3624
3722
return cqr ;
3625
3723
}
3626
3724
@@ -3940,6 +4038,14 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_tpm_track(
3940
4038
cqr -> retries = startdev -> default_retries ;
3941
4039
cqr -> buildclk = get_tod_clock ();
3942
4040
cqr -> status = DASD_CQR_FILLED ;
4041
+
4042
+ /* Set flags to suppress output for expected errors */
4043
+ if (dasd_eckd_is_ese (basedev )) {
4044
+ set_bit (DASD_CQR_SUPPRESS_FP , & cqr -> flags );
4045
+ set_bit (DASD_CQR_SUPPRESS_IL , & cqr -> flags );
4046
+ set_bit (DASD_CQR_SUPPRESS_NRF , & cqr -> flags );
4047
+ }
4048
+
3943
4049
return cqr ;
3944
4050
out_error :
3945
4051
dasd_sfree_request (cqr , startdev );
@@ -6061,6 +6167,8 @@ static struct dasd_discipline dasd_eckd_discipline = {
6061
6167
.ext_pool_cap_at_warnlevel = dasd_eckd_ext_pool_cap_at_warnlevel ,
6062
6168
.ext_pool_warn_thrshld = dasd_eckd_ext_pool_warn_thrshld ,
6063
6169
.ext_pool_oos = dasd_eckd_ext_pool_oos ,
6170
+ .ese_format = dasd_eckd_ese_format ,
6171
+ .ese_read = dasd_eckd_ese_read ,
6064
6172
};
6065
6173
6066
6174
static int __init
0 commit comments