• Corey Minyard's avatar
    [PATCH] Fixes for idr code · 90e518e1
    Corey Minyard authored
    * On a 32-bit architecture, the idr code will cease to work if you add
      more than 2^20 entries.  You will not be able to find many of the
      entries.  The problem is that the IDR code uses 5-bit chunks of the
      number and the lower portion used by IDR is 24 bits, so you have one bit
      that leaks over into the comparisons that should not be there.  The
      solution is to mask off that bit before doing IDR processing.  This
      actually causes the POSIX timer code to crash if you create that many
      timers.  I have included an idr_test.tar.gz file that demonstrates this
      with and without the fix, in case you need more evidence :).
    
    * When the IDR fills up, it returns -1.  However, there was no way to
      check for this condition.  This patch adds the ability to check for the
      idr being full and fixes all the users.  It also fixes a problem in
      fs/super.c where the idr code wasn't checking for -1.
    
    * There was a race condition creating POSIX timers.  The timer was added
      to a task struct for another process then the data for the timer was
      filled out.  The other task could use/destroy time timer as soon as it is
      in the task's queue and the lock is released.  This moves settup up the
      timer data to before the timer is enqueued or (for some data) into the
      lock.
    
    * Change things so that the caller doesn't need to run idr_full() to find
      out the reason for an idr_get_new() failure.
    
      Just return -ENOSPC if the tree was full, or -EAGAIN if the caller needs
      to re-run idr_pre_get() and try again.
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    90e518e1
idr.c 10.6 KB