> Is there any place from which we can get the changes you made to the
> fileserver/dbserver code?

I just posted the following two patches:

Sorry for the delay.
-------------------------------------------------------------------------
The following patch(s) add a bit (byte) to the volume header (reserveb3
becomes volIsShadow).  This is used to prevent accidentially putting
shadow volumes into the VLDB.  It is also used to prevent non-admin
access to shadow volumes.

Thanks.
=========
diff -u viced/afsfileprocs.c viced/afsfileprocs.c
--- viced/afsfileprocs.c        2006-04-07 01:36:59.000000000 -0400
+++ viced/afsfileprocs.c        2006-07-17 22:01:16.000000000 -0400
@@ -739,6 +739,11 @@
     if (!VanillaUser(*client))
        (*rights) |= PRSFS_LOOKUP;
 #endif /* ADMIN_IMPLICIT_LOOKUP */
+    /* restrict access to shadow volumes */
+    if (V_volIsShadow(*volptr) && VanillaUser(*client)) {
+       (*rights) = (*anyrights) = 0;
+       return (EACCES);
+    }
     return errorCode;
 
 }                              /*GetVolumePackage */
diff -u vol/vol-info.c vol/vol-info.c
--- vol/vol-info.c      2005-05-08 02:10:27.000000000 -0400
+++ vol/vol-info.c      2006-06-28 13:05:13.000000000 -0400
@@ -692,6 +692,7 @@
         V_dayUse(vp), V_weekUse(vp)[0], V_weekUse(vp)[1], V_weekUse(vp)[2],
         V_weekUse(vp)[3], V_weekUse(vp)[4], V_weekUse(vp)[5],
         V_weekUse(vp)[6], date(V_dayUseDate(vp)));
+    printf("volIsShadow = %d\n", V_volIsShadow(vp));
 }
 
 /* GetFileInfo
diff -u vol/volume.h vol/volume.h
--- vol/volume.h        2005-05-30 00:41:29.000000000 -0400
+++ vol/volume.h        2006-06-28 13:05:13.000000000 -0400
@@ -225,7 +225,8 @@
 #define DONT_SALVAGE   0xE5
 #endif                         /* ALPHA_DUX40_ENV */
     byte dontSalvage;          /* If this is on, then don't bother salvaging 
this volume */
-    byte reserveb3;
+    byte volIsShadow;          /* If this is on, this volume is a shadow of 
another volume.  Used
+                                * to make sure we don't accidentially populate 
the VLDB */
 
     bit32 reserved1[6];
 
@@ -373,6 +374,7 @@
 #define V_needsCallback(vp)    ((vp)->header->diskstuff.needsCallback)
 #define V_destroyMe(vp)                ((vp)->header->diskstuff.destroyMe)
 #define V_dontSalvage(vp)      ((vp)->header->diskstuff.dontSalvage)
+#define V_volIsShadow(vp)      ((vp)->header->diskstuff.volIsShadow)
 #define V_maxquota(vp)         ((vp)->header->diskstuff.maxquota)
 #define V_minquota(vp)         ((vp)->header->diskstuff.minquota)
 #define V_maxfiles(vp)         ((vp)->header->diskstuff.maxfiles)
diff -u volser/volint.xg volser/volint.xg
--- volser/volint.xg    2003-06-19 12:06:58.000000000 -0400
+++ volser/volint.xg    2006-06-28 13:05:13.000000000 -0400
@@ -109,7 +109,7 @@
     afs_int32 spare0;          /* Used to hold the minquota value */
     afs_int32 spare1;          /* Used to hold the weekuse value */
     afs_int32 spare2;
