@@ -1114,6 +1114,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
11141114 init_waitqueue_head (& udev -> nl_cmd_wq );
11151115 spin_lock_init (& udev -> nl_cmd_lock );
11161116
1117+ INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1118+
11171119 return & udev -> se_dev ;
11181120}
11191121
@@ -1282,10 +1284,54 @@ static void tcmu_dev_call_rcu(struct rcu_head *p)
12821284 kfree (udev );
12831285}
12841286
1287+ static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1288+ {
1289+ if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1290+ kmem_cache_free (tcmu_cmd_cache , cmd );
1291+ return 0 ;
1292+ }
1293+ return - EINVAL ;
1294+ }
1295+
1296+ static void tcmu_blocks_release (struct tcmu_dev * udev )
1297+ {
1298+ int i ;
1299+ struct page * page ;
1300+
1301+ /* Try to release all block pages */
1302+ mutex_lock (& udev -> cmdr_lock );
1303+ for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1304+ page = radix_tree_delete (& udev -> data_blocks , i );
1305+ if (page ) {
1306+ __free_page (page );
1307+ atomic_dec (& global_db_count );
1308+ }
1309+ }
1310+ mutex_unlock (& udev -> cmdr_lock );
1311+ }
1312+
12851313static void tcmu_dev_kref_release (struct kref * kref )
12861314{
12871315 struct tcmu_dev * udev = container_of (kref , struct tcmu_dev , kref );
12881316 struct se_device * dev = & udev -> se_dev ;
1317+ struct tcmu_cmd * cmd ;
1318+ bool all_expired = true;
1319+ int i ;
1320+
1321+ vfree (udev -> mb_addr );
1322+ udev -> mb_addr = NULL ;
1323+
1324+ /* Upper layer should drain all requests before calling this */
1325+ spin_lock_irq (& udev -> commands_lock );
1326+ idr_for_each_entry (& udev -> commands , cmd , i ) {
1327+ if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1328+ all_expired = false;
1329+ }
1330+ idr_destroy (& udev -> commands );
1331+ spin_unlock_irq (& udev -> commands_lock );
1332+ WARN_ON (!all_expired );
1333+
1334+ tcmu_blocks_release (udev );
12891335
12901336 call_rcu (& dev -> rcu_head , tcmu_dev_call_rcu );
12911337}
@@ -1478,8 +1524,6 @@ static int tcmu_configure_device(struct se_device *dev)
14781524 WARN_ON (udev -> data_size % PAGE_SIZE );
14791525 WARN_ON (udev -> data_size % DATA_BLOCK_SIZE );
14801526
1481- INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1482-
14831527 info -> version = __stringify (TCMU_MAILBOX_VERSION );
14841528
14851529 info -> mem [0 ].name = "tcm-user command & data buffer" ;
@@ -1529,44 +1573,19 @@ static int tcmu_configure_device(struct se_device *dev)
15291573 uio_unregister_device (& udev -> uio_info );
15301574err_register :
15311575 vfree (udev -> mb_addr );
1576+ udev -> mb_addr = NULL ;
15321577err_vzalloc :
15331578 kfree (info -> name );
15341579 info -> name = NULL ;
15351580
15361581 return ret ;
15371582}
15381583
1539- static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1540- {
1541- if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1542- kmem_cache_free (tcmu_cmd_cache , cmd );
1543- return 0 ;
1544- }
1545- return - EINVAL ;
1546- }
1547-
15481584static bool tcmu_dev_configured (struct tcmu_dev * udev )
15491585{
15501586 return udev -> uio_info .uio_dev ? true : false;
15511587}
15521588
1553- static void tcmu_blocks_release (struct tcmu_dev * udev )
1554- {
1555- int i ;
1556- struct page * page ;
1557-
1558- /* Try to release all block pages */
1559- mutex_lock (& udev -> cmdr_lock );
1560- for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1561- page = radix_tree_delete (& udev -> data_blocks , i );
1562- if (page ) {
1563- __free_page (page );
1564- atomic_dec (& global_db_count );
1565- }
1566- }
1567- mutex_unlock (& udev -> cmdr_lock );
1568- }
1569-
15701589static void tcmu_free_device (struct se_device * dev )
15711590{
15721591 struct tcmu_dev * udev = TCMU_DEV (dev );
@@ -1578,30 +1597,13 @@ static void tcmu_free_device(struct se_device *dev)
15781597static void tcmu_destroy_device (struct se_device * dev )
15791598{
15801599 struct tcmu_dev * udev = TCMU_DEV (dev );
1581- struct tcmu_cmd * cmd ;
1582- bool all_expired = true;
1583- int i ;
15841600
15851601 del_timer_sync (& udev -> timeout );
15861602
15871603 mutex_lock (& root_udev_mutex );
15881604 list_del (& udev -> node );
15891605 mutex_unlock (& root_udev_mutex );
15901606
1591- vfree (udev -> mb_addr );
1592-
1593- /* Upper layer should drain all requests before calling this */
1594- spin_lock_irq (& udev -> commands_lock );
1595- idr_for_each_entry (& udev -> commands , cmd , i ) {
1596- if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1597- all_expired = false;
1598- }
1599- idr_destroy (& udev -> commands );
1600- spin_unlock_irq (& udev -> commands_lock );
1601- WARN_ON (!all_expired );
1602-
1603- tcmu_blocks_release (udev );
1604-
16051607 tcmu_netlink_event (udev , TCMU_CMD_REMOVED_DEVICE , 0 , NULL );
16061608
16071609 uio_unregister_device (& udev -> uio_info );
0 commit comments