VnodeClass class, afs_int32 fromtime,
int forcedump);
static int DumpVnode(struct iod *iodp, struct VnodeDiskObject *v,
- int volid, int vnodeNumber, int dumpEverything);
+ VolumeId volid, int vnodeNumber, int dumpEverything);
static int ReadDumpHeader(struct iod *iodp, struct DumpHeader *hp);
static int ReadVnodes(struct iod *iodp, Volume * vp, int incremental,
afs_foff_t * Lbuf, afs_int32 s1, afs_foff_t * Sbuf,
int forcedump,
struct volintSize *size);
static int SizeDumpVnode(struct iod *iodp, struct VnodeDiskObject *v,
- int volid, int vnodeNumber, int dumpEverything,
+ VolumeId volid, int vnodeNumber, int dumpEverything,
struct volintSize *size);
#define MAX_SECTIONS 3
}
}
-static void
-ReadByteString(struct iod *iodp, byte * to,
- int size)
+static int
+ReadByteString(struct iod *iodp, byte * to, int size)
{
- while (size--)
- *to++ = iod_getc(iodp);
+ int nbytes = 0;
+ int c;
+
+ while (size-- > 0 && (c = iod_getc(iodp)) != EOF) {
+ *to++ = c;
+ nbytes++;
+ }
+ return nbytes;
}
/*
if (!code)
code = DumpString(iodp, 'n', V_name(vp));
dumpTimes[0] = fromtime;
- dumpTimes[1] = V_backupDate(vp); /* Until the time the clone was made */
+ switch (V_type(vp)) {
+ case readwriteVolume:
+ dumpTimes[1] = V_updateDate(vp); /* until last update */
+ break;
+ case readonlyVolume:
+ dumpTimes[1] = V_creationDate(vp); /* until clone was updated */
+ break;
+ case backupVolume:
+ /* until backup was made */
+ dumpTimes[1] = V_backupDate(vp) != 0 ? V_backupDate(vp) :
+ V_creationDate(vp);
+ break;
+ default:
+ code = EINVAL;
+ }
if (!code)
code = DumpArrayInt32(iodp, 't', (afs_uint32 *) dumpTimes, 2);
return code;
}
static int
-DumpVnode(struct iod *iodp, struct VnodeDiskObject *v, int volid,
+DumpVnode(struct iod *iodp, struct VnodeDiskObject *v, VolumeId volid,
int vnodeNumber, int dumpEverything)
{
int code = 0;
IHandle_t *ihP;
FdHandle_t *fdP;
+ afs_ino_str_t stmp;
if (!v || v->type == vNull)
return code;
if (!code)
code = DumpInt32(iodp, 's', v->serverModifyTime);
if (v->type == vDirectory) {
- acl_HtonACL(VVnodeDiskACL(v));
+ code = acl_HtonACL(VVnodeDiskACL(v));
+ if (code) {
+ Log("DumpVnode: Skipping invalid acl vnode %u (volume %"AFS_VOLID_FMT")\n",
+ vnodeNumber, afs_printable_VolumeId_lu(volid));
+ }
if (!code)
code =
DumpByteString(iodp, 'A', (byte *) VVnodeDiskACL(v),
IH_INIT(ihP, iodp->device, iodp->parentId, VNDISK_GET_INO(v));
fdP = IH_OPEN(ihP);
if (fdP == NULL) {
- Log("1 Volser: DumpVnode: dump: Unable to open inode %llu for vnode %u (volume %i); not dumped, error %d\n", (afs_uintmax_t) VNDISK_GET_INO(v), vnodeNumber, volid, errno);
+ Log("1 Volser: DumpVnode: dump: Unable to open inode %s "
+ "for vnode %u (volume %" AFS_VOLID_FMT "); "
+ "not dumped, error %d\n",
+ PrintInode(stmp, VNDISK_GET_INO(v)), vnodeNumber,
+ afs_printable_VolumeId_lu(volid), errno);
IH_RELEASE(ihP);
return VOLSERREAD_DUMPERROR;
}
if (indexlen != disklen) {
FDH_REALLYCLOSE(fdP);
IH_RELEASE(ihP);
- Log("DumpVnode: volume %lu vnode %lu has inconsistent length "
- "(index %lu disk %lu); aborting dump\n",
- (unsigned long)volid, (unsigned long)vnodeNumber,
- (unsigned long)indexlen, (unsigned long)disklen);
+ Log("DumpVnode: volume %"AFS_VOLID_FMT" "
+ "vnode %lu has inconsistent length "
+ "(index %lu disk %lu); aborting dump\n",
+ afs_printable_VolumeId_lu(volid), (unsigned long)vnodeNumber,
+ (unsigned long)indexlen, (unsigned long)disklen);
return VOLSERREAD_DUMPERROR;
}
code = DumpFile(iodp, vnodeNumber, fdP);
struct VnodeClassInfo *vcp = &VnodeClassInfo[class];
char buf[SIZEOF_LARGEDISKVNODE], zero[SIZEOF_LARGEDISKVNODE];
struct VnodeDiskObject *vnode = (struct VnodeDiskObject *)buf;
+ afs_ino_str_t stmp;
memset(zero, 0, sizeof(zero)); /* zero out our proto-vnode */
fdP = IH_OPEN(vp->vnodeIndex[class].handle);
if (vnode->type != vNull && VNDISK_GET_INO(vnode)) {
cnt1++;
if (DoLogging) {
- Log("RestoreVolume %u Cleanup: Removing old vnode=%u inode=%llu size=unknown\n",
- V_id(vp), bitNumberToVnodeNumber(i, class),
- (afs_uintmax_t) VNDISK_GET_INO(vnode));
+ Log("RestoreVolume %"AFS_VOLID_FMT" "
+ "Cleanup: Removing old vnode=%u inode=%s "
+ "size=unknown\n",
+ afs_printable_VolumeId_lu(V_id(vp)),
+ bitNumberToVnodeNumber(i, class),
+ PrintInode(stmp, VNDISK_GET_INO(vnode)));
}
IH_DEC(V_linkHandle(vp), VNDISK_GET_INO(vnode),
V_parentId(vp));
FdHandle_t *fdP;
Inode nearInode AFS_UNUSED;
afs_int32 critical = 0;
+ int nbytes;
tag = iod_getc(iodp);
V_pref(vp, nearInode);
return VOLSERREAD_DUMPERROR;
break;
case 'A':
- ReadByteString(iodp, (byte *) VVnodeDiskACL(vnode),
+ nbytes = ReadByteString(iodp, (byte *) VVnodeDiskACL(vnode),
VAclDiskSize(vnode));
- acl_NtohACL(VVnodeDiskACL(vnode));
+ if (nbytes != VAclDiskSize(vnode)) {
+ Log("ReadVnodes: could not read acl for vnode %lu in dump.\n",
+ (unsigned long)vnodeNumber);
+ return VOLSERREAD_DUMPERROR;
+ }
+ if (acl_NtohACL(VVnodeDiskACL(vnode)) != 0) {
+ Log("ReadVnodes: invalid acl for vnode %lu in dump.\n",
+ (unsigned long)vnodeNumber);
+ return VOLSERREAD_DUMPERROR;
+ }
break;
case 'h':
case 'f':{
}
static int
-SizeDumpVnode(struct iod *iodp, struct VnodeDiskObject *v, int volid,
+SizeDumpVnode(struct iod *iodp, struct VnodeDiskObject *v, VolumeId volid,
int vnodeNumber, int dumpEverything,
struct volintSize *v_size)
{