#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"
P_OUTPUT,
P_DELIM,
P_NOHEADING,
+ P_NOMAGIC,
} volinfo_parm_t;
/*
c(host) \
c(desc) \
c(vid) \
+ c(offset) \
c(vtype) \
c(vname) \
c(part) \
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. */
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));
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);
* @return 0 if successful
*/
static int
-ScanPartitions(char *partNameOrId, afs_uint32 volumeId)
+ScanPartitions(char *partNameOrId, VolumeId volumeId)
{
int err = 0;
char partName[64] = "";
}
}
snprintf(name1, sizeof name1, VFORMAT,
- afs_printable_uint32_lu(volumeId));
+ afs_printable_VolumeId_lu(volumeId));
if (PrintHeading) {
PrintColumnHeading();
}
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 */
VolScan(struct cmd_syndesc *as, void *arock)
{
struct cmd_item *ti;
- afs_uint32 volumeId = 0;
+ VolumeId volumeId = 0;
char *partNameOrId = NULL;
int i;
} 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';
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
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);
}
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);
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;
"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.");
}
/**
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
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),
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;
{
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 */
}
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;
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",