freelance-updates-20011031
authorJeff Riegel <riegel@almaden.ibm.com>
Thu, 1 Nov 2001 03:40:21 +0000 (03:40 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 1 Nov 2001 03:40:21 +0000 (03:40 +0000)
updates to make freelance patches work, create mountpoints from afsdb on the fly

15 files changed:
src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_cell.h
src/WINNT/afsd/cm_freelance.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_vnodeops.c
src/auth/cellconfig.c
src/bozo/NTMakefile
src/bucoord/NTMakefile
src/budb/NTMakefile
src/butc/NTMakefile
src/ptserver/ptclient.c
src/tbutc/NTMakefile
src/update/NTMakefile
src/vlserver/NTMakefile
src/volser/NTMakefile

index 5ef16bc..e2ba9e4 100644 (file)
@@ -57,14 +57,23 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep)
 /* load up a cell structure from the cell database, afsdcell.ini */
 cm_cell_t *cm_GetCell(char *namep, long flags)
 {
+  return cm_GetCell_Gen(namep, NULL, flags);
+}
+
+cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags)
+{
        cm_cell_t *cp;
         long code;
         static cellCounter = 1;                /* locked by cm_cellLock */
        int ttl;
+       char fullname[200];
 
        lock_ObtainWrite(&cm_cellLock);
        for(cp = cm_allCellsp; cp; cp=cp->nextp) {
-               if (strcmp(namep, cp->namep) == 0) break;
+               if (strcmp(namep, cp->namep) == 0) {
+                 strcpy(fullname, cp->namep);
+                 break;
+               }
         }
 
        if ((!cp && (flags & CM_FLAG_CREATE))
@@ -75,10 +84,11 @@ cm_cell_t *cm_GetCell(char *namep, long flags)
          ) {
                if (!cp) cp = malloc(sizeof(*cp));
                 memset(cp, 0, sizeof(*cp));
-                code = cm_SearchCellFile(namep, NULL, cm_AddCellProc, cp);
+                code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp);
+               if (code) {
 #ifdef AFS_AFSDB_ENV
-                if (code && cm_dnsEnabled) {
-                  code = cm_SearchCellByDNS(namep, NULL, &ttl, cm_AddCellProc, cp);
+                 if (cm_dnsEnabled /*&& cm_DomainValid(namep)*/)
+                   code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp);
 #endif
                  if (code) {
                    free(cp);
@@ -90,8 +100,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags)
                    cp->flags |= CM_CELLFLAG_DNS;
                    cp->timeout = time(0) + ttl;
                  }
-               }
 #endif
+               }
 
                /* randomise among those vlservers having the same rank*/ 
                cm_RandomizeServer(&cp->vlServersp);
@@ -100,8 +110,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags)
                 lock_InitializeMutex(&cp->mx, "cm_cell_t mutex");
 
                /* copy in name */
-                cp->namep = malloc(strlen(namep)+1);
-                strcpy(cp->namep, namep);
+                cp->namep = malloc(strlen(fullname)+1);
+                strcpy(cp->namep, fullname);
 
                /* thread on global list */
                 cp->nextp = cm_allCellsp;
@@ -111,6 +121,8 @@ cm_cell_t *cm_GetCell(char *namep, long flags)
         }
 
 done:
+       if (newnamep)
+         strcpy(newnamep, fullname);
        lock_ReleaseWrite(&cm_cellLock);
         return cp;
 }
index a642d04..bf03634 100644 (file)
@@ -30,6 +30,8 @@ extern void cm_InitCell(void);
 
 extern cm_cell_t *cm_GetCell(char *namep, long flags);
 
+extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags);
+
 extern cm_cell_t *cm_FindCellByID(long cellID);
 
 extern void cm_ChangeRankCellVLServer(cm_server_t       *tsp);
index 1da7f85..26d3c1f 100644 (file)
@@ -435,13 +435,24 @@ cm_localMountPoint_t* cm_getLocalMountPoint(int vnode) {
        return 0;
 }
 
