From 399655e3df3bf30d7878dec70402fc0021cae752 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Thu, 7 Apr 2011 12:36:19 -0500 Subject: [PATCH] volser: Avoid assert on ViceCreateRoot failure If IH_CREATE fails in ViceCreateRoot, it may just be due to an on-disk inconsistency. So, don't assert, but just return an error and detach the volume. Change-Id: I8acacff8c858b0d27234265fee5d7b49ebab5101 Reviewed-on: http://gerrit.openafs.org/4444 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/volser/volprocs.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/volser/volprocs.c b/src/volser/volprocs.c index 875f9f6..21e5958 100644 --- a/src/volser/volprocs.c +++ b/src/volser/volprocs.c @@ -41,6 +41,7 @@ #include "afs/audit.h" #include #include +#include #include #include @@ -304,7 +305,7 @@ XAttachVolume(afs_int32 *error, afs_uint32 avolid, afs_int32 apartid, int amode) } /* Adapted from the file server; create a root directory for this volume */ -static int +static Error ViceCreateRoot(Volume *vp) { DirHandle dir; @@ -328,7 +329,11 @@ ViceCreateRoot(Volume *vp) IH_CREATE(V_linkHandle(vp), V_device(vp), VPartitionPath(V_partition(vp)), nearInode, V_parentId(vp), 1, 1, 0); - osi_Assert(VALID_INO(inodeNumber)); + if (!VALID_INO(inodeNumber)) { + Log("ViceCreateRoot: IH_CREATE: %s\n", afs_error_message(errno)); + free(vnode); + return EIO; + } SetSalvageDirHandle(&dir, V_parentId(vp), vp->device, inodeNumber); did.Volume = V_id(vp); @@ -384,7 +389,7 @@ ViceCreateRoot(Volume *vp) V_diskused(vp) = nBlocks(length); free(vnode); - return 1; + return 0; } afs_int32 @@ -560,8 +565,16 @@ VolCreateVolume(struct rx_call *acid, afs_int32 apart, char *aname, V_inService(vp) = V_blessed(vp) = 1; V_type(vp) = atype; AssignVolumeName(&V_disk(vp), aname, 0); - if (doCreateRoot) - ViceCreateRoot(vp); + if (doCreateRoot) { + error = ViceCreateRoot(vp); + if (error) { + Log("1 Volser: CreateVolume: Unable to create volume root dir; " + "error code %u\n", (unsigned)error); + DeleteTrans(tt, 1); + VDetachVolume(&junk, vp); + return EIO; + } + } V_destroyMe(vp) = DESTROY_ME; V_inService(vp) = 0; V_maxquota(vp) = 5000; /* set a quota of 5000 at init time */ -- 1.9.4