windows-hard-link-count-20090628
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 29 Jun 2009 04:25:16 +0000 (04:25 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 29 Jun 2009 04:25:16 +0000 (04:25 +0000)
LICENSE MIT

cm_Link() is used to create hard links.  It did not apply the updated
link target status info to the target cm_scache_t object.  As a result
the linkCount would be incorrect.

cm_Unlink() did not take linkCount into account.  It did not reduce the
locally known linkCount, nor did it invalidate any currently known
callback.  As a result the linkCount would be incorrect.

src/WINNT/afsd/cm_vnodeops.c

index fe15adb..60ca987 100644 (file)
@@ -1629,7 +1629,9 @@ long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t * cnamep,
         cm_ReleaseSCache(scp);
         if (code == 0) {
            lock_ObtainWrite(&scp->rw);
-            scp->flags |= CM_SCACHEFLAG_DELETED;
+            if (--scp->linkCount == 0)
+                scp->flags |= CM_SCACHEFLAG_DELETED;
+            cm_DiscardSCache(scp);
            lock_ReleaseWrite(&scp->rw);
         }
     }
@@ -3036,6 +3038,13 @@ long cm_Link(cm_scache_t *dscp, clientchar_t *cnamep, cm_scache_t *sscp, long fl
     }
     cm_EndDirOp(&dirop);
 
+    /* Update the linked object status */
+    if (code == 0) {
+        lock_ObtainWrite(&sscp->rw);
+        cm_MergeStatus(NULL, sscp, &newLinkStatus, &volSync, userp, 0);
+        lock_ReleaseWrite(&sscp->rw);
+    }
+
     free(fnamep);
 
     return code;