@@ -1173,6 +1173,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
11731173 init_waitqueue_head (& udev -> nl_cmd_wq );
11741174 spin_lock_init (& udev -> nl_cmd_lock );
11751175
1176+ INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1177+
11761178 return & udev -> se_dev ;
11771179}
11781180
@@ -1351,10 +1353,54 @@ static void tcmu_dev_call_rcu(struct rcu_head *p)
13511353 kfree (udev );
13521354}
13531355
1356+ static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1357+ {
1358+ if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1359+ kmem_cache_free (tcmu_cmd_cache , cmd );
1360+ return 0 ;
1361+ }
1362+ return - EINVAL ;
1363+ }
1364+
1365+ static void tcmu_blocks_release (struct tcmu_dev * udev )
1366+ {
1367+ int i ;
1368+ struct page * page ;
1369+
1370+ /* Try to release all block pages */
1371+ mutex_lock (& udev -> cmdr_lock );
1372+ for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1373+ page = radix_tree_delete (& udev -> data_blocks , i );
1374+ if (page ) {
1375+ __free_page (page );
1376+ atomic_dec (& global_db_count );
1377+ }
1378+ }
1379+ mutex_unlock (& udev -> cmdr_lock );
1380+ }
1381+
13541382static void tcmu_dev_kref_release (struct kref * kref )
13551383{
13561384 struct tcmu_dev * udev = container_of (kref , struct tcmu_dev , kref );
13571385 struct se_device * dev = & udev -> se_dev ;
1386+ struct tcmu_cmd * cmd ;
1387+ bool all_expired = true;
1388+ int i ;
1389+
1390+ vfree (udev -> mb_addr );
1391+ udev -> mb_addr = NULL ;
1392+
1393+ /* Upper layer should drain all requests before calling this */
1394+ spin_lock_irq (& udev -> commands_lock );
1395+ idr_for_each_entry (& udev -> commands , cmd , i ) {
1396+ if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1397+ all_expired = false;
1398+ }
1399+ idr_destroy (& udev -> commands );
1400+ spin_unlock_irq (& udev -> commands_lock );
1401+ WARN_ON (!all_expired );
1402+
1403+ tcmu_blocks_release (udev );
13581404
13591405 call_rcu (& dev -> rcu_head , tcmu_dev_call_rcu );
13601406}
@@ -1546,8 +1592,6 @@ static int tcmu_configure_device(struct se_device *dev)
15461592 WARN_ON (udev -> data_size % PAGE_SIZE );
15471593 WARN_ON (udev -> data_size % DATA_BLOCK_SIZE );
15481594
1549- INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1550-
15511595 info -> version = __stringify (TCMU_MAILBOX_VERSION );
15521596
15531597 info -> mem [0 ].name = "tcm-user command & data buffer" ;
@@ -1597,44 +1641,19 @@ static int tcmu_configure_device(struct se_device *dev)
15971641 uio_unregister_device (& udev -> uio_info );
15981642err_register :
15991643 vfree (udev -> mb_addr );
1644+ udev -> mb_addr = NULL ;
16001645err_vzalloc :
16011646 kfree (info -> name );
16021647 info -> name = NULL ;
16031648
16041649 return ret ;
16051650}
16061651
1607- static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1608- {
1609- if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1610- kmem_cache_free (tcmu_cmd_cache , cmd );
1611- return 0 ;
1612- }
1613- return - EINVAL ;
1614- }
1615-
16161652static bool tcmu_dev_configured (struct tcmu_dev * udev )
16171653{
16181654 return udev -> uio_info .uio_dev ? true : false;
16191655}
16201656
1621- static void tcmu_blocks_release (struct tcmu_dev * udev )
1622- {
1623- int i ;
1624- struct page * page ;
1625-
1626- /* Try to release all block pages */
1627- mutex_lock (& udev -> cmdr_lock );
1628- for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1629- page = radix_tree_delete (& udev -> data_blocks , i );
1630- if (page ) {
1631- __free_page (page );
1632- atomic_dec (& global_db_count );
1633- }
1634- }
1635- mutex_unlock (& udev -> cmdr_lock );
1636- }
1637-
16381657static void tcmu_free_device (struct se_device * dev )
16391658{
16401659 struct tcmu_dev * udev = TCMU_DEV (dev );
@@ -1646,9 +1665,6 @@ static void tcmu_free_device(struct se_device *dev)
16461665static void tcmu_destroy_device (struct se_device * dev )
16471666{
16481667 struct tcmu_dev * udev = TCMU_DEV (dev );
1649- struct tcmu_cmd * cmd ;
1650- bool all_expired = true;
1651- int i ;
16521668
16531669 del_timer_sync (& udev -> timeout );
16541670
@@ -1663,20 +1679,6 @@ static void tcmu_destroy_device(struct se_device *dev)
16631679 mutex_unlock (& udev -> cmdr_lock );
16641680 mutex_unlock (& root_udev_waiter_mutex );
16651681
1666- vfree (udev -> mb_addr );
1667-
1668- /* Upper layer should drain all requests before calling this */
1669- spin_lock_irq (& udev -> commands_lock );
1670- idr_for_each_entry (& udev -> commands , cmd , i ) {
1671- if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1672- all_expired = false;
1673- }
1674- idr_destroy (& udev -> commands );
1675- spin_unlock_irq (& udev -> commands_lock );
1676- WARN_ON (!all_expired );
1677-
1678- tcmu_blocks_release (udev );
1679-
16801682 tcmu_netlink_event (udev , TCMU_CMD_REMOVED_DEVICE , 0 , NULL );
16811683
16821684 uio_unregister_device (& udev -> uio_info );
0 commit comments