[GIT PULL] libnvdimm-fixes for 4.5-rc2
by Williams, Dan J
Hi Linus, please pull from:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-fixes
1/ Fixes to the libnvdimm 'pfn' device that establishes a reserved area
for storing a struct page array.
2/ Fixes for dax operations on a raw block device to prevent pagecache
collisions with dax mappings.
3/ A fix for pfn_t usage in vm_insert_mixed that lead to a null pointer
de-reference.
These have received build success notification from the kbuild robot
across 153 configs and pass the latest ndctl tests.
Note that the below commits are also in -mm, but as Andrew is offline
until tomorrow I thought it best to submit these for 4.5-rc2
consideration. Please yell if I should just wait next time:
65f87ee71852 fs, block: force direct-I/O for dax-enabled block devices
03fc2da63b9a mm: fix pfn_t to page conversion in vm_insert_mixed
76e9f0ee52b0 phys_to_pfn_t: use phys_addr_t
The following changes since commit 92e963f50fc74041b5e9e744c330dca48e04f08d:
Linux 4.5-rc1 (2016-01-24 13:06:47 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-fixes
for you to fetch changes up to 76e9f0ee52b0be5761e29847e0ef01f23f24f1df:
phys_to_pfn_t: use phys_addr_t (2016-01-31 09:10:19 -0800)
----------------------------------------------------------------
Dan Williams (8):
libnvdimm: fix mode determination for e820 devices
libnvdimm, pfn: fix restoring memmap location
devm_memremap_pages: fix vmem_altmap lifetime + alignment handling
fs, block: force direct-I/O for dax-enabled block devices
block: revert runtime dax control of the raw block device
block: use DAX for partition table reads
mm: fix pfn_t to page conversion in vm_insert_mixed
phys_to_pfn_t: use phys_addr_t
block/ioctl.c | 38 --------------------------------------
block/partition-generic.c | 18 +++++++++++++++---
drivers/nvdimm/namespace_devs.c | 8 +++++---
drivers/nvdimm/pfn_devs.c | 4 +---
fs/block_dev.c | 28 ----------------------------
fs/dax.c | 20 ++++++++++++++++++++
include/linux/dax.h | 11 +++++++++++
include/linux/fs.h | 5 +----
include/linux/pfn_t.h | 4 ++--
include/uapi/linux/fs.h | 1 -
kernel/memremap.c | 20 ++++++++++++--------
mm/memory.c | 9 +++++++--
tools/testing/nvdimm/test/iomap.c | 2 +-
13 files changed, 75 insertions(+), 93 deletions(-)
commit 9c41242817f4b6d908886c0fdb036d9246c50630
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Sat Jan 23 15:34:10 2016 -0800
libnvdimm: fix mode determination for e820 devices
Correctly display "safe" mode when a btt is established on a e820/memmap
defined pmem namespace.
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 45eb570a0db3391c88cba04510a20fe7e4125497
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Fri Jan 29 17:42:51 2016 -0800
libnvdimm, pfn: fix restoring memmap location
This path was missed when turning on the memmap in pmem support. Permit
'pmem' as a valid location for the map.
Reported-by: Jeff Moyer <jmoyer(a)redhat.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit eb7d78c9e7f6418932bd5fbee45eb46d5ab05002
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Fri Jan 29 21:48:34 2016 -0800
devm_memremap_pages: fix vmem_altmap lifetime + alignment handling
to_vmem_altmap() needs to return valid results until
arch_remove_memory() completes. It also needs to be valid for any pfn
in a section regardless of whether that pfn maps to data. This escape
was a result of a bug in the unit test.
The signature of this bug is that free_pagetable() fails to retrieve a
vmem_altmap and goes off into the weeds:
BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [<ffffffff811d2629>] get_pfnblock_flags_mask+0x49/0x60
[..]
Call Trace:
[<ffffffff811d3477>] free_hot_cold_page+0x97/0x1d0
[<ffffffff811d367a>] __free_pages+0x2a/0x40
[<ffffffff8191e669>] free_pagetable+0x8c/0xd4
[<ffffffff8191ef4e>] remove_pagetable+0x37a/0x808
[<ffffffff8191b210>] vmemmap_free+0x10/0x20
Fixes: 4b94ffdc4163 ("x86, mm: introduce vmem_altmap to augment vmemmap_populate()")
Cc: Andrew Morton <akpm(a)linux-foundation.org>
Reported-by: Jeff Moyer <jmoyer(a)redhat.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 65f87ee71852a754f7981d0653e7136039b8798a
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Mon Jan 25 17:23:18 2016 -0800
fs, block: force direct-I/O for dax-enabled block devices
Similar to the file I/O path, re-direct all I/O to the DAX path for I/O
to a block-device special file. Both regular files and device special
files can use the common filp->f_mapping->host lookup to determing is
DAX is enabled.
Otherwise, we confuse the DAX code that does not expect to find live
data in the page cache:
------------[ cut here ]------------
WARNING: CPU: 0 PID: 7676 at mm/filemap.c:217
__delete_from_page_cache+0x9f6/0xb60()
Modules linked in:
CPU: 0 PID: 7676 Comm: a.out Not tainted 4.4.0+ #276
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
00000000ffffffff ffff88006d3f7738 ffffffff82999e2d 0000000000000000
ffff8800620a0000 ffffffff86473d20 ffff88006d3f7778 ffffffff81352089
ffffffff81658d36 ffffffff86473d20 00000000000000d9 ffffea0000009d60
Call Trace:
[< inline >] __dump_stack lib/dump_stack.c:15
[<ffffffff82999e2d>] dump_stack+0x6f/0xa2 lib/dump_stack.c:50
[<ffffffff81352089>] warn_slowpath_common+0xd9/0x140 kernel/panic.c:482
[<ffffffff813522b9>] warn_slowpath_null+0x29/0x30 kernel/panic.c:515
[<ffffffff81658d36>] __delete_from_page_cache+0x9f6/0xb60 mm/filemap.c:217
[<ffffffff81658fb2>] delete_from_page_cache+0x112/0x200 mm/filemap.c:244
[<ffffffff818af369>] __dax_fault+0x859/0x1800 fs/dax.c:487
[<ffffffff8186f4f6>] blkdev_dax_fault+0x26/0x30 fs/block_dev.c:1730
[< inline >] wp_pfn_shared mm/memory.c:2208
[<ffffffff816e9145>] do_wp_page+0xc85/0x14f0 mm/memory.c:2307
[< inline >] handle_pte_fault mm/memory.c:3323
[< inline >] __handle_mm_fault mm/memory.c:3417
[<ffffffff816ecec3>] handle_mm_fault+0x2483/0x4640 mm/memory.c:3446
[<ffffffff8127eff6>] __do_page_fault+0x376/0x960 arch/x86/mm/fault.c:1238
[<ffffffff8127f738>] trace_do_page_fault+0xe8/0x420 arch/x86/mm/fault.c:1331
[<ffffffff812705c4>] do_async_page_fault+0x14/0xd0 arch/x86/kernel/kvm.c:264
[<ffffffff86338f78>] async_page_fault+0x28/0x30 arch/x86/entry/entry_64.S:986
[<ffffffff86336c36>] entry_SYSCALL_64_fastpath+0x16/0x7a
arch/x86/entry/entry_64.S:185
---[ end trace dae21e0f85f1f98c ]---
Fixes: 5a023cdba50c ("block: enable dax for raw block devices")
Reported-by: Dmitry Vyukov <dvyukov(a)google.com>
Reported-by: Kirill A. Shutemov <kirill(a)shutemov.name>
Suggested-by: Jan Kara <jack(a)suse.cz>
Reviewed-by: Jan Kara <jack(a)suse.cz>
Suggested-by: Matthew Wilcox <willy(a)linux.intel.com>
Tested-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 9f4736fe7ca804aa79b5916221bb13dfc6221a0f
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Thu Jan 28 20:13:39 2016 -0800
block: revert runtime dax control of the raw block device
Dynamically enabling DAX requires that the page cache first be flushed
and invalidated. This must occur atomically with the change of DAX mode
otherwise we confuse the fsync/msync tracking and violate data
durability guarantees. Eliminate the possibilty of DAX-disabled to
DAX-enabled transitions for now and revisit this for the next cycle.
Cc: Jan Kara <jack(a)suse.com>
Cc: Jeff Moyer <jmoyer(a)redhat.com>
Cc: Christoph Hellwig <hch(a)lst.de>
Cc: Dave Chinner <david(a)fromorbit.com>
Cc: Matthew Wilcox <willy(a)linux.intel.com>
Cc: Andrew Morton <akpm(a)linux-foundation.org>
Cc: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit d1a5f2b4d8a125943dcb6b032fc7eaefc2c78296
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Thu Jan 28 20:25:31 2016 -0800
block: use DAX for partition table reads
Avoid populating pagecache when the block device is in DAX mode.
Otherwise these page cache entries collide with the fsync/msync
implementation and break data durability guarantees.
Cc: Jan Kara <jack(a)suse.com>
Cc: Jeff Moyer <jmoyer(a)redhat.com>
Cc: Christoph Hellwig <hch(a)lst.de>
Cc: Dave Chinner <david(a)fromorbit.com>
Cc: Andrew Morton <akpm(a)linux-foundation.org>
Reported-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Tested-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Reviewed-by: Matthew Wilcox <willy(a)linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 03fc2da63b9a33dce784a2075c7e068bb97cbf69
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Tue Jan 26 09:48:05 2016 -0800
mm: fix pfn_t to page conversion in vm_insert_mixed
pfn_t_to_page() honors the flags in the pfn_t value to determine if a
pfn is backed by a page. However, vm_insert_mixed() was originally
written to use pfn_valid() to make this determination. To restore the
old/correct behavior, ignore the pfn_t flags in the !pfn_t_devmap() case
and fallback to trusting pfn_valid().
Fixes: 01c8f1c44b83 ("mm, dax, gpu: convert vm_insert_mixed to pfn_t")
Cc: Dave Hansen <dave(a)sr71.net>
Cc: David Airlie <airlied(a)linux.ie>
Reported-by: Tomi Valkeinen <tomi.valkeinen(a)ti.com>
Tested-by: Tomi Valkeinen <tomi.valkeinen(a)ti.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 76e9f0ee52b0be5761e29847e0ef01f23f24f1df
Author: Dan Williams <dan.j.williams(a)intel.com>
Date: Fri Jan 22 09:43:28 2016 -0800
phys_to_pfn_t: use phys_addr_t
A dma_addr_t is potentially smaller than a phys_addr_t on some archs.
Don't truncate the address when doing the pfn conversion.
Cc: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Reported-by: Matthew Wilcox <willy(a)linux.intel.com>
[willy: fix pfn_t_to_phys as well]
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
4 years, 11 months
[ndctl PATCH] ndctl: create-namespace fix pfn setup
by Dan Williams
e820-defined persistent memory is in memory mode by default. For the
'memmap in pmem' case we need to instantiate a pfn instance.
Reported-by: Jeff Moyer <jmoyer(a)redhat.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
builtin-xaction-namespace.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/builtin-xaction-namespace.c b/builtin-xaction-namespace.c
index 3c4c3e8da255..eb16aaaf5ee7 100644
--- a/builtin-xaction-namespace.c
+++ b/builtin-xaction-namespace.c
@@ -239,6 +239,21 @@ do { \
} \
} while (0)
+static bool do_setup_pfn(struct ndctl_namespace *ndns,
+ struct parsed_parameters *p)
+{
+ if (p->mode != NDCTL_NS_MODE_MEMORY)
+ return false;
+
+ if (ndctl_namespace_get_mode(ndns) != NDCTL_NS_MODE_MEMORY)
+ return true;
+
+ if (p->loc == NDCTL_PFN_LOC_PMEM)
+ return true;
+
+ return false;
+}
+
static int setup_namespace(struct ndctl_region *region,
struct ndctl_namespace *ndns, struct parsed_parameters *p)
{
@@ -255,8 +270,7 @@ static int setup_namespace(struct ndctl_region *region,
try(ndctl_namespace, set_sector_size, ndns, p->sector_size);
uuid_generate(uuid);
- if (ndctl_namespace_get_mode(ndns) != NDCTL_NS_MODE_MEMORY
- && p->mode == NDCTL_NS_MODE_MEMORY) {
+ if (do_setup_pfn(ndns, p)) {
struct ndctl_pfn *pfn = ndctl_region_get_pfn_seed(region);
try(ndctl_pfn, set_uuid, pfn, uuid);
4 years, 11 months
[ndctl PATCH] ndctl: test memmap location
by Dan Williams
Add tests to validate placing the memmap in ram vs pmem.
Reported-by: Jeff Moyer <jmoyer(a)redhat.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
test/dax.sh | 53 +++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 45 insertions(+), 8 deletions(-)
diff --git a/test/dax.sh b/test/dax.sh
index c5fce475afce..9d2c27225653 100755
--- a/test/dax.sh
+++ b/test/dax.sh
@@ -1,13 +1,15 @@
#!/bin/bash
MNT=test_dax_mnt
FILE=image
-DEV=""
+NDCTL="./ndctl"
+json2var="s/[{}\",]//g; s/:/=/g"
+blockdev=""
err() {
rc=1
echo "test-dax: failed at line $1"
- if [ -n "$DEV" ]; then
- umount $DEV
+ if [ -n "$blockdev" ]; then
+ umount /dev/$blockdev
else
rc=77
fi
@@ -19,16 +21,51 @@ set -e
mkdir -p $MNT
trap 'err $LINENO' ERR
-DEV=$(test/dax-dev)
+blockdev=$(basename $(test/dax-dev))
+dev=$(basename $(readlink -f /sys/block/$(basename $blockdev)/device))
-mkfs.ext4 $DEV
-mount $DEV $MNT -o dax
+mkfs.ext4 /dev/$blockdev
+mount /dev/$blockdev $MNT -o dax
fallocate -l 1GiB $MNT/$FILE
test/dax-pmd $MNT/$FILE
umount $MNT
-mkfs.xfs -f $DEV
-mount $DEV $MNT -o dax
+# convert pmem to put the memmap on the device
+json=$($NDCTL create-namespace -m memory -M dev -f -e $dev)
+eval $(echo $json | sed -e "$json2var")
+[ $mode != "memory" ] && echo "fail: $LINENO" && exit 1
+
+#note the blockdev returned from ndctl create-namespace lacks the /dev prefix
+mkfs.ext4 /dev/$blockdev
+mount /dev/$blockdev $MNT -o dax
fallocate -l 1GiB $MNT/$FILE
test/dax-pmd $MNT/$FILE
umount $MNT
+
+json=$($NDCTL create-namespace -m raw -f -e $dev)
+eval $(echo $json | sed -e "$json2var")
+[ $mode != "memory" ] && echo "fail: $LINENO" && exit 1
+
+mkfs.xfs -f /dev/$blockdev
+mount /dev/$blockdev $MNT -o dax
+fallocate -l 1GiB $MNT/$FILE
+test/dax-pmd $MNT/$FILE
+umount $MNT
+
+# convert pmem to put the memmap on the device
+json=$($NDCTL create-namespace -m memory -M dev -f -e $dev)
+eval $(echo $json | sed -e "$json2var")
+[ $mode != "memory" ] && echo "fail: $LINENO" && exit 1
+
+mkfs.xfs -f /dev/$blockdev
+mount /dev/$blockdev $MNT -o dax
+fallocate -l 1GiB $MNT/$FILE
+test/dax-pmd $MNT/$FILE
+umount $MNT
+
+# revert namespace to raw mode
+json=$($NDCTL create-namespace -m raw -f -e $dev)
+eval $(echo $json | sed -e "$json2var")
+[ $mode != "memory" ] && echo "fail: $LINENO" && exit 1
+
+exit 0
4 years, 11 months
[PATCH 0/3] libnvdimm: fix memmap in pmem support
by Dan Williams
Thanks to Jeff for pointing out a thinko in the ndctl implementation of
create-namespace. That bug was covering up the fact that vmem_altmap
handling broke when 'pgmap_radix' was introduced to replace the list
based method [1].
The other two fixes fell out from further expanding the unit tests.
[1]: https://lists.01.org/pipermail/linux-nvdimm/2015-December/003608.html
---
Dan Williams (3):
libnvdimm: fix mode determination for e820 devices
libnvdimm, pfn: fix restoring memmap location
devm_memremap_pages: fix vmem_altmap lifetime + alignment handling
drivers/nvdimm/namespace_devs.c | 8 +++++---
drivers/nvdimm/pfn_devs.c | 4 +---
kernel/memremap.c | 18 +++++++++++-------
3 files changed, 17 insertions(+), 13 deletions(-)
4 years, 11 months
[PATCH 0/2] block: fix raw block device dax support
by Dan Williams
The dax support for a raw block device did not account for page cache
entries established by the kernel for partition reads. This breaks dax
as it assumes that page cache entries are limited to covering holes in
files, or are exceptional entries marking dirty pages.
Additionally, the facility to toggle dax at runtime fails to handle
evacuating the page cache when switching from non-dax-mode to dax-mode.
It needs to be rethought as enabling dax needs to be atomic with
flushing the page cache.
---
Dan Williams (2):
block: revert runtime dax control of the raw block device
block: use DAX for partition table reads
block/ioctl.c | 38 --------------------------------------
block/partition-generic.c | 18 +++++++++++++++---
fs/block_dev.c | 28 ----------------------------
fs/dax.c | 20 ++++++++++++++++++++
include/linux/blkdev.h | 10 ++++++++++
include/linux/fs.h | 3 ---
include/uapi/linux/fs.h | 1 -
7 files changed, 45 insertions(+), 73 deletions(-)
4 years, 11 months
[patch] ndctl: fix inverted mem vs. dev map argument to create-namespace
by Jeff Moyer
Again, simple think-o.
Signed-off-by: Jeff Moyer <jmoyer(a)redhat.com>
diff --git a/builtin-xaction-namespace.c b/builtin-xaction-namespace.c
index 4135e04..3c4c3e8 100644
--- a/builtin-xaction-namespace.c
+++ b/builtin-xaction-namespace.c
@@ -379,7 +379,7 @@ static int validate_namespace_options(struct ndctl_namespace *ndns,
}
if (param.map) {
- if (strcmp(param.map, "mem"))
+ if (!strcmp(param.map, "mem"))
p->loc = NDCTL_PFN_LOC_RAM;
else
p->loc = NDCTL_PFN_LOC_PMEM;
4 years, 11 months
[ndctl PATCH] ndctl: force creation test to use nfit_test
by Dan Williams
Make the namespace creation test safe to run on a platform with an
actual NFIT.
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
test/create.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/create.sh b/test/create.sh
index c49d15d455f5..61ffe5fcc424 100755
--- a/test/create.sh
+++ b/test/create.sh
@@ -15,7 +15,7 @@ $NDCTL enable-region $BUS all
# create pmem
dev="x"
-json=$($NDCTL create-namespace -t pmem -m raw)
+json=$($NDCTL create-namespace $BUS -t pmem -m raw)
eval $(echo $json | sed -e "$json2var")
[ $dev = "x" ] && echo "fail: $LINENO" && exit 1
[ $mode != "raw" ] && echo "fail: $LINENO" && exit 1
@@ -33,7 +33,7 @@ eval $(echo $json | sed -e "$json2var")
# create blk
dev="x"
-json=$($NDCTL create-namespace -t blk -m raw)
+json=$($NDCTL create-namespace $BUS -t blk -m raw)
eval $(echo $json | sed -e "$json2var")
[ $dev = "x" ] && echo "fail: $LINENO" && exit 1
[ $mode != "raw" ] && echo "fail: $LINENO" && exit 1
4 years, 11 months
[ndctl PATCH 00/13] ndctl: namespace creation, listing, and misc fixes
by Dan Williams
This series finalizes the work that has been brewing on the 'pending'
branch of the ndctl repository. It includes:
1/ Support for 'pfn' configurations to allocate an memmap array (struct
page) for a pmem namespace and enable direct-I/O + DMA.
2/ Reference implementations for namespace creation and lisitng devices
via the new 'ndctl create-namespace' and 'ndctl list' commands. Note
these are reference commands as the recommended vendor-provided tooling
should be used where available.
3/ Various fixes identified by the new unit tests and static analysis
checkers.
---
Dan Williams (13):
ndctl: add support for the namespace 'mode' attribute
ndctl: move tests to their own directory
ndctl: man pages
ndctl: help command
ndctl: don't fail requests to delete "io" namespaces
ndctl: create namespace
ndctl: alias "sector" and "safe" namespace modes
ndctl: refactor bus and region filtering to utility routines
ndctl: 'list' command
ndctl: emit namespace after successful create
ndctl: suggest --list-cmds for command discovery
ndctl: fix return code for enable/disable commands
ndctl: test create-namespace
.gitignore | 1
Documentation/Makefile.am | 28 +
Documentation/asciidoc.conf | 91 ++++
Documentation/manpage-base.xsl | 35 ++
Documentation/manpage-normal.xsl | 13 +
Documentation/namespace-description.txt | 6
Documentation/ndctl-create-namespace.txt | 128 +++++
Documentation/ndctl-disable-namespace.txt | 21 +
Documentation/ndctl-disable-region.txt | 22 +
Documentation/ndctl-enable-namespace.txt | 21 +
Documentation/ndctl-enable-region.txt | 22 +
Documentation/ndctl-list.txt | 86 ++++
Documentation/ndctl-zero-labels.txt | 41 ++
Documentation/ndctl.txt | 43 ++
Documentation/region-description.txt | 8
Documentation/xable-namespace-options.txt | 8
Documentation/xable-region-options.txt | 9
Makefile.am | 76 ++-
builtin-create-nfit.c | 45 --
builtin-help.c | 163 +++++++
builtin-list.c | 367 ++++++++++++++++
builtin-xable-namespace.c | 153 -------
builtin-xable-region.c | 33 -
builtin-xaction-namespace.c | 675 +++++++++++++++++++++++++++++
builtin.h | 26 +
configure.ac | 12 +
contrib/ndctl.spec.in | 4
lib/libndctl.c | 30 +
lib/libndctl.sym | 1
ndctl.c | 88 +---
test/blk_namespaces.c | 0
test/core.c | 0
test/create.sh | 47 ++
test/dax-dev.c | 7
test/dax-pmd.c | 3
test/dax.sh | 6
test/dpa-alloc.c | 0
test/libndctl.c | 13 +
test/mmap.c | 0
test/mmap.sh | 4
test/parent-uuid.c | 0
test/pcommit.c | 0
test/pmem_namespaces.c | 0
util/filter.c | 56 ++
util/filter.h | 6
util/json.c | 208 +++++++++
util/json.h | 11
util/size.c | 42 ++
util/size.h | 12 +
49 files changed, 2347 insertions(+), 324 deletions(-)
4 years, 11 months