|
@@ -303,7 +303,7 @@ out:
|
|
|
static DEFINE_IDR(proc_inum_idr);
|
|
|
static DEFINE_SPINLOCK(proc_inum_lock); /* protects the above */
|
|
|
|
|
|
-#define PROC_DYNAMIC_FIRST 0xF0000000UL
|
|
|
+#define PROC_DYNAMIC_FIRST 0xF0000000U
|
|
|
|
|
|
/*
|
|
|
* Return an inode number between PROC_DYNAMIC_FIRST and
|
|
@@ -311,7 +311,7 @@ static DEFINE_SPINLOCK(proc_inum_lock); /* protects the above */
|
|
|
*/
|
|
|
static unsigned int get_inode_number(void)
|
|
|
{
|
|
|
- int i, inum = 0;
|
|
|
+ unsigned int i;
|
|
|
int error;
|
|
|
|
|
|
retry:
|
|
@@ -326,21 +326,18 @@ retry:
|
|
|
else if (error)
|
|
|
return 0;
|
|
|
|
|
|
- inum = (i & MAX_ID_MASK) + PROC_DYNAMIC_FIRST;
|
|
|
-
|
|
|
- /* inum will never be more than 0xf0ffffff, so no check
|
|
|
- * for overflow.
|
|
|
- */
|
|
|
-
|
|
|
- return inum;
|
|
|
+ if (i > UINT_MAX - PROC_DYNAMIC_FIRST) {
|
|
|
+ spin_lock(&proc_inum_lock);
|
|
|
+ idr_remove(&proc_inum_idr, i);
|
|
|
+ spin_unlock(&proc_inum_lock);
|
|
|
+ }
|
|
|
+ return PROC_DYNAMIC_FIRST + i;
|
|
|
}
|
|
|
|
|
|
static void release_inode_number(unsigned int inum)
|
|
|
{
|
|
|
- int id = (inum - PROC_DYNAMIC_FIRST) | ~MAX_ID_MASK;
|
|
|
-
|
|
|
spin_lock(&proc_inum_lock);
|
|
|
- idr_remove(&proc_inum_idr, id);
|
|
|
+ idr_remove(&proc_inum_idr, inum - PROC_DYNAMIC_FIRST);
|
|
|
spin_unlock(&proc_inum_lock);
|
|
|
}
|
|
|
|