On Tue, Apr 11, 2017 at 12:47 PM, Jeff Cody <jc...@redhat.com> wrote: > On Mon, Apr 03, 2017 at 08:48:08PM -0700, Ashish Mittal wrote: >> Source code for the qnio library that this code loads can be downloaded from: >> https://github.com/VeritasHyperScale/libqnio.git >> >> Sample command line using JSON syntax: >> ./x86_64-softmmu/qemu-system-x86_64 -name instance-00000008 -S -vnc 0.0.0.0:0 >> -k en-us -vga cirrus -device >> virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 >> -msg timestamp=on >> 'json:{"driver":"vxhs","vdisk-id":"c3e9095a-a5ee-4dce-afeb-2a59fb387410", >> "server":{"host":"172.172.17.4","port":"9999"}}' >> >> Sample command line using URI syntax: >> qemu-img convert -f raw -O raw -n >> /var/lib/nova/instances/_base/0c5eacd5ebea5ed914b6a3e7b18f1ce734c386ad >> vxhs://192.168.0.1:9999/c6718f6b-0401-441d-a8c3-1f0064d75ee0 >> >> Sample command line using TLS credentials (run in secure mode): >> ./qemu-io --object >> tls-creds-x509,id=tls0,dir=/etc/pki/qemu/vxhs,endpoint=client -c 'read >> -v 66000 2.5k' 'json:{"server.host": "127.0.0.1", "server.port": "9999", >> "vdisk-id": "/test.raw", "driver": "vxhs", "tls-creds":"tls0"}' >> >> Signed-off-by: Ashish Mittal <ashish.mit...@veritas.com> > > I was testing this some with blockdev-add and blockdev-del, and this > sequence causes a segfault: > > 1. blockdev-add vxhs image > 2. blockdev-del above image > 3. blockdev-add vxhs image <--- segfaults > > Looking at it in gdb, this is an issue with libqnio. The call to iio_fini() > is not sufficiently thorough in cleaning up resources. > > In nio_client.c, qnc_ctx is never freed, because there does not > seem to be a call such as 'qnc_driver_fini' that cleans up the allocated > qnio_client_ctx. > > Therefore, on the second call to iio_init, the libqnio internal variable > network_driver is NULL, because qnc_driver_init() returns NULL if it is > called when qnc_ctx is still initialized: > > > > lib/qnio/nio_client.c: > > 411 int > 412 iio_init(int32_t version, iio_cb_t cb) > 413 { > > [...] > > 432 apictx->network_driver = qnc_secure_driver_init(client_callback); > 433 nioDbg("Created API context.\n"); > 434 return 0; > 435 } > > [...] > > 779 struct channel_driver * > 780 qnc_driver_init(qnio_notify client_notify) > 781 { > 782 if (qnc_ctx) { > 783 nioDbg("Driver already initialized"); > 784 return NULL; > 785 } > 786 > > > So two issues: > > A. iio_init() should check the returned pointer, and fail if NULL > > B. iio_fini() needs to clean everything up so that a new vxhs connection is > possible. This likely means at least one new function in nio_client.c to > clean up qnc_ctx. > > -Jeff
Thanks for reporting the issue and also suggesting the fix. I was able to reproduce the issue and have checked in a fix to libqnio. This was the stack trace from the core - Program terminated with signal 11, Segmentation fault. #0 0x00007f12083a3afa in iio_channel_open (uri=0x7f120c57eb70 "of://127.0.0.1:9999", cacert=0x0, client_key=0x0, client_cert=0x0) at lib/qnio/iioapi.c:105 #1 0x00007f12083a470a in iio_open (uri=0x7f120d121be0 "of://127.0.0.1:9999", devid=0x7f120baa4bb0 "/test.raw", flags=0, cacert=0x0, client_key=0x0, client_cert=0x0) at lib/qnio/iioapi.c:520 #2 0x00007f12091bf7a3 in vxhs_open (bs=<optimized out>, options=<optimized out>, bdrv_flags=<optimized out>, errp=0x7ffdf1cafd70) at block/vxhs.c:388 #3 0x00007f120916cf14 in bdrv_open_driver (bs=bs@entry=0x7f120b1481b0, drv=drv@entry=0x7f1209843580 <bdrv_vxhs>, node_name=<optimized out>, options=options@entry=0x7f120daa6840, open_flags=8194, errp=errp@entry=0x7ffdf1cafe28) at block.c:1011 #4 0x00007f120917079f in bdrv_open_common (errp=0x7ffdf1cafe28, options=0x7f120daa6840, file=0x0, bs=0x7f120b1481b0) at block.c:1250 #5 bdrv_open_inherit (filename=<optimized out>, filename@entry=0x0, reference=reference@entry=0x0, options=0x7f120daa6840, options@entry=0x7f120daa4800, flags=40962, parent=parent@entry=0x0, child_role=child_role@entry=0x0, errp=errp@entry=0x7ffdf1caff18) at block.c:2413 #6 0x00007f1209171663 in bdrv_open (filename=filename@entry=0x0, reference=reference@entry=0x0, options=options@entry=0x7f120daa4800, flags=<optimized out>, errp=errp@entry=0x7ffdf1caff18) at block.c:2505 #7 0x00007f1208f9f026 in bds_tree_init (bs_opts=bs_opts@entry=0x7f120daa4800, errp=errp@entry=0x7ffdf1caff18) at blockdev.c:656 #8 0x00007f1208fa4e5b in qmp_blockdev_add (options=options@entry=0x7ffdf1caff20, errp=errp@entry=0x7ffdf1caff18) at blockdev.c:3885 ... Please test again with refreshed libqnio and let me know in case of issues. Thanks, Ashish