@@ -1112,6 +1112,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
1112
1112
init_waitqueue_head (& udev -> nl_cmd_wq );
1113
1113
spin_lock_init (& udev -> nl_cmd_lock );
1114
1114
1115
+ INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1116
+
1115
1117
return & udev -> se_dev ;
1116
1118
}
1117
1119
@@ -1280,10 +1282,54 @@ static void tcmu_dev_call_rcu(struct rcu_head *p)
1280
1282
kfree (udev );
1281
1283
}
1282
1284
1285
+ static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1286
+ {
1287
+ if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1288
+ kmem_cache_free (tcmu_cmd_cache , cmd );
1289
+ return 0 ;
1290
+ }
1291
+ return - EINVAL ;
1292
+ }
1293
+
1294
+ static void tcmu_blocks_release (struct tcmu_dev * udev )
1295
+ {
1296
+ int i ;
1297
+ struct page * page ;
1298
+
1299
+ /* Try to release all block pages */
1300
+ mutex_lock (& udev -> cmdr_lock );
1301
+ for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1302
+ page = radix_tree_delete (& udev -> data_blocks , i );
1303
+ if (page ) {
1304
+ __free_page (page );
1305
+ atomic_dec (& global_db_count );
1306
+ }
1307
+ }
1308
+ mutex_unlock (& udev -> cmdr_lock );
1309
+ }
1310
+
1283
1311
static void tcmu_dev_kref_release (struct kref * kref )
1284
1312
{
1285
1313
struct tcmu_dev * udev = container_of (kref , struct tcmu_dev , kref );
1286
1314
struct se_device * dev = & udev -> se_dev ;
1315
+ struct tcmu_cmd * cmd ;
1316
+ bool all_expired = true;
1317
+ int i ;
1318
+
1319
+ vfree (udev -> mb_addr );
1320
+ udev -> mb_addr = NULL ;
1321
+
1322
+ /* Upper layer should drain all requests before calling this */
1323
+ spin_lock_irq (& udev -> commands_lock );
1324
+ idr_for_each_entry (& udev -> commands , cmd , i ) {
1325
+ if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1326
+ all_expired = false;
1327
+ }
1328
+ idr_destroy (& udev -> commands );
1329
+ spin_unlock_irq (& udev -> commands_lock );
1330
+ WARN_ON (!all_expired );
1331
+
1332
+ tcmu_blocks_release (udev );
1287
1333
1288
1334
call_rcu (& dev -> rcu_head , tcmu_dev_call_rcu );
1289
1335
}
@@ -1476,8 +1522,6 @@ static int tcmu_configure_device(struct se_device *dev)
1476
1522
WARN_ON (udev -> data_size % PAGE_SIZE );
1477
1523
WARN_ON (udev -> data_size % DATA_BLOCK_SIZE );
1478
1524
1479
- INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1480
-
1481
1525
info -> version = __stringify (TCMU_MAILBOX_VERSION );
1482
1526
1483
1527
info -> mem [0 ].name = "tcm-user command & data buffer" ;
@@ -1527,44 +1571,19 @@ static int tcmu_configure_device(struct se_device *dev)
1527
1571
uio_unregister_device (& udev -> uio_info );
1528
1572
err_register :
1529
1573
vfree (udev -> mb_addr );
1574
+ udev -> mb_addr = NULL ;
1530
1575
err_vzalloc :
1531
1576
kfree (info -> name );
1532
1577
info -> name = NULL ;
1533
1578
1534
1579
return ret ;
1535
1580
}
1536
1581
1537
- static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1538
- {
1539
- if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1540
- kmem_cache_free (tcmu_cmd_cache , cmd );
1541
- return 0 ;
1542
- }
1543
- return - EINVAL ;
1544
- }
1545
-
1546
1582
static bool tcmu_dev_configured (struct tcmu_dev * udev )
1547
1583
{
1548
1584
return udev -> uio_info .uio_dev ? true : false;
1549
1585
}
1550
1586
1551
- static void tcmu_blocks_release (struct tcmu_dev * udev )
1552
- {
1553
- int i ;
1554
- struct page * page ;
1555
-
1556
- /* Try to release all block pages */
1557
- mutex_lock (& udev -> cmdr_lock );
1558
- for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1559
- page = radix_tree_delete (& udev -> data_blocks , i );
1560
- if (page ) {
1561
- __free_page (page );
1562
- atomic_dec (& global_db_count );
1563
- }
1564
- }
1565
- mutex_unlock (& udev -> cmdr_lock );
1566
- }
1567
-
1568
1587
static void tcmu_free_device (struct se_device * dev )
1569
1588
{
1570
1589
struct tcmu_dev * udev = TCMU_DEV (dev );
@@ -1576,30 +1595,13 @@ static void tcmu_free_device(struct se_device *dev)
1576
1595
static void tcmu_destroy_device (struct se_device * dev )
1577
1596
{
1578
1597
struct tcmu_dev * udev = TCMU_DEV (dev );
1579
- struct tcmu_cmd * cmd ;
1580
- bool all_expired = true;
1581
- int i ;
1582
1598
1583
1599
del_timer_sync (& udev -> timeout );
1584
1600
1585
1601
mutex_lock (& root_udev_mutex );
1586
1602
list_del (& udev -> node );
1587
1603
mutex_unlock (& root_udev_mutex );
1588
1604
1589
- vfree (udev -> mb_addr );
1590
-
1591
- /* Upper layer should drain all requests before calling this */
1592
- spin_lock_irq (& udev -> commands_lock );
1593
- idr_for_each_entry (& udev -> commands , cmd , i ) {
1594
- if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1595
- all_expired = false;
1596
- }
1597
- idr_destroy (& udev -> commands );
1598
- spin_unlock_irq (& udev -> commands_lock );
1599
- WARN_ON (!all_expired );
1600
-
1601
- tcmu_blocks_release (udev );
1602
-
1603
1605
tcmu_netlink_event (udev , TCMU_CMD_REMOVED_DEVICE , 0 , NULL );
1604
1606
1605
1607
uio_unregister_device (& udev -> uio_info );
0 commit comments