On Tue, Oct 30, 2018 at 10:01:08PM -0700, Ori Bernstein wrote: > On Sun, 28 Oct 2018 00:58:57 +0200, Reyk Floeter <r...@openbsd.org> wrote: > > > Most of these are fatal and log_debug. Keep the __func__ there! But we___ll > > remove it from other logging functions where it was never intended to be > > used and potentially reword the warnings nicely. > > > > Reyk > > > > Alright, updated accordingly, with __func__ on fatals, and without it > on __warn__s. Also touched a few places where I noticed it in config.c. > > Ok? >
see below. > > diff --git usr.sbin/vmd/config.c usr.sbin/vmd/config.c > index 6e7ed279d6b..7dc2b266dfe 100644 > --- usr.sbin/vmd/config.c > +++ usr.sbin/vmd/config.c > @@ -284,8 +284,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > */ > if (kernfd == -1 && !vmboot && > (kernfd = open(VM_DEFAULT_BIOS, O_RDONLY)) == -1) { > - log_warn("%s: can't open %s", __func__, > - VM_DEFAULT_BIOS); > + log_warn("can't open %s", VM_DEFAULT_BIOS); > errno = VMD_BIOS_MISSING; > goto fail; > } > @@ -305,8 +304,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > /* Stat cdrom to ensure it is a regular file */ > if ((cdromfd = > open(vcp->vcp_cdrom, O_RDONLY)) == -1) { > - log_warn("%s: can't open cdrom %s", __func__, > - vcp->vcp_cdrom); > + log_warn("can't open cdrom %s", vcp->vcp_cdrom); > errno = VMD_CDROM_MISSING; > goto fail; > } > @@ -325,14 +323,14 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > for (i = 0 ; i < vcp->vcp_ndisks; i++) { > if (strlcpy(path, vcp->vcp_disks[i], sizeof(path)) > >= sizeof(path)) > - log_warnx("%s, disk path too long", __func__); > + log_warnx("disk path %s too long", vcp->vcp_disks[i]); > memset(vmc->vmc_diskbases, 0, sizeof(vmc->vmc_diskbases)); > oflags = O_RDWR|O_EXLOCK|O_NONBLOCK; > aflags = R_OK|W_OK; > for (j = 0; j < VM_MAX_BASE_PER_DISK; j++) { > /* Stat disk[i] to ensure it is a regular file */ > if ((diskfds[i][j] = open(path, oflags)) == -1) { > - log_warn("%s: can't open disk %s", __func__, > + log_warn("can't open disk %s", > vcp->vcp_disks[i]); > errno = VMD_DISK_MISSING; > goto fail; > @@ -487,7 +485,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > > fail: > saved_errno = errno; > - log_warnx("%s: failed to start vm %s", __func__, vcp->vcp_name); > + log_warnx("failed to start vm %s", __func__, vcp->vcp_name); > > if (kernfd != -1) > close(kernfd); > diff --git usr.sbin/vmd/vioqcow2.c usr.sbin/vmd/vioqcow2.c > index 28b087df39a..de9068827c5 100644 > --- usr.sbin/vmd/vioqcow2.c > +++ usr.sbin/vmd/vioqcow2.c > @@ -102,9 +102,9 @@ struct qcdisk { > extern char *__progname; > > static off_t xlate(struct qcdisk *, off_t, int *); > -static int copy_cluster(struct qcdisk *, struct qcdisk *, off_t, off_t); > +static void copy_cluster(struct qcdisk *, struct qcdisk *, off_t, off_t); > +static void inc_refs(struct qcdisk *, off_t, int); > static off_t mkcluster(struct qcdisk *, struct qcdisk *, off_t, off_t); > -static int inc_refs(struct qcdisk *, off_t, int); > static int qc2_open(struct qcdisk *, int *, size_t); > static ssize_t qc2_pread(void *, char *, size_t, off_t); > static ssize_t qc2_pwrite(void *, char *, size_t, off_t); > @@ -126,7 +126,7 @@ virtio_init_qcow2(struct virtio_backing *file, off_t > *szp, int *fd, size_t nfd) > if (diskp == NULL) > return -1; > if (qc2_open(diskp, fd, nfd) == -1) { > - log_warnx("%s: could not open qcow2 disk", __func__); > + log_warnx("could not open qcow2 disk"); > return -1; > } > file->p = diskp; > @@ -137,6 +137,10 @@ virtio_init_qcow2(struct virtio_backing *file, off_t > *szp, int *fd, size_t nfd) > return 0; > } > > +/* > + * Return the path to the base image given a disk image. > + * Called from vmctl. > + */ > ssize_t > virtio_qcow2_get_base(int fd, char *path, size_t npath, const char *dpath) > { > @@ -147,11 +151,11 @@ virtio_qcow2_get_base(int fd, char *path, size_t npath, > const char *dpath) > char *s = NULL; > > if (pread(fd, &header, sizeof(header), 0) != sizeof(header)) { > - log_warnx("%s: short read on header", __func__); > + log_warnx("short read on header"); > return -1; > } > if (strncmp(header.magic, VM_MAGIC_QCOW, strlen(VM_MAGIC_QCOW)) != 0) { > - log_warn("%s: invalid magic numbers", __func__); > + log_warnx("invalid magic numbers"); > return -1; > } > backingoff = be64toh(header.backingoff); > @@ -160,12 +164,11 @@ virtio_qcow2_get_base(int fd, char *path, size_t npath, > const char *dpath) > return 0; > > if (backingsz >= npath - 1) { > - log_warn("%s: snapshot path too long", __func__); > + log_warnx("snapshot path too long"); > return -1; > } > if (pread(fd, path, backingsz, backingoff) != backingsz) { > - log_warnx("%s: could not read snapshot base name", > - __func__); > + log_warnx("could not read snapshot base name"); > return -1; > } > path[backingsz] = '\0'; > @@ -178,20 +181,19 @@ virtio_qcow2_get_base(int fd, char *path, size_t npath, > const char *dpath) > if (path[0] == '/') { > if (realpath(path, expanded) == NULL || > strlcpy(path, expanded, npath) >= npath) { > - log_warn("unable to resolve %s", path); > + log_warnx("unable to resolve %s", path); > return -1; > } > } else { > s = dirname(dpath); > if (snprintf(expanded, sizeof(expanded), > "%s/%s", s, path) >= (int)sizeof(expanded)) { > - log_warn("path too long: %s/%s", > - s, path); > + log_warnx("path too long: %s/%s", s, path); > return -1; > } > if (npath < PATH_MAX || > realpath(expanded, path) == NULL) { > - log_warn("unable to resolve %s", path); > + log_warnx("unable to resolve %s", path); > return -1; > } > } > @@ -216,15 +218,10 @@ qc2_open(struct qcdisk *disk, int *fds, size_t nfd) > disk->base = NULL; > disk->l1 = NULL; > > - if (pread(fd, &header, sizeof(header), 0) != sizeof(header)) { > - log_warn("%s: short read on header", __func__); > - goto error; > - } > - if (strncmp(header.magic, > - VM_MAGIC_QCOW, strlen(VM_MAGIC_QCOW)) != 0) { > - log_warn("%s: invalid magic numbers", __func__); > - goto error; > - } > + if (pread(fd, &header, sizeof(header), 0) != sizeof(header)) > + fatalx("short read on header"); > + if (strncmp(header.magic, VM_MAGIC_QCOW, strlen(VM_MAGIC_QCOW)) != 0) > + fatalx("invalid magic numbers"); > > disk->clustersz = (1ull << be32toh(header.clustershift)); > disk->disksz = be64toh(header.disksz); > @@ -249,79 +246,59 @@ qc2_open(struct qcdisk *disk, int *fds, size_t nfd) > /* > * We only know about the dirty or corrupt bits here. > */ > - if (disk->incompatfeatures & ~(QCOW2_DIRTY|QCOW2_CORRUPT)) { > - log_warnx("%s: unsupported features %llx", __func__, > + if (disk->incompatfeatures & ~(QCOW2_DIRTY|QCOW2_CORRUPT)) > + fatalx("unsupported features %llx", > disk->incompatfeatures & ~(QCOW2_DIRTY|QCOW2_CORRUPT)); > - goto error; > - } > + if (be32toh(header.reforder) != 4) > + fatalx("unsupported refcount size\n"); > > disk->l1 = calloc(disk->l1sz, sizeof(*disk->l1)); > if (!disk->l1) > - goto error; > + fatal("%s: could not allocate l1 table", __func__); > if (pread(disk->fd, disk->l1, 8 * disk->l1sz, disk->l1off) > - != 8 * disk->l1sz) { > - log_warn("%s: unable to read qcow2 L1 table", __func__); > - goto error; > - } > + != 8 * disk->l1sz) > + fatalx("%s: unable to read qcow2 L1 table", __func__); > for (i = 0; i < disk->l1sz; i++) > disk->l1[i] = be64toh(disk->l1[i]); > version = be32toh(header.version); > - if (version != 2 && version != 3) { > - log_warn("%s: unknown qcow2 version %d", __func__, version); > - goto error; > - } > + if (version != 2 && version != 3) > + fatalx("%s: unknown qcow2 version %d", __func__, version); > > backingoff = be64toh(header.backingoff); > backingsz = be32toh(header.backingsz); > if (backingsz != 0) { > if (backingsz >= sizeof(basepath) - 1) { > - log_warn("%s: snapshot path too long", __func__); > - goto error; > + fatalx("%s: snapshot path too long", __func__); > } > if (pread(fd, basepath, backingsz, backingoff) != backingsz) { > - log_warn("%s: could not read snapshot base name", > + fatalx("%s: could not read snapshot base name", > __func__); > - goto error; > } > basepath[backingsz] = 0; > if (nfd <= 1) { > - log_warnx("%s: missing base image %s", __func__, > + fatalx("%s: missing base image %s", __func__, > basepath); > - goto error; > } > > > disk->base = calloc(1, sizeof(struct qcdisk)); > if (!disk->base) > - goto error; > - if (qc2_open(disk->base, fds + 1, nfd - 1) == -1) { > - log_warn("%s: could not open %s", basepath, __func__); > - goto error; > - } > - if (disk->base->clustersz != disk->clustersz) { > - log_warn("%s: all disks must share clustersize", > + fatal("%s: could not open %s", basepath, __func__); is this right? > + if (qc2_open(disk->base, fds + 1, nfd - 1) == -1) > + fatalx("%s: could not open %s", basepath, __func__); same > + if (disk->base->clustersz != disk->clustersz) > + fatalx("%s: all disk parts must share clustersize", > __func__); > - goto error; > - } > - } > - if (fstat(fd, &st) == -1) { > - log_warn("%s: unable to stat disk", __func__); > - goto error; > } > + if (fstat(fd, &st) == -1) > + fatal("%s: unable to stat disk", __func__); > > disk->end = st.st_size; > > log_debug("%s: qcow2 disk version %d size %lld end %lld snap %d", > - __func__, > - version, > - disk->disksz, > - disk->end, > - disk->nsnap); > + __func__, version, disk->disksz, disk->end, disk->nsnap); > > return 0; > -error: > - qc2_close(disk, 0); > - return -1; > } > > static ssize_t > @@ -345,7 +322,7 @@ qc2_pread(void *p, char *buf, size_t len, off_t off) > /* Break out into chunks. This handles > * three cases: > * > - * |----+====|========|====+ | > + * |----+====|========|====+-----| > * > * Either we are at the start of the read, > * and the cluster has some leading bytes. > @@ -418,6 +395,8 @@ qc2_pwrite(void *p, char *buf, size_t len, off_t off) > phys_off = mkcluster(disk, d, off, phys_off); > if (phys_off == -1) > return -1; > + if (phys_off < disk->clustersz) > + fatalx("%s: writing reserved cluster", __func__); > if (pwrite(disk->fd, buf, sz, phys_off) != sz) > return -1; > off += sz; > @@ -487,10 +466,8 @@ xlate(struct qcdisk *disk, off_t off, int *inplace) > */ > if (inplace) > *inplace = !!(cluster & QCOW2_INPLACE); > - if (cluster & QCOW2_COMPRESSED) { > - log_warn("%s: compressed clusters unsupported", __func__); > - goto err; > - } > + if (cluster & QCOW2_COMPRESSED) > + fatalx("%s: compressed clusters unsupported", __func__); > pthread_rwlock_unlock(&disk->lock); > clusteroff = 0; > cluster &= ~QCOW2_INPLACE; > @@ -525,13 +502,8 @@ mkcluster(struct qcdisk *disk, struct qcdisk *base, > off_t off, off_t src_phys) > l2sz = disk->clustersz / 8; > l1off = off / (disk->clustersz * l2sz); > if (l1off >= disk->l1sz) > - goto fail; > + fatalx("l1 offset outside disk"); > > - /* > - * Align disk to cluster size, for ftruncate: Not strictly > - * required, but it easier to eyeball buggy write offsets, > - * and helps performance a bit. > - */ > disk->end = (disk->end + disk->clustersz - 1) & ~(disk->clustersz - 1); > > l2tab = disk->l1[l1off]; > @@ -541,75 +513,63 @@ mkcluster(struct qcdisk *disk, struct qcdisk *base, > off_t off, off_t src_phys) > orig = l2tab & ~QCOW2_INPLACE; > l2tab = disk->end; > disk->end += disk->clustersz; > - if (ftruncate(disk->fd, disk->end) == -1) { > - perror("ftruncate"); > - goto fail; > - } > + if (ftruncate(disk->fd, disk->end) == -1) > + fatal("%s: ftruncate failed", __func__); > > /* > * If we translated, found a L2 entry, but it needed to > * be copied, copy it. > */ > - if (orig != 0 && copy_cluster(disk, disk, l2tab, orig) == -1) { > - perror("move cluster"); > - goto fail; > - } > + if (orig != 0) > + copy_cluster(disk, disk, l2tab, orig); > /* Update l1 -- we flush it later */ > disk->l1[l1off] = l2tab | QCOW2_INPLACE; > - if (inc_refs(disk, l2tab, 1) == -1) { > - perror("refs"); > - goto fail; > - } > + inc_refs(disk, l2tab, 1); > } > l2tab &= ~QCOW2_INPLACE; > > /* Grow the disk */ > if (ftruncate(disk->fd, disk->end + disk->clustersz) < 0) > - goto fail; > + fatalx("%s: could not grow disk", __func__); > if (src_phys > 0) > - if (copy_cluster(disk, base, disk->end, src_phys) == -1) > - goto fail; > + copy_cluster(disk, base, disk->end, src_phys); > cluster = disk->end; > disk->end += disk->clustersz; > buf = htobe64(cluster | QCOW2_INPLACE); > if (pwrite(disk->fd, &buf, sizeof(buf), l2tab + l2off * 8) != 8) > - goto fail; > + fatalx("%s: could not write cluster", __func__); > > /* TODO: lazily sync: currently VMD doesn't close things */ > buf = htobe64(disk->l1[l1off]); > if (pwrite(disk->fd, &buf, sizeof(buf), disk->l1off + 8 * l1off) != 8) > - goto fail; > - if (inc_refs(disk, cluster, 1) == -1) > - goto fail; > + fatalx("%s: could not write l1", __func__); > + inc_refs(disk, cluster, 1); > > pthread_rwlock_unlock(&disk->lock); > clusteroff = off % disk->clustersz; > + if (cluster + clusteroff < disk->clustersz) > + fatalx("write would clobber header"); > return cluster + clusteroff; > - > -fail: > - pthread_rwlock_unlock(&disk->lock); > - return -1; > } > > /* Copies a cluster containing src to dst. Src and dst need not be aligned. > */ > -static int > +static void > copy_cluster(struct qcdisk *disk, struct qcdisk *base, off_t dst, off_t src) > { > char *scratch; > > scratch = alloca(disk->clustersz); > if (!scratch) > - err(1, "out of memory"); > + fatal("out of memory"); > src &= ~(disk->clustersz - 1); > dst &= ~(disk->clustersz - 1); > if (pread(base->fd, scratch, disk->clustersz, src) == -1) > - return -1; > + fatal("%s: could not read cluster", __func__); > if (pwrite(disk->fd, scratch, disk->clustersz, dst) == -1) > - return -1; > - return 0; > + fatal("%s: could not write cluster", __func__); > } > > -static int > +static void > inc_refs(struct qcdisk *disk, off_t off, int newcluster) > { > off_t l1off, l1idx, l2idx, l2cluster; > @@ -623,34 +583,28 @@ inc_refs(struct qcdisk *disk, off_t off, int newcluster) > l2idx = (off / disk->clustersz) % nper; > l1off = disk->refoff + 8 * l1idx; > if (pread(disk->fd, &buf, sizeof(buf), l1off) != 8) > - return -1; > + fatal("could not read refs"); > > l2cluster = be64toh(buf); > if (l2cluster == 0) { > l2cluster = disk->end; > disk->end += disk->clustersz; > - if (ftruncate(disk->fd, disk->end) < 0) { > - log_warn("%s: refs block grow fail", __func__); > - return -1; > - } > + if (ftruncate(disk->fd, disk->end) < 0) > + fatal("%s: failed to allocate ref block", __func__); > buf = htobe64(l2cluster); > - if (pwrite(disk->fd, &buf, sizeof(buf), l1off) != 8) { > - return -1; > - } > + if (pwrite(disk->fd, &buf, sizeof(buf), l1off) != 8) > + fatal("%s: failed to write ref block", __func__); > } > > refs = 1; > if (!newcluster) { > if (pread(disk->fd, &refs, sizeof(refs), > l2cluster + 2 * l2idx) != 2) > - return -1; > + fatal("could not read ref cluster"); > refs = be16toh(refs) + 1; > } > refs = htobe16(refs); > - if (pwrite(disk->fd, &refs, sizeof(refs), l2cluster + 2 * l2idx) != 2) { > - log_warn("%s: could not write ref block", __func__); > - return -1; > - } > - return 0; > + if (pwrite(disk->fd, &refs, sizeof(refs), l2cluster + 2 * l2idx) != 2) > + fatal("%s: could not write ref block", __func__); > } > > > -- > Ori Bernstein >