vol: Nuke parent vol special inodes
[openafs.git] / src / vol / nuke.c
index 99df0d5..3d520ff 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <afs/opr.h>
 #include <afs/afsint.h>
+#include <rx/rx_queue.h>
 
 #include <afs/afsutil.h>
 
@@ -47,10 +48,9 @@ struct ilist {
 
 /* called with a structure specifying info about the inode, and our rock (which
  * is the volume ID.  Returns true if we should keep this inode, otherwise false.
- * Note that ainfo->u.param[0] is always the volume ID, for any vice inode.
  */
 static int
-NukeProc(struct ViceInodeInfo *ainfo, afs_uint32 avolid, void *arock)
+NukeProc(struct ViceInodeInfo *ainfo, VolumeId avolid, void *arock)
 {
     struct ilist **allInodes = (struct ilist **)arock;
     struct ilist *ti;
@@ -61,8 +61,21 @@ NukeProc(struct ViceInodeInfo *ainfo, afs_uint32 avolid, void *arock)
 #endif /* !AFS_PTHREAD_ENV */
 
     /* check if this is the volume we're looking for */
-    if (ainfo->u.param[0] != avolid)
-       return 0;               /* don't want this one */
+    if (ainfo->u.vnode.vnodeNumber == INODESPECIAL) {
+       /* For special inodes, look at both the volume id and the parent id.
+        * If we were given an RW vol id to nuke, we should delete the special
+        * inodes for all volumes in the VG, since we're deleting all of the
+        * regular inodes, too. If we don't do this, on namei would be
+        * impossible to nuke the special inodes for a non-RW volume. */
+       if (ainfo->u.special.volumeId != avolid && ainfo->u.special.parentId != avolid) {
+           return 0;
+       }
+    } else {
+       if (ainfo->u.vnode.volumeId != avolid) {
+           return 0;           /* don't want this one */
+       }
+    }
+
     /* record the info */
     if (!*allInodes || (*allInodes)->freePtr >= MAXATONCE) {
        ti = calloc(1, sizeof(struct ilist));
@@ -87,7 +100,7 @@ NukeProc(struct ViceInodeInfo *ainfo, afs_uint32 avolid, void *arock)
  * indices will be gone.
  */
 int
-nuke(char *aname, afs_int32 avolid)
+nuke(char *aname, VolumeId avolid)
 {
     /* first process the partition containing this junk */
     struct afs_stat_st tstat;
@@ -185,12 +198,11 @@ nuke(char *aname, afs_int32 avolid)
                IH_RELEASE(fileH);
 #endif /* AFS_NAMEI_ENV */
            }
-           ni = ti->next;
            if (li) free(li);
            li = ti;
        }
        if (li) free(li);
-       code = 0;               /* we really don't care about it except for debugging */
+
        allInodes = NULL;
 
        /* at this point, we should try to remove the volume header file itself.