aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/mkimg
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2014-12-12 06:13:31 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2014-12-12 06:13:31 +0000
commit0f49f14626c764125df4ba07de8ff71876e06ecf (patch)
tree8c8c917668425026bf0ff58625054ee51c7a9aa1 /usr.bin/mkimg
parentff0bab9760f8f68467fcd21500f8d552945d8c78 (diff)
downloadsrc-0f49f14626c764125df4ba07de8ff71876e06ecf.tar.gz
src-0f49f14626c764125df4ba07de8ff71876e06ecf.zip
The size of the first level reference count table is given in terms of the
number of clusters it occupies. It's not the number of entries in the table, as it is for the L1 cluster table. For small images, the two are the same. With the unit tests based on small images, this change has therefore no effect on the unit test. For larger images (like the FreeBSD 10.1-RELEASE image), this gives a discrepancy that actually shows up when running "qemu-img check". Bump the version number of mkimg. While here, fix a white-space bug. MFC after: 1 week
Notes
Notes: svn path=/head/; revision=275721
Diffstat (limited to 'usr.bin/mkimg')
-rw-r--r--usr.bin/mkimg/Makefile2
-rw-r--r--usr.bin/mkimg/qcow.c9
2 files changed, 6 insertions, 5 deletions
diff --git a/usr.bin/mkimg/Makefile b/usr.bin/mkimg/Makefile
index f028f3fcb988..c8fdb7deea70 100644
--- a/usr.bin/mkimg/Makefile
+++ b/usr.bin/mkimg/Makefile
@@ -6,7 +6,7 @@ PROG= mkimg
SRCS= format.c image.c mkimg.c scheme.c
MAN= mkimg.1
-MKIMG_VERSION=20141003
+MKIMG_VERSION=20141211
mkimg.o: Makefile
CFLAGS+=-DMKIMG_VERSION=${MKIMG_VERSION}
diff --git a/usr.bin/mkimg/qcow.c b/usr.bin/mkimg/qcow.c
index 5033286821b3..a89761b80107 100644
--- a/usr.bin/mkimg/qcow.c
+++ b/usr.bin/mkimg/qcow.c
@@ -71,7 +71,7 @@ struct qcow_header {
uint32_t l1_entries;
uint64_t l1_offset;
uint64_t refcnt_offset;
- uint32_t refcnt_entries;
+ uint32_t refcnt_clstrs;
uint32_t snapshot_count;
uint64_t snapshot_offset;
} v2;
@@ -139,7 +139,7 @@ qcow_write(int fd, u_int version)
uint64_t n, imagesz, nclstrs, ofs, ofsflags;
lba_t blk, blkofs, blk_imgsz;
u_int l1clno, l2clno, rcclno;
- u_int blk_clstrsz;
+ u_int blk_clstrsz, refcnt_clstrs;
u_int clstrsz, l1idx, l2idx;
int error;
@@ -199,14 +199,15 @@ qcow_write(int fd, u_int version)
be32enc(&hdr->u.v2.l1_entries, clstr_l2tbls);
be64enc(&hdr->u.v2.l1_offset, clstrsz * l1clno);
be64enc(&hdr->u.v2.refcnt_offset, clstrsz * rcclno);
- be32enc(&hdr->u.v2.refcnt_entries, clstr_rcblks);
+ refcnt_clstrs = round_clstr(clstr_rcblks * 8) >> clstr_log2sz;
+ be32enc(&hdr->u.v2.refcnt_clstrs, refcnt_clstrs);
break;
default:
return (EDOOFUS);
}
if (sparse_write(fd, hdr, clstrsz) < 0) {
- error = errno;
+ error = errno;
goto out;
}