-long cm_FreelanceAddMount(char *filename, char *cellname, char *volume)
+long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, cm_fid_t *fidp)
 {
     FILE *fp;
     char hfile[120];
     char line[200];
+    char fullname[200];
     int n;
 
+    /* before adding, verify the cell name; if it is not a valid cell,
+       don't add the mount point */
+    /* major performance issue? */
+    if (!cm_GetCell_Gen(cellname, fullname, CM_FLAG_CREATE))
+      return -1;
+#if 0
+    if (strcmp(cellname, fullname) != 0)   /* no partial matches allowed */
+      return -1;
+#endif
+    
     lock_ObtainMutex(&cm_Freelance_Lock);
 
      cm_GetConfigDir(hfile);
@@ -455,12 +466,17 @@ long cm_FreelanceAddMount(char *filename, char *cellname, char *volume)
      fseek(fp, 0, SEEK_SET);
      fprintf(fp, "%d", n);
      fseek(fp, 0, SEEK_END);
-     fprintf(fp, "%s#%s:%s\n", filename, cellname, volume);
+     fprintf(fp, "%s#%s:%s\n", filename, fullname, volume);
      fclose(fp);
      lock_ReleaseMutex(&cm_Freelance_Lock);
 
+     /*cm_reInitLocalMountPoints(&vnode);*/
+     if (fidp) {
+       fidp->unique = 1;
+       fidp->vnode = cm_noLocalMountPoints + 1;   /* vnode value of last mt pt */
+     }
      cm_noteLocalMountPointChange();
-
+     
      return 0;
 }
 
index eb5a671..17399bf 100644 (file)
@@ -1176,7 +1176,7 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
        if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
          /* we are adding the mount point to the root dir., so call
             the freelance code to do the add. */
-         code = cm_FreelanceAddMount(leaf, fullCell, volume);
+         code = cm_FreelanceAddMount(leaf, fullCell, volume, NULL);
          return code;
        }
 #endif
index e29d89d..7e7da24 100644 (file)
@@ -959,6 +959,7 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp,
         cm_scache_t *mountedScp;
         cm_lookupSearch_t rock;
         char tname[256];
