Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package multipath-tools for openSUSE:Factory checked in at 2021-03-16 15:43:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/multipath-tools (Old) and /work/SRC/openSUSE:Factory/.multipath-tools.new.2401 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "multipath-tools" Tue Mar 16 15:43:49 2021 rev:128 rq:878610 version:0.8.5+26+suse.2cbedfd Changes: -------- --- /work/SRC/openSUSE:Factory/multipath-tools/multipath-tools.changes 2020-12-18 19:52:23.925613911 +0100 +++ /work/SRC/openSUSE:Factory/.multipath-tools.new.2401/multipath-tools.changes 2021-03-16 15:45:28.781140437 +0100 @@ -1,0 +2,22 @@ +Fri Mar 12 14:53:41 UTC 2021 - mwi...@suse.com + +- Update to version 0.8.5+26+suse.2cbedfd: + Avoid "illegal request" errors on non-RDAC storage + (bsc#bsc#1182072, bsc#1177371) + +------------------------------------------------------------------- +Wed Mar 10 10:16:38 UTC 2021 - mwi...@suse.com + +- Update to version 0.8.5+23+suse.c11b054: + * multipath -U: reduce log level of "adding new path" message + (bsc#1181435) + +------------------------------------------------------------------- +Wed Feb 10 14:30:15 UTC 2021 - mwi...@suse.com + +- Update to version 0.8.5+22+suse.e1e3c48: + * multipath-tools tests: fix stringop-overflow build errors with gcc 11 + (bsc#1181877) + * README moved to README.md (has been converted to markdown upstream) + +------------------------------------------------------------------- @@ -4 +26 @@ -- Update to versioni 0.8.5+12+suse.3b0e9ca +- Update to version 0.8.5+12+suse.3b0e9ca @@ -91 +113 @@ - * cleanup disassemble_map() code path + * cleanup disassemble_map() code path (bsc#1178377, bsc#1178379) @@ -106,0 +129 @@ + (bsc#1182917) Old: ---- multipath-tools-0.8.5+12+suse.3b0e9ca.obscpio New: ---- multipath-tools-0.8.5+26+suse.2cbedfd.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ multipath-tools.spec ++++++ --- /var/tmp/diff_new_pack.qGRnvu/_old 2021-03-16 15:45:29.425141468 +0100 +++ /var/tmp/diff_new_pack.qGRnvu/_new 2021-03-16 15:45:29.429141474 +0100 @@ -1,7 +1,7 @@ # # spec file for package multipath-tools # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -39,7 +39,7 @@ %define _sysdir usr/lib Name: multipath-tools -Version: 0.8.5+12+suse.3b0e9ca +Version: 0.8.5+26+suse.2cbedfd Release: 0 Summary: Tools to Manage Multipathed Devices with the device-mapper License: GPL-2.0-only @@ -213,7 +213,7 @@ %files %defattr(-,root,root) -%doc README README.alua +%doc README.md README.alua %license LICENSES/GPL-2.0 %{_udevrulesdir}/11-dm-mpath.rules %{_udevrulesdir}/56-multipath.rules ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.qGRnvu/_old 2021-03-16 15:45:29.481141558 +0100 +++ /var/tmp/diff_new_pack.qGRnvu/_new 2021-03-16 15:45:29.481141558 +0100 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/multipath-tools.git</param> - <param name="changesrevision">3b0e9cacfe6f016beea69b1e42b593961579ec34</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">2cbedfd7568a1c41ede4b45e230cfdddfbb36232</param></service></servicedata> \ No newline at end of file ++++++ multipath-tools-0.8.5+12+suse.3b0e9ca.obscpio -> multipath-tools-0.8.5+26+suse.2cbedfd.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/.github/workflows/build-and-unittest.yaml new/multipath-tools-0.8.5+26+suse.2cbedfd/.github/workflows/build-and-unittest.yaml --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/.github/workflows/build-and-unittest.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/.github/workflows/build-and-unittest.yaml 2021-03-12 15:45:10.000000000 +0100 @@ -0,0 +1,95 @@ +name: basic-build-and-ci +on: [push] +jobs: + bionic: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: mpath + run: sudo modprobe dm_multipath + - name: zram + run: sudo modprobe zram num_devices=0 + - name: zram-device + run: echo ZRAM=$(sudo cat /sys/class/zram-control/hot_add) >> $GITHUB_ENV + - name: set-zram-size + run: echo 1G | sudo tee /sys/block/zram$ZRAM/disksize + - name: update + run: sudo apt-get update + - name: dependencies + run: > + sudo apt-get install --yes gcc + make perl-base pkg-config valgrind + libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev + libudev-dev libjson-c-dev liburcu-dev libcmocka-dev + - name: build + run: make -O -j$(grep -c ^processor /proc/cpuinfo) + - name: test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) test + - name: valgrind-test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) valgrind-test + - name: valgrind-results + run: cat tests/*.vgr + - name: clean-nonroot-artifacts + run: rm -f tests/dmevents.out tests/directio.out + - name: root-test + run: sudo make DIO_TEST_DEV=/dev/zram$ZRAM test + focal-gcc10: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: mpath + run: sudo modprobe dm_multipath + - name: brd + run: sudo modprobe brd rd_nr=1 rd_size=65536 + - name: update + run: sudo apt-get update + - name: dependencies + run: > + sudo apt-get install --yes gcc-10 + make perl-base pkg-config valgrind + libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev + libudev-dev libjson-c-dev liburcu-dev libcmocka-dev + - name: set CC + run: echo CC=gcc-10 >> $GITHUB_ENV + - name: build + run: make -O -j$(grep -c ^processor /proc/cpuinfo) + - name: test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) test + - name: valgrind-test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) valgrind-test + - name: valgrind-results + run: cat tests/*.vgr + - name: clean-nonroot-artifacts + run: rm -f tests/dmevents.out tests/directio.out + - name: root-test + run: sudo make DIO_TEST_DEV=/dev/ram0 test + focal-clang10: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: mpath + run: sudo modprobe dm_multipath + - name: brd + run: sudo modprobe brd rd_nr=1 rd_size=65536 + - name: update + run: sudo apt-get update + - name: dependencies + run: > + sudo apt-get install --yes clang + make perl-base pkg-config valgrind + libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev + libudev-dev libjson-c-dev liburcu-dev libcmocka-dev + - name: set CC + run: echo CC=clang >> $GITHUB_ENV + - name: build + run: make -O -j$(grep -c ^processor /proc/cpuinfo) + - name: test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) test + - name: valgrind-test + run: make -O -j$(grep -c ^processor /proc/cpuinfo) valgrind-test + - name: valgrind-results + run: cat tests/*.vgr + - name: clean-nonroot-artifacts + run: rm -f tests/dmevents.out tests/directio.out + - name: root-test + run: sudo make DIO_TEST_DEV=/dev/ram0 test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/README new/multipath-tools-0.8.5+26+suse.2cbedfd/README --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/README 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/README 1970-01-01 01:00:00.000000000 +0100 @@ -1,60 +0,0 @@ - multipath-tools for Linux <http://christophe.varoqui.free.fr/> - - -This package provides the following binaries to drive the Device Mapper -multipathing driver: - -multipath - Device mapper target autoconfig. -multipathd - Multipath daemon. -mpathpersist - Manages SCSI persistent reservations on dm multipath devices. -kpartx - Create device maps from partition tables. - - -Releases -======== -Tarballs are not generated anymore, to get a specific release do: -git clone https://git.opensvc.com/multipath-tools/.git -cd multipath-tools -git tag -git archive --format=tar.gz --prefix=multipath-tools-X.Y.Z/ X.Y.Z > ../multipath-tools-X.Y.Z.tar.gz - -Alternatively it may be obtained from gitweb, go to: -https://git.opensvc.com/?p=multipath-tools/.git;a=tags -select a release-tag and then click on "snapshot". Or get it with -wget "https://git.opensvc.com/?p=multipath-tools/.git;a=snapshot;sf=tgz;h=refs/tags/X.Y.Z" -O multipath-tools-X.Y.Z.tar.gz - - -Source code -=========== -To get latest devel code: git clone https://git.opensvc.com/multipath-tools/.git -Gitweb: https://git.opensvc.com/?p=multipath-tools/.git - - -Add storage devices -=================== -Follow the instructions in the libmultipath/hwtable.c header. - - -Mailing list (subscribers-only) -============ -To subscribe and archives: https://www.redhat.com/mailman/listinfo/dm-devel -Searchable: https://marc.info/?l=dm-devel - - -Changelog -========= -pre-0.4.5: https://web.archive.org/web/20070309224034/http://christophe.varoqui.free.fr/wiki/wakka.php?wiki=ChangeLog -post-0.4.5: https://git.opensvc.com/?p=multipath-tools/.git;a=log - - -Maintainer -========== -Christophe Varoqui <christophe.varo...@opensvc.com> -Device-mapper development mailing list <dm-de...@redhat.com> - -Licence -======= -The multipath-tools source code is covered by several different -licences. Refer to the individual source files for details. -Source files which do not specify a licence are shipped under -LGPL-2.0 (see LICENSES/LGPL-2.0). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/README.md new/multipath-tools-0.8.5+26+suse.2cbedfd/README.md --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/README.md 2021-03-12 15:45:10.000000000 +0100 @@ -0,0 +1,87 @@ +multipath-tools for Linux +************************* + +https://github.com/opensvc/multipath-tools + +This package provides the following binaries to drive the Device Mapper multipathing driver: + +* multipath - Device mapper target autoconfig. +* multipathd - Multipath daemon. +* mpathpersist - Manages SCSI persistent reservations on dm multipath devices. +* kpartx - Create device maps from partition tables. + + +Releases +======== + +To get a specific X.Y.Z release, use one of the following method: + + +Git +--- + + git clone https://github.com/opensvc/multipath-tools.git + cd multipath-tools + git tag + git archive --format=tar.gz --prefix=multipath-tools-X.Y.Z/ X.Y.Z > ../multipath-tools-X.Y.Z.tar.gz + + +Direct download +--------------- + + wget "https://github.com/opensvc/multipath-tools/archive/X.Y.Z.tar.gz" -O multipath-tools-X.Y.Z.tar.gz + + +Browser +------- + +Go to: https://github.com/opensvc/multipath-tools/tags +Select a release-tag and then click on "zip" or "tar.gz". + + +Source code +=========== + +To get latest devel code: + + git clone https://github.com/opensvc/multipath-tools.git + +Github page: https://github.com/opensvc/multipath-tools + + +Add storage devices +=================== + +Follow the instructions in the `libmultipath/hwtable.c` header. + + +Mailing list +============ + +(subscribers-only) +To subscribe and archives: https://www.redhat.com/mailman/listinfo/dm-devel +Searchable: https://marc.info/?l=dm-devel + + +Changelog +========= + +pre-0.4.5: https://web.archive.org/web/20070309224034/http://christophe.varoqui.free.fr/wiki/wakka.php?wiki=ChangeLog +post-0.4.5: https://github.com/opensvc/multipath-tools/commits/master + + +Maintainer +========== + +Christophe Varoqui <christophe.varo...@opensvc.com> +Device-mapper development mailing list <dm-de...@redhat.com> + + +Licence +======= + +The multipath-tools source code is covered by several different licences. +Refer to the individual source files for details. +Source files which do not specify a licence are shipped under LGPL-2.0 +(see `LICENSES/LGPL-2.0`). + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/discovery.c new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/discovery.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/discovery.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/discovery.c 2021-03-12 15:45:10.000000000 +0100 @@ -1275,14 +1275,13 @@ return len; } -int -get_vpd_sgio (int fd, int pg, int vend_id, char * str, int maxlen) +static int +fetch_vpd_page(int fd, int pg, unsigned char *buff, int maxlen) { - int len, buff_len; - unsigned char buff[4096]; + int buff_len; - memset(buff, 0x0, 4096); - if (sgio_get_vpd(buff, 4096, fd, pg) < 0) { + memset(buff, 0x0, maxlen); + if (sgio_get_vpd(buff, maxlen, fd, pg) < 0) { int lvl = pg == 0x80 || pg == 0x83 ? 3 : 4; condlog(lvl, "failed to issue vpd inquiry for pg%02x", @@ -1296,10 +1295,39 @@ return -ENODATA; } buff_len = get_unaligned_be16(&buff[2]) + 4; - if (buff_len > 4096) { + if (buff_len > maxlen) { condlog(3, "vpd pg%02x page truncated", pg); - buff_len = 4096; + buff_len = maxlen; } + return buff_len; +} + +/* based on sg_inq.c from sg3_utils */ +bool +is_vpd_page_supported(int fd, int pg) +{ + int i, len; + unsigned char buff[4096]; + + len = fetch_vpd_page(fd, 0x00, buff, sizeof(buff)); + if (len < 0) + return false; + + for (i = 4; i < len; ++i) + if (buff[i] == pg) + return true; + return false; +} + +int +get_vpd_sgio (int fd, int pg, int vend_id, char * str, int maxlen) +{ + int len, buff_len; + unsigned char buff[4096]; + + buff_len = fetch_vpd_page(fd, pg, buff, sizeof(buff)); + if (buff_len < 0) + return buff_len; if (pg == 0x80) len = parse_vpd_pg80(buff, str, maxlen); else if (pg == 0x83) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/discovery.h new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/discovery.h --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/discovery.h 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/discovery.h 2021-03-12 15:45:10.000000000 +0100 @@ -56,6 +56,7 @@ char *buff, int buflen); int get_uid(struct path * pp, int path_state, struct udev_device *udev, int allow_fallback); +bool is_vpd_page_supported(int fd, int pg); /* * discovery bitmask diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/propsel.c new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/propsel.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/propsel.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/propsel.c 2021-03-12 15:45:10.000000000 +0100 @@ -511,13 +511,15 @@ { int len; char buff[44]; - const char *checker_name; + const char *checker_name = NULL; if (pp->bus != SYSFS_BUS_SCSI) return 0; - /* Avoid ioctl if this is likely not an RDAC array */ - if (__do_set_from_hwe(checker_name, pp, checker_name) && - strcmp(checker_name, RDAC)) + /* Avoid checking 0xc9 if this is likely not an RDAC array */ + if (!__do_set_from_hwe(checker_name, pp, checker_name) && + !is_vpd_page_supported(pp->fd, 0xC9)) + return 0; + if (checker_name && strcmp(checker_name, RDAC)) return 0; len = get_vpd_sgio(pp->fd, 0xC9, 0, buff, 44); if (len <= 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/structs.c new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/structs.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/structs.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/structs.c 2021-03-12 15:45:10.000000000 +0100 @@ -468,12 +468,12 @@ } struct path * -find_path_by_dev (const struct _vector *pathvec, const char * dev) +find_path_by_dev (const struct _vector *pathvec, const char *dev) { int i; struct path * pp; - if (!pathvec) + if (!pathvec || !dev) return NULL; vector_foreach_slot (pathvec, pp, i) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/structs_vec.c new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/structs_vec.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/libmultipath/structs_vec.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/libmultipath/structs_vec.c 2021-03-12 15:45:10.000000000 +0100 @@ -192,7 +192,7 @@ must_reload = true; continue; } - condlog(2, "%s: adding new path %s", + condlog(3, "%s: adding new path %s", mpp->alias, pp->dev); store_path(pathvec, pp); pp->tick = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/multipath/multipath.conf.5 new/multipath-tools-0.8.5+26+suse.2cbedfd/multipath/multipath.conf.5 --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/multipath/multipath.conf.5 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/multipath/multipath.conf.5 2021-03-12 15:45:10.000000000 +0100 @@ -1160,7 +1160,7 @@ those issues. .RS .TP -The default is: \fB1000\fR +The default is: \fB4000\fR .RE . . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/alias.c new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/alias.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/alias.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/alias.c 2021-03-12 15:45:10.000000000 +0100 @@ -1,3 +1,4 @@ +#include <pthread.h> #include <stdint.h> #include <setjmp.h> #include <stdio.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/devt.c new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/devt.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/devt.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/devt.c 2021-03-12 15:45:10.000000000 +0100 @@ -11,11 +11,25 @@ #include <cmocka.h> #include <libudev.h> #include <sys/sysmacros.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <unistd.h> #include "util.h" #include "debug.h" #include "globals.c" +static bool sys_dev_block_exists(void) +{ + int fd; + bool rc; + + fd = open("/sys/dev/block", O_RDONLY|O_DIRECTORY); + rc = (fd != -1); + close(fd); + return rc; +} + static int get_one_devt(char *devt, size_t len) { struct udev_enumerate *enm; @@ -71,6 +85,8 @@ { char dummy[BLK_DEV_SIZE]; + if (!sys_dev_block_exists()) + skip(); assert_int_equal(devt2devname(dummy, sizeof(dummy), *state), 0); } @@ -137,6 +153,8 @@ struct udev_list_entry *first, *item; unsigned int i = 0; + if (!sys_dev_block_exists()) + skip(); enm = udev_enumerate_new(udev); assert_non_null(enm); r = udev_enumerate_add_match_subsystem(enm, "block"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/dmevents.c new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/dmevents.c --- old/multipath-tools-0.8.5+12+suse.3b0e9ca/tests/dmevents.c 2020-12-16 13:10:32.000000000 +0100 +++ new/multipath-tools-0.8.5+26+suse.2cbedfd/tests/dmevents.c 2021-03-12 15:45:10.000000000 +0100 @@ -16,6 +16,7 @@ * */ +#include <pthread.h> #include <stdint.h> #include <stdbool.h> #include <stdarg.h> ++++++ multipath-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.qGRnvu/_old 2021-03-16 15:45:29.761142006 +0100 +++ /var/tmp/diff_new_pack.qGRnvu/_new 2021-03-16 15:45:29.761142006 +0100 @@ -1,5 +1,5 @@ name: multipath-tools -version: 0.8.5+12+suse.3b0e9ca -mtime: 1608120632 -commit: 3b0e9cacfe6f016beea69b1e42b593961579ec34 +version: 0.8.5+26+suse.2cbedfd +mtime: 1615560310 +commit: 2cbedfd7568a1c41ede4b45e230cfdddfbb36232