@@ -280,27 +280,28 @@ static int sd_zbc_update_wp_offset_cb(struct blk_zone *zone, unsigned int idx,
280
280
static void sd_zbc_update_wp_offset_workfn (struct work_struct * work )
281
281
{
282
282
struct scsi_disk * sdkp ;
283
+ unsigned long flags ;
283
284
unsigned int zno ;
284
285
int ret ;
285
286
286
287
sdkp = container_of (work , struct scsi_disk , zone_wp_offset_work );
287
288
288
- spin_lock_bh (& sdkp -> zones_wp_offset_lock );
289
+ spin_lock_irqsave (& sdkp -> zones_wp_offset_lock , flags );
289
290
for (zno = 0 ; zno < sdkp -> nr_zones ; zno ++ ) {
290
291
if (sdkp -> zones_wp_offset [zno ] != SD_ZBC_UPDATING_WP_OFST )
291
292
continue ;
292
293
293
- spin_unlock_bh (& sdkp -> zones_wp_offset_lock );
294
+ spin_unlock_irqrestore (& sdkp -> zones_wp_offset_lock , flags );
294
295
ret = sd_zbc_do_report_zones (sdkp , sdkp -> zone_wp_update_buf ,
295
296
SD_BUF_SIZE ,
296
297
zno * sdkp -> zone_blocks , true);
297
- spin_lock_bh (& sdkp -> zones_wp_offset_lock );
298
+ spin_lock_irqsave (& sdkp -> zones_wp_offset_lock , flags );
298
299
if (!ret )
299
300
sd_zbc_parse_report (sdkp , sdkp -> zone_wp_update_buf + 64 ,
300
301
zno , sd_zbc_update_wp_offset_cb ,
301
302
sdkp );
302
303
}
303
- spin_unlock_bh (& sdkp -> zones_wp_offset_lock );
304
+ spin_unlock_irqrestore (& sdkp -> zones_wp_offset_lock , flags );
304
305
305
306
scsi_device_put (sdkp -> device );
306
307
}
@@ -324,6 +325,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
324
325
struct request * rq = cmd -> request ;
325
326
struct scsi_disk * sdkp = scsi_disk (rq -> rq_disk );
326
327
unsigned int wp_offset , zno = blk_rq_zone_no (rq );
328
+ unsigned long flags ;
327
329
blk_status_t ret ;
328
330
329
331
ret = sd_zbc_cmnd_checks (cmd );
@@ -337,7 +339,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
337
339
if (!blk_req_zone_write_trylock (rq ))
338
340
return BLK_STS_ZONE_RESOURCE ;
339
341
340
- spin_lock_bh (& sdkp -> zones_wp_offset_lock );
342
+ spin_lock_irqsave (& sdkp -> zones_wp_offset_lock , flags );
341
343
wp_offset = sdkp -> zones_wp_offset [zno ];
342
344
switch (wp_offset ) {
343
345
case SD_ZBC_INVALID_WP_OFST :
@@ -366,7 +368,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
366
368
367
369
* lba += wp_offset ;
368
370
}
369
- spin_unlock_bh (& sdkp -> zones_wp_offset_lock );
371
+ spin_unlock_irqrestore (& sdkp -> zones_wp_offset_lock , flags );
370
372
if (ret )
371
373
blk_req_zone_write_unlock (rq );
372
374
return ret ;
@@ -445,14 +447,15 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
445
447
struct scsi_disk * sdkp = scsi_disk (rq -> rq_disk );
446
448
unsigned int zno = blk_rq_zone_no (rq );
447
449
enum req_opf op = req_op (rq );
450
+ unsigned long flags ;
448
451
449
452
/*
450
453
* If we got an error for a command that needs updating the write
451
454
* pointer offset cache, we must mark the zone wp offset entry as
452
455
* invalid to force an update from disk the next time a zone append
453
456
* command is issued.
454
457
*/
455
- spin_lock_bh (& sdkp -> zones_wp_offset_lock );
458
+ spin_lock_irqsave (& sdkp -> zones_wp_offset_lock , flags );
456
459
457
460
if (result && op != REQ_OP_ZONE_RESET_ALL ) {
458
461
if (op == REQ_OP_ZONE_APPEND ) {
@@ -496,7 +499,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
496
499
}
497
500
498
501
unlock_wp_offset :
499
- spin_unlock_bh (& sdkp -> zones_wp_offset_lock );
502
+ spin_unlock_irqrestore (& sdkp -> zones_wp_offset_lock , flags );
500
503
501
504
return good_bytes ;
502
505
}
0 commit comments