-    afs_int32 spare3;
+    afs_int32 spare3;          /* Used to hold the unsigned char volIsShadow */
 };
 
 /*
diff -u volser/volprocs.c volser/volprocs.c
--- volser/volprocs.c   2006-01-24 22:25:49.000000000 -0500
+++ volser/volprocs.c   2006-06-28 13:05:13.000000000 -0400
@@ -1043,6 +1043,12 @@
     } else {
        V_inService(vp) = 1;
     }
+
+    if (aflags & VTIsShadow) {
+       V_volIsShadow(vp) = 1;
+    } else if (aflags & VTNotShadow) {
+       V_volIsShadow(vp) = 0;
+    }
     VUpdateVolume(&error, vp);
     tt->vflags = aflags;
     tt->rxCallPtr = (struct rx_call *)0;
@@ -1544,6 +1550,8 @@
        td->creationDate = astatus->creationDate;
     if (astatus->updateDate != -1)
        td->updateDate = astatus->updateDate;
+    if (astatus->spare3 != -1)
+       td->volIsShadow = astatus->spare3;
     VUpdateVolume(&error, tv);
     tt->rxCallPtr = (struct rx_call *)0;
     if (TRELE(tt))
@@ -1849,7 +1857,8 @@
                (long)tv->header->diskstuff.weekUse[4] +
                (long)tv->header->diskstuff.weekUse[5] +
                (long)tv->header->diskstuff.weekUse[6];
-           pntr->flags = pntr->spare2 = pntr->spare3 = (long)0;
+           pntr->flags = pntr->spare2 = (long)0;
+           pntr->spare3 = tv->header->diskstuff.volIsShadow;
            VDetachVolume(&error, tv);  /*free the volume */
            tv = (Volume *) 0;
            if (error) {
@@ -2224,7 +2233,8 @@
                (long)tv->header->diskstuff.weekUse[4] +
                (long)tv->header->diskstuff.weekUse[5] +
                (long)tv->header->diskstuff.weekUse[6];
-           pntr->flags = pntr->spare2 = pntr->spare3 = (long)0;
+           pntr->flags = pntr->spare2 = (long)0;
+           pntr->spare3 = tv->header->diskstuff.volIsShadow;
            VDetachVolume(&error, tv);  /*free the volume */
            tv = (Volume *) 0;
            if (error) {
diff -u volser/volser.p.h volser/volser.p.h
--- volser/volser.p.h   2005-07-11 15:27:29.000000000 -0400
+++ volser/volser.p.h   2006-06-28 13:05:13.000000000 -0400
@@ -19,6 +19,8 @@
 #define        VTDeleteOnSalvage       1       /* delete on next salvage */
 #define        VTOutOfService          2       /* never put this volume online 
*/
 #define        VTDeleted               4       /* deleted, don't do anything 
else */
+#define VTIsShadow             8       /* tag so we don't sync by mistake */
+#define VTNotShadow            0x10    /* tag so we don't sync by mistake */
 
 /* iflags, representing "attach mode" for this volume at the start of this 
transaction */
 #define        ITOffline       1       /* volume offline on server (returns 
VOFFLINE) */
@@ -169,6 +171,8 @@
 #define RV_CPINCR      0x20000
 #define RV_NOVLDB      0x40000
 #define RV_NOCLONE     0x80000
+#define RV_SETSHADOW   0x08000
+#define RV_CLRSHADOW   0x04000
 
 struct ubik_client;
 extern afs_uint32 vsu_GetVolumeID(char *astring, struct ubik_client *acstruct, 
afs_int32 *errp);
diff -u volser/vos.c volser/vos.c
--- volser/vos.c        2005-12-15 23:26:40.000000000 -0500
+++ volser/vos.c        2006-06-28 13:05:13.000000000 -0400
@@ -1080,7 +1080,7 @@
     fprintf(STDOUT, "dayUse\t\t%u\n", pntr->dayUse);
     fprintf(STDOUT, "weekUse\t\t%lu\t(Optional)\n", pntr->spare1);
     fprintf(STDOUT, "spare2\t\t%lu\t(Optional)\n", pntr->spare2);
-    fprintf(STDOUT, "spare3\t\t%lu\t(Optional)\n", pntr->spare3);
+    fprintf(STDOUT, "volIsShadow\t%s\t(Optional)\n", pntr->spare3 ? "Y" : "N");
     return;
 }
 
@@ -2487,7 +2487,7 @@
        }
     }
 
-    flags = RV_NOVLDB;
+    flags = RV_NOVLDB | RV_SETSHADOW;
     if (as->parms[7].items) flags |= RV_OFFLINE;
     if (as->parms[8].items) flags |= RV_RDONLY;
     if (as->parms[9].items) flags |= RV_NOCLONE;
