/* date volume instance was created */
if (async) {
if (avol)
- async->spare1 = avol->header->diskstuff.creationDate;
+ async->spare1 = V_creationDate(avol);
else
async->spare1 = 0;
async->spare2 = 0;
fdP = IH_OPEN(vnp->handle);
if (fdP == NULL) {
- ViceLog(0, ("CheckLength: cannot open inode for fid %lu.%lu.%lu\n",
- afs_printable_uint32_lu(vp->hashid),
+ ViceLog(0, ("CheckLength: cannot open inode for fid %" AFS_VOLID_FMT ".%lu.%lu\n",
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier)));
return -1;
FDH_CLOSE(fdP);
if (alen < 0) {
afs_int64 alen64 = alen;
- ViceLog(0, ("CheckLength: cannot get size for inode for fid "
- "%lu.%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
- afs_printable_uint32_lu(vp->hashid),
+ ViceLog(0, ("CheckLength: cannot get size for inode for fid %"
+ AFS_VOLID_FMT ".%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier),
alen64));
if (alen != vlen) {
afs_int64 alen64 = alen, vlen64 = vlen;
- ViceLog(0, ("Fid %lu.%lu.%lu has inconsistent length (index "
+ ViceLog(0, ("Fid %" AFS_VOLID_FMT ".%lu.%lu has inconsistent length (index "
"%lld inode %lld ); volume must be salvaged\n",
- afs_printable_uint32_lu(vp->hashid),
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier),
vlen64, alen64));
struct client **client, int locktype,
afs_int32 * rights, afs_int32 * anyrights, int remote)
{
- struct acl_accessList *aCL; /* Internal access List */
+ struct acl_accessList *aCL = NULL; /* Internal access List */
int aCLSize; /* size of the access list */
Error errorCode = 0; /* return code to caller */
struct rx_connection *tcon = rx_ConnectionOf(acall);
} /*RXStore_AccessList */
+static int
+CheckLink(Volume *volptr, FdHandle_t *fdP, const char *descr)
+{
+ int code;
+ afs_ino_str_t ino;
+
+ code = FDH_ISUNLINKED(fdP);
+ if (code < 0) {
+ ViceLog(0, ("CopyOnWrite: error fstating volume %u inode %s (%s), errno %d\n",
+ V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr, errno));
+ return -1;
+ }
+ if (code) {
+ ViceLog(0, ("CopyOnWrite corruption prevention: detected zero nlink for "
+ "volume %u inode %s (%s), forcing volume offline\n",
+ V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr));
+ return -1;
+ }
+ return 0;
+}
/* In our current implementation, each successive data store (new file
* data version) creates a new inode. This function creates the new
if (!VALID_INO(ino)) {
free(buff);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
targFdP = IH_OPEN(targetptr->handle);
if (targFdP == NULL) {
rc = errno;
ViceLog(0,
- ("CopyOnWrite failed: Failed to open target vnode %u in volume %u (errno = %d)\n",
- targetptr->vnodeNumber, V_id(volptr), rc));
+ ("CopyOnWrite failed: Failed to open target vnode %u in volume %" AFS_VOLID_FMT " (errno = %d)\n",
+ targetptr->vnodeNumber, afs_printable_VolumeId_lu(V_id(volptr)), rc));
free(buff);
VTakeOffline(volptr);
return rc;
(int)targetptr->disk.dataVersion);
if (!VALID_INO(ino)) {
ViceLog(0,
- ("CopyOnWrite failed: Partition %s that contains volume %u may be out of free inodes(errno = %d)\n",
- volptr->partition->name, V_id(volptr), errno));
+ ("CopyOnWrite failed: Partition %s that contains volume %" AFS_VOLID_FMT " may be out of free inodes(errno = %d)\n",
+ volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr)), errno));
FDH_CLOSE(targFdP);
free(buff);
return ENOSPC;
newFdP = IH_OPEN(newH);
opr_Assert(newFdP != NULL);
+ rc = CheckLink(volptr, targFdP, "source");
+ if (!rc) {
+ rc = CheckLink(volptr, newFdP, "dest");
+ }
+ if (rc) {
+ FDH_REALLYCLOSE(newFdP);
+ IH_RELEASE(newH);
+ FDH_REALLYCLOSE(targFdP);
+ IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
+ free(buff);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
+
done = off;
while (size > 0) {
if (size > COPYBUFFSIZE) { /* more than a buffer */
if ((rdlen != length) || (wrlen != length)) {
if ((wrlen < 0) && (errno == ENOSPC)) { /* disk full */
ViceLog(0,
- ("CopyOnWrite failed: Partition %s containing volume %u is full\n",
- volptr->partition->name, V_id(volptr)));
+ ("CopyOnWrite failed: Partition %s containing volume %" AFS_VOLID_FMT " is full\n",
+ volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr))));
/* remove destination inode which was partially copied till now */
FDH_REALLYCLOSE(newFdP);
IH_RELEASE(newH);
rc = IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
if (rc) {
ViceLog(0,
- ("CopyOnWrite failed: error %u after i_dec on disk full, volume %u in partition %s needs salvage\n",
- rc, V_id(volptr), volptr->partition->name));
+ ("CopyOnWrite failed: error %u after i_dec on disk full, volume %" AFS_VOLID_FMT " in partition %s needs salvage\n",
+ rc, afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name));
VTakeOffline(volptr);
}
free(buff);
* time, just case to an unsigned int for printing */
ViceLog(0,
- ("CopyOnWrite failed: volume %u in partition %s (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
- V_id(volptr), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
+ ("CopyOnWrite failed: volume %" AFS_VOLID_FMT " in partition %s (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
+ afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
(unsigned)wrlen, errno));
#if defined(AFS_DEMAND_ATTACH_FS)
ViceLog(0, ("CopyOnWrite failed: requesting salvage\n"));
if ((*targetptr)->disk.uniquifier != fileFid->Unique) {
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
errorCode = VSALVAGE;
return errorCode;
}
{
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return (EIO);
}
DT1++;
Directory) ? "directory" : "file")));
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
if (!errorCode)
errorCode = code;
}
if (Caller & TVS_SDATA) {
targetptr->disk.dataVersion++;
if (!remote && VanillaUser(client)) {
- targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+ /* turn off suid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
#ifdef CREATE_SGUID_ADMIN_ONLY
- targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+ /* turn off sgid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
#endif
}
}
if (InStatus->Mask & AFS_SETOWNER) {
/* admin is allowed to do chmod, chown as well as chown, chmod. */
if (!remote && VanillaUser(client)) {
- targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+ /* turn off suid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
#ifdef CREATE_SGUID_ADMIN_ONLY
- targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+ /* turn off sgid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
#endif
}
targetptr->disk.owner = InStatus->Owner;
VAdjustDiskUsage(&nc, volptr, -length, 0);
if (rc == VOVERQUOTA) {
ViceLog(2,
- ("Volume %u (%s) is full\n", V_id(volptr),
+ ("Volume %" AFS_VOLID_FMT " (%s) is full\n",
+ afs_printable_VolumeId_lu(V_id(volptr)),
V_name(volptr)));
return (rc);
}
if (rc == VDISKFULL) {
ViceLog(0,
- ("Partition %s that contains volume %u is full\n",
- volptr->partition->name, V_id(volptr)));
+ ("Partition %s that contains volume %" AFS_VOLID_FMT " is full\n",
+ volptr->partition->name,
+ afs_printable_VolumeId_lu(V_id(volptr))));
return (rc);
}
ViceLog(0, ("Got error return %d from VAdjustDiskUsage\n", rc));
/* error in creating inode */
if (!VALID_INO(inode)) {
ViceLog(0,
- ("Volume : %u vnode = %u Failed to create inode: errno = %d\n",
- (*targetptr)->volumePtr->header->diskstuff.id,
+ ("Volume : %" AFS_VOLID_FMT " vnode = %u Failed to create inode: errno = %d\n",
+ afs_printable_VolumeId_lu(V_id((*targetptr)->volumePtr)),
(*targetptr)->vnodeNumber, errno));
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
(*targetptr)->delete = 1; /* delete vnode */
if ((top == 1) && (testnode != 0)) {
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
errorCode = EIO;
goto Bad_Rename;
}
(void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
parentptr, volptr, &client);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
len = strlen((char *) LinkContents);
fdP = IH_OPEN(ihP);
if (fdP == NULL) {
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
optSize = sendBufSize;
if (tlen < 0) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
if (CheckLength(volptr, targetptr, tlen)) {
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
nBytes = rx_Write(Call, tbuffer, wlen);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
nBytes = rx_Writev(Call, tiov, tnio, wlen);
if (GetLinkCountAndSize(volptr, fdP, &linkCount, &DataLength) < 0) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
if (CheckLength(volptr, targetptr, DataLength)) {
}
if (!VALID_INO(tinode)) {
VTakeOffline(volptr);
- ViceLog(0,("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0,("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}