volscan: avoid printing null mount-point cellname
[openafs.git] / src / vol / vol-info.c
index 83a3320..8ba8c7a 100644 (file)
@@ -31,7 +31,7 @@
 #include <afs/errors.h>
 #include <afs/acl.h>
 #include <afs/prs_fs.h>
-#include <opr/queue.h>
+#include <rx/rx_queue.h>
 
 #include "nfs.h"
 #include "lock.h"
@@ -71,6 +71,7 @@ typedef enum {
     P_OUTPUT,
     P_DELIM,
     P_NOHEADING,
+    P_NOMAGIC,
 } volinfo_parm_t;
 
 /*
@@ -80,6 +81,7 @@ typedef enum {
     c(host) \
     c(desc) \
     c(vid) \
+    c(offset) \
     c(vtype) \
     c(vname) \
     c(part) \
@@ -187,6 +189,7 @@ static char Hostname[64] = "";      /**< This hostname, for volscan output. */
 static int NeedDirIndex = 0;        /**< Large vnode index handle is needed for path lookups. */
 static char ColumnDelim[16] = " ";  /**< Column delimiter char(s) */
 static char PrintHeading = 0;       /**< Print column heading */
+static int CheckMagic = 1;          /**< Check directory vnode magic when looking up paths */
 static unsigned int ModeMask[64];
 
 static FdHandle_t *DirIndexFd = NULL; /**< Current large vnode index handle for path lookups. */
@@ -376,8 +379,8 @@ PrintVolumeSizes(Volume * vp)
     afs_int64 diff_k = volumeTotals.size_k - volumeTotals.diskused_k;
 
     PrintVolumeSizeHeading();