@@ -3672,6 +3672,7 @@
     afs_int32 pnum = 0, code;  /* part name */
     char part[10];
     int flags = 0;
+    int forceshadows = 0;
     char *volname = 0;
 
     tserver = 0;
@@ -3709,17 +3710,21 @@
        }
     }
 
+    if (as->parms[3].items) {
+       forceshadows = 1;
+    }
+
     if (as->parms[2].items) {
        /* Synchronize an individual volume */
        volname = as->parms[2].items->data;
-       code = UV_SyncVolume(tserver, pnum, volname, flags);
+       code = UV_SyncVolume2(tserver, pnum, volname, flags, forceshadows);
     } else {
        if (!tserver) {
            fprintf(STDERR,
                    "Without a -volume option, the -server option is 
required\n");
            exit(1);
        }
-       code = UV_SyncVldb(tserver, pnum, flags, 0 /*unused */ );
+       code = UV_SyncVldb(tserver, pnum, flags, forceshadows );
     }
 
     if (code) {
@@ -5873,6 +5878,8 @@
     cmd_AddParm(ts, "-server", CMD_SINGLE, CMD_OPTIONAL, "machine name");
     cmd_AddParm(ts, "-partition", CMD_SINGLE, CMD_OPTIONAL, "partition name");
     cmd_AddParm(ts, "-volume", CMD_SINGLE, CMD_OPTIONAL, "volume name or ID");
+    cmd_AddParm(ts, "-forceshadows", CMD_FLAG, CMD_OPTIONAL,
+               "add shadows to VLDB");
     COMMONPARMS;
 
     ts = cmd_CreateSyntax("syncserv", SyncServer, 0,
diff -u volser/vsprocs.c volser/vsprocs.c
--- volser/vsprocs.c    2006-01-24 22:49:53.000000000 -0500
+++ volser/vsprocs.c    2006-07-06 11:38:08.000000000 -0400
@@ -171,7 +171,10 @@
                                   void *cookie, manyResults * results);
 static afs_int32 CheckVolume(volintInfo * volumeinfo, afs_int32 aserver,
                             afs_int32 apart, afs_int32 * modentry,
-                            afs_uint32 * maxvolid);
+                            afs_uint32 * maxvolid,
+                            struct rx_connection *aconn);
+static afs_int32 ClearShadow(struct rx_connection *aconn,
+                               afs_int32 avol, afs_int32 apart);
 
 
 /*map the partition <partId> into partition name <partName>*/
@@ -2019,6 +2022,8 @@
  *     RV_CPINCR  - do incremental dump if target exists
  *     RV_NOVLDB  - don't create/update VLDB entry
  *     RV_NOCLONE - don't use a copy clone
+ *     RV_SETSHADOW -set tag so we don't sync by mistake
+ *     RV_CLRSHADOW -clear tag so shadow is treated as a normal RW
  */
 int
 UV_CopyVolume2(afs_int32 afromvol, afs_int32 afromserver, afs_int32 afrompart,
@@ -2050,6 +2055,7 @@
     error = 0;
     pntg = 0;
     newVol = 0;
+    cloneVol = 0;
 
     /* support control-c processing */
     if (setjmp(env))
@@ -2071,13 +2077,19 @@
     /* check if we can shortcut and use a local clone instead of a full copy */
     if (afromserver == atoserver && afrompart == atopart) {
        justclone = 1;
+       if (atovolid) {
+           fprintf(STDOUT,
+                   "Shadowing volume %u onto itself not allowed\n",
+                   atovolid);
+           fflush(STDOUT);
+           goto mfail;
+       }
     }
 
     /* ***
      * clone the read/write volume locally.
      * ***/
 
-    cloneVol = 0;
     if (!(flags & RV_NOCLONE)) {
        VPRINT1("Starting transaction on source volume %u ...", afromvol);
        code = AFSVolTransCreate(fromconn, afromvol, afrompart, ITBusy,
@@ -2295,11 +2307,15 @@
                      &cookie);
     EGOTO1(mfail, code,
           "Failed to do the%s dump from old site to new site\n",
-          afromvol);
+        (flags & RV_NOCLONE) ? "" : " incremental");
     VDONE;
 
     VPRINT1("Setting volume flags on destination volume %u ...", newVol);
     volflag = ((flags & RV_OFFLINE) ? VTOutOfService : 0);     /* off or 
on-line */
+    if (flags & RV_SETSHADOW)
+       volflag |= VTIsShadow;
+    if (flags & RV_CLRSHADOW)
+       volflag |= VTNotShadow;
     code = AFSVolSetFlags(toconn, totid, volflag);
     EGOTO(mfail, code,
          "Failed to set the flags to make destination volume online\n");
@@ -5223,7 +5239,8 @@
  */
 static afs_int32
 CheckVolume(volintInfo * volumeinfo, afs_int32 aserver, afs_int32 apart,
-           afs_int32 * modentry, afs_uint32 * maxvolid)
+           afs_int32 * modentry, afs_uint32 * maxvolid, struct
+           rx_connection *aconn)
 {
     int idx, j;
     afs_int32 code, error = 0;
@@ -5231,6 +5248,7 @@
     char pname[10];
     int pass = 0, islocked = 0, createentry, addvolume, modified, mod;
     afs_int32 rwvolid;
+    afs_int32 volIsShadow;
 
     if (modentry)
        *modentry = 0;
@@ -5595,7 +5613,7 @@
        if (createentry) {
            code = VLDB_CreateEntry(&storeEntry);
            if (code) {
-               fprintf(STDOUT,
+               fprintf(STDERR,
                        "Could not create a VLDB entry for the volume %lu\n",
                        (unsigned long)rwvolid);
                ERROR_EXIT(code);
@@ -5613,6 +5631,15 @@
                ERROR_EXIT(code);
            }
        }
+       volIsShadow = volumeinfo->spare3;
+       if (volIsShadow) {
+           code = ClearShadow(aconn, volumeinfo->volid, apart);
+           if (code) {
+               fprintf(STDERR, "Could not clear shadow flag for volume %u\n",
+                       volumeinfo->volid);
+               ERROR_EXIT(code);
+           }
+       }
        if (modentry)
            *modentry = modified;
     } else if (pass == 2) {
@@ -5669,6 +5696,43 @@
     return 0;
 }
 
+static afs_int32
+ClearShadow(struct rx_connection *aconn, afs_int32 avol, afs_int32 apart)
+{
+    afs_int32 error = 0, tid = 0, rcode = 0;
+    register afs_int32 code = 0;
+
+    code = AFSVolTransCreate(aconn, avol, apart, ITOffline, &tid);
+    if (code) {
+       fprintf(STDERR, "Failed to start a transaction on the shadow volume 
%u\n",
+           avol);
+       error = code;
+    }
+
+    if (!code) {
+       code = AFSVolSetFlags(aconn, tid, VTNotShadow);
+       if (code) {
+           fprintf(STDERR, "Failed to set the flags on the shadow volume %u\n",
+                   avol);
+           error = code;
+       }
+    }
+
+    if (tid) {
+       code = AFSVolEndTrans(aconn, tid, &rcode);
+       if (code || rcode) {
+           fprintf(STDERR, "Failed to end the transaction on the shadow volume 
%u\n",
+                   avol);
+           if (!error)
+               error = (code ? code : rcode);
+       }
+    }
+
+    return error;
+
+}
+
+
 /* UV_SyncVolume()
  *      Synchronise <aserver> <apart>(if flags = 1) <avolid>.
  *      Synchronize an individual volume against a sever and partition.
@@ -5676,7 +5740,7 @@
  *      if the volume exists on specified servers (similar to syncvldb).
  */
 int
-UV_SyncVolume(afs_int32 aserver, afs_int32 apart, char *avolname, int flags)
+UV_SyncVolume2(afs_int32 aserver, afs_int32 apart, char *avolname, int flags, 
int force)
 {
     struct rx_connection *aconn = 0;
     afs_int32 j, k, code, vcode, error = 0;
@@ -5687,6 +5751,7 @@
     struct partList PartList;
     afs_int32 pcnt, rv;
     afs_int32 maxvolid = 0;
+    afs_int32 volIsShadow;
 
     volumeInfo.volEntries_val = (volintInfo *) 0;
     volumeInfo.volEntries_len = 0;
@@ -5768,14 +5833,24 @@
                        ERROR_EXIT(code);
                    }
                } else {
-                   /* Found one, sync it with VLDB entry */
-                   code =
-                       CheckVolume(volumeInfo.volEntries_val, aserver,
-                                   PartList.partId[j], &mod, &maxvolid);
-                   if (code)
-                       ERROR_EXIT(code);
-                   if (mod)
-                       modified++;
+                   /* Found one */
+                   volIsShadow = volumeInfo.volEntries_val->spare3;
+                   if (volIsShadow && !force) {
+                       if (tverbose) {
+                           fprintf(STDOUT,
+                               "You must use -forceshadows to sync this volume 
to the VLDB.\n");
+                       }
+                   } else {
+                       /* sync it with VLDB entry */
+                       code =
+                           CheckVolume(volumeInfo.volEntries_val,
+                                   aserver, PartList.partId[j], &mod,
+                                   &maxvolid, aconn);
+                       if (code)
+                           ERROR_EXIT(code);
+                       if (mod)
+                           modified++;
+                   }
                }
 
                if (volumeInfo.volEntries_val)
@@ -5821,7 +5896,8 @@
                    /* Found one, sync it with VLDB entry */
                    code =
                        CheckVolume(volumeInfo.volEntries_val, aserver,
-                                   PartList.partId[k], &mod, &maxvolid);
+                                   PartList.partId[k], &mod, &maxvolid,
+                                   aconn);
                    if (code)
                        ERROR_EXIT(code);
                    if (mod)
@@ -5895,6 +5971,14 @@
     return error;
 }
 
