@@ -2335,8 +2335,7 @@ dasd_eckd_build_check_tcw(struct dasd_device *base, struct format_data_t *fdata,
23352335 */
23362336 itcw_size = itcw_calc_size (0 , count , 0 );
23372337
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 );
23402339 if (IS_ERR (cqr ))
23412340 return cqr ;
23422341
@@ -2429,8 +2428,7 @@ dasd_eckd_build_check(struct dasd_device *base, struct format_data_t *fdata,
24292428 }
24302429 cplength += count ;
24312430
2432- cqr = dasd_smalloc_request (DASD_ECKD_MAGIC , cplength , datasize ,
2433- startdev , NULL );
2431+ cqr = dasd_fmalloc_request (DASD_ECKD_MAGIC , cplength , datasize , startdev );
24342432 if (IS_ERR (cqr ))
24352433 return cqr ;
24362434
@@ -2477,13 +2475,11 @@ dasd_eckd_build_check(struct dasd_device *base, struct format_data_t *fdata,
24772475}
24782476
24792477static 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 )
24832480{
24842481 struct dasd_eckd_private * base_priv ;
24852482 struct dasd_eckd_private * start_priv ;
2486- struct dasd_device * startdev = NULL ;
24872483 struct dasd_ccw_req * fcp ;
24882484 struct eckd_count * ect ;
24892485 struct ch_t address ;
@@ -2574,9 +2570,8 @@ dasd_eckd_build_format(struct dasd_device *base,
25742570 fdata -> intensity );
25752571 return ERR_PTR (- EINVAL );
25762572 }
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 );
25802575 if (IS_ERR (fcp ))
25812576 return fcp ;
25822577
@@ -2749,7 +2744,7 @@ dasd_eckd_format_build_ccw_req(struct dasd_device *base,
27492744 struct dasd_ccw_req * ccw_req ;
27502745
27512746 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 );
27532748 } else {
27542749 if (tpm )
27552750 ccw_req = dasd_eckd_build_check_tcw (base , fdata ,
@@ -2895,7 +2890,7 @@ static int dasd_eckd_format_process_data(struct dasd_device *base,
28952890 rc = - EIO ;
28962891 }
28972892 list_del_init (& cqr -> blocklist );
2898- dasd_sfree_request (cqr , device );
2893+ dasd_ffree_request (cqr , device );
28992894 private -> count -- ;
29002895 }
29012896
@@ -2934,6 +2929,96 @@ static int dasd_eckd_format_device(struct dasd_device *base,
29342929 0 , NULL );
29352930}
29362931
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+
29373022/*
29383023 * Helper function to count consecutive records of a single track.
29393024 */
@@ -3450,6 +3535,14 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_single(
34503535 cqr -> retries = startdev -> default_retries ;
34513536 cqr -> buildclk = get_tod_clock ();
34523537 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+
34533546 return cqr ;
34543547}
34553548
@@ -3621,6 +3714,11 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_track(
36213714 cqr -> retries = startdev -> default_retries ;
36223715 cqr -> buildclk = get_tod_clock ();
36233716 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+
36243722 return cqr ;
36253723}
36263724
@@ -3940,6 +4038,14 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_tpm_track(
39404038 cqr -> retries = startdev -> default_retries ;
39414039 cqr -> buildclk = get_tod_clock ();
39424040 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+
39434049 return cqr ;
39444050out_error :
39454051 dasd_sfree_request (cqr , startdev );
@@ -6061,6 +6167,8 @@ static struct dasd_discipline dasd_eckd_discipline = {
60616167 .ext_pool_cap_at_warnlevel = dasd_eckd_ext_pool_cap_at_warnlevel ,
60626168 .ext_pool_warn_thrshld = dasd_eckd_ext_pool_warn_thrshld ,
60636169 .ext_pool_oos = dasd_eckd_ext_pool_oos ,
6170+ .ese_format = dasd_eckd_ese_format ,
6171+ .ese_read = dasd_eckd_ese_read ,
60646172};
60656173
60666174static int __init
0 commit comments