]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-threadquota-enforcement-fixes-20080225
authorJeffrey Hutzelman <jhutz@cmu.edu>
Mon, 25 Feb 2008 20:39:04 +0000 (20:39 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 25 Feb 2008 20:39:04 +0000 (20:39 +0000)
LICENSE IPL10
FIXES 87416

correctly set and unset HWHO_INPROGRESS as we pass through host probing package.

also, do not block on lock checking for HOSTDELETED. instead, return a null host
and VBUSY; restructure code to allow returning a null host with prejudice.

(cherry picked from commit f4f7ac048c52f859000a0d42640f0a6d43cc942a)

src/viced/host.c
src/viced/host.h

index ed7dc81c01fe0fcc332ce371b9f29f03453454c2..029af25e285f035c0994590da29b9a7f3cae2d11 100644 (file)
@@ -732,11 +732,11 @@ h_gethostcps_r(register struct host *host, register afs_int32 now)
 void
 h_flushhostcps(register afs_uint32 hostaddr, register afs_uint16 hport)
 {
-    register struct host *host;
+    struct host *host;
     int held = 0;
 
     H_LOCK;
-    host = h_Lookup_r(hostaddr, hport, &held);
+    h_Lookup_r(hostaddr, hport, &held, &host);
     if (host) {
        host->hcpsfailed = 1;
        if (!held)
@@ -824,8 +824,8 @@ h_Alloc_r(register struct rx_connection *r_con)
 /* hostaddr and hport are in network order */
 /* Note: host should be released by caller if 0 == *heldp and non-null */
 /* hostaddr and hport are in network order */
-struct host *
-h_Lookup_r(afs_uint32 haddr, afs_uint16 hport, int *heldp)
+int
+h_Lookup_r(afs_uint32 haddr, afs_uint16 hport, int *heldp, struct host **hostp)
 {
     register afs_int32 now;
     register struct host *host = NULL;
@@ -839,6 +839,11 @@ h_Lookup_r(afs_uint32 haddr, afs_uint16 hport, int *heldp)
        assert(host);
        if (!(host->hostFlags & HOSTDELETED) && chain->addr == haddr
            && chain->port == hport) {
+           if ((host->hostFlags & HWHO_INPROGRESS) && 
+               h_threadquota(host->lock.num_waiting)) {
+               *hostp = 0;
+               return VBUSY;
+           }
            *heldp = h_Held_r(host);
            if (!*heldp)
                h_Hold_r(host);
@@ -866,8 +871,8 @@ h_Lookup_r(afs_uint32 haddr, afs_uint16 hport, int *heldp)
        }
        host = NULL;
     }
-    return host;
-
+    *hostp = host;
+    return 0;
 }                              /*h_Lookup */
 
 /* Lookup a host given its UUID. */
@@ -1425,7 +1430,8 @@ h_GetHost_r(struct rx_connection *tcon)
     caps.Capabilities_len = 0;
 
     code = 0;
-    host = h_Lookup_r(haddr, hport, &held);
+    if (h_Lookup_r(haddr, hport, &held, &host))
+       return 0;
     identP = (struct Identity *)rx_GetSpecific(tcon, rxcon_ident_key);
     if (host && !identP && !(host->Console & 1)) {
        /* This is a new connection, and we already have a host
@@ -1440,7 +1446,6 @@ h_GetHost_r(struct rx_connection *tcon)
        }
        h_Lock_r(host);
        if (!(host->hostFlags & ALTADDR)) {
-           host->hostFlags &= ~HWHO_INPROGRESS;
            /* Another thread is doing initialization */
            h_Unlock_r(host);
            if (!held)
@@ -1451,6 +1456,7 @@ h_GetHost_r(struct rx_connection *tcon)
                     ntohs(host->port)));
            goto retry;
        }
+       host->hostFlags |= HWHO_INPROGRESS;
        host->hostFlags &= ~ALTADDR;
        cb_conn = host->callback_rxcon;
        rx_GetConnection(cb_conn);
@@ -1537,7 +1543,6 @@ h_GetHost_r(struct rx_connection *tcon)
                     afs_inet_ntoa_r(host->host, hoststr),
                     ntohs(host->port)));
            h_Lock_r(host);
-           host->hostFlags &= ~HWHO_INPROGRESS;
            h_Unlock_r(host);
            if (!held)
                h_Release_r(host);
@@ -1571,7 +1576,6 @@ h_GetHost_r(struct rx_connection *tcon)
            /* The host in the cache is not the host for this connection */
             h_Lock_r(host);
            host->hostFlags |= HOSTDELETED;
-           host->hostFlags &= ~HWHO_INPROGRESS;
            h_Unlock_r(host);
            if (!held)
                h_Release_r(host);
@@ -1584,6 +1588,7 @@ h_GetHost_r(struct rx_connection *tcon)
            int pident = 0;
            cb_conn = host->callback_rxcon;
            rx_GetConnection(cb_conn);
+           host->hostFlags |= HWHO_INPROGRESS;
            H_UNLOCK;
            code =
                RXAFSCB_TellMeAboutYourself(cb_conn, &interf, &caps);
index 305d3914969d46926d91b889c4fe542340602ebf..f861dc8c1d0a713fadf2a0e4c5afe6461a03a0ab 100644 (file)
@@ -205,8 +205,8 @@ extern int h_Lock_r(register struct host *host);
 extern int DeleteAllCallBacks_r(struct host *host, int deletefe);
 extern struct host *h_Alloc(register struct rx_connection *r_con);
 extern struct host *h_Alloc_r(register struct rx_connection *r_con);
-extern struct host *h_Lookup_r(afs_uint32 hostaddr, afs_uint16 hport,
-                              int *heldp);
+extern int h_Lookup_r(afs_uint32 hostaddr, afs_uint16 hport,
+                              int *heldp, struct host **hostp);
 extern void   hashInsert_r(afs_uint32 addr, afs_uint16 port, 
                           struct host* host);
 extern struct host *h_LookupUuid_r(afsUUID * uuidp);