kernel - Add cache_isopen()
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 12 Dec 2013 17:06:01 +0000 (09:06 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 12 Dec 2013 17:06:01 +0000 (09:06 -0800)
* Add cache_isopen(), a function which nominally returns whether the
  file referenced by a namecache structure is active (opened or mmapped).

  The code currently just checks the ref-count on the underlying vnode
  if it is present, which should be sufficient.

* Used by HAMMER2.

sys/kern/vfs_cache.c
sys/sys/namecache.h

index f250348..bc4c00b 100644 (file)
@@ -1788,7 +1788,7 @@ _cache_unlink(struct namecache *ncp)
        ncp->nc_flag |= NCF_DESTROYED;
 
        /*
-        * Attempt to trigger a deactivation.  Set VAUX_FINALIZE to
+        * Attempt to trigger a deactivation.  Set VREF_FINALIZE to
         * force action on the 1->0 transition.
         */
        if ((ncp->nc_flag & NCF_UNRESOLVED) == 0 &&
@@ -1802,6 +1802,27 @@ _cache_unlink(struct namecache *ncp)
 }
 
 /*
+ * Return non-zero if the nch might be associated with an open and/or mmap()'d
+ * file.  The easy solution is to just return non-zero if the vnode has refs.
+ * Used to interlock hammer2 reclaims (VREF_FINALIZE should already be set to
+ * force the reclaim).
+ */
+int
+cache_isopen(struct nchandle *nch)
+{
+       struct vnode *vp;
+       struct namecache *ncp = nch->ncp;
+
+       if ((ncp->nc_flag & NCF_UNRESOLVED) == 0 &&
+           (vp = ncp->nc_vp) != NULL &&
+           VREFCNT(vp)) {
+               return 1;
+       }
+       return 0;
+}
+
+
+/*
  * vget the vnode associated with the namecache entry.  Resolve the namecache
  * entry if necessary.  The passed ncp must be referenced and locked.  If
  * the ncp is resolved it might be locked shared.
index 6c202e6..0777f6e 100644 (file)
@@ -222,6 +222,7 @@ void        cache_drop(struct nchandle *nch);
 void   cache_zero(struct nchandle *nch);
 void   cache_rename(struct nchandle *fnch, struct nchandle *tnch);
 void   cache_unlink(struct nchandle *nch);
+int    cache_isopen(struct nchandle *nch);
 int    cache_vget(struct nchandle *, struct ucred *, int, struct vnode **);
 int    cache_vref(struct nchandle *, struct ucred *, struct vnode **);
 int    cache_fromdvp(struct vnode *, struct ucred *, int, struct nchandle *);