From e6ddb2a18857e1e1509d910e46c4b6959e2df789 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 11 Jan 2012 10:00:35 -0500 Subject: [PATCH] vol: Fix VCreateVolume special inode cleanup In order to dec the relevant special inodes, we need to know the parent vol id in addition to the vol id itself. Use the appropriate volume IDs when IH_DEC'ing special inodes after we fail to create the volume, so we don't leave behind special inodes. (cherry picked from commit 627cfb1d4e7b32b4342c59b162a36ba9beb8a066) Reviewed-on: http://gerrit.openafs.org/6529 Tested-by: BuildBot Reviewed-by: Derrick Brashear Change-Id: I9f40f170cd6a0fffe2e17fc199af99e087066902 Reviewed-on: http://gerrit.openafs.org/6550 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/vol/vutil.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vol/vutil.c b/src/vol/vutil.c index 6f7f7ce13..acda92a31 100644 --- a/src/vol/vutil.c +++ b/src/vol/vutil.c @@ -91,7 +91,7 @@ #ifdef FSSYNC_BUILD_CLIENT static void -RemoveInodes(Device dev, VolumeId vid) +RemoveInodes(Device dev, VolumeId parent, VolumeId vid) { int i; IHandle_t *handle; @@ -99,11 +99,16 @@ RemoveInodes(Device dev, VolumeId vid) /* This relies on the fact that IDEC only needs the device and NT only * needs the dev and vid to decrement volume special files. */ - IH_INIT(handle, dev, vid, -1); + IH_INIT(handle, dev, parent, -1); for (i = 0; i < nFILES; i++) { Inode inode = *stuff[i].inode; - if (VALID_INO(inode)) - IH_DEC(handle, inode, vid); + if (VALID_INO(inode)) { + if (stuff[i].inodeType == VI_LINKTABLE) { + IH_DEC(handle, inode, parent); + } else { + IH_DEC(handle, inode, vid); + } + } } IH_RELEASE(handle); } @@ -256,7 +261,7 @@ VCreateVolume_r(Error * ec, char *partname, VolId volumeId, VolId parentId) bad: if (handle) IH_RELEASE(handle); - RemoveInodes(device, vol.id); + RemoveInodes(device, vol.parentId, vol.id); if (!*ec) { *ec = VNOVOL; } -- 2.39.5