afs_int32 ec = 0;
vp = (Volume *) calloc(1, sizeof(Volume));
+ if (!vp) {
+ fprintf(stderr, "%s: Failed to allocate volume object.\n", progname);
+ return NULL;
+ }
vp->specialStatus = 0;
vp->device = dp->device;
vp->partition = dp;
vp->goingOffline = 0;
vp->nUsers = 1;
vp->header = (struct volHeader *)calloc(1, sizeof(*vp->header));
+ if (!vp->header) {
+ fprintf(stderr, "%s: Failed to allocate volume header.\n", progname);
+ free(vp);
+ return NULL;
+ }
ec = ReadHdr1(V_diskDataHandle(vp), (char *)&V_disk(vp),
sizeof(V_disk(vp)), VOLUMEINFOMAGIC, VOLUMEINFOVERSION);
if (!ec) {
}
/**
+ * Simplified detach volume
+ *
+ * param[in] vp volume object from AttachVolume
+ *
+ * @return none
+ */
+static void
+DetachVolume(Volume * vp)
+{
+ IH_RELEASE(vp->vnodeIndex[vLarge].handle);
+ IH_RELEASE(vp->vnodeIndex[vSmall].handle);
+ IH_RELEASE(vp->diskDataHandle);
+ IH_RELEASE(V_linkHandle(vp));
+ free(vp->header);
+ free(vp);
+}
+
+/**
* Convert the partition device number into a partition name.
*
* @param[in] partId partition number, 0 to 254
struct VolumeHeader header;
struct VolumeDiskHeader diskHeader;
FD_t fd = INVALID_FD;
- Volume *vp;
+ Volume *vp = NULL;
char headerName[1024];
afs_sfsize_t n;
VPartitionPath(dp), name);
if ((fd = OS_OPEN(headerName, O_RDONLY, 0666)) == INVALID_FD) {
fprintf(stderr, "%s: Cannot open volume header %s\n", progname, name);
- return;
+ goto cleanup;
}
if (OS_SIZE(fd) < 0) {
fprintf(stderr, "%s: Cannot read volume header %s\n", progname, name);
- OS_CLOSE(fd);
- return;
+ goto cleanup;
}
n = OS_READ(fd, &diskHeader, sizeof(diskHeader));
if (n != sizeof(diskHeader)
|| diskHeader.stamp.magic != VOLUMEHEADERMAGIC) {
fprintf(stderr, "%s: Error reading volume header %s\n", progname,
name);
- OS_CLOSE(fd);
- return;
+ goto cleanup;
}
if (diskHeader.stamp.version != VOLUMEHEADERVERSION) {
fprintf(stderr,
"%s: Volume %s, version number is incorrect; volume needs to be salvaged\n",
progname, name);
- OS_CLOSE(fd);
- return;
+ goto cleanup;
}
+
DiskToVolumeHeader(&header, &diskHeader);
if (DumpHeader || ShowSizes) {
HandleHeaderFiles(dp, fd, &header);
}
- OS_CLOSE(fd);
+
vp = AttachVolume(dp, name, &header);
if (!vp) {
fprintf(stderr, "%s: Error attaching volume header %s\n",
progname, name);
- return;
+ goto cleanup;
}
+
if (DumpInfo) {
PrintHeader(vp);
}
volumeTotals.auxsize_k + volumeTotals.vnodesize_k;
PrintVolumeSizes(vp);
}
- free(vp->header);
- free(vp);
-}
+ cleanup:
+ if (fd != INVALID_FD) {
+ OS_CLOSE(fd);
+ }
+ if (vp) {
+ DetachVolume(vp);
+ }
+}
/**
* volinfo program entry