Fileserver: Add the /vicepXX/NeverAttach flag to skip mounting a partition
authorJason Edgecombe <jason@rampaginggeek.com>
Sat, 7 Apr 2012 00:58:13 +0000 (20:58 -0400)
committerDerrick Brashear <shadow@dementix.org>
Sat, 7 Apr 2012 14:32:52 +0000 (07:32 -0700)
FIXES 130561

LICENSE MIT

Change-Id: Ib465a978d08238d83c4c0a03813f5ec240f9bd9b
Reviewed-on: http://gerrit.openafs.org/7108
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Jason Edgecombe <jason@rampaginggeek.com>

doc/man-pages/pod8/fragments/fileserver-description.pod
src/vol/partition.c
src/vol/partition.h

index d4ebb64..155505f 100644 (file)
@@ -127,9 +127,12 @@ or C</vicepXX> where XX is "a" through "z" or "aa" though "iv". Up to
 255 partitions are allowed. The File Server expects that the /vicepXX
 directories are each on a dedicated filesystem. The File Server will
 only use a /vicepXX if it's a mountpoint for another filesystem,
-unless the file C</vicepXX/AlwaysAttach> exists. The data in the
-partition is a special format that can only be access using OpenAFS
-commands or an OpenAFS client.
+unless the file C</vicepXX/AlwaysAttach> exists.  A partition will not be
+mounted if the file C</vicepXX/NeverAttach> exists. If both
+C</vicepXX/AlwaysAttach> and C</vicepXX/NeverAttach> are present, then
+C</vicepXX/AlwaysAttach> wins.  The data in the partition is a special
+format that can only be access using OpenAFS commands or an OpenAFS
+client.
 
 The File Server generates the following message when a partition is nearly
 full:
index 0e3e448..95bb8a8 100644 (file)
@@ -398,6 +398,28 @@ VIsAlwaysAttach(char *part, int *awouldattach)
 #endif /* AFS_NAMEI_ENV */
 }
 
+/* VIsNeverAttach() checks whether a /vicepX directory should never be
+ * attached (return value 1), or follow the normal mounting logic. The
+ * Always Attach flag may override the NeverAttach flag.
+ */
+static int
+VIsNeverAttach(char *part)
+{
+    struct afs_stat_st st;
+    char checkfile[256];
+    int ret;
+
+    if (strncmp(part, VICE_PARTITION_PREFIX, VICE_PREFIX_SIZE))
+       return 0;
+
+    strncpy(checkfile, part, 100);
+    strcat(checkfile, OS_DIRSEP);
+    strcat(checkfile, VICE_NEVERATTACH_FILE);
+
+    ret = afs_stat(checkfile, &st);
+    return (ret < 0) ? 0 : 1;
+}
+
 /* VAttachPartitions2() looks for and attaches /vicepX partitions
  * where a special file (VICE_ALWAYSATTACH_FILE) exists.  This is
  * used to attach /vicepX directories which aren't on dedicated
@@ -478,6 +500,10 @@ VAttachPartitions(void)
            || (strncmp(mnt.mnt_mntopts, "ro,ignore", 9) == 0))
            continue;
 
+       /* Skip this Partition? */
+       if (VIsNeverAttach(mntent->mnt_dir))
+           continue;
+
        /* If we're going to always attach this partition, do it later. */
        if (VIsAlwaysAttach(mnt.mnt_mountp, NULL))
            continue;
@@ -517,6 +543,10 @@ VAttachPartitions(void)
        if (!hasmntopt(mntent, MNTOPT_RW))
            continue;
 
+       /* Skip this Partition? */
+       if (VIsNeverAttach(mntent->mnt_dir))
+           continue;
+
        /* If we're going to always attach this partition, do it later. */
        if (VIsAlwaysAttach(mntent->mnt_dir, NULL))
            continue;
@@ -620,6 +650,10 @@ VAttachPartitions(void)
 #endif
 #endif
 
+       /* Skip this Partition? */
+       if (VIsNeverAttach(mntent->mnt_dir))
+           continue;
+
        /* If we're going to always attach this partition, do it later. */
        if (VIsAlwaysAttach(part, NULL))
            continue;
@@ -650,6 +684,10 @@ VAttachPartitions(void)
        if (strcmp(fsent->fs_type, "rw") != 0)
            continue;
 
+       /* Skip this Partition? */
+       if (VIsNeverAttach(mntent->mnt_dir))
+           continue;
+
        /* If we're going to always attach this partition, do it later. */
        if (VIsAlwaysAttach(fsent->fs_file, NULL))
            continue;
@@ -834,6 +872,10 @@ VAttachPartitions(void)
        }
     }
     while ((mntent = getmntent(mfd))) {
+       /* Skip this Partition? */
+       if (VIsNeverAttach(mntent->mnt_dir))
+           continue;
+
        /* If we're going to always attach this partition, do it later. */
        if (VIsAlwaysAttach(mntent->mnt_dir, NULL))
            continue;
index 8fe774d..28c96cf 100644 (file)
 #define VICE_ALWAYSATTACH_FILE "AlwaysAttach"
 #endif
 
+/* If a file by this name exists in a /vicepX directory, it means that
+ * this directory should NOT be used as an AFS partition.
+ */
+#define VICE_NEVERATTACH_FILE  "NeverAttach"
+
 /**
  * abstraction for files used for file-locking.
  */