@@ -502,34 +502,21 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
502
502
static int blkif_ioctl (struct block_device * bdev , fmode_t mode ,
503
503
unsigned command , unsigned long argument )
504
504
{
505
- struct blkfront_info * info = bdev -> bd_disk -> private_data ;
506
505
int i ;
507
506
508
- dev_dbg (& info -> xbdev -> dev , "command: 0x%x, argument: 0x%lx\n" ,
509
- command , (long )argument );
510
-
511
507
switch (command ) {
512
508
case CDROMMULTISESSION :
513
- dev_dbg (& info -> xbdev -> dev , "FIXME: support multisession CDs later\n" );
514
509
for (i = 0 ; i < sizeof (struct cdrom_multisession ); i ++ )
515
510
if (put_user (0 , (char __user * )(argument + i )))
516
511
return - EFAULT ;
517
512
return 0 ;
518
-
519
- case CDROM_GET_CAPABILITY : {
520
- struct gendisk * gd = info -> gd ;
521
- if (gd -> flags & GENHD_FL_CD )
513
+ case CDROM_GET_CAPABILITY :
514
+ if (bdev -> bd_disk -> flags & GENHD_FL_CD )
522
515
return 0 ;
523
516
return - EINVAL ;
524
- }
525
-
526
517
default :
527
- /*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n",
528
- command);*/
529
- return - EINVAL ; /* same return as native Linux */
518
+ return - EINVAL ;
530
519
}
531
-
532
- return 0 ;
533
520
}
534
521
535
522
static unsigned long blkif_ring_get_request (struct blkfront_ring_info * rinfo ,
@@ -1177,36 +1164,6 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
1177
1164
return err ;
1178
1165
}
1179
1166
1180
- static void xlvbd_release_gendisk (struct blkfront_info * info )
1181
- {
1182
- unsigned int minor , nr_minors , i ;
1183
- struct blkfront_ring_info * rinfo ;
1184
-
1185
- if (info -> rq == NULL )
1186
- return ;
1187
-
1188
- /* No more blkif_request(). */
1189
- blk_mq_stop_hw_queues (info -> rq );
1190
-
1191
- for_each_rinfo (info , rinfo , i ) {
1192
- /* No more gnttab callback work. */
1193
- gnttab_cancel_free_callback (& rinfo -> callback );
1194
-
1195
- /* Flush gnttab callback work. Must be done with no locks held. */
1196
- flush_work (& rinfo -> work );
1197
- }
1198
-
1199
- del_gendisk (info -> gd );
1200
-
1201
- minor = info -> gd -> first_minor ;
1202
- nr_minors = info -> gd -> minors ;
1203
- xlbd_release_minors (minor , nr_minors );
1204
-
1205
- blk_cleanup_disk (info -> gd );
1206
- info -> gd = NULL ;
1207
- blk_mq_free_tag_set (& info -> tag_set );
1208
- }
1209
-
1210
1167
/* Already hold rinfo->ring_lock. */
1211
1168
static inline void kick_pending_request_queues_locked (struct blkfront_ring_info * rinfo )
1212
1169
{
@@ -1756,12 +1713,6 @@ static int write_per_ring_nodes(struct xenbus_transaction xbt,
1756
1713
return err ;
1757
1714
}
1758
1715
1759
- static void free_info (struct blkfront_info * info )
1760
- {
1761
- list_del (& info -> info_list );
1762
- kfree (info );
1763
- }
1764
-
1765
1716
/* Common code used when first setting up, and when resuming. */
1766
1717
static int talk_to_blkback (struct xenbus_device * dev ,
1767
1718
struct blkfront_info * info )
@@ -1880,13 +1831,6 @@ static int talk_to_blkback(struct xenbus_device *dev,
1880
1831
xenbus_dev_fatal (dev , err , "%s" , message );
1881
1832
destroy_blkring :
1882
1833
blkif_free (info , 0 );
1883
-
1884
- mutex_lock (& blkfront_mutex );
1885
- free_info (info );
1886
- mutex_unlock (& blkfront_mutex );
1887
-
1888
- dev_set_drvdata (& dev -> dev , NULL );
1889
-
1890
1834
return err ;
1891
1835
}
1892
1836
@@ -2126,38 +2070,26 @@ static int blkfront_resume(struct xenbus_device *dev)
2126
2070
static void blkfront_closing (struct blkfront_info * info )
2127
2071
{
2128
2072
struct xenbus_device * xbdev = info -> xbdev ;
2129
- struct block_device * bdev = NULL ;
2130
-
2131
- mutex_lock (& info -> mutex );
2073
+ struct blkfront_ring_info * rinfo ;
2074
+ unsigned int i ;
2132
2075
2133
- if (xbdev -> state == XenbusStateClosing ) {
2134
- mutex_unlock (& info -> mutex );
2076
+ if (xbdev -> state == XenbusStateClosing )
2135
2077
return ;
2136
- }
2137
2078
2138
- if (info -> gd )
2139
- bdev = bdgrab (info -> gd -> part0 );
2140
-
2141
- mutex_unlock (& info -> mutex );
2142
-
2143
- if (!bdev ) {
2144
- xenbus_frontend_closed (xbdev );
2145
- return ;
2146
- }
2079
+ /* No more blkif_request(). */
2080
+ blk_mq_stop_hw_queues (info -> rq );
2081
+ blk_set_queue_dying (info -> rq );
2082
+ set_capacity (info -> gd , 0 );
2147
2083
2148
- mutex_lock (& bdev -> bd_disk -> open_mutex );
2084
+ for_each_rinfo (info , rinfo , i ) {
2085
+ /* No more gnttab callback work. */
2086
+ gnttab_cancel_free_callback (& rinfo -> callback );
2149
2087
2150
- if (bdev -> bd_openers ) {
2151
- xenbus_dev_error (xbdev , - EBUSY ,
2152
- "Device in use; refusing to close" );
2153
- xenbus_switch_state (xbdev , XenbusStateClosing );
2154
- } else {
2155
- xlvbd_release_gendisk (info );
2156
- xenbus_frontend_closed (xbdev );
2088
+ /* Flush gnttab callback work. Must be done with no locks held. */
2089
+ flush_work (& rinfo -> work );
2157
2090
}
2158
2091
2159
- mutex_unlock (& bdev -> bd_disk -> open_mutex );
2160
- bdput (bdev );
2092
+ xenbus_frontend_closed (xbdev );
2161
2093
}
2162
2094
2163
2095
static void blkfront_setup_discard (struct blkfront_info * info )
@@ -2472,65 +2404,29 @@ static void blkback_changed(struct xenbus_device *dev,
2472
2404
break ;
2473
2405
fallthrough ;
2474
2406
case XenbusStateClosing :
2475
- if (info )
2476
- blkfront_closing (info );
2407
+ blkfront_closing (info );
2477
2408
break ;
2478
2409
}
2479
2410
}
2480
2411
2481
2412
static int blkfront_remove (struct xenbus_device * xbdev )
2482
2413
{
2483
2414
struct blkfront_info * info = dev_get_drvdata (& xbdev -> dev );
2484
- struct block_device * bdev = NULL ;
2485
- struct gendisk * disk ;
2486
2415
2487
2416
dev_dbg (& xbdev -> dev , "%s removed" , xbdev -> nodename );
2488
2417
2489
- if (!info )
2490
- return 0 ;
2491
-
2492
- blkif_free (info , 0 );
2493
-
2494
- mutex_lock (& info -> mutex );
2495
-
2496
- disk = info -> gd ;
2497
- if (disk )
2498
- bdev = bdgrab (disk -> part0 );
2499
-
2500
- info -> xbdev = NULL ;
2501
- mutex_unlock (& info -> mutex );
2502
-
2503
- if (!bdev ) {
2504
- mutex_lock (& blkfront_mutex );
2505
- free_info (info );
2506
- mutex_unlock (& blkfront_mutex );
2507
- return 0 ;
2508
- }
2509
-
2510
- /*
2511
- * The xbdev was removed before we reached the Closed
2512
- * state. See if it's safe to remove the disk. If the bdev
2513
- * isn't closed yet, we let release take care of it.
2514
- */
2515
-
2516
- mutex_lock (& disk -> open_mutex );
2517
- info = disk -> private_data ;
2518
-
2519
- dev_warn (disk_to_dev (disk ),
2520
- "%s was hot-unplugged, %d stale handles\n" ,
2521
- xbdev -> nodename , bdev -> bd_openers );
2418
+ del_gendisk (info -> gd );
2522
2419
2523
- if (info && !bdev -> bd_openers ) {
2524
- xlvbd_release_gendisk (info );
2525
- disk -> private_data = NULL ;
2526
- mutex_lock (& blkfront_mutex );
2527
- free_info (info );
2528
- mutex_unlock (& blkfront_mutex );
2529
- }
2420
+ mutex_lock (& blkfront_mutex );
2421
+ list_del (& info -> info_list );
2422
+ mutex_unlock (& blkfront_mutex );
2530
2423
2531
- mutex_unlock (& disk -> open_mutex );
2532
- bdput (bdev );
2424
+ blkif_free (info , 0 );
2425
+ xlbd_release_minors (info -> gd -> first_minor , info -> gd -> minors );
2426
+ blk_cleanup_disk (info -> gd );
2427
+ blk_mq_free_tag_set (& info -> tag_set );
2533
2428
2429
+ kfree (info );
2534
2430
return 0 ;
2535
2431
}
2536
2432
@@ -2541,77 +2437,9 @@ static int blkfront_is_ready(struct xenbus_device *dev)
2541
2437
return info -> is_ready && info -> xbdev ;
2542
2438
}
2543
2439
2544
- static int blkif_open (struct block_device * bdev , fmode_t mode )
2545
- {
2546
- struct gendisk * disk = bdev -> bd_disk ;
2547
- struct blkfront_info * info ;
2548
- int err = 0 ;
2549
-
2550
- mutex_lock (& blkfront_mutex );
2551
-
2552
- info = disk -> private_data ;
2553
- if (!info ) {
2554
- /* xbdev gone */
2555
- err = - ERESTARTSYS ;
2556
- goto out ;
2557
- }
2558
-
2559
- mutex_lock (& info -> mutex );
2560
-
2561
- if (!info -> gd )
2562
- /* xbdev is closed */
2563
- err = - ERESTARTSYS ;
2564
-
2565
- mutex_unlock (& info -> mutex );
2566
-
2567
- out :
2568
- mutex_unlock (& blkfront_mutex );
2569
- return err ;
2570
- }
2571
-
2572
- static void blkif_release (struct gendisk * disk , fmode_t mode )
2573
- {
2574
- struct blkfront_info * info = disk -> private_data ;
2575
- struct xenbus_device * xbdev ;
2576
-
2577
- mutex_lock (& blkfront_mutex );
2578
- if (disk -> part0 -> bd_openers )
2579
- goto out_mutex ;
2580
-
2581
- /*
2582
- * Check if we have been instructed to close. We will have
2583
- * deferred this request, because the bdev was still open.
2584
- */
2585
-
2586
- mutex_lock (& info -> mutex );
2587
- xbdev = info -> xbdev ;
2588
-
2589
- if (xbdev && xbdev -> state == XenbusStateClosing ) {
2590
- /* pending switch to state closed */
2591
- dev_info (disk_to_dev (disk ), "releasing disk\n" );
2592
- xlvbd_release_gendisk (info );
2593
- xenbus_frontend_closed (info -> xbdev );
2594
- }
2595
-
2596
- mutex_unlock (& info -> mutex );
2597
-
2598
- if (!xbdev ) {
2599
- /* sudden device removal */
2600
- dev_info (disk_to_dev (disk ), "releasing disk\n" );
2601
- xlvbd_release_gendisk (info );
2602
- disk -> private_data = NULL ;
2603
- free_info (info );
2604
- }
2605
-
2606
- out_mutex :
2607
- mutex_unlock (& blkfront_mutex );
2608
- }
2609
-
2610
2440
static const struct block_device_operations xlvbd_block_fops =
2611
2441
{
2612
2442
.owner = THIS_MODULE ,
2613
- .open = blkif_open ,
2614
- .release = blkif_release ,
2615
2443
.getgeo = blkif_getgeo ,
2616
2444
.ioctl = blkif_ioctl ,
2617
2445
.compat_ioctl = blkdev_compat_ptr_ioctl ,
0 commit comments