+       int getroot;
 
        if (dscp->fid.vnode == 1 && dscp->fid.unique == 1
            && strcmp(namep, "..") == 0) {
@@ -988,12 +989,27 @@ long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp,
         * looking for.  Any other non-zero code is an error.
          */
         if (code && code != CM_ERROR_STOPNOW) return code;
-        
-        if (!rock.found)
+
+       getroot = (dscp==cm_rootSCachep) ;
+        if (!rock.found) {
+         if (!cm_freelanceEnabled || !getroot) {
                if (flags & CM_FLAG_CHECKPATH)
                        return CM_ERROR_NOSUCHPATH;
                else
                        return CM_ERROR_NOSUCHFILE;
+         }
+         else {  /* nonexistent dir on freelance root, so add it */
+           code = cm_FreelanceAddMount(namep, namep, "root.cell.",
+                                       &rock.fid);
+           if (code < 0) {   /* add mount point failed, so give up */
+             if (flags & CM_FLAG_CHECKPATH)
+               return CM_ERROR_NOSUCHPATH;
+             else
+               return CM_ERROR_NOSUCHFILE;
+           }
+           tscp = NULL;   /* to force call of cm_GetSCache */
+         }
+       }
         
 haveFid:       
        if ( !tscp )    /* we did not find it in the dnlc */
@@ -1190,9 +1206,17 @@ long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp,
                 *newRootScpp = cm_rootSCachep;
                 cm_HoldSCache(cm_rootSCachep);
         } else if (*linkp == '\\' || *linkp == '/') {
+         /* formerly, this was considered to be from the AFS root,
+            but this seems to create problems.  instead, we will just
+            reject the link */
+#if 0
                strcpy(tsp->data, linkp+1);
                 *newRootScpp = cm_rootSCachep;
                 cm_HoldSCache(cm_rootSCachep);
+#else
+               code = CM_ERROR_NOSUCHPATH;
+               goto done;
+#endif
         }
         else {
                /* a relative link */
index a9d8959..cf40e41 100644 (file)
@@ -33,12 +33,12 @@ RCSID("$Header$");
 #include <netdb.h>
 #include <sys/file.h>
 #include <sys/time.h>
-#include <afs/afsint.h>
 #ifdef AFS_AFSDB_ENV
 #include <arpa/nameser.h>
 #include <resolv.h>
 #endif /* AFS_AFSDB_ENV */
 #endif /* AFS_NT40_ENV */
+#include <afs/afsint.h>
 #include <errno.h>
 #include <ctype.h>
 #include <time.h>
index 4653dc8..7a6f085 100644 (file)
@@ -66,7 +66,8 @@ BOSSERVER_EXELIBS =\
        $(DESTDIR)\lib\afs\afsaudit.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(DESTDIR)\lib\afs\afsprocmgmt.lib
+       $(DESTDIR)\lib\afs\afsprocmgmt.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 $(BOSSERVER_EXEFILE): $(BOSSERVER_EXEOBJS) $(BOSSERVER_EXELIBS)
        $(EXECONLINK)
@@ -100,7 +101,8 @@ BOS_EXELIBS =\
        $(DESTDIR)\lib\afs\afsbos.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
        $(DESTDIR)\lib\afs\afsprocmgmt.lib \
-       $(DESTDIR)\lib\afs\afspioctl.lib
+       $(DESTDIR)\lib\afs\afspioctl.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 
 $(RS_BOS_EXEFILE): $(BOS_EXEOBJS) $(BOS_EXELIBS)
index bc2437b..68e5fe6 100644 (file)
@@ -79,7 +79,8 @@ EXELIBS =\
         $(DESTDIR)\lib\afs\afsusd.lib \
        $(DESTDIR)\lib\afs\afsprocmgmt.lib \
        $(DESTDIR)\lib\afs\afspioctl.lib \
-       $(DESTDIR)\lib\afs\afsreg.lib
+       $(DESTDIR)\lib\afs\afsreg.lib \
+     $(DESTDIR)\lib\cm_dns.obj
        
 
 $(EXEFILE): $(EXEOBJS) $(EXELIBS)
index 278bf71..2bbe304 100644 (file)
@@ -75,7 +75,8 @@ EXELIBS =\
        $(DESTDIR)\lib\afsubik.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
-       $(DESTDIR)\lib\afs\afsprocmgmt.lib
+       $(DESTDIR)\lib\afs\afsprocmgmt.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 
 $(EXEFILE): $(EXEOBJS)  $(EXELIBS)
index e798e6d..9c87cf8 100644 (file)
@@ -49,7 +49,8 @@ EXELIBS =\
        $(DESTDIR)\lib\afs\afsprocmgmt.lib \
        $(DESTDIR)\lib\afs\afspioctl.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(DESTDIR)\lib\afs\afsreg.lib
+       $(DESTDIR)\lib\afs\afsreg.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 $(EXEFILE): $(EXEOBJS) $(EXELIBS)
        $(EXECONLINK)
index 8fa312f..92a49ec 100644 (file)
@@ -21,8 +21,8 @@ RCSID("$Header$");
 #include <WINNT/afsevent.h>
 #else
 #include <netinet/in.h>
-#endif
 #include <netdb.h>
+#endif
 #include <stdio.h>
 #include <rx/xdr.h>
 #include <rx/rx.h>
index 6d3ec64..261fa20 100644 (file)
@@ -73,7 +73,8 @@ BUTCLIBS=$(DESTDIR)\lib\afs\afsbudb.lib  \
 !ELSE
        $(DESTDIR)\lib\pthread.lib \
 !ENDIF
-            $(DESTDIR)\lib\afsdes.lib
+            $(DESTDIR)\lib\afsdes.lib \
+            $(DESTDIR)\lib\cm_dns.obj
 
 
 #      $(DESTDIR)\lib\afsauthent.lib \
index 607c745..8643cca 100644 (file)
@@ -21,7 +21,8 @@ LIBS = \
        $(DESTDIR)\lib\afsubik.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
        $(DESTDIR)\lib\afsrxkad.lib \
-       $(DESTDIR)\lib\afs\afsprocmgmt.lib
+       $(DESTDIR)\lib\afs\afsprocmgmt.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 ############################################################################
 # Definitions for generating files via RXGEN
index 9f0a5e4..e2331e4 100644 (file)
@@ -85,7 +85,8 @@ VLSERVER_EXECLIBS = \
        $(DESTDIR)\lib\afs\afsaudit.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
-       $(DESTDIR)\lib\afs\afsprocmgmt.lib
+       $(DESTDIR)\lib\afs\afsprocmgmt.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
        
 $(VLSERVER): $(VLSERVER_EXEOBJS) $(LIBFILE) $(VLSERVER_EXECLIBS)
index 90d4038..f9f2e70 100644 (file)
@@ -64,7 +64,8 @@ EXEC_LIBS = \
        $(DESTDIR)\lib\afslwp.lib \
        $(DESTDIR)\lib\afs\afsacl.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
-       $(DESTDIR)\lib\afs\afseventlog.lib
+       $(DESTDIR)\lib\afs\afseventlog.lib \
+     $(DESTDIR)\lib\cm_dns.obj
 
 
 ############################################################################