+
+int
+UV_SyncVolume(afs_int32 aserver, afs_int32 apart, char *avolname, int flags)
+{
+    return UV_SyncVolume2(aserver, apart, avolname, flags, 0);
+}
+
+
 /* UV_SyncVldb()
  *      Synchronise vldb with the file server <aserver> and,
  *      optionally, <apart>.
@@ -5913,6 +5997,7 @@
     afs_int32 failures = 0, modifications = 0, tentries = 0;
     afs_int32 modified;
     afs_uint32 maxvolid = 0;
+    afs_int32 volIsShadow;
 
     volumeInfo.volEntries_val = (volintInfo *) 0;
     volumeInfo.volEntries_len = 0;
@@ -5968,13 +6053,21 @@
                fflush(STDOUT);
            }
 
-           code = CheckVolume(vi, aserver, apart, &modified, &maxvolid);
-           if (code) {
-               PrintError("", code);
-               failures++;
-               pfail++;
-           } else if (modified) {
-               modifications++;
+           volIsShadow = vi->spare3;
+           if (volIsShadow && !force) {
+               if (verbose) {
+                   fprintf(STDOUT,
+                       "You must use -forceshadows to sync this volume to the 
VLDB.\n");
+               }
+           } else {
+               /* sync it with VLDB entry */
+               code = CheckVolume(vi, aserver, apart, &modified, &maxvolid, 
aconn);
+               if (code) {
+                   PrintError("", code);
+                   failures++;
+                   pfail++;
+               } else if (modified)
+                   modifications++;
            }
 
            if (verbose) {
-------------------------------------------------------------------------
The following fixes a bug in the UV_CopyVolume2 cleanup code.  Without
this patch, the cleanup code will delete the source volume.

Thanks.
========
diff -u volser/vsprocs.c volser/vsprocs.c
--- volser/vsprocs.c    2007-03-09 16:53:45.000000000 -0500
+++ volser/vsprocs.c    2007-03-14 16:10:14.000000000 -0400
@@ -2496,7 +2496,7 @@
        VPRINT1("Recovery: Creating transaction on clone volume %u ...",
                cloneVol);
        code =
-           AFSVolTransCreate(fromconn, newVol, afrompart, ITOffline,
+           AFSVolTransCreate(fromconn, cloneVol, afrompart, ITOffline,
                              &clonetid);
        if (!code) {
            VDONE;
_______________________________________________
OpenAFS-info mailing list
OpenAFS-info@openafs.org
https://lists.openafs.org/mailman/listinfo/openafs-info

Reply via email to