[libvirt] [PATCH] Allow blkdeviotune to take human readable values
by Nishith Shah
Use vshCommandOptScaledInt instead of vshCommandOptULongLong so there is
no need to pass values in raw bytes, which is seldom the case.
---
tools/virsh-domain.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 0a6caae..3843675 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -1299,7 +1299,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
if (vshCommandOptStringReq(ctl, cmd, "device", &disk) < 0)
goto cleanup;
- if ((rv = vshCommandOptULongLong(ctl, cmd, "total-bytes-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "total-bytes-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1308,7 +1308,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "read-bytes-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "read-bytes-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1317,7 +1317,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "write-bytes-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "write-bytes-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1326,7 +1326,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "total-bytes-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "total-bytes-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1335,7 +1335,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "read-bytes-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "read-bytes-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1344,7 +1344,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "write-bytes-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "write-bytes-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1353,7 +1353,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "total-iops-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "total-iops-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1362,7 +1362,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "read-iops-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "read-iops-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1371,7 +1371,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "write-iops-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "write-iops-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1380,7 +1380,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "write-iops-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "write-iops-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1389,7 +1389,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "read-iops-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "read-iops-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1398,7 +1398,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "total-iops-sec-max", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "total-iops-sec-max", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
@@ -1407,7 +1407,7 @@ cmdBlkdeviotune(vshControl *ctl, const vshCmd *cmd)
goto save_error;
}
- if ((rv = vshCommandOptULongLong(ctl, cmd, "size-iops-sec", &value)) < 0) {
+ if ((rv = vshCommandOptScaledInt(ctl, cmd, "size-iops-sec", &value, 1, ULLONG_MAX)) < 0) {
goto interror;
} else if (rv > 0) {
if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams,
--
2.1.4
8 years, 6 months
[libvirt] [PATCH] virsh: volume: Add --bytes to 'vol-info'
by Peter Krempa
---
tools/virsh-volume.c | 23 +++++++++++++++++++----
tools/virsh.pod | 4 +++-
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 9cc8e52..d35fee1 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -992,6 +992,10 @@ static const vshCmdInfo info_vol_info[] = {
static const vshCmdOptDef opts_vol_info[] = {
VIRSH_COMMON_OPT_VOLUME_VOL,
VIRSH_COMMON_OPT_POOL_OPTIONAL,
+ {.name = "bytes",
+ .type = VSH_OT_BOOL,
+ .help = N_("sizes are represented in bytes rather than pretty units")
+ },
{.name = NULL}
};
@@ -1000,6 +1004,7 @@ cmdVolInfo(vshControl *ctl, const vshCmd *cmd)
{
virStorageVolInfo info;
virStorageVolPtr vol;
+ bool bytes = vshCommandOptBool(cmd, "bytes");
bool ret = true;
if (!(vol = virshCommandOptVol(ctl, cmd, "vol", "pool", NULL)))
@@ -1014,11 +1019,21 @@ cmdVolInfo(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "%-15s %s\n", _("Type:"),
virshVolumeTypeToString(info.type));
- val = vshPrettyCapacity(info.capacity, &unit);
- vshPrint(ctl, "%-15s %2.2lf %s\n", _("Capacity:"), val, unit);
+ if (bytes) {
+ vshPrint(ctl, "%-15s %llu %s\n", _("Capacity:"),
+ info.capacity, _("bytes"));
+ } else {
+ val = vshPrettyCapacity(info.capacity, &unit);
+ vshPrint(ctl, "%-15s %2.2lf %s\n", _("Capacity:"), val, unit);
+ }
- val = vshPrettyCapacity(info.allocation, &unit);
- vshPrint(ctl, "%-15s %2.2lf %s\n", _("Allocation:"), val, unit);
+ if (bytes) {
+ vshPrint(ctl, "%-15s %llu %s\n", _("Allocation:"),
+ info.allocation, _("bytes"));
+ } else {
+ val = vshPrettyCapacity(info.allocation, &unit);
+ vshPrint(ctl, "%-15s %2.2lf %s\n", _("Allocation:"), val, unit);
+ }
} else {
ret = false;
}
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 90ab47d..2a95df7 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -3639,11 +3639,13 @@ is in. I<vol-name-or-key-or-path> is the name or key or path of the volume
to output the XML of.
=item B<vol-info> [I<--pool> I<pool-or-uuid>] I<vol-name-or-key-or-path>
+[I<--bytes>]
Returns basic information about the given storage volume.
I<--pool> I<pool-or-uuid> is the name or UUID of the storage pool the volume
is in. I<vol-name-or-key-or-path> is the name or key or path of the volume
-to return information for.
+to return information for. If I<--bytes> is specified the sizes are not
+converted to human friendly units.
=item B<vol-list> [I<--pool> I<pool-or-uuid>] [I<--details>]
--
2.8.1
8 years, 6 months
[libvirt] [PATCH 0/4] configure: Fix init script choice
by Andrea Bolognani
The changes pushed yesterday have introduced an issue where
systemd was turned into systemd+redhat on RHEL systems,
which in turn caused RPM building to fail[1].
Patch 1/4 is the actual fix; patch 2/4 changes the code so
that breaking it again is hopefully a bit harder.
Patches 3/4 and 4/4 clean up a couple of barely related issues
in the spec file that I've ran into while investigating this.
[1] https://ci.centos.org/view/libvirt-project/job/libvirt-daemon-rpm/systems...
Andrea Bolognani (4):
configure: Change RHEL default from systemd+redhat to systemd
configure: Remove nested conditionals in LIBVIRT_CHECK_INIT_SCRIPT
spec: Type --with-init-script correctly
spec: Rename %{init_scripts} -> %{with_init_script}
libvirt.spec.in | 6 +++---
m4/virt-init-script.m4 | 21 ++++++---------------
2 files changed, 9 insertions(+), 18 deletions(-)
--
2.5.5
8 years, 6 months
[libvirt] [PATCH] maint: Ignore all .init, .service and .socket files
by Andrea Bolognani
All files with those extensions are generated, so we can have
three generic rules instead of explicitly ignoring every single
instance.
---
Pushed as trivial.
.gitignore | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/.gitignore b/.gitignore
index bf9109f..ba537d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,7 @@
*.gcov
*.html
*.i
+*.init
*.la
*.lo
*.loT
@@ -20,6 +21,8 @@
*.pyc
*.rej
*.s
+*.service
+*.socket
*.swp
*~
.#*
@@ -59,9 +62,7 @@
/daemon/libvirt_qemud
/daemon/libvirtd
/daemon/libvirtd*.logrotate
-/daemon/libvirtd.init
/daemon/libvirtd.policy
-/daemon/libvirtd.service
/daemon/test_libvirtd.aug
/docs/aclperms.htmlinc
/docs/apibuild.py.stamp
@@ -154,13 +155,7 @@
/src/util/virkeymaps.h
/src/virt-aa-helper
/src/virtlockd
-/src/virtlockd.init
-/src/virtlockd.service
-/src/virtlockd.socket
/src/virtlogd
-/src/virtlogd.init
-/src/virtlogd.service
-/src/virtlogd.socket
/tests/*.log
/tests/*.pid
/tests/*.trs
@@ -174,8 +169,6 @@
/tests/reconnect
/tests/ssh
/tests/test_conf
-/tools/libvirt-guests.init
-/tools/libvirt-guests.service
/tools/libvirt-guests.sh
/tools/virt-login-shell
/tools/virsh
--
2.5.5
8 years, 6 months
[libvirt] [PATCH] gitignore: ignore virt(log|lock)d.(service|socket)
by Cole Robinson
---
Pushed as trivial
.gitignore | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.gitignore b/.gitignore
index 6021403..a0de097 100644
--- a/.gitignore
+++ b/.gitignore
@@ -156,8 +156,12 @@
/src/virt-aa-helper
/src/virtlockd
/src/virtlockd.init
+/src/virtlockd.service
+/src/virtlockd.socket
/src/virtlogd
/src/virtlogd.init
+/src/virtlogd.service
+/src/virtlogd.socket
/tests/*.log
/tests/*.pid
/tests/*.trs
--
2.7.4
8 years, 6 months
[libvirt] [PATCH] maint: Don't ignore libvirtd.pod any longer
by Andrea Bolognani
Starting from commit 5b479f3b5b82, libvirtd.pod is a source file
rather than a generated file. Update ignore patterns accordingly.
---
Pushed as trivial.
.gitignore | 1 -
1 file changed, 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index a0de097..bf9109f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,7 +60,6 @@
/daemon/libvirtd
/daemon/libvirtd*.logrotate
/daemon/libvirtd.init
-/daemon/libvirtd.pod
/daemon/libvirtd.policy
/daemon/libvirtd.service
/daemon/test_libvirtd.aug
--
2.5.5
8 years, 6 months
[libvirt] [PATCH v3 0/2] daemon: add option to read host uuid from /etc/machine-id
by Nikolay Shirokovskiy
difference from version 2:
* cleanup syms file
* split patch into two
* update libvirtd.conf augeas lens and tests
Nikolay Shirokovskiy (2):
util: factor out reading file into preallocated buffer
daemon: add option to read host uuid from /etc/machine-id
daemon/libvirtd-config.c | 2 ++
daemon/libvirtd-config.h | 1 +
daemon/libvirtd.aug | 1 +
daemon/libvirtd.c | 38 +++++++++++++++++++++++++++++++++++---
daemon/libvirtd.conf | 15 +++++++++++----
daemon/test_libvirtd.aug.in | 1 +
src/libvirt_private.syms | 1 +
src/util/virfile.c | 24 ++++++++++++++++++++++++
src/util/virfile.h | 2 ++
src/util/viruuid.c | 11 ++---------
10 files changed, 80 insertions(+), 16 deletions(-)
--
1.8.3.1
8 years, 6 months
[libvirt] [PATCH 0/3] qemu: support configuring usb3 controller port count
by Cole Robinson
This adds support for configuring the amount of usb ports on
qemu's usb3 controller. The default port count is 4 which is
kind of low, and when virt-manager starts using usb3 by default
we will likely up the port count to something like 8.
Cole Robinson (3):
qemu: parse: Use virControllerDefNew
qemu: caps: introduce QEMU_CAPS_NEC_USB_XHCI_PORTS
qemu: support configuring usb3 controller port count
docs/formatdomain.html.in | 6 ++--
docs/schemas/domaincommon.rng | 8 ++++-
src/conf/domain_conf.c | 41 ++++++++++++++--------
src/conf/domain_conf.h | 9 +++++
src/libvirt_private.syms | 1 +
src/qemu/qemu_capabilities.c | 7 ++++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 13 +++++++
src/qemu/qemu_parse_command.c | 8 ++---
tests/qemucapabilitiesdata/caps_1.2.2-1.replies | 11 ++++++
tests/qemucapabilitiesdata/caps_1.3.1-1.caps | 1 +
tests/qemucapabilitiesdata/caps_1.3.1-1.replies | 29 +++++++++++++++
tests/qemucapabilitiesdata/caps_1.4.2-1.caps | 1 +
tests/qemucapabilitiesdata/caps_1.4.2-1.replies | 29 +++++++++++++++
tests/qemucapabilitiesdata/caps_1.5.3-1.caps | 1 +
tests/qemucapabilitiesdata/caps_1.5.3-1.replies | 29 +++++++++++++++
tests/qemucapabilitiesdata/caps_1.6.0-1.caps | 1 +
tests/qemucapabilitiesdata/caps_1.6.0-1.replies | 29 +++++++++++++++
tests/qemucapabilitiesdata/caps_1.6.50-1.caps | 1 +
tests/qemucapabilitiesdata/caps_1.6.50-1.replies | 29 +++++++++++++++
tests/qemucapabilitiesdata/caps_2.1.1-1.caps | 1 +
tests/qemucapabilitiesdata/caps_2.1.1-1.replies | 33 +++++++++++++++++
tests/qemucapabilitiesdata/caps_2.4.0-1.caps | 1 +
tests/qemucapabilitiesdata/caps_2.4.0-1.replies | 41 ++++++++++++++++++++++
tests/qemucapabilitiesdata/caps_2.5.0-1.caps | 1 +
tests/qemucapabilitiesdata/caps_2.5.0-1.replies | 41 ++++++++++++++++++++++
tests/qemucapabilitiesdata/caps_2.6.0-1.caps | 1 +
tests/qemucapabilitiesdata/caps_2.6.0-1.replies | 41 ++++++++++++++++++++++
.../qemuxml2argv-usb-controller-xhci.args | 22 ++++++++++++
.../qemuxml2argv-usb-controller-xhci.xml | 16 +++++++++
tests/qemuxml2argvtest.c | 3 ++
31 files changed, 434 insertions(+), 22 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-controller-xhci.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-controller-xhci.xml
--
2.7.4
8 years, 6 months
Re: [libvirt] [PATCH] ppc64: get the maxvcpus from the qemu caps instead of /dev/kvm
by Cole Robinson
On 05/03/2016 02:39 AM, Shivaprasad bhat wrote:
> Thanks for the reply Cole.
>
> On Tue, May 3, 2016 at 3:27 AM, Cole Robinson <crobinso(a)redhat.com
> <mailto:crobinso@redhat.com>> wrote:
>
> On 05/02/2016 09:14 AM, Shivaprasad G Bhat wrote:
> > On PPC64, the KVM_MAX_VCPUS is defined to be 1024 where as qemu has
> > MAX_CPUMASK_BITS defined at 255 in include/sysemu/sysemu.h.
> >
> > virsh domacapabilities and virsh maxvcpus --type kvm return different
> > maxvcpus values and is confusing as to know what actually works.
> >
> > Signed-off-by: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com
> <mailto:sbhat@linux.vnet.ibm.com>>
> > ---
> > src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++--
> > 1 file changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 3d0c7c8..d84fc47 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -1255,10 +1255,34 @@ static int qemuConnectIsAlive(virConnectPtr conn
> ATTRIBUTE_UNUSED)
> >
> >
> > static int
> > -kvmGetMaxVCPUs(void)
> > +kvmGetMaxVCPUs(virConnectPtr conn)
> > {
> > int fd;
> > int ret;
> > + virArch arch = virArchFromHost();
> > + virQEMUCapsPtr qemuCaps = NULL;
> > + virQEMUDriverPtr driver = conn->privateData;
> > +
> > + const char *machine;
> > +
> > + if (ARCH_IS_PPC64(arch)) {
> > + if (!(qemuCaps =
> virQEMUCapsCacheLookupByArch(driver->qemuCapsCache,
> > + arch))) {
> > + virReportError(VIR_ERR_INVALID_ARG,
> > + _("unable to find any emulator to serve '%s' "
> > + "architecture"), virArchToString(arch));
> > + return -1;
> > + }
> > +
> > + if (!(machine = virQEMUCapsGetDefaultMachine(qemuCaps))) {
> > + virObjectUnref(qemuCaps);
> > + return -1;
> > + }
> > +
> > + ret = virQEMUCapsGetMachineMaxCpus(qemuCaps, machine);
> > + virObjectUnref(qemuCaps);
> > + return ret;
> > + }
> >
>
> I don't really like this.
>
> The MaxVCPUs API sucks: it doesn't take enough parameters to give an accurate
> picture of what the max VCPUs supported for your desired config is. And that's
> basically unfixable.
>
> Hacking in a one off fix for PPC64 here doesn't seem like a good idea. If you
> really want to 'fix' this I'd suggest one or more of:
>
> - Reflect /dev/kvm maxvcpus in the capabilities XML somehow
> - Extend 'virsh maxvcpus' to take os_type+virt_type+emulator+machine_type,
> look up the capabilities XML, correlate that with maxvcpus output/new
> capabilities XML, and give a real value for the desired config
> - Change the maxvcpus API to consistently to return capabilities output, or
> cap the return value to the largest reported in capabilities output, and do it
> consistently for all architectures
>
>
> Extending maxvcpus API would make it more or less same as domcapabilities and I am
> not sure if that is necessary. I feel just reporting the maxvcpus to show the
> max possible
> vcpus for the default machine & arch & binary is a good idea as that is what
> the API
> intends to return today.
>
> I think the third option here what you suggested seems more logical. The
> maxvcpus supposed to be "minimum" of what comes out of capabilities or
> /dev/kvm not the
> "maximum".
>
> I am not sure of how the /dev/kvm and capabilties outputs differ on all archs.
> For x86 I saw them to be consistent. And on PPC it was different. Hope having a
> generic approach to report the "minimum" is good for all archs. Being unsure
> was the
> reason limiting my checks to PPC alone.
>
> I'll take the third approach as suggested.
>
Re-adding libvir-list to CC
I lightly grepped kernel sources. I think PPC is the only > 255 VCPU case, if
anything the other archs will be limited by their KVM support and not qemu
machine type support
- Cole
8 years, 6 months
[libvirt] [PATCH 0/7] qemu machine cleanups
by Ján Tomko
Unify detection of machine types and clean up some return value handling.
Ján Tomko (7):
Use qemuDomainMachineIs helpers when adding default devices
Invert condition in qemuDomainDefAddDefaultDevices
Return void in qemuDomainAssignARMVirtioMMIOAddresses
Remove useless variable in qemuDomainAssignAddresses
Rewrite the condition in qemuDomainAssignARMVirtioMMIOAddresses
Introduce qemuDomainMachineIsVirt
Remove useless os.machine NULL check
src/qemu/qemu_capabilities.c | 3 +--
src/qemu/qemu_command.c | 3 +--
src/qemu/qemu_domain.c | 32 +++++++++++++-----------------
src/qemu/qemu_domain.h | 1 +
src/qemu/qemu_domain_address.c | 45 ++++++++++++++++++++----------------------
5 files changed, 38 insertions(+), 46 deletions(-)
--
2.7.3
8 years, 6 months