]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
idr: Return the deleted entry from idr_remove
authorMatthew Wilcox <mawilcox@microsoft.com>
Thu, 22 Dec 2016 18:30:22 +0000 (13:30 -0500)
committerMatthew Wilcox <mawilcox@microsoft.com>
Tue, 14 Feb 2017 02:44:03 +0000 (21:44 -0500)
It is a relatively common idiom (8 instances) to first look up an IDR
entry, and then remove it from the tree if it is found, possibly doing
further operations upon the entry afterwards.  If we change idr_remove()
to return the removed object, all of these users can save themselves a
walk of the IDR tree.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
drivers/atm/nicstar.c
drivers/block/drbd/drbd_main.c
drivers/firewire/core-cdev.c
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
drivers/net/wireless/marvell/mwifiex/txrx.c
drivers/target/target_core_user.c
include/linux/idr.h
net/mac80211/status.c

index cb28579e8a946f6820fdff21433fd715870a6436..d879f3bca1076dbbcfe1d3313f8286d984e1bbd5 100644 (file)
@@ -1980,13 +1980,12 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe)
        card->lbfqc = ns_stat_lfbqc_get(stat);
 
        id = le32_to_cpu(rsqe->buffer_handle);
-       skb = idr_find(&card->idr, id);
+       skb = idr_remove(&card->idr, id);
        if (!skb) {
                RXPRINTK(KERN_ERR
-                        "nicstar%d: idr_find() failed!\n", card->index);
+                        "nicstar%d: skb not found!\n", card->index);
                return;
        }
-       idr_remove(&card->idr, id);
        dma_sync_single_for_cpu(&card->pcidev->dev,
                                NS_PRV_DMA(skb),
                                (NS_PRV_BUFTYPE(skb) == BUF_SM
index 83482721bc012739cf25ee627fd2b85b2fd094ab..6bb3b80e7e5161ae84d5f37698e9685e03aaf873 100644 (file)
@@ -2915,11 +2915,9 @@ out_idr_remove_vol:
        idr_remove(&connection->peer_devices, vnr);
 out_idr_remove_from_resource:
        for_each_connection(connection, resource) {
-               peer_device = idr_find(&connection->peer_devices, vnr);
-               if (peer_device) {
-                       idr_remove(&connection->peer_devices, vnr);
+               peer_device = idr_remove(&connection->peer_devices, vnr);
+               if (peer_device)
                        kref_put(&connection->kref, drbd_destroy_connection);
-               }
        }
        for_each_peer_device_safe(peer_device, tmp_peer_device, device) {
                list_del(&peer_device->peer_devices);
index aee149bdf4c0339169d939eed797ef9e6ab521bf..a301fcf46e8821ba7d605582703df532f27f24b5 100644 (file)
@@ -1307,8 +1307,7 @@ static void iso_resource_work(struct work_struct *work)
         */
        if (r->todo == ISO_RES_REALLOC && !success &&
            !client->in_shutdown &&
-           idr_find(&client->resource_idr, r->resource.handle)) {
-               idr_remove(&client->resource_idr, r->resource.handle);
+           idr_remove(&client->resource_idr, r->resource.handle)) {
                client_put(client);
                free = true;
        }
index c02db01f6583e620d885542f37a0da6f1780152e..0218cea6be4d23ff500e17e9372085198e893efa 100644 (file)
@@ -70,10 +70,10 @@ static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
        struct amdgpu_bo_list *list;
 
        mutex_lock(&fpriv->bo_list_lock);
-       list = idr_find(&fpriv->bo_list_handles, id);
+       list = idr_remove(&fpriv->bo_list_handles, id);
        if (list) {
+               /* Another user may have a reference to this list still */
                mutex_lock(&list->lock);
-               idr_remove(&fpriv->bo_list_handles, id);
                mutex_unlock(&list->lock);
                amdgpu_bo_list_free(list);
        }
index 400c66ba4c6bdc49ecdf30a3cb9deb9a79dffa71..cf05006713531ce920c62ca105929907b7457fcd 100644 (file)
@@ -135,15 +135,11 @@ static int amdgpu_ctx_free(struct amdgpu_fpriv *fpriv, uint32_t id)
        struct amdgpu_ctx *ctx;
 
        mutex_lock(&mgr->lock);
-       ctx = idr_find(&mgr->ctx_handles, id);
-       if (ctx) {
-               idr_remove(&mgr->ctx_handles, id);
+       ctx = idr_remove(&mgr->ctx_handles, id);
+       if (ctx)
                kref_put(&ctx->refcount, amdgpu_ctx_do_release);
-               mutex_unlock(&mgr->lock);
-               return 0;
-       }
        mutex_unlock(&mgr->lock);
-       return -EINVAL;
+       return ctx ? 0 : -EINVAL;
 }
 
 static int amdgpu_ctx_query(struct amdgpu_device *adev,
index abdd0cf710bf6df2440595dfbe879debf208be9a..fac28bd8fbee49bac450a7af32b7c6c71b4e95b6 100644 (file)
@@ -346,9 +346,7 @@ void mwifiex_parse_tx_status_event(struct mwifiex_private *priv,
                return;
 
        spin_lock_irqsave(&priv->ack_status_lock, flags);
-       ack_skb = idr_find(&priv->ack_status_frames, tx_status->tx_token_id);
-       if (ack_skb)
-               idr_remove(&priv->ack_status_frames, tx_status->tx_token_id);
+       ack_skb = idr_remove(&priv->ack_status_frames, tx_status->tx_token_id);
        spin_unlock_irqrestore(&priv->ack_status_lock, flags);
 
        if (ack_skb) {
index 8041710b697298ec7073c4e5910849bd1a154703..18f0ec2e1f9c3cc8807a19eed8aa39396a0dd79a 100644 (file)
@@ -642,9 +642,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
                WARN_ON(tcmu_hdr_get_op(entry->hdr.len_op) != TCMU_OP_CMD);
 
                spin_lock(&udev->commands_lock);
-               cmd = idr_find(&udev->commands, entry->hdr.cmd_id);
-               if (cmd)
-                       idr_remove(&udev->commands, cmd->cmd_id);
+               cmd = idr_remove(&udev->commands, entry->hdr.cmd_id);
                spin_unlock(&udev->commands_lock);
 
                if (!cmd) {
index 2027c7aba50d85b8b1ed86e309679c8e0fcde370..bf70b3ef0a073bbcb301ddf0141d90e8ac6fa018 100644 (file)
@@ -88,9 +88,9 @@ void *idr_get_next(struct idr *, int *nextid);
 void *idr_replace(struct idr *, void *, int id);
 void idr_destroy(struct idr *);
 
-static inline void idr_remove(struct idr *idr, int id)
+static inline void *idr_remove(struct idr *idr, int id)
 {
-       radix_tree_delete(&idr->idr_rt, id);
+       return radix_tree_delete_item(&idr->idr_rt, id, NULL);
 }
 
 static inline void idr_init(struct idr *idr)
index ddf71c648cab008baaff8ed430b9b222410f8ce1..43dd3316d8a4637d16dcf0e274f2c956c560e360 100644 (file)
@@ -462,9 +462,7 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
        unsigned long flags;
 
        spin_lock_irqsave(&local->ack_status_lock, flags);
-       skb = idr_find(&local->ack_status_frames, info->ack_frame_id);
-       if (skb)
-               idr_remove(&local->ack_status_frames, info->ack_frame_id);
+       skb = idr_remove(&local->ack_status_frames, info->ack_frame_id);
        spin_unlock_irqrestore(&local->ack_status_lock, flags);
 
        if (!skb)