#include <afs/opr.h>
#include <afs/afsint.h>
+#include <rx/rx_queue.h>
#include <afs/afsutil.h>
/* 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;
#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));
* 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;
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.