cvs commit: src/sys/ufs/ufs dirhash.h ufs_dirhash.c

John Baldwin jhb at FreeBSD.org
Tue Sep 16 16:24:06 UTC 2008


jhb         2008-09-16 16:23:56 UTC

  FreeBSD src repository

  Modified files:
    sys/ufs/ufs          dirhash.h ufs_dirhash.c 
  Log:
  SVN rev 183080 on 2008-09-16 16:23:56Z by jhb
  
  Fix a race with shared lookups on UFS.  If the the dirhash code reached the
  cap on memory usage, then shared LOOKUP operations could start free'ing
  dirhash structures.  Without these fixes, concurrent free's on the same
  directory could result in one of the threads blocked on a lock in a dirhash
  structure free'd by the other thread.
  - Replace the lockmgr lock in the dirhash structure with an sx lock.
  - Use a reference count managed with ufsdirhash_hold()/drop() to determine
    when to free the dirhash structures.  The directory i-node holds a
    reference while the dirhash is attached to an i-node.  Code that wishes
    to lock the dirhash while holding a shared vnode lock must first
    acquire a private reference to the dirhash while holding the vnode
    interlock before acquiring the dirhash sx lock.  After acquiring the sx
    lock, it drops the private reference after checking to see if the
    dirhash is still used by the directory i-node.
  
  Revision  Changes    Path
  1.7       +5 -1      src/sys/ufs/ufs/dirhash.h
  1.25      +82 -33    src/sys/ufs/ufs/ufs_dirhash.c


More information about the cvs-all mailing list