viced: Avoid clang errors with modeBits
[openafs.git] / src / viced / afsfileprocs.c
index 0bb0ea3..b400c99 100644 (file)
@@ -245,7 +245,7 @@ SetVolumeSync(struct AFSVolSync *async, Volume * avol)
     /* 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;
@@ -283,8 +283,8 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
 
        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;
@@ -293,9 +293,9 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
        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));
@@ -305,9 +305,9 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
 
     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));
@@ -811,7 +811,7 @@ GetVolumePackageWithCall(struct rx_call *acall, struct VCallByVol *cbv,
                         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);
@@ -1220,6 +1220,26 @@ RXStore_AccessList(Vnode * targetptr, struct AFSOpaque *AccessList)
 
 }                              /*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
@@ -1266,16 +1286,16 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
     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;
@@ -1290,8 +1310,8 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                  (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;
@@ -1300,6 +1320,20 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
     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 */
@@ -1327,8 +1361,8 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
        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);
@@ -1336,8 +1370,8 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                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);
@@ -1348,8 +1382,8 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                 * 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"));
@@ -1447,8 +1481,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
     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;
     }
@@ -1479,8 +1513,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
                {
                    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++;
@@ -1505,8 +1539,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
                   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;
     }
@@ -1667,9 +1701,11 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
     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
        }
     }
@@ -1685,9 +1721,11 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
     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;
@@ -1771,14 +1809,16 @@ AdjustDiskUsage(Volume * volptr, afs_sfsize_t length,
        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));
@@ -1839,8 +1879,8 @@ Alloc_NewVnode(Vnode * parentptr, DirHandle * dir, Volume * volptr,
     /* 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 */
@@ -3736,8 +3776,8 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
            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;
            }
@@ -4068,8 +4108,8 @@ SAFSS_Symlink(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
        (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);
@@ -6153,8 +6193,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
     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;
@@ -6164,8 +6204,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
     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)) {
@@ -6208,8 +6248,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
            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);
@@ -6224,8 +6264,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
        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);
@@ -6393,8 +6433,8 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
        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)) {
@@ -6445,8 +6485,8 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     }
     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;
     }