Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:15:21 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/include/linux: idr.h
        src/sys/external/bsd/drm2/linux: linux_idr.c

Log Message:
Teach idr_remove to accept failure.

But teach it to return the data if it succeeds too.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/idr.h
cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/linux/linux_idr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/include/linux/idr.h
diff -u src/sys/external/bsd/drm2/include/linux/idr.h:1.8 src/sys/external/bsd/drm2/include/linux/idr.h:1.9
--- src/sys/external/bsd/drm2/include/linux/idr.h:1.8	Sun Dec 19 01:00:17 2021
+++ src/sys/external/bsd/drm2/include/linux/idr.h	Sun Dec 19 01:15:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: idr.h,v 1.8 2021/12/19 01:00:17 riastradh Exp $	*/
+/*	$NetBSD: idr.h,v 1.9 2021/12/19 01:15:21 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@ bool	idr_is_empty(struct idr *);
 void	*idr_find(struct idr *, int);
 void	*idr_get_next(struct idr *, int *);
 void	*idr_replace(struct idr *, void *, int);
-void	idr_remove(struct idr *, int);
+void	*idr_remove(struct idr *, int);
 void	idr_preload(gfp_t);
 int	idr_alloc(struct idr *, void *, int, int, gfp_t);
 void	idr_preload_end(void);

Index: src/sys/external/bsd/drm2/linux/linux_idr.c
diff -u src/sys/external/bsd/drm2/linux/linux_idr.c:1.13 src/sys/external/bsd/drm2/linux/linux_idr.c:1.14
--- src/sys/external/bsd/drm2/linux/linux_idr.c:1.13	Sun Dec 19 01:00:17 2021
+++ src/sys/external/bsd/drm2/linux/linux_idr.c	Sun Dec 19 01:15:21 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_idr.c,v 1.13 2021/12/19 01:00:17 riastradh Exp $	*/
+/*	$NetBSD: linux_idr.c,v 1.14 2021/12/19 01:15:21 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_idr.c,v 1.13 2021/12/19 01:00:17 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_idr.c,v 1.14 2021/12/19 01:15:21 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -259,19 +259,26 @@ idr_replace(struct idr *idr, void *repla
 	return result;
 }
 
-void
+void *
 idr_remove(struct idr *idr, int id)
 {
 	struct idr_node *node;
+	void *data;
 
 	mutex_spin_enter(&idr->idr_lock);
 	node = rb_tree_find_node(&idr->idr_tree, &id);
-	KASSERTMSG((node != NULL), "idr %p has no entry for id %d", idr, id);
-	SDT_PROBE3(sdt, linux, idr, remove,  idr, id, node->in_data);
-	rb_tree_remove_node(&idr->idr_tree, node);
+	if (node == NULL) {
+		data = NULL;
+	} else {
+		data = node->in_data;
+		SDT_PROBE3(sdt, linux, idr, remove,  idr, id, data);
+		rb_tree_remove_node(&idr->idr_tree, node);
+	}
 	mutex_spin_exit(&idr->idr_lock);
 
 	kmem_free(node, sizeof(*node));
+
+	return data;
 }
 
 void

Reply via email to