Merge tag 'ecryptfs-3.9-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / lib / idr.c
index 1a30272..73f4d53 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -569,6 +569,7 @@ void idr_remove(struct idr *idp, int id)
        struct idr_layer *p;
        struct idr_layer *to_free;
 
+       /* see comment in idr_find_slowpath() */
        if (WARN_ON_ONCE(id < 0))
                return;
 
@@ -666,6 +667,14 @@ void *idr_find_slowpath(struct idr *idp, int id)
        int n;
        struct idr_layer *p;
 
+       /*
+        * If @id is negative, idr_find() used to ignore the sign bit and
+        * performed lookup with the rest of bits, which is weird and can
+        * lead to very obscure bugs.  We're now returning NULL for all
+        * negative IDs but just in case somebody was depending on the sign
+        * bit being ignored, let's trigger WARN_ON_ONCE() so that they can
+        * be detected and fixed.  WARN_ON_ONCE() can later be removed.
+        */
        if (WARN_ON_ONCE(id < 0))
                return NULL;
 
@@ -815,6 +824,7 @@ void *idr_replace(struct idr *idp, void *ptr, int id)
        int n;
        struct idr_layer *p, *old_p;
 
+       /* see comment in idr_find_slowpath() */
        if (WARN_ON_ONCE(id < 0))
                return ERR_PTR(-EINVAL);