-    printf("%u\t%9llu%9llu%10llu%10llu%9lld\t%24s\n",
-          V_id(vp),
+    printf("%" AFS_VOLID_FMT "\t%9llu%9llu%10llu%10llu%9lld\t%24s\n",
+          afs_printable_VolumeId_lu(V_id(vp)),
           volumeTotals.diskused_k,
           volumeTotals.auxsize_k, volumeTotals.vnodesize_k,
           volumeTotals.size_k, diff_k, V_name(vp));
@@ -532,7 +535,7 @@ AttachVolume(struct DiskPartition64 * dp, char *volname,
     vp->shuttingDown = 0;
     vp->goingOffline = 0;
     vp->nUsers = 1;
-    vp->header = (struct volHeader *)calloc(1, sizeof(*vp->header));
+    vp->header = calloc(1, sizeof(*vp->header));
     if (!vp->header) {
        fprintf(stderr, "%s: Failed to allocate volume header.\n", progname);
        free(vp);
@@ -655,7 +658,7 @@ GetPartitionName(afs_uint32 partId, char *partName, afs_size_t partNameSize)
  * @return 0 if successful
  */
 static int
-ScanPartitions(char *partNameOrId, afs_uint32 volumeId)
+ScanPartitions(char *partNameOrId, VolumeId volumeId)
 {
     int err = 0;
     char partName[64] = "";
@@ -740,7 +743,7 @@ ScanPartitions(char *partNameOrId, afs_uint32 volumeId)
            }
        }
        snprintf(name1, sizeof name1, VFORMAT,
-                afs_printable_uint32_lu(volumeId));
+                afs_printable_VolumeId_lu(volumeId));
        if (PrintHeading) {
            PrintColumnHeading();
        }
@@ -785,7 +788,7 @@ static int
 VolInfo(struct cmd_syndesc *as, void *arock)
 {
     struct cmd_item *ti;
-    afs_uint32 volumeId = 0;
+    VolumeId volumeId = 0;
     char *partNameOrId = NULL;
 
     DumpInfo = 1;              /* volinfo default mode */
@@ -913,7 +916,7 @@ static int
 VolScan(struct cmd_syndesc *as, void *arock)
 {
     struct cmd_item *ti;
-    afs_uint32 volumeId = 0;
+    VolumeId volumeId = 0;
     char *partNameOrId = NULL;
     int i;
 
@@ -931,6 +934,9 @@ VolScan(struct cmd_syndesc *as, void *arock)
     } else {
        PrintHeading = 1;
     }
+    if (as->parms[P_NOMAGIC].items) {
+        CheckMagic = 0;
+    }
     if ((ti = as->parms[P_DELIM].items)) {
        strncpy(ColumnDelim, ti->data, 15);
        ColumnDelim[15] = '\0';
@@ -1166,7 +1172,7 @@ HandleSpecialFile(const char *name, struct DiskPartition64 *dp,
                  struct VolumeHeader *header, Inode inode,
                  afs_sfsize_t * psize)
 {
-    afs_sfsize_t size = 0;
+    afs_sfsize_t size = -1;
     IHandle_t *ih = NULL;
     FdHandle_t *fdP = NULL;
 #ifdef AFS_NAMEI_ENV
@@ -1177,30 +1183,35 @@ HandleSpecialFile(const char *name, struct DiskPartition64 *dp,
     fdP = IH_OPEN(ih);
     if (fdP == NULL) {
        fprintf(stderr,
-               "%s: Error opening header file '%s' for volume %u", progname,
-               name, header->id);
+               "%s: Error opening header file '%s' for volume %" AFS_VOLID_FMT "\n", progname,
+               name, afs_printable_VolumeId_lu(header->id));
        perror("open");
        goto error;
     }
     size = FDH_SIZE(fdP);
     if (size == -1) {
        fprintf(stderr,
-               "%s: Error getting size of header file '%s' for volume %u",
-               progname, name, header->id);
+               "%s: Error getting size of header file '%s' for volume %" AFS_VOLID_FMT "\n",
+               progname, name, afs_printable_VolumeId_lu(header->id));
        perror("fstat");
        goto error;
     }
+    *psize += size;
+
+  error:
     if (DumpInfo) {
-       printf("\t%s inode\t= %s (size = %lld)\n",
-              name, PrintInode(NULL, inode), size);
+       printf("\t%s inode\t= %s (size = ", name, PrintInode(NULL, inode));
+       if (size != -1) {
+           printf("%lld)\n", size);
+       } else {
+           printf("unknown)\n");
+       }
 #ifdef AFS_NAMEI_ENV
        namei_HandleToName(&filename, ih);
        printf("\t%s namei\t= %s\n", name, filename.n_path);
 #endif /* AFS_NAMEI_ENV */
     }
-    *psize += size;
 
-  error:
     if (fdP != NULL) {
        FDH_REALLYCLOSE(fdP);
     }
@@ -1229,8 +1240,8 @@ HandleHeaderFiles(struct DiskPartition64 *dp, FD_t header_fd,
        size = OS_SIZE(header_fd);
        printf("Volume header (size = %lld):\n", size);
        printf("\tstamp\t= 0x%x\n", header->stamp.version);
-       printf("\tVolId\t= %u\n", header->id);
-       printf("\tparent\t= %u\n", header->parent);
+       printf("\tVolId\t= %" AFS_VOLID_FMT "\n", afs_printable_VolumeId_lu(header->id));
+       printf("\tparent\t= %" AFS_VOLID_FMT "\n", afs_printable_VolumeId_lu(header->parent));
     }
 
     HandleSpecialFile("Info", dp, header, header->volumeInfo, &size);
@@ -1277,8 +1288,8 @@ IsScannable(Volume * vp)
     case BACKVOL:
        return ScanVolType & SCAN_BK;
     default:
-       fprintf(stderr, "%s: Volume %u; Unknown volume type %d\n", progname,
-               V_id(vp), V_type(vp));
+       fprintf(stderr, "%s: Volume %" AFS_VOLID_FMT "; Unknown volume type %d\n", progname,
+               afs_printable_VolumeId_lu(V_id(vp)), V_type(vp));
        break;
     }
     return 0;
@@ -1457,6 +1468,8 @@ VolScanSyntax(void)
                        "Output field delimiter");
     cmd_AddParmAtOffset(ts, P_NOHEADING, "-noheading", CMD_FLAG, CMD_OPTIONAL,
                        "Do not print the heading line");
+    cmd_AddParmAtOffset(ts, P_NOMAGIC, "-ignore-magic", CMD_FLAG, CMD_OPTIONAL,
+                       "Skip directory vnode magic checks when looking up paths.");
 }
 
 /**
@@ -1547,7 +1560,7 @@ volumeTypeShortString(int type)
 void
 PrintHeader(Volume * vp)
 {
-    printf("Volume header for volume %u (%s)\n", V_id(vp), V_name(vp));
+    printf("Volume header for volume %" AFS_VOLID_FMT " (%s)\n", afs_printable_VolumeId_lu(V_id(vp)), V_name(vp));
     printf("stamp.magic = %x, stamp.version = %u\n", V_stamp(vp).magic,
           V_stamp(vp).version);
     printf
@@ -1559,9 +1572,8 @@ PrintHeader(Volume * vp)
         V_type(vp), volumeTypeString(V_type(vp)), V_uniquifier(vp),
         V_needsCallback(vp), V_destroyMe(vp));
     printf
-       ("id = %u, parentId = %u, cloneId = %u, backupId = %u, restoredFromId = %u\n",
-        V_id(vp), V_parentId(vp), V_cloneId(vp), V_backupId(vp),
-        V_restoredFromId(vp));
+       ("id = %" AFS_VOLID_FMT ", parentId = %" AFS_VOLID_FMT ", cloneId = %" AFS_VOLID_FMT ", backupId = %" AFS_VOLID_FMT ", restoredFromId = %" AFS_VOLID_FMT "\n",
+        afs_printable_VolumeId_lu(V_id(vp)), afs_printable_VolumeId_lu(V_parentId(vp)), afs_printable_VolumeId_lu(V_cloneId(vp)), afs_printable_VolumeId_lu(V_backupId(vp)), afs_printable_VolumeId_lu(V_restoredFromId(vp)));
     printf
        ("maxquota = %d, minquota = %d, maxfiles = %d, filecount = %d, diskused = %d\n",
         V_maxquota(vp), V_minquota(vp), V_maxfiles(vp), V_filecount(vp),
@@ -1751,12 +1763,16 @@ GetDirVnode(Volume * vp, VnodeId parent, VnodeDiskObject * pvn)
                afs_printable_uint32_lu(parent), (long long unsigned)offset);
        return -1;
     }
-    if (pvn->vnodeMagic != LARGEVNODEMAGIC) {
-       fprintf(stderr, "%s: GetDirVnode: bad vnode magic\n", progname);
+    if (CheckMagic && (pvn->vnodeMagic != LARGEVNODEMAGIC)) {
+       fprintf(stderr, "%s: GetDirVnode: bad vnode magic for %lu.%lu at offset %llu\n",
+               progname, afs_printable_uint32_lu(V_id(vp)),
+               afs_printable_uint32_lu(parent), (long long unsigned)offset);
        return -1;
     }
     if (!pvn->dataVersion) {
-       fprintf(stderr, "%s: GetDirVnode: dv is zero\n", progname);
+       fprintf(stderr, "%s: GetDirVnode: dv is zero for %lu.%lu at offset %llu\n",
+               progname, afs_printable_uint32_lu(V_id(vp)),
+               afs_printable_uint32_lu(parent), (long long unsigned)offset);
        return -1;
     }
     return 0;
@@ -2100,7 +2116,7 @@ ModeMaskMatch(unsigned int modeBits)
 {
     int i;
 
-    for (i = 0; ModeMask[i] && i <= sizeof(ModeMask) / sizeof(*ModeMask); i++) {
+    for (i = 0; i < sizeof(ModeMask) / sizeof(*ModeMask) && ModeMask[i]; i++) {
        if ((ModeMask[i] & modeBits) == 0) {
            return 0;           /* at least one mode bit is not present */
        }
@@ -2432,6 +2448,9 @@ PrintColumns(struct VnodeDetails *vdp, const char *desc)
        case col_vid:
            printf("%lu", afs_printable_uint32_lu(V_id(vdp->vp)));
            break;
+       case col_offset:
+           printf("%llu", vdp->offset);
+           break;
        case col_vtype:
            printf("%s", volumeTypeShortString(V_type(vdp->vp)));
            break;
@@ -2476,7 +2495,7 @@ PrintColumns(struct VnodeDetails *vdp, const char *desc)
            break;
        case col_mcell:
            printf("%s",
-                  (vdp->t == VNODE_U_MOUNT ? vdp->u.mnt.cell : PLACEHOLDER));
+                  (vdp->t == VNODE_U_MOUNT && vdp->u.mnt.cell ? vdp->u.mnt.cell : PLACEHOLDER));
            break;
        case col_mvol:
            printf("%s",