Compare commits
7 Commits
871e750385
...
42e934e271
| Author | SHA1 | Date | |
|---|---|---|---|
| 42e934e271 | |||
| 026bc5c9b2 | |||
| edf5051c71 | |||
| 75b07eca3e | |||
| 8324054718 | |||
| 1fa7e3ca4d | |||
| 8a088a9e2a |
@@ -2,7 +2,7 @@ RELEASE=5.1
|
||||
|
||||
# source form https://github.com/zfsonlinux/
|
||||
|
||||
ZFSVER=0.7.6
|
||||
ZFSVER=0.7.7
|
||||
ZFSPKGREL=pve1~bpo9
|
||||
SPLPKGREL=pve1~bpo9
|
||||
ZFSPKGVER=${ZFSVER}-${ZFSPKGREL}
|
||||
@@ -76,4 +76,4 @@ distclean: clean
|
||||
|
||||
.PHONY: upload
|
||||
upload: ${DEBS}
|
||||
tar -cf - ${DEBS} | ssh repoman@repo.proxmox.com -- upload --product pve --dist stretch --arch amd64
|
||||
tar -cf - ${DEBS} | ssh repoman@repo.proxmox.com -- upload --product pve,pmg --dist stretch --arch amd64
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
spl-linux (0.7.7-pve1~bpo9) unstable; urgency=medium
|
||||
|
||||
* update SPL to 0.7.7
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Tue, 3 Apr 2018 14:28:35 +0200
|
||||
|
||||
spl-linux (0.7.6-pve1~bpo9) unstable; urgency=medium
|
||||
|
||||
* update SPL to 0.7.6
|
||||
|
||||
+1
-1
Submodule spl-debian updated: 4a6efb89ab...d169ca25d5
@@ -8,16 +8,16 @@ Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
debian/control.in | 24 --------------------
|
||||
debian/control.in | 30 ------------------------
|
||||
debian/control | 1 -
|
||||
debian/rules | 68 +------------------------------------------------------
|
||||
3 files changed, 1 insertion(+), 92 deletions(-)
|
||||
debian/rules | 70 ++-----------------------------------------------------
|
||||
3 files changed, 2 insertions(+), 99 deletions(-)
|
||||
|
||||
diff --git a/debian/control.in b/debian/control.in
|
||||
index b910704..786e689 100644
|
||||
index 02d3182..5fd81aa 100644
|
||||
--- a/debian/control.in
|
||||
+++ b/debian/control.in
|
||||
@@ -8,40 +8,16 @@ Build-Depends: autogen,
|
||||
@@ -8,46 +8,16 @@ Build-Depends: autogen,
|
||||
autotools-dev,
|
||||
debhelper (>= 9),
|
||||
dh-autoreconf,
|
||||
@@ -25,13 +25,19 @@ index b910704..786e689 100644
|
||||
libtool
|
||||
Standards-Version: 4.1.2
|
||||
Homepage: http://www.zfsonlinux.org/
|
||||
Vcs-Git: git://anonscm.debian.org/pkg-zfsonlinux/spl.git
|
||||
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-zfsonlinux/spl.git
|
||||
Vcs-Git: git@salsa.debian.org:zfsonlinux-team/spl.git
|
||||
Vcs-Browser: https://salsa.debian.org/zfsonlinux-team/spl
|
||||
|
||||
-Package: spl-dkms
|
||||
-Architecture: all
|
||||
-Depends: dkms (>> 2.2.1.0), file, libc-dev, libelf-dev, lsb-release, ${misc:Depends}
|
||||
-Recommends: spl (>= ${source:Upstream-Version})
|
||||
-Depends: dkms (>> 2.2.1.0),
|
||||
- file,
|
||||
- libc-dev,
|
||||
- libelf-dev,
|
||||
- lsb-release,
|
||||
- ${misc:Depends}
|
||||
-Recommends: spl (>= ${source:Upstream-Version}),
|
||||
- @LINUX_COMPAT@
|
||||
-Provides: spl-modules
|
||||
-Description: Solaris Porting Layer kernel modules for Linux
|
||||
- The Solaris Porting Layer (SPL) is a Linux kernel module which provides
|
||||
@@ -59,7 +65,7 @@ index b910704..786e689 100644
|
||||
The Solaris Porting Layer (SPL) is a Linux kernel module which provides
|
||||
many of the Solaris kernel APIs. This shim layer makes it possible to
|
||||
diff --git a/debian/control b/debian/control
|
||||
index b910704..9ddc12d 100644
|
||||
index c3abf8d..455c34d 100644
|
||||
--- a/debian/control
|
||||
+++ b/debian/control
|
||||
@@ -8,7 +8,6 @@ Build-Depends: autogen,
|
||||
@@ -71,7 +77,7 @@ index b910704..9ddc12d 100644
|
||||
Standards-Version: 4.1.2
|
||||
Homepage: http://www.zfsonlinux.org/
|
||||
diff --git a/debian/rules b/debian/rules
|
||||
index b2fc86c..a474ca4 100755
|
||||
index c7f2608..bca58f7 100755
|
||||
--- a/debian/rules
|
||||
+++ b/debian/rules
|
||||
@@ -14,12 +14,8 @@ ifndef KVERS
|
||||
@@ -87,7 +93,7 @@ index b2fc86c..a474ca4 100755
|
||||
+ dh $@ --with autoreconf --parallel
|
||||
|
||||
override_dh_auto_configure:
|
||||
@cp debian/control.in debian/control
|
||||
sed "s/@LINUX_COMPAT@/linux-libc-dev \(< $(shell debian/get_next.sh)\)/" debian/control.in > debian/control
|
||||
@@ -45,69 +41,7 @@ override_dh_auto_install:
|
||||
@# This creates the $(CURDIR)/$(NAME)-$(VERSION)/ tree.
|
||||
$(MAKE) distdir
|
||||
@@ -108,7 +114,7 @@ index b2fc86c..a474ca4 100755
|
||||
override_dh_auto_clean:
|
||||
dh_auto_clean
|
||||
@if test -e META.orig; then mv META.orig META; fi
|
||||
cp debian/control.in debian/control
|
||||
- sed "s/@LINUX_COMPAT@/linux-libc-dev \(< $(shell debian/get_next.sh)\)/" debian/control.in > debian/control
|
||||
-
|
||||
-# ------------
|
||||
-
|
||||
@@ -158,6 +164,7 @@ index b2fc86c..a474ca4 100755
|
||||
- dh_md5sums -p${pmodules}
|
||||
-
|
||||
- dh_builddeb -p${pmodules}
|
||||
+ cp debian/control.in debian/control
|
||||
--
|
||||
2.14.2
|
||||
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: gaurkuma <gaurkuma@users.noreply.github.com>
|
||||
Date: Fri, 11 Aug 2017 08:53:35 -0700
|
||||
Subject: [PATCH] Allow longer SPA names in stats
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: gaurkuma <gauravk.18@gmail.com>
|
||||
Closes #641
|
||||
(cherry picked from commit cbf0dff3d8a13c2b4e547321ff2005055521e5ee)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/kstat.h | 2 +-
|
||||
module/spl/spl-kstat.c | 13 +++++++++----
|
||||
2 files changed, 10 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/include/sys/kstat.h b/include/sys/kstat.h
|
||||
index faf6b81..7862ab0 100644
|
||||
--- a/include/sys/kstat.h
|
||||
+++ b/include/sys/kstat.h
|
||||
@@ -32,7 +32,7 @@
|
||||
#include <sys/kmem.h>
|
||||
#include <sys/mutex.h>
|
||||
|
||||
-#define KSTAT_STRLEN 31
|
||||
+#define KSTAT_STRLEN 255
|
||||
#define KSTAT_RAW_MAX (128*1024)
|
||||
|
||||
/* For reference valid classes are:
|
||||
diff --git a/module/spl/spl-kstat.c b/module/spl/spl-kstat.c
|
||||
index e306915..ed52653 100644
|
||||
--- a/module/spl/spl-kstat.c
|
||||
+++ b/module/spl/spl-kstat.c
|
||||
@@ -614,21 +614,26 @@ kstat_detect_collision(kstat_t *ksp)
|
||||
{
|
||||
kstat_module_t *module;
|
||||
kstat_t *tmp;
|
||||
- char parent[KSTAT_STRLEN+1];
|
||||
+ char *parent;
|
||||
char *cp;
|
||||
|
||||
- (void) strlcpy(parent, ksp->ks_module, sizeof(parent));
|
||||
+ parent = kmem_asprintf("%s", ksp->ks_module);
|
||||
|
||||
- if ((cp = strrchr(parent, '/')) == NULL)
|
||||
+ if ((cp = strrchr(parent, '/')) == NULL) {
|
||||
+ strfree(parent);
|
||||
return (0);
|
||||
+ }
|
||||
|
||||
cp[0] = '\0';
|
||||
if ((module = kstat_find_module(parent)) != NULL) {
|
||||
list_for_each_entry(tmp, &module->ksm_kstat_list, ks_list)
|
||||
- if (strncmp(tmp->ks_name, cp+1, KSTAT_STRLEN) == 0)
|
||||
+ if (strncmp(tmp->ks_name, cp+1, KSTAT_STRLEN) == 0) {
|
||||
+ strfree(parent);
|
||||
return (EEXIST);
|
||||
+ }
|
||||
}
|
||||
|
||||
+ strfree(parent);
|
||||
return (0);
|
||||
}
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Thu, 21 Dec 2017 10:56:32 -0800
|
||||
Subject: [PATCH] Linux 4.15 compat: timer updates
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Use timer_setup() macro and new timeout function definition.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Closes #670
|
||||
Closes #671
|
||||
(cherry picked from commit 71513af020c0522560dc86668db46b49068787b3)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/spl/spl-taskq.c | 27 +++++++++++++++++++++++++--
|
||||
config/spl-build.m4 | 34 ++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 59 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c
|
||||
index 7cad9f7..89c53a5 100644
|
||||
--- a/module/spl/spl-taskq.c
|
||||
+++ b/module/spl/spl-taskq.c
|
||||
@@ -209,9 +209,9 @@ task_done(taskq_t *tq, taskq_ent_t *t)
|
||||
* add it to the priority list in order for immediate processing.
|
||||
*/
|
||||
static void
|
||||
-task_expire(unsigned long data)
|
||||
+task_expire_impl(taskq_ent_t *t)
|
||||
{
|
||||
- taskq_ent_t *w, *t = (taskq_ent_t *)data;
|
||||
+ taskq_ent_t *w;
|
||||
taskq_t *tq = t->tqent_taskq;
|
||||
struct list_head *l;
|
||||
unsigned long flags;
|
||||
@@ -245,6 +245,21 @@ task_expire(unsigned long data)
|
||||
wake_up(&tq->tq_work_waitq);
|
||||
}
|
||||
|
||||
+#ifdef HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
+static void
|
||||
+task_expire(struct timer_list *tl)
|
||||
+{
|
||||
+ taskq_ent_t *t = from_timer(t, tl, tqent_timer);
|
||||
+ task_expire_impl(t);
|
||||
+}
|
||||
+#else
|
||||
+static void
|
||||
+task_expire(unsigned long data)
|
||||
+{
|
||||
+ task_expire_impl((taskq_ent_t *)data);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Returns the lowest incomplete taskqid_t. The taskqid_t may
|
||||
* be queued on the pending list, on the priority list, on the
|
||||
@@ -590,7 +605,9 @@ taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t flags)
|
||||
t->tqent_func = func;
|
||||
t->tqent_arg = arg;
|
||||
t->tqent_taskq = tq;
|
||||
+#ifndef HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
t->tqent_timer.data = 0;
|
||||
+#endif
|
||||
t->tqent_timer.function = NULL;
|
||||
t->tqent_timer.expires = 0;
|
||||
t->tqent_birth = jiffies;
|
||||
@@ -640,7 +657,9 @@ taskq_dispatch_delay(taskq_t *tq, task_func_t func, void *arg,
|
||||
t->tqent_func = func;
|
||||
t->tqent_arg = arg;
|
||||
t->tqent_taskq = tq;
|
||||
+#ifndef HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
t->tqent_timer.data = (unsigned long)t;
|
||||
+#endif
|
||||
t->tqent_timer.function = task_expire;
|
||||
t->tqent_timer.expires = (unsigned long)expire_time;
|
||||
add_timer(&t->tqent_timer);
|
||||
@@ -732,7 +751,11 @@ taskq_init_ent(taskq_ent_t *t)
|
||||
{
|
||||
spin_lock_init(&t->tqent_lock);
|
||||
init_waitqueue_head(&t->tqent_waitq);
|
||||
+#ifdef HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
+ timer_setup(&t->tqent_timer, NULL, 0);
|
||||
+#else
|
||||
init_timer(&t->tqent_timer);
|
||||
+#endif
|
||||
INIT_LIST_HEAD(&t->tqent_list);
|
||||
t->tqent_id = 0;
|
||||
t->tqent_func = NULL;
|
||||
diff --git a/config/spl-build.m4 b/config/spl-build.m4
|
||||
index accf675..25013b5 100644
|
||||
--- a/config/spl-build.m4
|
||||
+++ b/config/spl-build.m4
|
||||
@@ -56,6 +56,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_WAIT_QUEUE_HEAD_ENTRY
|
||||
SPL_AC_KERNEL_WRITE
|
||||
SPL_AC_KERNEL_READ
|
||||
+ SPL_AC_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
])
|
||||
|
||||
AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
|
||||
@@ -1755,3 +1756,36 @@ AC_DEFUN([SPL_AC_KERNEL_READ], [
|
||||
])
|
||||
EXTRA_KCFLAGS="$tmp_flags"
|
||||
])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # 4.15 API change
|
||||
+dnl # https://lkml.org/lkml/2017/11/25/90
|
||||
+dnl # Check if timer_list.func get passed a timer_list or an unsigned long
|
||||
+dnl # (older kernels). Also sanity check the from_timer() and timer_setup()
|
||||
+dnl # macros are available as well, since they will be used in the same newer
|
||||
+dnl # kernels that support the new timer_list.func signature.
|
||||
+dnl #
|
||||
+AC_DEFUN([SPL_AC_KERNEL_TIMER_FUNCTION_TIMER_LIST], [
|
||||
+ AC_MSG_CHECKING([whether timer_list.function gets a timer_list])
|
||||
+ tmp_flags="$EXTRA_KCFLAGS"
|
||||
+ EXTRA_KCFLAGS="-Werror"
|
||||
+ SPL_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/timer.h>
|
||||
+ void task_expire(struct timer_list *tl) {}
|
||||
+ ],[
|
||||
+ #ifndef from_timer
|
||||
+ #error "No from_timer() macro"
|
||||
+ #endif
|
||||
+
|
||||
+ struct timer_list timer;
|
||||
+ timer.function = task_expire;
|
||||
+ timer_setup(&timer, NULL, 0);
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST, 1,
|
||||
+ [timer_list.function gets a timer_list])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+ EXTRA_KCFLAGS="$tmp_flags"
|
||||
+])
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Thu, 18 Jan 2018 19:14:18 +0100
|
||||
Subject: [PATCH] Fix Debian packaging on ARMv7/ARM64
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When building packages on Debian-based systems specify the target
|
||||
architecture used by 'alien' to convert .rpm packages into .deb: this
|
||||
avoids detecting an incorrect value which results in the following
|
||||
errors:
|
||||
|
||||
<package>.aarch64.rpm is for architecture aarch64 ; the package cannot be built on this system
|
||||
<package>.armv7l.rpm is for architecture armel ; the package cannot be built on this system
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes zfsonlinux/zfs#7046
|
||||
Closes #678
|
||||
(cherry picked from commit 9ee1fc8b4cb7fdcda88e161d9fc2bbe50427972c)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/deb.am | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/config/deb.am b/config/deb.am
|
||||
index e05a175..f745c91 100644
|
||||
--- a/config/deb.am
|
||||
+++ b/config/deb.am
|
||||
@@ -32,24 +32,27 @@ deb-kmod: deb-local rpm-kmod
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-kmod-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=kmod-$${name}*$${version}.$${arch}.rpm; \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb $$pkg1; \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch $$pkg1; \
|
||||
$(RM) $$pkg1
|
||||
|
||||
deb-dkms: deb-local rpm-dkms
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-dkms-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=$${name}-dkms-$${version}.$${arch}.rpm; \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb $$pkg1; \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch $$pkg1; \
|
||||
$(RM) $$pkg1
|
||||
|
||||
deb-utils: deb-local rpm-utils
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=$${name}-$${version}.$${arch}.rpm; \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb $$pkg1; \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch $$pkg1; \
|
||||
$(RM) $$pkg1
|
||||
|
||||
deb: deb-kmod deb-dkms deb-utils
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,527 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Fri, 27 Oct 2017 15:49:14 -0700
|
||||
Subject: [PATCH] Remove vn_rename and vn_remove
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Both vn_rename and vn_remove have been historically problematic
|
||||
to implement reliably. Rather than fixing them yet again they
|
||||
are being removed.
|
||||
|
||||
Reviewed-by: Arkadiusz Bubala <arkadiusz.bubala@open-e.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #648
|
||||
Closes #661
|
||||
(cherry picked from commit 1cb26f06524bdddef24352a3d9ac90a402294f2b)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/vnode.h | 2 -
|
||||
module/spl/spl-vnode.c | 217 ---------------------------------------------
|
||||
module/splat/splat-vnode.c | 96 --------------------
|
||||
config/spl-build.m4 | 101 ---------------------
|
||||
4 files changed, 416 deletions(-)
|
||||
|
||||
diff --git a/include/sys/vnode.h b/include/sys/vnode.h
|
||||
index 0b857d3..ad7f8f4 100644
|
||||
--- a/include/sys/vnode.h
|
||||
+++ b/include/sys/vnode.h
|
||||
@@ -177,8 +177,6 @@ extern int vn_rdwr(uio_rw_t uio, vnode_t *vp, void *addr, ssize_t len,
|
||||
extern int vn_close(vnode_t *vp, int flags, int x1, int x2, void *x3, void *x4);
|
||||
extern int vn_seek(vnode_t *vp, offset_t o, offset_t *op, void *ct);
|
||||
|
||||
-extern int vn_remove(const char *path, uio_seg_t seg, int flags);
|
||||
-extern int vn_rename(const char *path1, const char *path2, int x1);
|
||||
extern int vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4);
|
||||
extern int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4);
|
||||
extern int vn_space(vnode_t *vp, int cmd, struct flock *bfp, int flag,
|
||||
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
|
||||
index ca19d73..77bfb45 100644
|
||||
--- a/module/spl/spl-vnode.c
|
||||
+++ b/module/spl/spl-vnode.c
|
||||
@@ -269,223 +269,6 @@ vn_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, void *ct)
|
||||
}
|
||||
EXPORT_SYMBOL(vn_seek);
|
||||
|
||||
-/*
|
||||
- * spl_basename() takes a NULL-terminated string s as input containing a path.
|
||||
- * It returns a char pointer to a string and a length that describe the
|
||||
- * basename of the path. If the basename is not "." or "/", it will be an index
|
||||
- * into the string. While the string should be NULL terminated, the section
|
||||
- * referring to the basename is not. spl_basename is dual-licensed GPLv2+ and
|
||||
- * CC0. Anyone wishing to reuse it in another codebase may pick either license.
|
||||
- */
|
||||
-static void
|
||||
-spl_basename(const char *s, const char **str, int *len)
|
||||
-{
|
||||
- size_t i, end;
|
||||
-
|
||||
- ASSERT(str);
|
||||
- ASSERT(len);
|
||||
-
|
||||
- if (!s || !*s) {
|
||||
- *str = ".";
|
||||
- *len = 1;
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- i = strlen(s) - 1;
|
||||
-
|
||||
- while (i && s[i--] == '/');
|
||||
-
|
||||
- if (i == 0) {
|
||||
- *str = "/";
|
||||
- *len = 1;
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- end = i;
|
||||
-
|
||||
- for (end = i; i; i--) {
|
||||
- if (s[i] == '/') {
|
||||
- *str = &s[i+1];
|
||||
- *len = end - i + 1;
|
||||
- return;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- *str = s;
|
||||
- *len = end + 1;
|
||||
-}
|
||||
-
|
||||
-static struct dentry *
|
||||
-spl_kern_path_locked(const char *name, struct path *path)
|
||||
-{
|
||||
- struct path parent;
|
||||
- struct dentry *dentry;
|
||||
- const char *basename;
|
||||
- int len;
|
||||
- int rc;
|
||||
-
|
||||
- ASSERT(name);
|
||||
- ASSERT(path);
|
||||
-
|
||||
- spl_basename(name, &basename, &len);
|
||||
-
|
||||
- /* We do not accept "." or ".." */
|
||||
- if (len <= 2 && basename[0] == '.')
|
||||
- if (len == 1 || basename[1] == '.')
|
||||
- return (ERR_PTR(-EACCES));
|
||||
-
|
||||
- rc = kern_path(name, LOOKUP_PARENT, &parent);
|
||||
- if (rc)
|
||||
- return (ERR_PTR(rc));
|
||||
-
|
||||
- /* use I_MUTEX_PARENT because vfs_unlink needs it */
|
||||
- spl_inode_lock_nested(parent.dentry->d_inode, I_MUTEX_PARENT);
|
||||
-
|
||||
- dentry = lookup_one_len(basename, parent.dentry, len);
|
||||
- if (IS_ERR(dentry)) {
|
||||
- spl_inode_unlock(parent.dentry->d_inode);
|
||||
- path_put(&parent);
|
||||
- } else {
|
||||
- *path = parent;
|
||||
- }
|
||||
-
|
||||
- return (dentry);
|
||||
-}
|
||||
-
|
||||
-/* Based on do_unlinkat() from linux/fs/namei.c */
|
||||
-int
|
||||
-vn_remove(const char *path, uio_seg_t seg, int flags)
|
||||
-{
|
||||
- struct dentry *dentry;
|
||||
- struct path parent;
|
||||
- struct inode *inode = NULL;
|
||||
- int rc = 0;
|
||||
-
|
||||
- ASSERT(seg == UIO_SYSSPACE);
|
||||
- ASSERT(flags == RMFILE);
|
||||
-
|
||||
- dentry = spl_kern_path_locked(path, &parent);
|
||||
- rc = PTR_ERR(dentry);
|
||||
- if (!IS_ERR(dentry)) {
|
||||
- if (parent.dentry->d_name.name[parent.dentry->d_name.len]) {
|
||||
- rc = 0;
|
||||
- goto slashes;
|
||||
- }
|
||||
-
|
||||
- inode = dentry->d_inode;
|
||||
- if (inode) {
|
||||
- atomic_inc(&inode->i_count);
|
||||
- } else {
|
||||
- rc = 0;
|
||||
- goto slashes;
|
||||
- }
|
||||
-
|
||||
-#ifdef HAVE_2ARGS_VFS_UNLINK
|
||||
- rc = vfs_unlink(parent.dentry->d_inode, dentry);
|
||||
-#else
|
||||
- rc = vfs_unlink(parent.dentry->d_inode, dentry, NULL);
|
||||
-#endif /* HAVE_2ARGS_VFS_UNLINK */
|
||||
-exit1:
|
||||
- dput(dentry);
|
||||
- } else {
|
||||
- return (-rc);
|
||||
- }
|
||||
-
|
||||
- spl_inode_unlock(parent.dentry->d_inode);
|
||||
- if (inode)
|
||||
- iput(inode); /* truncate the inode here */
|
||||
-
|
||||
- path_put(&parent);
|
||||
- return (-rc);
|
||||
-
|
||||
-slashes:
|
||||
- rc = !dentry->d_inode ? -ENOENT :
|
||||
- S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR;
|
||||
- goto exit1;
|
||||
-} /* vn_remove() */
|
||||
-EXPORT_SYMBOL(vn_remove);
|
||||
-
|
||||
-/* Based on do_rename() from linux/fs/namei.c */
|
||||
-int
|
||||
-vn_rename(const char *oldname, const char *newname, int x1)
|
||||
-{
|
||||
- struct dentry *old_dir, *new_dir;
|
||||
- struct dentry *old_dentry, *new_dentry;
|
||||
- struct dentry *trap;
|
||||
- struct path old_parent, new_parent;
|
||||
- int rc = 0;
|
||||
-
|
||||
- old_dentry = spl_kern_path_locked(oldname, &old_parent);
|
||||
- if (IS_ERR(old_dentry)) {
|
||||
- rc = PTR_ERR(old_dentry);
|
||||
- goto exit;
|
||||
- }
|
||||
-
|
||||
- spl_inode_unlock(old_parent.dentry->d_inode);
|
||||
-
|
||||
- new_dentry = spl_kern_path_locked(newname, &new_parent);
|
||||
- if (IS_ERR(new_dentry)) {
|
||||
- rc = PTR_ERR(new_dentry);
|
||||
- goto exit2;
|
||||
- }
|
||||
-
|
||||
- spl_inode_unlock(new_parent.dentry->d_inode);
|
||||
-
|
||||
- rc = -EXDEV;
|
||||
- if (old_parent.mnt != new_parent.mnt)
|
||||
- goto exit3;
|
||||
-
|
||||
- old_dir = old_parent.dentry;
|
||||
- new_dir = new_parent.dentry;
|
||||
- trap = lock_rename(new_dir, old_dir);
|
||||
-
|
||||
- /* source should not be ancestor of target */
|
||||
- rc = -EINVAL;
|
||||
- if (old_dentry == trap)
|
||||
- goto exit4;
|
||||
-
|
||||
- /* target should not be an ancestor of source */
|
||||
- rc = -ENOTEMPTY;
|
||||
- if (new_dentry == trap)
|
||||
- goto exit4;
|
||||
-
|
||||
- /* source must exist */
|
||||
- rc = -ENOENT;
|
||||
- if (!old_dentry->d_inode)
|
||||
- goto exit4;
|
||||
-
|
||||
- /* unless the source is a directory trailing slashes give -ENOTDIR */
|
||||
- if (!S_ISDIR(old_dentry->d_inode->i_mode)) {
|
||||
- rc = -ENOTDIR;
|
||||
- if (old_dentry->d_name.name[old_dentry->d_name.len])
|
||||
- goto exit4;
|
||||
- if (new_dentry->d_name.name[new_dentry->d_name.len])
|
||||
- goto exit4;
|
||||
- }
|
||||
-
|
||||
-#if defined(HAVE_4ARGS_VFS_RENAME)
|
||||
- rc = vfs_rename(old_dir->d_inode, old_dentry,
|
||||
- new_dir->d_inode, new_dentry);
|
||||
-#elif defined(HAVE_5ARGS_VFS_RENAME)
|
||||
- rc = vfs_rename(old_dir->d_inode, old_dentry,
|
||||
- new_dir->d_inode, new_dentry, NULL);
|
||||
-#else
|
||||
- rc = vfs_rename(old_dir->d_inode, old_dentry,
|
||||
- new_dir->d_inode, new_dentry, NULL, 0);
|
||||
-#endif
|
||||
-exit4:
|
||||
- unlock_rename(new_dir, old_dir);
|
||||
-exit3:
|
||||
- dput(new_dentry);
|
||||
- path_put(&new_parent);
|
||||
-exit2:
|
||||
- dput(old_dentry);
|
||||
- path_put(&old_parent);
|
||||
-exit:
|
||||
- return (-rc);
|
||||
-}
|
||||
-EXPORT_SYMBOL(vn_rename);
|
||||
-
|
||||
int
|
||||
vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4)
|
||||
{
|
||||
diff --git a/module/splat/splat-vnode.c b/module/splat/splat-vnode.c
|
||||
index ad69cf6..9160003 100644
|
||||
--- a/module/splat/splat-vnode.c
|
||||
+++ b/module/splat/splat-vnode.c
|
||||
@@ -42,10 +42,6 @@
|
||||
#define SPLAT_VNODE_TEST3_NAME "vn_rdwr"
|
||||
#define SPLAT_VNODE_TEST3_DESC "Vn_rdwrt Test"
|
||||
|
||||
-#define SPLAT_VNODE_TEST4_ID 0x0904
|
||||
-#define SPLAT_VNODE_TEST4_NAME "vn_rename"
|
||||
-#define SPLAT_VNODE_TEST4_DESC "Vn_rename Test"
|
||||
-
|
||||
#define SPLAT_VNODE_TEST5_ID 0x0905
|
||||
#define SPLAT_VNODE_TEST5_NAME "vn_getattr"
|
||||
#define SPLAT_VNODE_TEST5_DESC "Vn_getattr Test"
|
||||
@@ -218,94 +214,10 @@ splat_vnode_test3(struct file *file, void *arg)
|
||||
|
||||
out:
|
||||
VOP_CLOSE(vp, 0, 0, 0, 0, 0);
|
||||
- vn_remove(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE, RMFILE);
|
||||
|
||||
return -rc;
|
||||
} /* splat_vnode_test3() */
|
||||
|
||||
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
|
||||
-static int
|
||||
-splat_vnode_test4(struct file *file, void *arg)
|
||||
-{
|
||||
- vnode_t *vp;
|
||||
- char buf1[32] = "SPL VNode Interface Test File\n";
|
||||
- char buf2[32] = "";
|
||||
- int rc;
|
||||
-
|
||||
- if ((rc = splat_vnode_unlink_all(file, arg, SPLAT_VNODE_TEST4_NAME)))
|
||||
- return rc;
|
||||
-
|
||||
- if ((rc = vn_open(SPLAT_VNODE_TEST_FILE_RW1, UIO_SYSSPACE,
|
||||
- FWRITE | FREAD | FCREAT | FEXCL, 0644, &vp, 0, 0))) {
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
|
||||
- "Failed to vn_open test file: %s (%d)\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW1, rc);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- rc = vn_rdwr(UIO_WRITE, vp, buf1, strlen(buf1), 0,
|
||||
- UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
|
||||
- if (rc) {
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
|
||||
- "Failed vn_rdwr write of test file: %s (%d)\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW1, rc);
|
||||
- goto out2;
|
||||
- }
|
||||
-
|
||||
- VOP_CLOSE(vp, 0, 0, 0, 0, 0);
|
||||
-
|
||||
- rc = vn_rename(SPLAT_VNODE_TEST_FILE_RW1,SPLAT_VNODE_TEST_FILE_RW2,0);
|
||||
- if (rc) {
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME, "Failed vn_rename "
|
||||
- "%s -> %s (%d)\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW1,
|
||||
- SPLAT_VNODE_TEST_FILE_RW2, rc);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if ((rc = vn_open(SPLAT_VNODE_TEST_FILE_RW2, UIO_SYSSPACE,
|
||||
- FREAD | FEXCL, 0644, &vp, 0, 0))) {
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
|
||||
- "Failed to vn_open test file: %s (%d)\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW2, rc);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- rc = vn_rdwr(UIO_READ, vp, buf2, strlen(buf1), 0,
|
||||
- UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
|
||||
- if (rc) {
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
|
||||
- "Failed vn_rdwr read of test file: %s (%d)\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW2, rc);
|
||||
- goto out2;
|
||||
- }
|
||||
-
|
||||
- if (strncmp(buf1, buf2, strlen(buf1))) {
|
||||
- rc = EINVAL;
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
|
||||
- "Failed strncmp data written does not match "
|
||||
- "data read\nWrote: %sRead: %s\n", buf1, buf2);
|
||||
- goto out2;
|
||||
- }
|
||||
-
|
||||
- rc = 0;
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME, "Wrote to %s: %s",
|
||||
- SPLAT_VNODE_TEST_FILE_RW1, buf1);
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME, "Read from %s: %s",
|
||||
- SPLAT_VNODE_TEST_FILE_RW2, buf2);
|
||||
- splat_vprint(file, SPLAT_VNODE_TEST4_NAME, "Successfully renamed "
|
||||
- "test file %s -> %s and verified data pattern\n",
|
||||
- SPLAT_VNODE_TEST_FILE_RW1, SPLAT_VNODE_TEST_FILE_RW2);
|
||||
-out2:
|
||||
- VOP_CLOSE(vp, 0, 0, 0, 0, 0);
|
||||
-out:
|
||||
- vn_remove(SPLAT_VNODE_TEST_FILE_RW1, UIO_SYSSPACE, RMFILE);
|
||||
- vn_remove(SPLAT_VNODE_TEST_FILE_RW2, UIO_SYSSPACE, RMFILE);
|
||||
-
|
||||
- return -rc;
|
||||
-} /* splat_vnode_test4() */
|
||||
-#endif
|
||||
-
|
||||
static int
|
||||
splat_vnode_test5(struct file *file, void *arg)
|
||||
{
|
||||
@@ -387,7 +299,6 @@ splat_vnode_test6(struct file *file, void *arg)
|
||||
"fsync'ed test file %s\n", SPLAT_VNODE_TEST_FILE_RW);
|
||||
out:
|
||||
VOP_CLOSE(vp, 0, 0, 0, 0, 0);
|
||||
- vn_remove(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE, RMFILE);
|
||||
|
||||
return -rc;
|
||||
} /* splat_vnode_test6() */
|
||||
@@ -415,10 +326,6 @@ splat_vnode_init(void)
|
||||
SPLAT_VNODE_TEST2_ID, splat_vnode_test2);
|
||||
splat_test_init(sub, SPLAT_VNODE_TEST3_NAME, SPLAT_VNODE_TEST3_DESC,
|
||||
SPLAT_VNODE_TEST3_ID, splat_vnode_test3);
|
||||
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
|
||||
- splat_test_init(sub, SPLAT_VNODE_TEST4_NAME, SPLAT_VNODE_TEST4_DESC,
|
||||
- SPLAT_VNODE_TEST4_ID, splat_vnode_test4);
|
||||
-#endif
|
||||
splat_test_init(sub, SPLAT_VNODE_TEST5_NAME, SPLAT_VNODE_TEST5_DESC,
|
||||
SPLAT_VNODE_TEST5_ID, splat_vnode_test5);
|
||||
splat_test_init(sub, SPLAT_VNODE_TEST6_NAME, SPLAT_VNODE_TEST6_DESC,
|
||||
@@ -434,9 +341,6 @@ splat_vnode_fini(splat_subsystem_t *sub)
|
||||
|
||||
splat_test_fini(sub, SPLAT_VNODE_TEST6_ID);
|
||||
splat_test_fini(sub, SPLAT_VNODE_TEST5_ID);
|
||||
-#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,1,0)
|
||||
- splat_test_fini(sub, SPLAT_VNODE_TEST4_ID);
|
||||
-#endif
|
||||
splat_test_fini(sub, SPLAT_VNODE_TEST3_ID);
|
||||
splat_test_fini(sub, SPLAT_VNODE_TEST2_ID);
|
||||
splat_test_fini(sub, SPLAT_VNODE_TEST1_ID);
|
||||
diff --git a/config/spl-build.m4 b/config/spl-build.m4
|
||||
index 25013b5..926abd5 100644
|
||||
--- a/config/spl-build.m4
|
||||
+++ b/config/spl-build.m4
|
||||
@@ -27,8 +27,6 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_CONFIG_TRIM_UNUSED_KSYMS
|
||||
SPL_AC_PDE_DATA
|
||||
SPL_AC_SET_FS_PWD_WITH_CONST
|
||||
- SPL_AC_2ARGS_VFS_UNLINK
|
||||
- SPL_AC_4ARGS_VFS_RENAME
|
||||
SPL_AC_2ARGS_VFS_FSYNC
|
||||
SPL_AC_INODE_TRUNCATE_RANGE
|
||||
SPL_AC_FS_STRUCT_SPINLOCK
|
||||
@@ -936,105 +934,6 @@ AC_DEFUN([SPL_AC_SET_FS_PWD_WITH_CONST],
|
||||
EXTRA_KCFLAGS="$tmp_flags"
|
||||
])
|
||||
|
||||
-dnl #
|
||||
-dnl # 3.13 API change
|
||||
-dnl # vfs_unlink() updated to take a third delegated_inode argument.
|
||||
-dnl #
|
||||
-AC_DEFUN([SPL_AC_2ARGS_VFS_UNLINK],
|
||||
- [AC_MSG_CHECKING([whether vfs_unlink() wants 2 args])
|
||||
- SPL_LINUX_TRY_COMPILE([
|
||||
- #include <linux/fs.h>
|
||||
- ],[
|
||||
- vfs_unlink((struct inode *) NULL, (struct dentry *) NULL);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1,
|
||||
- [vfs_unlink() wants 2 args])
|
||||
- ],[
|
||||
- AC_MSG_RESULT(no)
|
||||
- dnl #
|
||||
- dnl # Linux 3.13 API change
|
||||
- dnl # Added delegated inode
|
||||
- dnl #
|
||||
- AC_MSG_CHECKING([whether vfs_unlink() wants 3 args])
|
||||
- SPL_LINUX_TRY_COMPILE([
|
||||
- #include <linux/fs.h>
|
||||
- ],[
|
||||
- vfs_unlink((struct inode *) NULL,
|
||||
- (struct dentry *) NULL,
|
||||
- (struct inode **) NULL);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(HAVE_3ARGS_VFS_UNLINK, 1,
|
||||
- [vfs_unlink() wants 3 args])
|
||||
- ],[
|
||||
- AC_MSG_ERROR(no)
|
||||
- ])
|
||||
-
|
||||
- ])
|
||||
-])
|
||||
-
|
||||
-dnl #
|
||||
-dnl # 3.13 and 3.15 API changes
|
||||
-dnl # Added delegated inode and flags argument.
|
||||
-dnl #
|
||||
-AC_DEFUN([SPL_AC_4ARGS_VFS_RENAME],
|
||||
- [AC_MSG_CHECKING([whether vfs_rename() wants 4 args])
|
||||
- SPL_LINUX_TRY_COMPILE([
|
||||
- #include <linux/fs.h>
|
||||
- ],[
|
||||
- vfs_rename((struct inode *) NULL, (struct dentry *) NULL,
|
||||
- (struct inode *) NULL, (struct dentry *) NULL);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1,
|
||||
- [vfs_rename() wants 4 args])
|
||||
- ],[
|
||||
- AC_MSG_RESULT(no)
|
||||
- dnl #
|
||||
- dnl # Linux 3.13 API change
|
||||
- dnl # Added delegated inode
|
||||
- dnl #
|
||||
- AC_MSG_CHECKING([whether vfs_rename() wants 5 args])
|
||||
- SPL_LINUX_TRY_COMPILE([
|
||||
- #include <linux/fs.h>
|
||||
- ],[
|
||||
- vfs_rename((struct inode *) NULL,
|
||||
- (struct dentry *) NULL,
|
||||
- (struct inode *) NULL,
|
||||
- (struct dentry *) NULL,
|
||||
- (struct inode **) NULL);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(HAVE_5ARGS_VFS_RENAME, 1,
|
||||
- [vfs_rename() wants 5 args])
|
||||
- ],[
|
||||
- AC_MSG_RESULT(no)
|
||||
- dnl #
|
||||
- dnl # Linux 3.15 API change
|
||||
- dnl # Added flags
|
||||
- dnl #
|
||||
- AC_MSG_CHECKING([whether vfs_rename() wants 6 args])
|
||||
- SPL_LINUX_TRY_COMPILE([
|
||||
- #include <linux/fs.h>
|
||||
- ],[
|
||||
- vfs_rename((struct inode *) NULL,
|
||||
- (struct dentry *) NULL,
|
||||
- (struct inode *) NULL,
|
||||
- (struct dentry *) NULL,
|
||||
- (struct inode **) NULL,
|
||||
- (unsigned int) 0);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(HAVE_6ARGS_VFS_RENAME, 1,
|
||||
- [vfs_rename() wants 6 args])
|
||||
- ],[
|
||||
- AC_MSG_ERROR(no)
|
||||
- ])
|
||||
- ])
|
||||
- ])
|
||||
-])
|
||||
-
|
||||
dnl #
|
||||
dnl # 2.6.36 API change,
|
||||
dnl # The 'struct fs_struct->lock' was changed from a rwlock_t to
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: James Cowgill <jcowgill@users.noreply.github.com>
|
||||
Date: Mon, 30 Oct 2017 18:16:56 +0000
|
||||
Subject: [PATCH] Remove all spin_is_locked calls
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On systems with CONFIG_SMP turned off, spin_is_locked always returns
|
||||
false causing these assertions to fail. Remove them as suggested in
|
||||
zfsonlinux/zfs#6558.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: James Cowgill <james.cowgill@mips.com>
|
||||
Closes #665
|
||||
(cherry picked from commit 9e573b7f9a5cf3e1cb6bb1b66bc35d5bb93cfaa9)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/spl/spl-kmem-cache.c | 4 ----
|
||||
module/spl/spl-taskq.c | 13 -------------
|
||||
module/spl/spl-tsd.c | 1 -
|
||||
module/spl/spl-vnode.c | 2 --
|
||||
4 files changed, 20 deletions(-)
|
||||
|
||||
diff --git a/module/spl/spl-kmem-cache.c b/module/spl/spl-kmem-cache.c
|
||||
index 45576b9..3668669 100644
|
||||
--- a/module/spl/spl-kmem-cache.c
|
||||
+++ b/module/spl/spl-kmem-cache.c
|
||||
@@ -382,7 +382,6 @@ spl_slab_free(spl_kmem_slab_t *sks,
|
||||
|
||||
skc = sks->sks_cache;
|
||||
ASSERT(skc->skc_magic == SKC_MAGIC);
|
||||
- ASSERT(spin_is_locked(&skc->skc_lock));
|
||||
|
||||
/*
|
||||
* Update slab/objects counters in the cache, then remove the
|
||||
@@ -583,7 +582,6 @@ __spl_cache_flush(spl_kmem_cache_t *skc, spl_kmem_magazine_t *skm, int flush)
|
||||
|
||||
ASSERT(skc->skc_magic == SKC_MAGIC);
|
||||
ASSERT(skm->skm_magic == SKM_MAGIC);
|
||||
- ASSERT(spin_is_locked(&skc->skc_lock));
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
spl_cache_shrink(skc, skm->skm_objs[i]);
|
||||
@@ -1125,7 +1123,6 @@ spl_cache_obj(spl_kmem_cache_t *skc, spl_kmem_slab_t *sks)
|
||||
|
||||
ASSERT(skc->skc_magic == SKC_MAGIC);
|
||||
ASSERT(sks->sks_magic == SKS_MAGIC);
|
||||
- ASSERT(spin_is_locked(&skc->skc_lock));
|
||||
|
||||
sko = list_entry(sks->sks_free_list.next, spl_kmem_obj_t, sko_list);
|
||||
ASSERT(sko->sko_magic == SKO_MAGIC);
|
||||
@@ -1396,7 +1393,6 @@ spl_cache_shrink(spl_kmem_cache_t *skc, void *obj)
|
||||
spl_kmem_obj_t *sko = NULL;
|
||||
|
||||
ASSERT(skc->skc_magic == SKC_MAGIC);
|
||||
- ASSERT(spin_is_locked(&skc->skc_lock));
|
||||
|
||||
sko = spl_sko_from_obj(skc, obj);
|
||||
ASSERT(sko->sko_magic == SKO_MAGIC);
|
||||
diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c
|
||||
index 89c53a5..ae26bdb 100644
|
||||
--- a/module/spl/spl-taskq.c
|
||||
+++ b/module/spl/spl-taskq.c
|
||||
@@ -103,7 +103,6 @@ task_alloc(taskq_t *tq, uint_t flags, unsigned long *irqflags)
|
||||
int count = 0;
|
||||
|
||||
ASSERT(tq);
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
retry:
|
||||
/* Acquire taskq_ent_t's from free list if available */
|
||||
if (!list_empty(&tq->tq_free_list) && !(flags & TQ_NEW)) {
|
||||
@@ -168,7 +167,6 @@ task_free(taskq_t *tq, taskq_ent_t *t)
|
||||
{
|
||||
ASSERT(tq);
|
||||
ASSERT(t);
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
ASSERT(list_empty(&t->tqent_list));
|
||||
ASSERT(!timer_pending(&t->tqent_timer));
|
||||
|
||||
@@ -185,7 +183,6 @@ task_done(taskq_t *tq, taskq_ent_t *t)
|
||||
{
|
||||
ASSERT(tq);
|
||||
ASSERT(t);
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
|
||||
/* Wake tasks blocked in taskq_wait_id() */
|
||||
wake_up_all(&t->tqent_waitq);
|
||||
@@ -274,7 +271,6 @@ taskq_lowest_id(taskq_t *tq)
|
||||
taskq_thread_t *tqt;
|
||||
|
||||
ASSERT(tq);
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
|
||||
if (!list_empty(&tq->tq_pend_list)) {
|
||||
t = list_entry(tq->tq_pend_list.next, taskq_ent_t, tqent_list);
|
||||
@@ -312,7 +308,6 @@ taskq_insert_in_order(taskq_t *tq, taskq_thread_t *tqt)
|
||||
|
||||
ASSERT(tq);
|
||||
ASSERT(tqt);
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
|
||||
list_for_each_prev(l, &tq->tq_active_list) {
|
||||
w = list_entry(l, taskq_thread_t, tqt_active_list);
|
||||
@@ -335,8 +330,6 @@ taskq_find_list(taskq_t *tq, struct list_head *lh, taskqid_t id)
|
||||
struct list_head *l;
|
||||
taskq_ent_t *t;
|
||||
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
-
|
||||
list_for_each(l, lh) {
|
||||
t = list_entry(l, taskq_ent_t, tqent_list);
|
||||
|
||||
@@ -363,8 +356,6 @@ taskq_find(taskq_t *tq, taskqid_t id)
|
||||
struct list_head *l;
|
||||
taskq_ent_t *t;
|
||||
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
-
|
||||
t = taskq_find_list(tq, &tq->tq_delay_list, id);
|
||||
if (t)
|
||||
return (t);
|
||||
@@ -774,8 +765,6 @@ taskq_next_ent(taskq_t *tq)
|
||||
{
|
||||
struct list_head *list;
|
||||
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
-
|
||||
if (!list_empty(&tq->tq_prio_list))
|
||||
list = &tq->tq_prio_list;
|
||||
else if (!list_empty(&tq->tq_pend_list))
|
||||
@@ -840,8 +829,6 @@ taskq_thread_spawn(taskq_t *tq)
|
||||
static int
|
||||
taskq_thread_should_stop(taskq_t *tq, taskq_thread_t *tqt)
|
||||
{
|
||||
- ASSERT(spin_is_locked(&tq->tq_lock));
|
||||
-
|
||||
if (!(tq->tq_flags & TASKQ_DYNAMIC))
|
||||
return (0);
|
||||
|
||||
diff --git a/module/spl/spl-tsd.c b/module/spl/spl-tsd.c
|
||||
index bf82350..4c80029 100644
|
||||
--- a/module/spl/spl-tsd.c
|
||||
+++ b/module/spl/spl-tsd.c
|
||||
@@ -315,7 +315,6 @@ tsd_hash_add_pid(tsd_hash_table_t *table, pid_t pid)
|
||||
static void
|
||||
tsd_hash_del(tsd_hash_table_t *table, tsd_hash_entry_t *entry)
|
||||
{
|
||||
- ASSERT(spin_is_locked(&table->ht_lock));
|
||||
hlist_del(&entry->he_list);
|
||||
list_del_init(&entry->he_key_list);
|
||||
list_del_init(&entry->he_pid_list);
|
||||
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
|
||||
index 77bfb45..a804e10 100644
|
||||
--- a/module/spl/spl-vnode.c
|
||||
+++ b/module/spl/spl-vnode.c
|
||||
@@ -414,8 +414,6 @@ file_find(int fd, struct task_struct *task)
|
||||
{
|
||||
file_t *fp;
|
||||
|
||||
- ASSERT(spin_is_locked(&vn_file_lock));
|
||||
-
|
||||
list_for_each_entry(fp, &vn_file_list, f_list) {
|
||||
if (fd == fp->f_fd && fp->f_task == task) {
|
||||
ASSERT(atomic_read(&fp->f_ref) != 0);
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Wed, 24 Jan 2018 11:33:47 -0800
|
||||
Subject: [PATCH] Add cv_timedwait_io()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add missing helper function cv_timedwait_io(), it should be used
|
||||
when waiting on IO with a specified timeout.
|
||||
|
||||
Reviewed-by: Tim Chase <tim@chase2k.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #674
|
||||
(cherry picked from commit ba003d46e3269ead9128b537f8f31c44bc3a974f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/condvar.h | 2 ++
|
||||
module/spl/spl-condvar.c | 58 +++++++++++++++++++++++++++++++++++++++++-------
|
||||
config/spl-build.m4 | 21 ++++++++++++++++++
|
||||
3 files changed, 73 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/include/sys/condvar.h b/include/sys/condvar.h
|
||||
index 5479e75..5fcc906 100644
|
||||
--- a/include/sys/condvar.h
|
||||
+++ b/include/sys/condvar.h
|
||||
@@ -56,6 +56,7 @@ extern void __cv_wait(kcondvar_t *, kmutex_t *);
|
||||
extern void __cv_wait_io(kcondvar_t *, kmutex_t *);
|
||||
extern void __cv_wait_sig(kcondvar_t *, kmutex_t *);
|
||||
extern clock_t __cv_timedwait(kcondvar_t *, kmutex_t *, clock_t);
|
||||
+extern clock_t __cv_timedwait_io(kcondvar_t *, kmutex_t *, clock_t);
|
||||
extern clock_t __cv_timedwait_sig(kcondvar_t *, kmutex_t *, clock_t);
|
||||
extern clock_t cv_timedwait_hires(kcondvar_t *, kmutex_t *, hrtime_t,
|
||||
hrtime_t res, int flag);
|
||||
@@ -71,6 +72,7 @@ extern void __cv_broadcast(kcondvar_t *c);
|
||||
#define cv_wait_sig(cvp, mp) __cv_wait_sig(cvp, mp)
|
||||
#define cv_wait_interruptible(cvp, mp) cv_wait_sig(cvp, mp)
|
||||
#define cv_timedwait(cvp, mp, t) __cv_timedwait(cvp, mp, t)
|
||||
+#define cv_timedwait_io(cvp, mp, t) __cv_timedwait_io(cvp, mp, t)
|
||||
#define cv_timedwait_sig(cvp, mp, t) __cv_timedwait_sig(cvp, mp, t)
|
||||
#define cv_timedwait_interruptible(cvp, mp, t) cv_timedwait_sig(cvp, mp, t)
|
||||
#define cv_signal(cvp) __cv_signal(cvp)
|
||||
diff --git a/module/spl/spl-condvar.c b/module/spl/spl-condvar.c
|
||||
index 80c2ef0..4778fb2 100644
|
||||
--- a/module/spl/spl-condvar.c
|
||||
+++ b/module/spl/spl-condvar.c
|
||||
@@ -136,6 +136,13 @@ __cv_wait(kcondvar_t *cvp, kmutex_t *mp)
|
||||
}
|
||||
EXPORT_SYMBOL(__cv_wait);
|
||||
|
||||
+void
|
||||
+__cv_wait_io(kcondvar_t *cvp, kmutex_t *mp)
|
||||
+{
|
||||
+ cv_wait_common(cvp, mp, TASK_UNINTERRUPTIBLE, 1);
|
||||
+}
|
||||
+EXPORT_SYMBOL(__cv_wait_io);
|
||||
+
|
||||
void
|
||||
__cv_wait_sig(kcondvar_t *cvp, kmutex_t *mp)
|
||||
{
|
||||
@@ -143,12 +150,34 @@ __cv_wait_sig(kcondvar_t *cvp, kmutex_t *mp)
|
||||
}
|
||||
EXPORT_SYMBOL(__cv_wait_sig);
|
||||
|
||||
-void
|
||||
-__cv_wait_io(kcondvar_t *cvp, kmutex_t *mp)
|
||||
+#if defined(HAVE_IO_SCHEDULE_TIMEOUT)
|
||||
+#define spl_io_schedule_timeout(t) io_schedule_timeout(t)
|
||||
+#else
|
||||
+static void
|
||||
+__cv_wakeup(unsigned long data)
|
||||
{
|
||||
- cv_wait_common(cvp, mp, TASK_UNINTERRUPTIBLE, 1);
|
||||
+ wake_up_process((struct task_struct *)data);
|
||||
}
|
||||
-EXPORT_SYMBOL(__cv_wait_io);
|
||||
+
|
||||
+static long
|
||||
+spl_io_schedule_timeout(long time_left)
|
||||
+{
|
||||
+ long expire_time = jiffies + time_left;
|
||||
+ struct timer_list timer;
|
||||
+
|
||||
+ init_timer(&timer);
|
||||
+ setup_timer(&timer, __cv_wakeup, (unsigned long)current);
|
||||
+ timer.expires = expire_time;
|
||||
+ add_timer(&timer);
|
||||
+
|
||||
+ io_schedule();
|
||||
+
|
||||
+ del_timer_sync(&timer);
|
||||
+ time_left = expire_time - jiffies;
|
||||
+
|
||||
+ return (time_left < 0 ? 0 : time_left);
|
||||
+}
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* 'expire_time' argument is an absolute wall clock time in jiffies.
|
||||
@@ -156,7 +185,7 @@ EXPORT_SYMBOL(__cv_wait_io);
|
||||
*/
|
||||
static clock_t
|
||||
__cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
|
||||
- int state)
|
||||
+ int state, int io)
|
||||
{
|
||||
DEFINE_WAIT(wait);
|
||||
kmutex_t *m;
|
||||
@@ -188,7 +217,10 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
|
||||
* race where 'cvp->cv_waiters > 0' but the list is empty.
|
||||
*/
|
||||
mutex_exit(mp);
|
||||
- time_left = schedule_timeout(time_left);
|
||||
+ if (io)
|
||||
+ time_left = spl_io_schedule_timeout(time_left);
|
||||
+ else
|
||||
+ time_left = schedule_timeout(time_left);
|
||||
|
||||
/* No more waiters a different mutex could be used */
|
||||
if (atomic_dec_and_test(&cvp->cv_waiters)) {
|
||||
@@ -214,14 +246,24 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
|
||||
clock_t
|
||||
__cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time)
|
||||
{
|
||||
- return (__cv_timedwait_common(cvp, mp, exp_time, TASK_UNINTERRUPTIBLE));
|
||||
+ return (__cv_timedwait_common(cvp, mp, exp_time,
|
||||
+ TASK_UNINTERRUPTIBLE, 0));
|
||||
}
|
||||
EXPORT_SYMBOL(__cv_timedwait);
|
||||
|
||||
+clock_t
|
||||
+__cv_timedwait_io(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time)
|
||||
+{
|
||||
+ return (__cv_timedwait_common(cvp, mp, exp_time,
|
||||
+ TASK_UNINTERRUPTIBLE, 1));
|
||||
+}
|
||||
+EXPORT_SYMBOL(__cv_timedwait_io);
|
||||
+
|
||||
clock_t
|
||||
__cv_timedwait_sig(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time)
|
||||
{
|
||||
- return (__cv_timedwait_common(cvp, mp, exp_time, TASK_INTERRUPTIBLE));
|
||||
+ return (__cv_timedwait_common(cvp, mp, exp_time,
|
||||
+ TASK_INTERRUPTIBLE, 0));
|
||||
}
|
||||
EXPORT_SYMBOL(__cv_timedwait_sig);
|
||||
|
||||
diff --git a/config/spl-build.m4 b/config/spl-build.m4
|
||||
index 926abd5..afc8de6 100644
|
||||
--- a/config/spl-build.m4
|
||||
+++ b/config/spl-build.m4
|
||||
@@ -52,6 +52,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_KMEM_CACHE_CREATE_USERCOPY
|
||||
SPL_AC_WAIT_QUEUE_ENTRY_T
|
||||
SPL_AC_WAIT_QUEUE_HEAD_ENTRY
|
||||
+ SPL_AC_IO_SCHEDULE_TIMEOUT
|
||||
SPL_AC_KERNEL_WRITE
|
||||
SPL_AC_KERNEL_READ
|
||||
SPL_AC_KERNEL_TIMER_FUNCTION_TIMER_LIST
|
||||
@@ -1598,6 +1599,26 @@ AC_DEFUN([SPL_AC_WAIT_QUEUE_HEAD_ENTRY], [
|
||||
])
|
||||
])
|
||||
|
||||
+dnl #
|
||||
+dnl # 3.19 API change
|
||||
+dnl # The io_schedule_timeout() function is present in all 2.6.32 kernels
|
||||
+dnl # but it was not exported until Linux 3.19. The RHEL 7.x kernels which
|
||||
+dnl # are based on a 3.10 kernel do export this symbol.
|
||||
+dnl #
|
||||
+AC_DEFUN([SPL_AC_IO_SCHEDULE_TIMEOUT], [
|
||||
+ AC_MSG_CHECKING([whether io_schedule_timeout() is available])
|
||||
+ SPL_LINUX_TRY_COMPILE_SYMBOL([
|
||||
+ #include <linux/sched.h>
|
||||
+ ], [
|
||||
+ (void) io_schedule_timeout(1);
|
||||
+ ], [io_schedule_timeout], [], [
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(HAVE_IO_SCHEDULE_TIMEOUT, 1, [yes])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
+
|
||||
dnl #
|
||||
dnl # 4.14 API change
|
||||
dnl # kernel_write() which was introduced in 3.9 was updated to take
|
||||
--
|
||||
2.14.2
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: DeHackEd <DeHackEd@users.noreply.github.com>
|
||||
Date: Wed, 21 Feb 2018 17:54:26 -0500
|
||||
Subject: [PATCH] Fix multiple evaluations of VERIFY() and ASSERT() on failures
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: DHE <git@dehacked.net>
|
||||
Closes #684
|
||||
Closes #685
|
||||
(cherry picked from commit 610988f2dbf0e1c5811e6115d7ff8948b90a660e)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/debug.h | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/include/sys/debug.h b/include/sys/debug.h
|
||||
index 6d683c2..b523ea1 100644
|
||||
--- a/include/sys/debug.h
|
||||
+++ b/include/sys/debug.h
|
||||
@@ -63,12 +63,15 @@ void spl_dumpstack(void);
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"%s", "VERIFY(" #cond ") failed\n"))
|
||||
|
||||
-#define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE, FMT, CAST) \
|
||||
- (void) ((!((TYPE)(LEFT) OP (TYPE)(RIGHT))) && \
|
||||
- spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
- "VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
- "failed (" FMT " " #OP " " FMT ")\n", \
|
||||
- CAST (LEFT), CAST (RIGHT)))
|
||||
+#define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE, FMT, CAST) do { \
|
||||
+ TYPE _verify3_left = (TYPE)(LEFT); \
|
||||
+ TYPE _verify3_right = (TYPE)(RIGHT); \
|
||||
+ if (!(_verify3_left OP _verify3_right)) \
|
||||
+ spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
+ "VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
+ "failed (" FMT " " #OP " " FMT ")\n", \
|
||||
+ CAST (_verify3_left), CAST (_verify3_right)); \
|
||||
+ } while (0)
|
||||
|
||||
#define VERIFY3B(x,y,z) VERIFY3_IMPL(x, y, z, boolean_t, "%d", (boolean_t))
|
||||
#define VERIFY3S(x,y,z) VERIFY3_IMPL(x, y, z, int64_t, "%lld", (long long))
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
|
||||
Date: Mon, 19 Feb 2018 19:23:53 +0900
|
||||
Subject: [PATCH] Staticize kstat_default_update()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is only used via ->ks_update of `kstat_t *`.
|
||||
This isn't exported nor do headers have its prototype.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
|
||||
Closes #686
|
||||
(cherry picked from commit 76ede57c7d927f34fcb5df30c3e7f2b2254ff5ed)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/spl/spl-kstat.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/module/spl/spl-kstat.c b/module/spl/spl-kstat.c
|
||||
index d2baa49..e769510 100644
|
||||
--- a/module/spl/spl-kstat.c
|
||||
+++ b/module/spl/spl-kstat.c
|
||||
@@ -327,7 +327,7 @@ restart:
|
||||
return (-rc);
|
||||
}
|
||||
|
||||
-int
|
||||
+static int
|
||||
kstat_default_update(kstat_t *ksp, int rw)
|
||||
{
|
||||
ASSERT(ksp != NULL);
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
|
||||
Date: Mon, 19 Feb 2018 20:40:38 +0900
|
||||
Subject: [PATCH] Fix function name typos
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
vn_init() and vn_fini() had been renamed by 12ff95ff in 2011.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
|
||||
Closes #686
|
||||
(cherry picked from commit cfbcc0d4d74ea3ad279706b63e7a13290d3e130a)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/spl/spl-vnode.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
|
||||
index 75d8936..23008af 100644
|
||||
--- a/module/spl/spl-vnode.c
|
||||
+++ b/module/spl/spl-vnode.c
|
||||
@@ -658,7 +658,7 @@ vn_file_cache_constructor(void *buf, void *cdrarg, int kmflags)
|
||||
INIT_LIST_HEAD(&fp->f_list);
|
||||
|
||||
return (0);
|
||||
-} /* file_cache_constructor() */
|
||||
+} /* vn_file_cache_constructor() */
|
||||
|
||||
static void
|
||||
vn_file_cache_destructor(void *buf, void *cdrarg)
|
||||
@@ -680,7 +680,7 @@ spl_vn_init(void)
|
||||
vn_file_cache_destructor, NULL, NULL, NULL, 0);
|
||||
|
||||
return (0);
|
||||
-} /* vn_init() */
|
||||
+} /* spl_vn_init() */
|
||||
|
||||
void
|
||||
spl_vn_fini(void)
|
||||
@@ -703,4 +703,4 @@ spl_vn_fini(void)
|
||||
|
||||
kmem_cache_destroy(vn_file_cache);
|
||||
kmem_cache_destroy(vn_cache);
|
||||
-} /* vn_fini() */
|
||||
+} /* spl_vn_fini() */
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,391 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Sat, 24 Feb 2018 10:05:37 -0800
|
||||
Subject: [PATCH] Fix more cstyle warnings
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch contains no functional changes. It is solely intended
|
||||
to resolve cstyle warnings in order to facilitate moving the spl
|
||||
source code in to the zfs repository.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #687
|
||||
(cherry picked from commit 37a93c61226f3fd76f6f1e67291128a5d2d6d7c1)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/spl/spl-err.c | 5 ++++-
|
||||
module/spl/spl-generic.c | 11 ++++++++---
|
||||
module/spl/spl-kmem-cache.c | 5 ++++-
|
||||
module/spl/spl-kmem.c | 5 ++++-
|
||||
module/spl/spl-kstat.c | 17 ++++++++++-------
|
||||
module/spl/spl-proc.c | 18 ++++++++++--------
|
||||
module/spl/spl-thread.c | 3 +--
|
||||
module/spl/spl-vnode.c | 11 +++++------
|
||||
module/spl/spl-xdr.c | 10 +++++-----
|
||||
9 files changed, 51 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/module/spl/spl-err.c b/module/spl/spl-err.c
|
||||
index e089de2..adfa555 100644
|
||||
--- a/module/spl/spl-err.c
|
||||
+++ b/module/spl/spl-err.c
|
||||
@@ -34,9 +34,11 @@
|
||||
* analysis and other such goodies.
|
||||
* But we would still default to the current default of not to do that.
|
||||
*/
|
||||
+/* BEGIN CSTYLED */
|
||||
unsigned int spl_panic_halt;
|
||||
module_param(spl_panic_halt, uint, 0644);
|
||||
MODULE_PARM_DESC(spl_panic_halt, "Cause kernel panic on assertion failures");
|
||||
+/* END CSTYLED */
|
||||
|
||||
/*
|
||||
* Limit the number of stack traces dumped to not more than 5 every
|
||||
@@ -55,7 +57,8 @@ spl_dumpstack(void)
|
||||
EXPORT_SYMBOL(spl_dumpstack);
|
||||
|
||||
int
|
||||
-spl_panic(const char *file, const char *func, int line, const char *fmt, ...) {
|
||||
+spl_panic(const char *file, const char *func, int line, const char *fmt, ...)
|
||||
+{
|
||||
const char *newfile;
|
||||
char msg[MAXMSGLEN];
|
||||
va_list ap;
|
||||
diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c
|
||||
index 80fc54c..1098d9a 100644
|
||||
--- a/module/spl/spl-generic.c
|
||||
+++ b/module/spl/spl-generic.c
|
||||
@@ -50,10 +50,12 @@
|
||||
char spl_version[32] = "SPL v" SPL_META_VERSION "-" SPL_META_RELEASE;
|
||||
EXPORT_SYMBOL(spl_version);
|
||||
|
||||
+/* BEGIN CSTYLED */
|
||||
unsigned long spl_hostid = 0;
|
||||
EXPORT_SYMBOL(spl_hostid);
|
||||
module_param(spl_hostid, ulong, 0644);
|
||||
MODULE_PARM_DESC(spl_hostid, "The system hostid.");
|
||||
+/* END CSTYLED */
|
||||
|
||||
proc_t p0;
|
||||
EXPORT_SYMBOL(p0);
|
||||
@@ -98,7 +100,8 @@ static DEFINE_PER_CPU(uint64_t[2], spl_pseudo_entropy);
|
||||
*/
|
||||
|
||||
static inline uint64_t
|
||||
-spl_rand_next(uint64_t *s) {
|
||||
+spl_rand_next(uint64_t *s)
|
||||
+{
|
||||
uint64_t s1 = s[0];
|
||||
const uint64_t s0 = s[1];
|
||||
s[0] = s0;
|
||||
@@ -108,7 +111,8 @@ spl_rand_next(uint64_t *s) {
|
||||
}
|
||||
|
||||
static inline void
|
||||
-spl_rand_jump(uint64_t *s) {
|
||||
+spl_rand_jump(uint64_t *s)
|
||||
+{
|
||||
static const uint64_t JUMP[] =
|
||||
{ 0x8a5cd789635d2dff, 0x121fd2155c472f96 };
|
||||
|
||||
@@ -184,7 +188,8 @@ EXPORT_SYMBOL(random_get_pseudo_bytes);
|
||||
* Calculate number of leading of zeros for a 64-bit value.
|
||||
*/
|
||||
static int
|
||||
-nlz64(uint64_t x) {
|
||||
+nlz64(uint64_t x)
|
||||
+{
|
||||
register int n = 0;
|
||||
|
||||
if (x == 0)
|
||||
diff --git a/module/spl/spl-kmem-cache.c b/module/spl/spl-kmem-cache.c
|
||||
index e4bcdd8..c73a2fd 100644
|
||||
--- a/module/spl/spl-kmem-cache.c
|
||||
+++ b/module/spl/spl-kmem-cache.c
|
||||
@@ -66,6 +66,7 @@
|
||||
* because it has been shown to improve responsiveness on low memory systems.
|
||||
* This policy may be changed by setting KMC_EXPIRE_AGE or KMC_EXPIRE_MEM.
|
||||
*/
|
||||
+/* BEGIN CSTYLED */
|
||||
unsigned int spl_kmem_cache_expire = KMC_EXPIRE_MEM;
|
||||
EXPORT_SYMBOL(spl_kmem_cache_expire);
|
||||
module_param(spl_kmem_cache_expire, uint, 0644);
|
||||
@@ -148,6 +149,7 @@ unsigned int spl_kmem_cache_kmem_threads = 4;
|
||||
module_param(spl_kmem_cache_kmem_threads, uint, 0444);
|
||||
MODULE_PARM_DESC(spl_kmem_cache_kmem_threads,
|
||||
"Number of spl_kmem_cache threads");
|
||||
+/* END CSTYLED */
|
||||
|
||||
/*
|
||||
* Slab allocation interfaces
|
||||
@@ -356,8 +358,9 @@ out:
|
||||
if (rc) {
|
||||
if (skc->skc_flags & KMC_OFFSLAB)
|
||||
list_for_each_entry_safe(sko,
|
||||
- n, &sks->sks_free_list, sko_list)
|
||||
+ n, &sks->sks_free_list, sko_list) {
|
||||
kv_free(skc, sko->sko_addr, offslab_size);
|
||||
+ }
|
||||
|
||||
kv_free(skc, base, skc->skc_slab_size);
|
||||
sks = NULL;
|
||||
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
|
||||
index bf9c6b1..e0d5510 100755
|
||||
--- a/module/spl/spl-kmem.c
|
||||
+++ b/module/spl/spl-kmem.c
|
||||
@@ -44,6 +44,7 @@
|
||||
* allocations are quickly caught. These warnings may be disabled by setting
|
||||
* the threshold to zero.
|
||||
*/
|
||||
+/* BEGIN CSTYLED */
|
||||
unsigned int spl_kmem_alloc_warn = MIN(16 * PAGE_SIZE, 64 * 1024);
|
||||
module_param(spl_kmem_alloc_warn, uint, 0644);
|
||||
MODULE_PARM_DESC(spl_kmem_alloc_warn,
|
||||
@@ -64,6 +65,7 @@ module_param(spl_kmem_alloc_max, uint, 0644);
|
||||
MODULE_PARM_DESC(spl_kmem_alloc_max,
|
||||
"Maximum size in bytes for a kmem_alloc()");
|
||||
EXPORT_SYMBOL(spl_kmem_alloc_max);
|
||||
+/* END CSTYLED */
|
||||
|
||||
int
|
||||
kmem_debugging(void)
|
||||
@@ -520,10 +522,11 @@ spl_kmem_fini_tracking(struct list_head *list, spinlock_t *lock)
|
||||
printk(KERN_WARNING "%-16s %-5s %-16s %s:%s\n", "address",
|
||||
"size", "data", "func", "line");
|
||||
|
||||
- list_for_each_entry(kd, list, kd_list)
|
||||
+ list_for_each_entry(kd, list, kd_list) {
|
||||
printk(KERN_WARNING "%p %-5d %-16s %s:%d\n", kd->kd_addr,
|
||||
(int)kd->kd_size, spl_sprintf_addr(kd, str, 17, 8),
|
||||
kd->kd_func, kd->kd_line);
|
||||
+ }
|
||||
|
||||
spin_unlock_irqrestore(lock, flags);
|
||||
}
|
||||
diff --git a/module/spl/spl-kstat.c b/module/spl/spl-kstat.c
|
||||
index e769510..6970fcc 100644
|
||||
--- a/module/spl/spl-kstat.c
|
||||
+++ b/module/spl/spl-kstat.c
|
||||
@@ -305,7 +305,7 @@ restart:
|
||||
} else {
|
||||
ASSERT(ksp->ks_ndata == 1);
|
||||
rc = kstat_seq_show_raw(f, ksp->ks_data,
|
||||
- ksp->ks_data_size);
|
||||
+ ksp->ks_data_size);
|
||||
}
|
||||
break;
|
||||
case KSTAT_TYPE_NAMED:
|
||||
@@ -434,9 +434,10 @@ kstat_find_module(char *name)
|
||||
{
|
||||
kstat_module_t *module;
|
||||
|
||||
- list_for_each_entry(module, &kstat_module_list, ksm_module_list)
|
||||
+ list_for_each_entry(module, &kstat_module_list, ksm_module_list) {
|
||||
if (strncmp(name, module->ksm_name, KSTAT_STRLEN) == 0)
|
||||
return (module);
|
||||
+ }
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
@@ -517,9 +518,9 @@ static struct file_operations proc_kstat_operations = {
|
||||
|
||||
void
|
||||
__kstat_set_raw_ops(kstat_t *ksp,
|
||||
- int (*headers)(char *buf, size_t size),
|
||||
- int (*data)(char *buf, size_t size, void *data),
|
||||
- void *(*addr)(kstat_t *ksp, loff_t index))
|
||||
+ int (*headers)(char *buf, size_t size),
|
||||
+ int (*data)(char *buf, size_t size, void *data),
|
||||
+ void *(*addr)(kstat_t *ksp, loff_t index))
|
||||
{
|
||||
ksp->ks_raw_ops.headers = headers;
|
||||
ksp->ks_raw_ops.data = data;
|
||||
@@ -628,11 +629,12 @@ kstat_detect_collision(kstat_t *ksp)
|
||||
|
||||
cp[0] = '\0';
|
||||
if ((module = kstat_find_module(parent)) != NULL) {
|
||||
- list_for_each_entry(tmp, &module->ksm_kstat_list, ks_list)
|
||||
+ list_for_each_entry(tmp, &module->ksm_kstat_list, ks_list) {
|
||||
if (strncmp(tmp->ks_name, cp+1, KSTAT_STRLEN) == 0) {
|
||||
strfree(parent);
|
||||
return (EEXIST);
|
||||
}
|
||||
+ }
|
||||
}
|
||||
|
||||
strfree(parent);
|
||||
@@ -665,9 +667,10 @@ __kstat_install(kstat_t *ksp)
|
||||
* Only one entry by this name per-module, on failure the module
|
||||
* shouldn't be deleted because we know it has at least one entry.
|
||||
*/
|
||||
- list_for_each_entry(tmp, &module->ksm_kstat_list, ks_list)
|
||||
+ list_for_each_entry(tmp, &module->ksm_kstat_list, ks_list) {
|
||||
if (strncmp(tmp->ks_name, ksp->ks_name, KSTAT_STRLEN) == 0)
|
||||
goto out;
|
||||
+ }
|
||||
|
||||
list_add_tail(&ksp->ks_list, &module->ksm_kstat_list);
|
||||
|
||||
diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c
|
||||
index 60d6bbb..8ce5bbe 100644
|
||||
--- a/module/spl/spl-proc.c
|
||||
+++ b/module/spl/spl-proc.c
|
||||
@@ -85,8 +85,8 @@ proc_copyin_string(char *kbuffer, int kbuffer_size, const char *ubuffer,
|
||||
}
|
||||
|
||||
static int
|
||||
-proc_copyout_string(char *ubuffer, int ubuffer_size,
|
||||
- const char *kbuffer, char *append)
|
||||
+proc_copyout_string(char *ubuffer, int ubuffer_size, const char *kbuffer,
|
||||
+ char *append)
|
||||
{
|
||||
/*
|
||||
* NB if 'append' != NULL, it's a single character to append to the
|
||||
@@ -239,9 +239,11 @@ taskq_seq_show_headers(struct seq_file *f)
|
||||
#define LHEAD_ACTIVE 4
|
||||
#define LHEAD_SIZE 5
|
||||
|
||||
+/* BEGIN CSTYLED */
|
||||
static unsigned int spl_max_show_tasks = 512;
|
||||
module_param(spl_max_show_tasks, uint, 0644);
|
||||
MODULE_PARM_DESC(spl_max_show_tasks, "Max number of tasks shown in taskq proc");
|
||||
+/* END CSTYLED */
|
||||
|
||||
static int
|
||||
taskq_seq_show_impl(struct seq_file *f, void *p, boolean_t allflag)
|
||||
@@ -719,15 +721,15 @@ spl_proc_init(void)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- proc_spl_taskq_all = proc_create_data("taskq-all", 0444,
|
||||
- proc_spl, &proc_taskq_all_operations, NULL);
|
||||
+ proc_spl_taskq_all = proc_create_data("taskq-all", 0444, proc_spl,
|
||||
+ &proc_taskq_all_operations, NULL);
|
||||
if (proc_spl_taskq_all == NULL) {
|
||||
rc = -EUNATCH;
|
||||
goto out;
|
||||
}
|
||||
|
||||
- proc_spl_taskq = proc_create_data("taskq", 0444,
|
||||
- proc_spl, &proc_taskq_operations, NULL);
|
||||
+ proc_spl_taskq = proc_create_data("taskq", 0444, proc_spl,
|
||||
+ &proc_taskq_operations, NULL);
|
||||
if (proc_spl_taskq == NULL) {
|
||||
rc = -EUNATCH;
|
||||
goto out;
|
||||
@@ -739,8 +741,8 @@ spl_proc_init(void)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- proc_spl_kmem_slab = proc_create_data("slab", 0444,
|
||||
- proc_spl_kmem, &proc_slab_operations, NULL);
|
||||
+ proc_spl_kmem_slab = proc_create_data("slab", 0444, proc_spl_kmem,
|
||||
+ &proc_slab_operations, NULL);
|
||||
if (proc_spl_kmem_slab == NULL) {
|
||||
rc = -EUNATCH;
|
||||
goto out;
|
||||
diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c
|
||||
index 357d0ca..6f640fd 100644
|
||||
--- a/module/spl/spl-thread.c
|
||||
+++ b/module/spl/spl-thread.c
|
||||
@@ -79,8 +79,7 @@ EXPORT_SYMBOL(__thread_exit);
|
||||
*/
|
||||
kthread_t *
|
||||
__thread_create(caddr_t stk, size_t stksize, thread_func_t func,
|
||||
- const char *name, void *args, size_t len, proc_t *pp,
|
||||
- int state, pri_t pri)
|
||||
+ const char *name, void *args, size_t len, proc_t *pp, int state, pri_t pri)
|
||||
{
|
||||
thread_priv_t *tp;
|
||||
struct task_struct *tsk;
|
||||
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
|
||||
index 23008af..74ae8fe 100644
|
||||
--- a/module/spl/spl-vnode.c
|
||||
+++ b/module/spl/spl-vnode.c
|
||||
@@ -118,8 +118,8 @@ vn_free(vnode_t *vp)
|
||||
EXPORT_SYMBOL(vn_free);
|
||||
|
||||
int
|
||||
-vn_open(const char *path, uio_seg_t seg, int flags, int mode,
|
||||
- vnode_t **vpp, int x1, void *x2)
|
||||
+vn_open(const char *path, uio_seg_t seg, int flags, int mode, vnode_t **vpp,
|
||||
+ int x1, void *x2)
|
||||
{
|
||||
struct file *fp;
|
||||
struct kstat stat;
|
||||
@@ -210,7 +210,7 @@ EXPORT_SYMBOL(vn_openat);
|
||||
|
||||
int
|
||||
vn_rdwr(uio_rw_t uio, vnode_t *vp, void *addr, ssize_t len, offset_t off,
|
||||
- uio_seg_t seg, int ioflag, rlim64_t x2, void *x3, ssize_t *residp)
|
||||
+ uio_seg_t seg, int ioflag, rlim64_t x2, void *x3, ssize_t *residp)
|
||||
{
|
||||
struct file *fp = vp->v_file;
|
||||
loff_t offset = off;
|
||||
@@ -401,9 +401,8 @@ int vn_space(vnode_t *vp, int cmd, struct flock *bfp, int flag,
|
||||
--end;
|
||||
|
||||
vp->v_file->f_dentry->d_inode->i_op->truncate_range(
|
||||
- vp->v_file->f_dentry->d_inode,
|
||||
- bfp->l_start, end
|
||||
- );
|
||||
+ vp->v_file->f_dentry->d_inode, bfp->l_start, end);
|
||||
+
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
diff --git a/module/spl/spl-xdr.c b/module/spl/spl-xdr.c
|
||||
index 7c166e9..456887e 100644
|
||||
--- a/module/spl/spl-xdr.c
|
||||
+++ b/module/spl/spl-xdr.c
|
||||
@@ -160,7 +160,7 @@ EXPORT_SYMBOL(xdrmem_create);
|
||||
static bool_t
|
||||
xdrmem_control(XDR *xdrs, int req, void *info)
|
||||
{
|
||||
- struct xdr_bytesrec *rec = (struct xdr_bytesrec *) info;
|
||||
+ struct xdr_bytesrec *rec = (struct xdr_bytesrec *)info;
|
||||
|
||||
if (req != XDR_GET_BYTES_AVAIL)
|
||||
return (FALSE);
|
||||
@@ -236,7 +236,7 @@ xdrmem_enc_uint32(XDR *xdrs, uint32_t val)
|
||||
if (xdrs->x_addr + sizeof (uint32_t) > xdrs->x_addr_end)
|
||||
return (FALSE);
|
||||
|
||||
- *((uint32_t *) xdrs->x_addr) = cpu_to_be32(val);
|
||||
+ *((uint32_t *)xdrs->x_addr) = cpu_to_be32(val);
|
||||
|
||||
xdrs->x_addr += sizeof (uint32_t);
|
||||
|
||||
@@ -249,7 +249,7 @@ xdrmem_dec_uint32(XDR *xdrs, uint32_t *val)
|
||||
if (xdrs->x_addr + sizeof (uint32_t) > xdrs->x_addr_end)
|
||||
return (FALSE);
|
||||
|
||||
- *val = be32_to_cpu(*((uint32_t *) xdrs->x_addr));
|
||||
+ *val = be32_to_cpu(*((uint32_t *)xdrs->x_addr));
|
||||
|
||||
xdrs->x_addr += sizeof (uint32_t);
|
||||
|
||||
@@ -333,7 +333,7 @@ xdrmem_dec_uint(XDR *xdrs, unsigned *up)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof (unsigned) != 4);
|
||||
|
||||
- return (xdrmem_dec_uint32(xdrs, (uint32_t *) up));
|
||||
+ return (xdrmem_dec_uint32(xdrs, (uint32_t *)up));
|
||||
}
|
||||
|
||||
static bool_t
|
||||
@@ -359,7 +359,7 @@ xdrmem_dec_ulonglong(XDR *xdrs, u_longlong_t *ullp)
|
||||
if (!xdrmem_dec_uint32(xdrs, &low))
|
||||
return (FALSE);
|
||||
|
||||
- *ullp = ((u_longlong_t) high << 32) | low;
|
||||
+ *ullp = ((u_longlong_t)high << 32) | low;
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Fri, 9 Mar 2018 22:51:31 +0100
|
||||
Subject: [PATCH] Fix spl-kmod builds when using rpm >= 4.14
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
With rpm-software-management/rpm@5e94633 a package version containing
|
||||
invalid characters (most commonly a double '-') causes the kmod package
|
||||
generation to terminate with an error. This change takes advantage of
|
||||
the newly introduced rpm macro "_wrong_version_format_terminate_build"
|
||||
to allow kmod packages to be built.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #691
|
||||
(cherry picked from commit 7d17023a33bb6f064e013dd99862e62b719f1e26)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/spl-build.m4 | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/config/spl-build.m4 b/config/spl-build.m4
|
||||
index 553b5d5..9c97e64 100644
|
||||
--- a/config/spl-build.m4
|
||||
+++ b/config/spl-build.m4
|
||||
@@ -231,6 +231,7 @@ AC_DEFUN([SPL_AC_RPM], [
|
||||
RPM_DEFINE_COMMON='--define "$(DEBUG_SPL) 1" --define "$(DEBUG_KMEM) 1" --define "$(DEBUG_KMEM_TRACKING) 1"'
|
||||
RPM_DEFINE_UTIL=
|
||||
RPM_DEFINE_KMOD='--define "kernels $(LINUX_VERSION)"'
|
||||
+ RPM_DEFINE_KMOD+=' --define "_wrong_version_format_terminate_build 0"'
|
||||
RPM_DEFINE_DKMS=
|
||||
|
||||
SRPM_DEFINE_COMMON='--define "build_src_rpm 1"'
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Thu, 1 Feb 2018 10:02:27 -0800
|
||||
Subject: [PATCH] Tag spl-0.7.6
|
||||
Date: Wed, 14 Mar 2018 16:16:00 -0700
|
||||
Subject: [PATCH] Tag spl-0.7.7
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@@ -9,7 +9,7 @@ Content-Transfer-Encoding: 8bit
|
||||
META file and changelog updated.
|
||||
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
(cherry picked from commit 3cc0ea2a461788408aa2325e8ecb4e7f209633a8)
|
||||
(cherry picked from commit 2f52bf4a84b1a3520cccd5cee1415ce85b91d04f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
rpm/generic/spl-kmod.spec.in | 3 +++
|
||||
@@ -18,43 +18,43 @@ Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
3 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/rpm/generic/spl-kmod.spec.in b/rpm/generic/spl-kmod.spec.in
|
||||
index af7132d..eb38c21 100644
|
||||
index eb38c21..6af292d 100644
|
||||
--- a/rpm/generic/spl-kmod.spec.in
|
||||
+++ b/rpm/generic/spl-kmod.spec.in
|
||||
@@ -167,6 +167,9 @@ chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/*
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%changelog
|
||||
+* Thu Feb 01 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.6-1
|
||||
+- Released 0.7.6-1, detailed release notes are available at:
|
||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.6
|
||||
* Mon Dec 18 2017 Tony Hutter <hutter2@llnl.gov> - 0.7.5-1
|
||||
- Released 0.7.5-1, detailed release notes are available at:
|
||||
- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.5
|
||||
+* Wed Mar 14 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.7-1
|
||||
+- Released 0.7.7-1, detailed release notes are available at:
|
||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.7
|
||||
* Thu Feb 01 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.6-1
|
||||
- Released 0.7.6-1, detailed release notes are available at:
|
||||
- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.6
|
||||
diff --git a/rpm/generic/spl.spec.in b/rpm/generic/spl.spec.in
|
||||
index f619475..0338a47 100644
|
||||
index 0338a47..b693bdc 100644
|
||||
--- a/rpm/generic/spl.spec.in
|
||||
+++ b/rpm/generic/spl.spec.in
|
||||
@@ -34,6 +34,9 @@ make install DESTDIR=%{?buildroot}
|
||||
%{_mandir}/man5/*
|
||||
|
||||
%changelog
|
||||
+* Thu Feb 01 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.6-1
|
||||
+- Released 0.7.6-1, detailed release notes are available at:
|
||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.6
|
||||
* Mon Dec 18 2017 Tony Hutter <hutter2@llnl.gov> - 0.7.5-1
|
||||
- Released 0.7.5-1, detailed release notes are available at:
|
||||
- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.5
|
||||
+* Wed Mar 14 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.7-1
|
||||
+- Released 0.7.7-1, detailed release notes are available at:
|
||||
+- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.7
|
||||
* Thu Feb 01 2018 Tony Hutter <hutter2@llnl.gov> - 0.7.6-1
|
||||
- Released 0.7.6-1, detailed release notes are available at:
|
||||
- https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.7.6
|
||||
diff --git a/META b/META
|
||||
index c66cd11..4b0c0bb 100644
|
||||
index 4b0c0bb..64a07f1 100644
|
||||
--- a/META
|
||||
+++ b/META
|
||||
@@ -1,7 +1,7 @@
|
||||
Meta: 1
|
||||
Name: spl
|
||||
Branch: 1.0
|
||||
-Version: 0.7.5
|
||||
+Version: 0.7.6
|
||||
-Version: 0.7.6
|
||||
+Version: 0.7.7
|
||||
Release: 1
|
||||
Release-Tags: relext
|
||||
License: GPL
|
||||
+12
-3
@@ -1,4 +1,13 @@
|
||||
0001-remove-DKMS-and-module-build.patch
|
||||
0002-Linux-4.15-compat-timer-updates.patch
|
||||
0003-Fix-Debian-packaging-on-ARMv7-ARM64.patch
|
||||
0004-Tag-spl-0.7.6.patch
|
||||
0002-Allow-longer-SPA-names-in-stats.patch
|
||||
0003-Remove-vn_rename-and-vn_remove.patch
|
||||
0004-Remove-all-spin_is_locked-calls.patch
|
||||
0005-Add-cv_timedwait_io.patch
|
||||
0006-Fix-cstyle-warnings.patch
|
||||
0007-Split-spl-build.m4.patch
|
||||
0008-Fix-multiple-evaluations-of-VERIFY-and-ASSERT-on-fai.patch
|
||||
0009-Staticize-kstat_default_update.patch
|
||||
0010-Fix-function-name-typos.patch
|
||||
0011-Fix-more-cstyle-warnings.patch
|
||||
0012-Fix-spl-kmod-builds-when-using-rpm-4.14.patch
|
||||
0013-Tag-spl-0.7.7.patch
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
zfs-linux (0.7.7-pve1~bpo9) unstable; urgency=medium
|
||||
|
||||
* update ZFS to 0.7.7
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Tue, 3 Apr 2018 14:28:35 +0200
|
||||
|
||||
zfs-linux (0.7.6-pve1~bpo9) unstable; urgency=medium
|
||||
|
||||
* update ZFS to 0.7.6
|
||||
|
||||
+1
-1
Submodule zfs-debian updated: 5601d8209e...751356d354
@@ -8,33 +8,35 @@ Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
debian/control.in | 37 +++---------------
|
||||
debian/control.in | 41 ++------------------
|
||||
debian/control | 1 -
|
||||
debian/not-installed | 1 +
|
||||
debian/not-installed | 2 +
|
||||
debian/rules | 105 +--------------------------------------------------
|
||||
4 files changed, 8 insertions(+), 136 deletions(-)
|
||||
4 files changed, 7 insertions(+), 142 deletions(-)
|
||||
|
||||
diff --git a/debian/control.in b/debian/control.in
|
||||
index b3ef99870..8e69b6e37 100644
|
||||
index aef8cac2e..3cc15a05b 100644
|
||||
--- a/debian/control.in
|
||||
+++ b/debian/control.in
|
||||
@@ -8,7 +8,6 @@ Uploaders: Aron Xu <aron@debian.org>,
|
||||
Build-Depends: dh-autoreconf,
|
||||
autotools-dev,
|
||||
@@ -9,7 +9,6 @@ Build-Depends: autotools-dev,
|
||||
debhelper (>= 10.2),
|
||||
dh-autoreconf,
|
||||
dh-python,
|
||||
- dkms (>> 2.1.1.2-5),
|
||||
libattr1-dev,
|
||||
libblkid-dev,
|
||||
libselinux1-dev,
|
||||
libtool,
|
||||
lsb-release,
|
||||
@@ -84,25 +83,11 @@ Description: OpenZFS pool library for Linux
|
||||
@@ -86,27 +85,10 @@ Description: OpenZFS pool library for Linux
|
||||
.
|
||||
This zpool library provides support for managing zpools.
|
||||
|
||||
-Package: zfs-dkms
|
||||
-Architecture: all
|
||||
-Pre-Depends: spl-dkms (>= ${source:Upstream-Version}), spl-dkms (<<${source:Upstream-Version}.)
|
||||
-Pre-Depends: spl-dkms (<<${source:Upstream-Version}.),
|
||||
- spl-dkms (>= ${source:Upstream-Version})
|
||||
-Depends: dkms (>> 2.1.1.2-5), lsb-release, ${misc:Depends}
|
||||
-Recommends: zfsutils-linux (>= ${binary:Version}), zfs-zed
|
||||
-Recommends: zfs-zed, zfsutils-linux (>= ${binary:Version}),
|
||||
- @LINUX_COMPAT@
|
||||
-Provides: zfs-modules
|
||||
-Description: OpenZFS filesystem kernel modules for Linux
|
||||
- The Z file system is a pooled filesystem designed for maximum data
|
||||
@@ -46,20 +48,22 @@ index b3ef99870..8e69b6e37 100644
|
||||
-
|
||||
Package: zfs-initramfs
|
||||
Architecture: all
|
||||
Depends: initramfs-tools,
|
||||
busybox-initramfs | busybox-static | busybox,
|
||||
- zfs-modules | zfs-dkms, zfsutils-linux (>= ${binary:Version}),
|
||||
+ zfsutils-linux (>= ${binary:Version}),
|
||||
${misc:Depends}
|
||||
Depends: busybox-initramfs | busybox-static | busybox,
|
||||
initramfs-tools,
|
||||
- zfs-modules | zfs-dkms,
|
||||
zfsutils-linux (>= ${binary:Version}),
|
||||
${misc:Depends}
|
||||
Description: OpenZFS root filesystem capabilities for Linux - initramfs
|
||||
The Z file system is a pooled filesystem designed for maximum data
|
||||
@@ -112,24 +97,12 @@ Description: OpenZFS root filesystem capabilities for Linux - initramfs
|
||||
@@ -117,29 +99,14 @@ Description: OpenZFS root filesystem capabilities for Linux - initramfs
|
||||
This package adds OpenZFS to the system initramfs with a hook
|
||||
for the initramfs-tools infrastructure.
|
||||
|
||||
-Package: zfs-dracut
|
||||
-Architecture: all
|
||||
-Depends: dracut, zfs-modules | zfs-dkms, zfsutils-linux (>= ${binary:Version}), ${misc:Depends}
|
||||
-Depends: dracut,
|
||||
- zfs-modules | zfs-dkms,
|
||||
- zfsutils-linux (>= ${binary:Version}),
|
||||
- ${misc:Depends}
|
||||
-Description: OpenZFS root filesystem capabilities for Linux - dracut
|
||||
- The Z file system is a pooled filesystem designed for maximum data
|
||||
- integrity, supporting data snapshots, multiple copies, and data
|
||||
@@ -71,56 +75,59 @@ index b3ef99870..8e69b6e37 100644
|
||||
Package: zfsutils-linux
|
||||
Section: contrib/admin
|
||||
Architecture: linux-any
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}, ${python3:Depends}, python3
|
||||
Depends: python3, ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends}
|
||||
-Recommends: lsb-base, zfs-modules | zfs-dkms, zfs-zed
|
||||
-Breaks: zfs-dkms (>> ${binary:Version}), zfs-dkms (<< ${binary:Version})
|
||||
-Suggests: nfs-kernel-server, samba-common-bin (>= 3.0.23), zfs-initramfs | zfs-dracut
|
||||
-Breaks: zfs-dkms (<< ${binary:Version}), zfs-dkms (>> ${binary:Version})
|
||||
+Recommends: lsb-base, zfs-zed
|
||||
+Suggests: nfs-kernel-server, samba-common-bin (>= 3.0.23), zfs-initramfs
|
||||
Suggests: nfs-kernel-server,
|
||||
samba-common-bin (>= 3.0.23),
|
||||
- zfs-initramfs | zfs-dracut
|
||||
+ zfs-initramfs
|
||||
Conflicts: zfs, zfs-fuse, zutils
|
||||
Provides: zfsutils
|
||||
Description: command-line tools to manage OpenZFS filesystems
|
||||
@@ -143,7 +116,7 @@ Description: command-line tools to manage OpenZFS filesystems
|
||||
@@ -153,8 +120,7 @@ Description: command-line tools to manage OpenZFS filesystems
|
||||
Package: zfs-zed
|
||||
Section: contrib/admin
|
||||
Architecture: linux-any
|
||||
-Depends: ${misc:Depends}, ${shlibs:Depends}, zfs-modules | zfs-dkms, zfsutils-linux (>= ${binary:Version})
|
||||
+Depends: ${misc:Depends}, ${shlibs:Depends}, zfsutils-linux (>= ${binary:Version})
|
||||
-Depends: zfs-modules | zfs-dkms,
|
||||
- zfsutils-linux (>= ${binary:Version}),
|
||||
+Depends: zfsutils-linux (>= ${binary:Version}),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Description: OpenZFS Event Daemon
|
||||
The Z file system is a pooled filesystem designed for maximum data
|
||||
integrity, supporting data snapshots, multiple copies, and data
|
||||
@@ -154,7 +127,7 @@ Description: OpenZFS Event Daemon
|
||||
Package: zfs-test
|
||||
Section: contrib/admin
|
||||
Architecture: linux-any
|
||||
-Depends: ${misc:Depends}, ${shlibs:Depends}, zfs-modules | zfs-dkms, zfsutils-linux (>=${binary:Version}), parted, lsscsi, mdadm, bc, ksh, fio, acl, sudo, sysstat, python
|
||||
+Depends: ${misc:Depends}, ${shlibs:Depends}, zfsutils-linux (>=${binary:Version}), parted, lsscsi, mdadm, bc, ksh, fio, acl, sudo, sysstat, python
|
||||
Breaks: zfsutils-linux (<= 0.6.5.11-1)
|
||||
Replaces: zfsutils-linux (<= 0.6.5.11-1)
|
||||
Description: OpenZFS test infrastructure an support scripts
|
||||
@@ -177,7 +143,6 @@ Depends: acl,
|
||||
python,
|
||||
sudo,
|
||||
sysstat,
|
||||
- zfs-modules | zfs-dkms,
|
||||
zfsutils-linux (>=${binary:Version}),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
diff --git a/debian/control b/debian/control
|
||||
index b3ef99870..816403e44 100644
|
||||
index 3cf6fb649..51cfe6a64 100644
|
||||
--- a/debian/control
|
||||
+++ b/debian/control
|
||||
@@ -8,7 +8,6 @@ Uploaders: Aron Xu <aron@debian.org>,
|
||||
Build-Depends: dh-autoreconf,
|
||||
autotools-dev,
|
||||
@@ -9,7 +9,6 @@ Build-Depends: autotools-dev,
|
||||
debhelper (>= 10.2),
|
||||
dh-autoreconf,
|
||||
dh-python,
|
||||
- dkms (>> 2.1.1.2-5),
|
||||
libattr1-dev,
|
||||
libblkid-dev,
|
||||
libselinux1-dev,
|
||||
libtool,
|
||||
lsb-release,
|
||||
diff --git a/debian/not-installed b/debian/not-installed
|
||||
index f54fe7310..16b1cef6c 100644
|
||||
index f54fe7310..c3929d90e 100644
|
||||
--- a/debian/not-installed
|
||||
+++ b/debian/not-installed
|
||||
@@ -5,3 +5,4 @@ etc/zfs/vdev_id.conf.alias.example
|
||||
@@ -5,3 +5,5 @@ etc/zfs/vdev_id.conf.alias.example
|
||||
etc/zfs/vdev_id.conf.multipath.example
|
||||
etc/zfs/vdev_id.conf.sas_direct.example
|
||||
etc/zfs/vdev_id.conf.sas_switch.example
|
||||
+usr/lib/dracut
|
||||
+usr/share/zfs/enum-extract.pl
|
||||
diff --git a/debian/rules b/debian/rules
|
||||
index f445b58c5..d71926b33 100755
|
||||
index cc47a74a1..a5c37c81d 100755
|
||||
--- a/debian/rules
|
||||
+++ b/debian/rules
|
||||
@@ -5,9 +5,6 @@ include /usr/share/dpkg/default.mk
|
||||
@@ -156,7 +163,7 @@ index f445b58c5..d71926b33 100755
|
||||
+ dh $@ --with autoreconf,python3,systemd --parallel
|
||||
|
||||
override_dh_auto_configure:
|
||||
@cp debian/control.in debian/control
|
||||
sed "s/@LINUX_COMPAT@/linux-libc-dev \(< $(shell debian/get_next.sh)\)/" debian/control.in > debian/control
|
||||
@@ -73,36 +65,6 @@ override_dh_auto_install:
|
||||
$(INSTALL) -d '$(CURDIR)/debian/tmp/usr/sbin/'
|
||||
mv '$(CURDIR)/debian/tmp/sbin/zed' '$(CURDIR)/debian/tmp/usr/sbin/zed'
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Date: Tue, 31 Oct 2017 09:08:42 +0100
|
||||
Subject: [PATCH] Use user namespaces for FSETID policy check.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
With this we also need to verify the group id of a file with
|
||||
the setgid flag has a valid mapping in the current
|
||||
namespace.
|
||||
|
||||
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/policy.c | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/policy.c b/module/zfs/policy.c
|
||||
index 03e8f748b..dbbcfefa3 100644
|
||||
--- a/module/zfs/policy.c
|
||||
+++ b/module/zfs/policy.c
|
||||
@@ -42,19 +42,26 @@
|
||||
* all other cases this function must fail and return the passed err.
|
||||
*/
|
||||
static int
|
||||
-priv_policy(const cred_t *cr, int capability, boolean_t all, int err)
|
||||
+priv_policy_ns(const cred_t *cr, int capability, boolean_t all, int err,
|
||||
+ struct user_namespace *ns)
|
||||
{
|
||||
ASSERT3S(all, ==, B_FALSE);
|
||||
|
||||
if (cr != CRED() && (cr != kcred))
|
||||
return (err);
|
||||
|
||||
- if (!capable(capability))
|
||||
+ if (!(ns ? ns_capable(ns, capability) : capable(capability)))
|
||||
return (err);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
+static int
|
||||
+priv_policy(const cred_t *cr, int capability, boolean_t all, int err)
|
||||
+{
|
||||
+ return priv_policy_ns(cr, capability, all, err, NULL);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Checks for operations that are either client-only or are used by
|
||||
* both clients and servers.
|
||||
@@ -175,8 +182,11 @@ secpolicy_vnode_setid_retain(const cred_t *cr, boolean_t issuidroot)
|
||||
int
|
||||
secpolicy_vnode_setids_setgids(const cred_t *cr, gid_t gid)
|
||||
{
|
||||
+ if (!kgid_has_mapping(cr->user_ns, SGID_TO_KGID(gid)))
|
||||
+ return (EPERM);
|
||||
if (crgetfsgid(cr) != gid && !groupmember(gid, cr))
|
||||
- return (priv_policy(cr, CAP_FSETID, B_FALSE, EPERM));
|
||||
+ return (priv_policy_ns(cr, CAP_FSETID, B_FALSE, EPERM,
|
||||
+ cr->user_ns));
|
||||
|
||||
return (0);
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Mon, 8 Jan 2018 09:52:36 -0800
|
||||
Subject: [PATCH] Fix ARC hit rate
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When the compressed ARC feature was added in commit d3c2ae1
|
||||
the method of reference counting in the ARC was modified. As
|
||||
part of this accounting change the arc_buf_add_ref() function
|
||||
was removed entirely.
|
||||
|
||||
This would have be fine but the arc_buf_add_ref() function
|
||||
served a second undocumented purpose of updating the ARC access
|
||||
information when taking a hold on a dbuf. Without this logic
|
||||
in place a cached dbuf would not migrate its associated
|
||||
arc_buf_hdr_t to the MFU list. This would negatively impact
|
||||
the ARC hit rate, particularly on systems with a small ARC.
|
||||
|
||||
This change reinstates the missing call to arc_access() from
|
||||
dbuf_hold() by implementing a new arc_buf_access() function.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Reviewed-by: Tim Chase <tim@chase2k.com>
|
||||
Reviewed by: George Wilson <george.wilson@delphix.com>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6171
|
||||
Closes #6852
|
||||
Closes #6989
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/arc.h | 1 +
|
||||
module/zfs/arc.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
module/zfs/dbuf.c | 4 +++-
|
||||
3 files changed, 56 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/include/sys/arc.h b/include/sys/arc.h
|
||||
index 66f37cf71..1ea4937bd 100644
|
||||
--- a/include/sys/arc.h
|
||||
+++ b/include/sys/arc.h
|
||||
@@ -221,6 +221,7 @@ void arc_buf_destroy(arc_buf_t *buf, void *tag);
|
||||
void arc_buf_info(arc_buf_t *buf, arc_buf_info_t *abi, int state_index);
|
||||
uint64_t arc_buf_size(arc_buf_t *buf);
|
||||
uint64_t arc_buf_lsize(arc_buf_t *buf);
|
||||
+void arc_buf_access(arc_buf_t *buf);
|
||||
void arc_release(arc_buf_t *buf, void *tag);
|
||||
int arc_released(arc_buf_t *buf);
|
||||
void arc_buf_sigsegv(int sig, siginfo_t *si, void *unused);
|
||||
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
|
||||
index 2b0a78d4b..264e67735 100644
|
||||
--- a/module/zfs/arc.c
|
||||
+++ b/module/zfs/arc.c
|
||||
@@ -429,9 +429,14 @@ typedef struct arc_stats {
|
||||
* by multiple buffers.
|
||||
*/
|
||||
kstat_named_t arcstat_mutex_miss;
|
||||
+ /*
|
||||
+ * Number of buffers skipped when updating the access state due to the
|
||||
+ * header having already been released after acquiring the hash lock.
|
||||
+ */
|
||||
+ kstat_named_t arcstat_access_skip;
|
||||
/*
|
||||
* Number of buffers skipped because they have I/O in progress, are
|
||||
- * indrect prefetch buffers that have not lived long enough, or are
|
||||
+ * indirect prefetch buffers that have not lived long enough, or are
|
||||
* not from the spa we're trying to evict from.
|
||||
*/
|
||||
kstat_named_t arcstat_evict_skip;
|
||||
@@ -667,6 +672,7 @@ static arc_stats_t arc_stats = {
|
||||
{ "mfu_ghost_hits", KSTAT_DATA_UINT64 },
|
||||
{ "deleted", KSTAT_DATA_UINT64 },
|
||||
{ "mutex_miss", KSTAT_DATA_UINT64 },
|
||||
+ { "access_skip", KSTAT_DATA_UINT64 },
|
||||
{ "evict_skip", KSTAT_DATA_UINT64 },
|
||||
{ "evict_not_enough", KSTAT_DATA_UINT64 },
|
||||
{ "evict_l2_cached", KSTAT_DATA_UINT64 },
|
||||
@@ -4926,7 +4932,51 @@ arc_access(arc_buf_hdr_t *hdr, kmutex_t *hash_lock)
|
||||
}
|
||||
}
|
||||
|
||||
-/* a generic arc_done_func_t which you can use */
|
||||
+/*
|
||||
+ * This routine is called by dbuf_hold() to update the arc_access() state
|
||||
+ * which otherwise would be skipped for entries in the dbuf cache.
|
||||
+ */
|
||||
+void
|
||||
+arc_buf_access(arc_buf_t *buf)
|
||||
+{
|
||||
+ mutex_enter(&buf->b_evict_lock);
|
||||
+ arc_buf_hdr_t *hdr = buf->b_hdr;
|
||||
+
|
||||
+ /*
|
||||
+ * Avoid taking the hash_lock when possible as an optimization.
|
||||
+ * The header must be checked again under the hash_lock in order
|
||||
+ * to handle the case where it is concurrently being released.
|
||||
+ */
|
||||
+ if (hdr->b_l1hdr.b_state == arc_anon || HDR_EMPTY(hdr)) {
|
||||
+ mutex_exit(&buf->b_evict_lock);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ kmutex_t *hash_lock = HDR_LOCK(hdr);
|
||||
+ mutex_enter(hash_lock);
|
||||
+
|
||||
+ if (hdr->b_l1hdr.b_state == arc_anon || HDR_EMPTY(hdr)) {
|
||||
+ mutex_exit(hash_lock);
|
||||
+ mutex_exit(&buf->b_evict_lock);
|
||||
+ ARCSTAT_BUMP(arcstat_access_skip);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ mutex_exit(&buf->b_evict_lock);
|
||||
+
|
||||
+ ASSERT(hdr->b_l1hdr.b_state == arc_mru ||
|
||||
+ hdr->b_l1hdr.b_state == arc_mfu);
|
||||
+
|
||||
+ DTRACE_PROBE1(arc__hit, arc_buf_hdr_t *, hdr);
|
||||
+ arc_access(hdr, hash_lock);
|
||||
+ mutex_exit(hash_lock);
|
||||
+
|
||||
+ ARCSTAT_BUMP(arcstat_hits);
|
||||
+ ARCSTAT_CONDSTAT(!HDR_PREFETCH(hdr), demand, prefetch,
|
||||
+ !HDR_ISTYPE_METADATA(hdr), data, metadata, hits);
|
||||
+}
|
||||
+
|
||||
+/* a generic arc_read_done_func_t which you can use */
|
||||
/* ARGSUSED */
|
||||
void
|
||||
arc_bcopy_func(zio_t *zio, arc_buf_t *buf, void *arg)
|
||||
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c
|
||||
index 60f52d294..4ee121f5a 100644
|
||||
--- a/module/zfs/dbuf.c
|
||||
+++ b/module/zfs/dbuf.c
|
||||
@@ -2719,8 +2719,10 @@ __dbuf_hold_impl(struct dbuf_hold_impl_data *dh)
|
||||
return (SET_ERROR(ENOENT));
|
||||
}
|
||||
|
||||
- if (dh->dh_db->db_buf != NULL)
|
||||
+ if (dh->dh_db->db_buf != NULL) {
|
||||
+ arc_buf_access(dh->dh_db->db_buf);
|
||||
ASSERT3P(dh->dh_db->db.db_data, ==, dh->dh_db->db_buf->b_data);
|
||||
+ }
|
||||
|
||||
ASSERT(dh->dh_db->db_buf == NULL || arc_referenced(dh->dh_db->db_buf));
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Yao <richard.yao@clusterhq.com>
|
||||
Date: Tue, 23 Sep 2014 13:31:33 -0400
|
||||
Subject: [PATCH] Make --enable-debug fail when given bogus args
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Currently, bogus options to --enable-debug become --disable-debug. That
|
||||
means that passing --enable-debug=true is analogous to --disable-debug,
|
||||
but the result is counterintuitive. We switch to AS_CASE to allow us to
|
||||
fail when given a bogus option.
|
||||
|
||||
Also, we modify the text printed to clarify that --enable-debug enables
|
||||
assertions.
|
||||
|
||||
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Richard Yao <richard.yao@clusterhq.com>
|
||||
Closes #2734
|
||||
(cherry picked from commit 0f1ff38476ba255eb1f066f675c8721168ff2295)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/zfs-build.m4 | 43 +++++++++++++++++++++++++------------------
|
||||
1 file changed, 25 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index 7651dc2c1..78a87aef7 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -6,30 +6,37 @@ AC_DEFUN([ZFS_AC_LICENSE], [
|
||||
AC_MSG_RESULT([$ZFS_META_LICENSE])
|
||||
])
|
||||
|
||||
+AC_DEFUN([ZFS_AC_DEBUG_ENABLE], [
|
||||
+ KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG -Werror"
|
||||
+ HOSTCFLAGS="${HOSTCFLAGS} -DDEBUG -Werror"
|
||||
+ DEBUG_CFLAGS="-DDEBUG -Werror"
|
||||
+ DEBUG_STACKFLAGS="-fstack-check"
|
||||
+ DEBUG_ZFS="_with_debug"
|
||||
+ AC_DEFINE(ZFS_DEBUG, 1, [zfs debugging enabled])
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_DEBUG_DISABLE], [
|
||||
+ KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG "
|
||||
+ HOSTCFLAGS="${HOSTCFLAGS} -DNDEBUG "
|
||||
+ DEBUG_CFLAGS="-DNDEBUG"
|
||||
+ DEBUG_STACKFLAGS=""
|
||||
+ DEBUG_ZFS="_without_debug"
|
||||
+])
|
||||
+
|
||||
AC_DEFUN([ZFS_AC_DEBUG], [
|
||||
- AC_MSG_CHECKING([whether debugging is enabled])
|
||||
+ AC_MSG_CHECKING([whether assertion support will be enabled])
|
||||
AC_ARG_ENABLE([debug],
|
||||
[AS_HELP_STRING([--enable-debug],
|
||||
- [Enable generic debug support @<:@default=no@:>@])],
|
||||
+ [Enable assertion support @<:@default=no@:>@])],
|
||||
[],
|
||||
[enable_debug=no])
|
||||
|
||||
- AS_IF([test "x$enable_debug" = xyes],
|
||||
- [
|
||||
- KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG -Werror"
|
||||
- HOSTCFLAGS="${HOSTCFLAGS} -DDEBUG -Werror"
|
||||
- DEBUG_CFLAGS="-DDEBUG -Werror"
|
||||
- DEBUG_STACKFLAGS="-fstack-check"
|
||||
- DEBUG_ZFS="_with_debug"
|
||||
- AC_DEFINE(ZFS_DEBUG, 1, [zfs debugging enabled])
|
||||
- ],
|
||||
- [
|
||||
- KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG "
|
||||
- HOSTCFLAGS="${HOSTCFLAGS} -DNDEBUG "
|
||||
- DEBUG_CFLAGS="-DNDEBUG"
|
||||
- DEBUG_STACKFLAGS=""
|
||||
- DEBUG_ZFS="_without_debug"
|
||||
- ])
|
||||
+ AS_CASE(["x$enable_debug"],
|
||||
+ ["xyes"],
|
||||
+ [ZFS_AC_DEBUG_ENABLE],
|
||||
+ ["xno"],
|
||||
+ [ZFS_AC_DEBUG_DISABLE],
|
||||
+ [AC_MSG_ERROR([Unknown option $enable_debug])])
|
||||
|
||||
AC_SUBST(DEBUG_CFLAGS)
|
||||
AC_SUBST(DEBUG_STACKFLAGS)
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Yao <richard.yao@clusterhq.com>
|
||||
Date: Tue, 23 Sep 2014 14:29:30 -0400
|
||||
Subject: [PATCH] Implement --enable-debuginfo to force debuginfo
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Inspection of a Ubuntu 14.04 x64 system revealed that the config file
|
||||
used to build the kernel image differs from the config file used to
|
||||
build kernel modules by the presence of CONFIG_DEBUG_INFO=y:
|
||||
|
||||
This in itself is insufficient to show that the kernel is built with
|
||||
debuginfo, but a cursory analysis of the debuginfo provided and the
|
||||
size of the kernel strongly suggests that it was built with
|
||||
CONFIG_DEBUG_INFO=y while the modules were not. Installing
|
||||
linux-image-$(uname -r)-dbgsym had no obvious effect on the debuginfo
|
||||
provided by either the modules or the kernel.
|
||||
|
||||
The consequence is that issue reports from distributions such as Ubuntu
|
||||
and its derivatives build kernel modules without debuginfo contain
|
||||
nonsensical backtraces. It is therefore desireable to force generation
|
||||
of debuginfo, so we implement --enable-debuginfo. Since the build system
|
||||
can build both userspace components and kernel modules, the generic
|
||||
--enable-debuginfo option will force debuginfo for both. However, it
|
||||
also supports --enable-debuginfo=kernel and --enable-debuginfo=user for
|
||||
finer grained control.
|
||||
|
||||
Enabling debuginfo for the kernel modules works by injecting
|
||||
CONFIG_DEBUG_INFO=y into the make environment. This is enables
|
||||
generation of debuginfo by the kernel build systems on all Linux
|
||||
kernels, but the build environment is slightly different int hat
|
||||
CONFIG_DEBUG_INFO has not been in the CPP. Adding -DCONFIG_DEBUG_INFO
|
||||
would fix that, but it would also cause build failures on kernels where
|
||||
CONFIG_DEBUG_INFO=y is already set. That would complicate its use in
|
||||
DKMS environments that support a range of kernels and is therefore
|
||||
undesireable. We could write a compatibility shim to enable
|
||||
CONFIG_DEBUG_INFO only when it is explicitly disabled, but we forgo
|
||||
doing that because it is unnecessary. Nothing in ZoL or the kernel uses
|
||||
CONFIG_DEBUG_INFO in the CPP at this time and that is unlikely to
|
||||
change.
|
||||
|
||||
Enabling debuginfo for the userspace components is done by injecting -g
|
||||
into CPPFLAGS. This is not necessary because the build system honors the
|
||||
environment's CPPFLAGS by appending them to the actual CPPFLAGS used,
|
||||
but it is supported for consistency.
|
||||
|
||||
Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Richard Yao <richard.yao@clusterhq.com>
|
||||
Closes #2734
|
||||
(cherry picked from commit 834815e9f767c9c5e7220ff84f29b1f069822a4d)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
configure.ac | 1 +
|
||||
config/zfs-build.m4 | 33 ++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 33 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 0c7977ef8..e145aa370 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -55,6 +55,7 @@ ZFS_AC_LICENSE
|
||||
ZFS_AC_PACKAGE
|
||||
ZFS_AC_CONFIG
|
||||
ZFS_AC_DEBUG
|
||||
+ZFS_AC_DEBUGINFO
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index 78a87aef7..a8609b829 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -38,12 +38,43 @@ AC_DEFUN([ZFS_AC_DEBUG], [
|
||||
[ZFS_AC_DEBUG_DISABLE],
|
||||
[AC_MSG_ERROR([Unknown option $enable_debug])])
|
||||
|
||||
- AC_SUBST(DEBUG_CFLAGS)
|
||||
AC_SUBST(DEBUG_STACKFLAGS)
|
||||
AC_SUBST(DEBUG_ZFS)
|
||||
AC_MSG_RESULT([$enable_debug])
|
||||
])
|
||||
|
||||
+AC_DEFUN([ZFS_AC_DEBUGINFO_KERNEL], [
|
||||
+ KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS CONFIG_DEBUG_INFO=y"
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_DEBUGINFO_USER], [
|
||||
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -g"
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_DEBUGINFO], [
|
||||
+ AC_MSG_CHECKING([whether debuginfo support will be forced])
|
||||
+ AC_ARG_ENABLE([debuginfo],
|
||||
+ [AS_HELP_STRING([--enable-debuginfo],
|
||||
+ [Force generation of debuginfo @<:@default=no@:>@])],
|
||||
+ [],
|
||||
+ [enable_debuginfo=no])
|
||||
+
|
||||
+ AS_CASE(["x$enable_debuginfo"],
|
||||
+ ["xyes"],
|
||||
+ [ZFS_AC_DEBUGINFO_KERNEL
|
||||
+ ZFS_AC_DEBUGINFO_USER],
|
||||
+ ["xkernel"],
|
||||
+ [ZFS_AC_DEBUGINFO_KERNEL],
|
||||
+ ["xuser"],
|
||||
+ [ZFS_AC_DEBUGINFO_USER],
|
||||
+ ["xno"],
|
||||
+ [],
|
||||
+ [AC_MSG_ERROR([Unknown option $enable_debug])])
|
||||
+
|
||||
+ AC_SUBST(DEBUG_CFLAGS)
|
||||
+ AC_MSG_RESULT([$enable_debuginfo])
|
||||
+])
|
||||
+
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_UNUSED_BUT_SET_VARIABLE
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_BOOL_COMPARE
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Fri, 15 Sep 2017 10:24:13 -0700
|
||||
Subject: [PATCH] Add configure option to enable gcov analysis
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
* Add configure option to enable gcov analysis.
|
||||
* Includes a few minor ctime fixes.
|
||||
* Add codecov.yml configuration.
|
||||
|
||||
Reviewed-by: Prakash Surya <prakash.surya@delphix.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6642
|
||||
(cherry picked from commit 184087f822ef178d6f5c155681ee7c3d90f23321)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
configure.ac | 1 +
|
||||
Makefile.am | 8 +++---
|
||||
.github/codecov.yml | 9 +++++++
|
||||
config/zfs-build.m4 | 31 ++++++++++++++++++++++
|
||||
.../tests/functional/ctime/ctime_001_pos.ksh | 0
|
||||
5 files changed, 45 insertions(+), 4 deletions(-)
|
||||
create mode 100644 .github/codecov.yml
|
||||
mode change 100644 => 100755 tests/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index e145aa370..ee754fd38 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -56,6 +56,7 @@ ZFS_AC_PACKAGE
|
||||
ZFS_AC_CONFIG
|
||||
ZFS_AC_DEBUG
|
||||
ZFS_AC_DEBUGINFO
|
||||
+ZFS_AC_GCOV
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 508d3f40e..732a373bd 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -29,10 +29,10 @@ distclean-local::
|
||||
-o -name .pc -o -name .hg -o -name .git \) -prune -o \
|
||||
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
|
||||
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
|
||||
- -o -name '.*.rej' -o -name '.script-config' -o -size 0 \
|
||||
- -o -name '*%' -o -name '.*.cmd' -o -name 'core' \
|
||||
- -o -name 'Makefile' -o -name 'Module.symvers' \
|
||||
- -o -name '*.order' -o -name '*.markers' \) \
|
||||
+ -o -name '.*.rej' -o -size 0 -o -name '*%' -o -name '.*.cmd' \
|
||||
+ -o -name 'core' -o -name 'Makefile' -o -name 'Module.symvers' \
|
||||
+ -o -name '*.order' -o -name '*.markers' -o -name '*.gcda' \
|
||||
+ -o -name '*.gcno' \) \
|
||||
-type f -print | xargs $(RM)
|
||||
|
||||
dist-hook:
|
||||
diff --git a/.github/codecov.yml b/.github/codecov.yml
|
||||
new file mode 100644
|
||||
index 000000000..f36be39cb
|
||||
--- /dev/null
|
||||
+++ b/.github/codecov.yml
|
||||
@@ -0,0 +1,9 @@
|
||||
+codecov:
|
||||
+ strict_yaml_branch: master # only use the latest copy on master branch
|
||||
+
|
||||
+comment: off
|
||||
+
|
||||
+coverage:
|
||||
+ status:
|
||||
+ project: off
|
||||
+ patch: off
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index a8609b829..b84658a64 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -75,6 +75,37 @@ AC_DEFUN([ZFS_AC_DEBUGINFO], [
|
||||
AC_MSG_RESULT([$enable_debuginfo])
|
||||
])
|
||||
|
||||
+AC_DEFUN([ZFS_AC_GCOV_KERNEL], [
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_GCOV_USER], [
|
||||
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -fprofile-arcs -ftest-coverage"
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_GCOV], [
|
||||
+ AC_MSG_CHECKING([whether gcov profiling will be enabled])
|
||||
+ AC_ARG_ENABLE([gcov],
|
||||
+ [AS_HELP_STRING([--enable-gcov],
|
||||
+ [Enable gcov profiling @<:@default=no@:>@])],
|
||||
+ [],
|
||||
+ [enable_gcov=no])
|
||||
+
|
||||
+ AS_CASE(["x$enable_gcov"],
|
||||
+ ["xyes"],
|
||||
+ [ZFS_AC_GCOV_KERNEL
|
||||
+ ZFS_AC_GCOV_USER],
|
||||
+ ["xkernel"],
|
||||
+ [ZFS_AC_GCOV_KERNEL],
|
||||
+ ["xuser"],
|
||||
+ [ZFS_AC_GCOV_USER],
|
||||
+ ["xno"],
|
||||
+ [],
|
||||
+ [AC_MSG_ERROR([Unknown option $enable_gcov])])
|
||||
+
|
||||
+ AC_SUBST(DEBUG_CFLAGS)
|
||||
+ AC_MSG_RESULT([$enable_gcov])
|
||||
+])
|
||||
+
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_UNUSED_BUT_SET_VARIABLE
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_BOOL_COMPARE
|
||||
diff --git a/tests/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh b/tests/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh
|
||||
old mode 100644
|
||||
new mode 100755
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BtbN <btbn@btbn.de>
|
||||
Date: Thu, 17 Aug 2017 00:51:51 +0200
|
||||
Subject: [PATCH] Use /sbin/openrc-run for openrc init scripts
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Using /sbin/runscript is deprecated and throws a QA warning
|
||||
when still used in init scripts.
|
||||
|
||||
Reviewed-by: bunder2015 <omfgbunder@gmail.com>
|
||||
Signed-off-by: BtbN <btbn@btbn.de>
|
||||
Closes #6519
|
||||
(cherry picked from commit 6116bbd7446f06d913415bdecb208a78b31db0af)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
etc/init.d/Makefile.am | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/etc/init.d/Makefile.am b/etc/init.d/Makefile.am
|
||||
index 247db0aba..93432386a 100644
|
||||
--- a/etc/init.d/Makefile.am
|
||||
+++ b/etc/init.d/Makefile.am
|
||||
@@ -22,7 +22,7 @@ $(init_SCRIPTS) $(initconf_SCRIPTS) $(initcommon_SCRIPTS):%:%.in
|
||||
NFS_SRV=nfs; \
|
||||
fi; \
|
||||
if [ -e /sbin/openrc-run ]; then \
|
||||
- SHELL=/sbin/runscript; \
|
||||
+ SHELL=/sbin/openrc-run; \
|
||||
else \
|
||||
SHELL=/bin/sh; \
|
||||
fi; \
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Prakash Surya <prakash.surya@delphix.com>
|
||||
Date: Fri, 15 Sep 2017 11:47:11 -0700
|
||||
Subject: [PATCH] Make "-fno-inline" compile option more accessible
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When functions are inlined, it can make the system much more difficult
|
||||
to instrument using tools such as ftrace, BPF, crash, etc. Thus, to aid
|
||||
development and increase the system's observability, when the
|
||||
"--enable-debuginfo" flag is specified, the "-fno-inline" compilation
|
||||
option will be used for both userspace and kernel modules.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Prakash Surya <prakash.surya@delphix.com>
|
||||
Closes #6605
|
||||
(cherry picked from commit f1236ebf35d1531db75ac8a57b23e8fe48d6b780)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/zfs-build.m4 | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index b84658a64..c695a882e 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -45,10 +45,11 @@ AC_DEFUN([ZFS_AC_DEBUG], [
|
||||
|
||||
AC_DEFUN([ZFS_AC_DEBUGINFO_KERNEL], [
|
||||
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS CONFIG_DEBUG_INFO=y"
|
||||
+ KERNELCPPFLAGS="${KERNELCPPFLAGS} -fno-inline"
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_DEBUGINFO_USER], [
|
||||
- DEBUG_CFLAGS="$DEBUG_CFLAGS -g"
|
||||
+ DEBUG_CFLAGS="${DEBUG_CFLAGS} -g -fno-inline"
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_DEBUGINFO], [
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,209 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Date: Fri, 4 Aug 2017 11:29:56 +0200
|
||||
Subject: [PATCH] vdev_mirror: load balancing fixes
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
vdev_queue:
|
||||
- Track the last position of each vdev, including the io size,
|
||||
in order to detect linear access of the following zio.
|
||||
- Remove duplicate `vq_lastoffset`
|
||||
|
||||
vdev_mirror:
|
||||
- Correctly calculate the zio offset (signedness issue)
|
||||
- Deprecate `vdev_queue_register_lastoffset()`
|
||||
- Add `VDEV_LABEL_START_SIZE` to zio offset of leaf vdevs
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Closes #6461
|
||||
(cherry picked from commit 06acbbc429bfe7197e5fc3a49acfeef5c37b64c8)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/vdev.h | 3 +--
|
||||
include/sys/vdev_impl.h | 1 -
|
||||
module/zfs/vdev_mirror.c | 36 ++++++++++++++++--------------------
|
||||
module/zfs/vdev_queue.c | 21 +++++++--------------
|
||||
4 files changed, 24 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/include/sys/vdev.h b/include/sys/vdev.h
|
||||
index 7157ef43f..473d2691c 100644
|
||||
--- a/include/sys/vdev.h
|
||||
+++ b/include/sys/vdev.h
|
||||
@@ -125,8 +125,7 @@ extern zio_t *vdev_queue_io(zio_t *zio);
|
||||
extern void vdev_queue_io_done(zio_t *zio);
|
||||
|
||||
extern int vdev_queue_length(vdev_t *vd);
|
||||
-extern uint64_t vdev_queue_lastoffset(vdev_t *vd);
|
||||
-extern void vdev_queue_register_lastoffset(vdev_t *vd, zio_t *zio);
|
||||
+extern uint64_t vdev_queue_last_offset(vdev_t *vd);
|
||||
|
||||
extern void vdev_config_dirty(vdev_t *vd);
|
||||
extern void vdev_config_clean(vdev_t *vd);
|
||||
diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h
|
||||
index 7c5e54b08..4c2e3cd2e 100644
|
||||
--- a/include/sys/vdev_impl.h
|
||||
+++ b/include/sys/vdev_impl.h
|
||||
@@ -127,7 +127,6 @@ struct vdev_queue {
|
||||
hrtime_t vq_io_delta_ts;
|
||||
zio_t vq_io_search; /* used as local for stack reduction */
|
||||
kmutex_t vq_lock;
|
||||
- uint64_t vq_lastoffset;
|
||||
};
|
||||
|
||||
/*
|
||||
diff --git a/module/zfs/vdev_mirror.c b/module/zfs/vdev_mirror.c
|
||||
index 0439e4b46..d230b4db4 100644
|
||||
--- a/module/zfs/vdev_mirror.c
|
||||
+++ b/module/zfs/vdev_mirror.c
|
||||
@@ -116,7 +116,8 @@ static const zio_vsd_ops_t vdev_mirror_vsd_ops = {
|
||||
static int
|
||||
vdev_mirror_load(mirror_map_t *mm, vdev_t *vd, uint64_t zio_offset)
|
||||
{
|
||||
- uint64_t lastoffset;
|
||||
+ uint64_t last_offset;
|
||||
+ int64_t offset_diff;
|
||||
int load;
|
||||
|
||||
/* All DVAs have equal weight at the root. */
|
||||
@@ -129,13 +130,17 @@ vdev_mirror_load(mirror_map_t *mm, vdev_t *vd, uint64_t zio_offset)
|
||||
* worse overall when resilvering with compared to without.
|
||||
*/
|
||||
|
||||
+ /* Fix zio_offset for leaf vdevs */
|
||||
+ if (vd->vdev_ops->vdev_op_leaf)
|
||||
+ zio_offset += VDEV_LABEL_START_SIZE;
|
||||
+
|
||||
/* Standard load based on pending queue length. */
|
||||
load = vdev_queue_length(vd);
|
||||
- lastoffset = vdev_queue_lastoffset(vd);
|
||||
+ last_offset = vdev_queue_last_offset(vd);
|
||||
|
||||
if (vd->vdev_nonrot) {
|
||||
/* Non-rotating media. */
|
||||
- if (lastoffset == zio_offset)
|
||||
+ if (last_offset == zio_offset)
|
||||
return (load + zfs_vdev_mirror_non_rotating_inc);
|
||||
|
||||
/*
|
||||
@@ -148,16 +153,16 @@ vdev_mirror_load(mirror_map_t *mm, vdev_t *vd, uint64_t zio_offset)
|
||||
}
|
||||
|
||||
/* Rotating media I/O's which directly follow the last I/O. */
|
||||
- if (lastoffset == zio_offset)
|
||||
+ if (last_offset == zio_offset)
|
||||
return (load + zfs_vdev_mirror_rotating_inc);
|
||||
|
||||
/*
|
||||
* Apply half the seek increment to I/O's within seek offset
|
||||
- * of the last I/O queued to this vdev as they should incur less
|
||||
+ * of the last I/O issued to this vdev as they should incur less
|
||||
* of a seek increment.
|
||||
*/
|
||||
- if (ABS(lastoffset - zio_offset) <
|
||||
- zfs_vdev_mirror_rotating_seek_offset)
|
||||
+ offset_diff = (int64_t)(last_offset - zio_offset);
|
||||
+ if (ABS(offset_diff) < zfs_vdev_mirror_rotating_seek_offset)
|
||||
return (load + (zfs_vdev_mirror_rotating_seek_inc / 2));
|
||||
|
||||
/* Apply the full seek increment to all other I/O's. */
|
||||
@@ -382,29 +387,20 @@ vdev_mirror_child_select(zio_t *zio)
|
||||
mm->mm_preferred_cnt++;
|
||||
}
|
||||
|
||||
- if (mm->mm_preferred_cnt == 1) {
|
||||
- vdev_queue_register_lastoffset(
|
||||
- mm->mm_child[mm->mm_preferred[0]].mc_vd, zio);
|
||||
+ if (mm->mm_preferred_cnt == 1)
|
||||
return (mm->mm_preferred[0]);
|
||||
- }
|
||||
|
||||
- if (mm->mm_preferred_cnt > 1) {
|
||||
- int c = vdev_mirror_preferred_child_randomize(zio);
|
||||
|
||||
- vdev_queue_register_lastoffset(mm->mm_child[c].mc_vd, zio);
|
||||
- return (c);
|
||||
- }
|
||||
+ if (mm->mm_preferred_cnt > 1)
|
||||
+ return (vdev_mirror_preferred_child_randomize(zio));
|
||||
|
||||
/*
|
||||
* Every device is either missing or has this txg in its DTL.
|
||||
* Look for any child we haven't already tried before giving up.
|
||||
*/
|
||||
for (c = 0; c < mm->mm_children; c++) {
|
||||
- if (!mm->mm_child[c].mc_tried) {
|
||||
- vdev_queue_register_lastoffset(mm->mm_child[c].mc_vd,
|
||||
- zio);
|
||||
+ if (!mm->mm_child[c].mc_tried)
|
||||
return (c);
|
||||
- }
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/module/zfs/vdev_queue.c b/module/zfs/vdev_queue.c
|
||||
index 6b3e87291..40cba340a 100644
|
||||
--- a/module/zfs/vdev_queue.c
|
||||
+++ b/module/zfs/vdev_queue.c
|
||||
@@ -393,7 +393,7 @@ vdev_queue_init(vdev_t *vd)
|
||||
sizeof (zio_t), offsetof(struct zio, io_queue_node));
|
||||
}
|
||||
|
||||
- vq->vq_lastoffset = 0;
|
||||
+ vq->vq_last_offset = 0;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -699,9 +699,8 @@ again:
|
||||
*/
|
||||
tree = vdev_queue_class_tree(vq, p);
|
||||
vq->vq_io_search.io_timestamp = 0;
|
||||
- vq->vq_io_search.io_offset = vq->vq_last_offset + 1;
|
||||
- VERIFY3P(avl_find(tree, &vq->vq_io_search,
|
||||
- &idx), ==, NULL);
|
||||
+ vq->vq_io_search.io_offset = vq->vq_last_offset - 1;
|
||||
+ VERIFY3P(avl_find(tree, &vq->vq_io_search, &idx), ==, NULL);
|
||||
zio = avl_nearest(tree, idx, AVL_AFTER);
|
||||
if (zio == NULL)
|
||||
zio = avl_first(tree);
|
||||
@@ -728,7 +727,7 @@ again:
|
||||
}
|
||||
|
||||
vdev_queue_pending_add(vq, zio);
|
||||
- vq->vq_last_offset = zio->io_offset;
|
||||
+ vq->vq_last_offset = zio->io_offset + zio->io_size;
|
||||
|
||||
return (zio);
|
||||
}
|
||||
@@ -806,7 +805,7 @@ vdev_queue_io_done(zio_t *zio)
|
||||
}
|
||||
|
||||
/*
|
||||
- * As these three methods are only used for load calculations we're not
|
||||
+ * As these two methods are only used for load calculations we're not
|
||||
* concerned if we get an incorrect value on 32bit platforms due to lack of
|
||||
* vq_lock mutex use here, instead we prefer to keep it lock free for
|
||||
* performance.
|
||||
@@ -818,15 +817,9 @@ vdev_queue_length(vdev_t *vd)
|
||||
}
|
||||
|
||||
uint64_t
|
||||
-vdev_queue_lastoffset(vdev_t *vd)
|
||||
+vdev_queue_last_offset(vdev_t *vd)
|
||||
{
|
||||
- return (vd->vdev_queue.vq_lastoffset);
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-vdev_queue_register_lastoffset(vdev_t *vd, zio_t *zio)
|
||||
-{
|
||||
- vd->vdev_queue.vq_lastoffset = zio->io_offset + zio->io_size;
|
||||
+ return (vd->vdev_queue.vq_last_offset);
|
||||
}
|
||||
|
||||
#if defined(_KERNEL) && defined(HAVE_SPL)
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,399 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Prakash Surya <prakash.surya@delphix.com>
|
||||
Date: Fri, 22 Sep 2017 18:49:57 -0700
|
||||
Subject: [PATCH] Add support for "--enable-code-coverage" option
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This change adds support for a new option that can be passed to the
|
||||
configure script: "--enable-code-coverage". Further, the "--enable-gcov"
|
||||
option has been removed, as this new option provides the same
|
||||
functionality (plus more).
|
||||
|
||||
When using this new option the following make targets are available:
|
||||
|
||||
* check-code-coverage
|
||||
* code-coverage-capture
|
||||
* code-coverage-clean
|
||||
|
||||
Note: these make targets can only be run from the root of the project.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Prakash Surya <prakash.surya@delphix.com>
|
||||
Closes #6670
|
||||
(cherry picked from commit 6b278f3223c0322527836da2e11e33978e54a234)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
Makefile.am | 2 +
|
||||
config/Rules.am | 2 +
|
||||
config/ax_code_coverage.m4 | 264 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
config/zfs-build.m4 | 31 ------
|
||||
5 files changed, 269 insertions(+), 32 deletions(-)
|
||||
create mode 100644 config/ax_code_coverage.m4
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index ee754fd38..d71712e4c 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -50,13 +50,13 @@ AC_PROG_CC
|
||||
AC_PROG_LIBTOOL
|
||||
AM_PROG_AS
|
||||
AM_PROG_CC_C_O
|
||||
+AX_CODE_COVERAGE
|
||||
|
||||
ZFS_AC_LICENSE
|
||||
ZFS_AC_PACKAGE
|
||||
ZFS_AC_CONFIG
|
||||
ZFS_AC_DEBUG
|
||||
ZFS_AC_DEBUGINFO
|
||||
-ZFS_AC_GCOV
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 732a373bd..b539ff30f 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -23,6 +23,8 @@ EXTRA_DIST = autogen.sh copy-builtin
|
||||
EXTRA_DIST += config/config.awk config/rpm.am config/deb.am config/tgz.am
|
||||
EXTRA_DIST += META DISCLAIMER COPYRIGHT README.markdown OPENSOLARIS.LICENSE
|
||||
|
||||
+@CODE_COVERAGE_RULES@
|
||||
+
|
||||
distclean-local::
|
||||
-$(RM) -R autom4te*.cache
|
||||
-find . \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
|
||||
diff --git a/config/Rules.am b/config/Rules.am
|
||||
index 1d39e7779..215f09c34 100644
|
||||
--- a/config/Rules.am
|
||||
+++ b/config/Rules.am
|
||||
@@ -6,6 +6,7 @@ AM_CFLAGS += ${NO_UNUSED_BUT_SET_VARIABLE}
|
||||
AM_CFLAGS += ${NO_BOOL_COMPARE}
|
||||
AM_CFLAGS += -fno-strict-aliasing
|
||||
AM_CFLAGS += -std=gnu99
|
||||
+AM_CFLAGS += $(CODE_COVERAGE_CFLAGS)
|
||||
AM_CPPFLAGS = -D_GNU_SOURCE -D__EXTENSIONS__ -D_REENTRANT
|
||||
AM_CPPFLAGS += -D_POSIX_PTHREAD_SEMANTICS -D_FILE_OFFSET_BITS=64
|
||||
AM_CPPFLAGS += -D_LARGEFILE64_SOURCE -DHAVE_LARGE_STACKS=1
|
||||
@@ -14,3 +15,4 @@ AM_CPPFLAGS += -DLIBEXECDIR=\"$(libexecdir)\"
|
||||
AM_CPPFLAGS += -DRUNSTATEDIR=\"$(runstatedir)\"
|
||||
AM_CPPFLAGS += -DSBINDIR=\"$(sbindir)\"
|
||||
AM_CPPFLAGS += -DSYSCONFDIR=\"$(sysconfdir)\"
|
||||
+AM_CPPFLAGS += $(CODE_COVERAGE_CPPFLAGS)
|
||||
diff --git a/config/ax_code_coverage.m4 b/config/ax_code_coverage.m4
|
||||
new file mode 100644
|
||||
index 000000000..6484f0332
|
||||
--- /dev/null
|
||||
+++ b/config/ax_code_coverage.m4
|
||||
@@ -0,0 +1,264 @@
|
||||
+# ===========================================================================
|
||||
+# https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html
|
||||
+# ===========================================================================
|
||||
+#
|
||||
+# SYNOPSIS
|
||||
+#
|
||||
+# AX_CODE_COVERAGE()
|
||||
+#
|
||||
+# DESCRIPTION
|
||||
+#
|
||||
+# Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS,
|
||||
+# CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included
|
||||
+# in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every
|
||||
+# build target (program or library) which should be built with code
|
||||
+# coverage support. Also defines CODE_COVERAGE_RULES which should be
|
||||
+# substituted in your Makefile; and $enable_code_coverage which can be
|
||||
+# used in subsequent configure output. CODE_COVERAGE_ENABLED is defined
|
||||
+# and substituted, and corresponds to the value of the
|
||||
+# --enable-code-coverage option, which defaults to being disabled.
|
||||
+#
|
||||
+# Test also for gcov program and create GCOV variable that could be
|
||||
+# substituted.
|
||||
+#
|
||||
+# Note that all optimization flags in CFLAGS must be disabled when code
|
||||
+# coverage is enabled.
|
||||
+#
|
||||
+# Usage example:
|
||||
+#
|
||||
+# configure.ac:
|
||||
+#
|
||||
+# AX_CODE_COVERAGE
|
||||
+#
|
||||
+# Makefile.am:
|
||||
+#
|
||||
+# @CODE_COVERAGE_RULES@
|
||||
+# my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ...
|
||||
+# my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ...
|
||||
+# my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ...
|
||||
+# my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ...
|
||||
+#
|
||||
+# This results in a "check-code-coverage" rule being added to any
|
||||
+# Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module
|
||||
+# has been configured with --enable-code-coverage). Running `make
|
||||
+# check-code-coverage` in that directory will run the module's test suite
|
||||
+# (`make check`) and build a code coverage report detailing the code which
|
||||
+# was touched, then print the URI for the report.
|
||||
+#
|
||||
+# In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined
|
||||
+# instead of CODE_COVERAGE_LIBS. They are both still defined, but use of
|
||||
+# CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is
|
||||
+# deprecated. They have the same value.
|
||||
+#
|
||||
+# This code was derived from Makefile.decl in GLib, originally licenced
|
||||
+# under LGPLv2.1+.
|
||||
+#
|
||||
+# LICENSE
|
||||
+#
|
||||
+# Copyright (c) 2012, 2016 Philip Withnall
|
||||
+# Copyright (c) 2012 Xan Lopez
|
||||
+# Copyright (c) 2012 Christian Persch
|
||||
+# Copyright (c) 2012 Paolo Borelli
|
||||
+# Copyright (c) 2012 Dan Winship
|
||||
+# Copyright (c) 2015 Bastien ROUCARIES
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or modify it
|
||||
+# under the terms of the GNU Lesser General Public License as published by
|
||||
+# the Free Software Foundation; either version 2.1 of the License, or (at
|
||||
+# your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful, but
|
||||
+# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
|
||||
+# General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public License
|
||||
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
+
|
||||
+#serial 25
|
||||
+
|
||||
+AC_DEFUN([AX_CODE_COVERAGE],[
|
||||
+ dnl Check for --enable-code-coverage
|
||||
+ AC_REQUIRE([AC_PROG_SED])
|
||||
+
|
||||
+ # allow to override gcov location
|
||||
+ AC_ARG_WITH([gcov],
|
||||
+ [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])],
|
||||
+ [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov],
|
||||
+ [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov])
|
||||
+
|
||||
+ AC_MSG_CHECKING([whether to build with code coverage support])
|
||||
+ AC_ARG_ENABLE([code-coverage],
|
||||
+ AS_HELP_STRING([--enable-code-coverage],
|
||||
+ [Whether to enable code coverage support]),,
|
||||
+ enable_code_coverage=no)
|
||||
+
|
||||
+ AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes])
|
||||
+ AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage])
|
||||
+ AC_MSG_RESULT($enable_code_coverage)
|
||||
+
|
||||
+ AS_IF([ test "$enable_code_coverage" = "yes" ], [
|
||||
+ # check for gcov
|
||||
+ AC_CHECK_TOOL([GCOV],
|
||||
+ [$_AX_CODE_COVERAGE_GCOV_PROG_WITH],
|
||||
+ [:])
|
||||
+ AS_IF([test "X$GCOV" = "X:"],
|
||||
+ [AC_MSG_ERROR([gcov is needed to do coverage])])
|
||||
+ AC_SUBST([GCOV])
|
||||
+
|
||||
+ dnl Check if gcc is being used
|
||||
+ AS_IF([ test "$GCC" = "no" ], [
|
||||
+ AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage])
|
||||
+ ])
|
||||
+
|
||||
+ AC_CHECK_PROG([LCOV], [lcov], [lcov])
|
||||
+ AC_CHECK_PROG([GENHTML], [genhtml], [genhtml])
|
||||
+
|
||||
+ AS_IF([ test -z "$LCOV" ], [
|
||||
+ AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed])
|
||||
+ ])
|
||||
+
|
||||
+ AS_IF([ test -z "$GENHTML" ], [
|
||||
+ AC_MSG_ERROR([Could not find genhtml from the lcov package])
|
||||
+ ])
|
||||
+
|
||||
+ dnl Build the code coverage flags
|
||||
+ dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility
|
||||
+ CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
|
||||
+ CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
|
||||
+ CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
|
||||
+ CODE_COVERAGE_LIBS="-lgcov"
|
||||
+ CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS"
|
||||
+
|
||||
+ AC_SUBST([CODE_COVERAGE_CPPFLAGS])
|
||||
+ AC_SUBST([CODE_COVERAGE_CFLAGS])
|
||||
+ AC_SUBST([CODE_COVERAGE_CXXFLAGS])
|
||||
+ AC_SUBST([CODE_COVERAGE_LIBS])
|
||||
+ AC_SUBST([CODE_COVERAGE_LDFLAGS])
|
||||
+
|
||||
+ [CODE_COVERAGE_RULES_CHECK='
|
||||
+ -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check
|
||||
+ $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture
|
||||
+']
|
||||
+ [CODE_COVERAGE_RULES_CAPTURE='
|
||||
+ $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS)
|
||||
+ $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS)
|
||||
+ -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp
|
||||
+ $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS)
|
||||
+ @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html"
|
||||
+']
|
||||
+ [CODE_COVERAGE_RULES_CLEAN='
|
||||
+clean: code-coverage-clean
|
||||
+distclean: code-coverage-clean
|
||||
+code-coverage-clean:
|
||||
+ -$(LCOV) --directory $(top_builddir) -z
|
||||
+ -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY)
|
||||
+ -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete
|
||||
+']
|
||||
+ ], [
|
||||
+ [CODE_COVERAGE_RULES_CHECK='
|
||||
+ @echo "Need to reconfigure with --enable-code-coverage"
|
||||
+']
|
||||
+ CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK"
|
||||
+ CODE_COVERAGE_RULES_CLEAN=''
|
||||
+ ])
|
||||
+
|
||||
+[CODE_COVERAGE_RULES='
|
||||
+# Code coverage
|
||||
+#
|
||||
+# Optional:
|
||||
+# - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting.
|
||||
+# Multiple directories may be specified, separated by whitespace.
|
||||
+# (Default: $(top_builddir))
|
||||
+# - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated
|
||||
+# by lcov for code coverage. (Default:
|
||||
+# $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info)
|
||||
+# - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage
|
||||
+# reports to be created. (Default:
|
||||
+# $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage)
|
||||
+# - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage,
|
||||
+# set to 0 to disable it and leave empty to stay with the default.
|
||||
+# (Default: empty)
|
||||
+# - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov
|
||||
+# instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
|
||||
+# - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov
|
||||
+# instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
|
||||
+# - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov
|
||||
+# - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the
|
||||
+# collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
|
||||
+# - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov
|
||||
+# instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
|
||||
+# - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering
|
||||
+# lcov instance. (Default: empty)
|
||||
+# - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov
|
||||
+# instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
|
||||
+# - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the
|
||||
+# genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE)
|
||||
+# - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml
|
||||
+# instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
|
||||
+# - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore
|
||||
+#
|
||||
+# The generated report will be titled using the $(PACKAGE_NAME) and
|
||||
+# $(PACKAGE_VERSION). In order to add the current git hash to the title,
|
||||
+# use the git-version-gen script, available online.
|
||||
+
|
||||
+# Optional variables
|
||||
+CODE_COVERAGE_DIRECTORY ?= $(top_builddir)
|
||||
+CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info
|
||||
+CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage
|
||||
+CODE_COVERAGE_BRANCH_COVERAGE ?=
|
||||
+CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
|
||||
+--rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
|
||||
+CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT)
|
||||
+CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)"
|
||||
+CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH)
|
||||
+CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT)
|
||||
+CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?=
|
||||
+CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT)
|
||||
+CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\
|
||||
+$(if $(CODE_COVERAGE_BRANCH_COVERAGE),\
|
||||
+--rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE))
|
||||
+CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT)
|
||||
+CODE_COVERAGE_IGNORE_PATTERN ?=
|
||||
+
|
||||
+GITIGNOREFILES ?=
|
||||
+GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY)
|
||||
+
|
||||
+code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V))
|
||||
+code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY))
|
||||
+code_coverage_v_lcov_cap_0 = @echo " LCOV --capture"\
|
||||
+ $(CODE_COVERAGE_OUTPUT_FILE);
|
||||
+code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V))
|
||||
+code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY))
|
||||
+code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*"\
|
||||
+ $(CODE_COVERAGE_IGNORE_PATTERN);
|
||||
+code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V))
|
||||
+code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY))
|
||||
+code_coverage_v_genhtml_0 = @echo " GEN " $(CODE_COVERAGE_OUTPUT_DIRECTORY);
|
||||
+code_coverage_quiet = $(code_coverage_quiet_$(V))
|
||||
+code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY))
|
||||
+code_coverage_quiet_0 = --quiet
|
||||
+
|
||||
+# sanitizes the test-name: replaces with underscores: dashes and dots
|
||||
+code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1)))
|
||||
+
|
||||
+# Use recursive makes in order to ignore errors during check
|
||||
+check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"'
|
||||
+
|
||||
+# Capture code coverage data
|
||||
+code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"'
|
||||
+
|
||||
+# Hook rule executed before code-coverage-capture, overridable by the user
|
||||
+code-coverage-capture-hook:
|
||||
+
|
||||
+'"$CODE_COVERAGE_RULES_CLEAN"'
|
||||
+
|
||||
+A''M_DISTCHECK_CONFIGURE_FLAGS ?=
|
||||
+A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage
|
||||
+
|
||||
+.PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean
|
||||
+']
|
||||
+
|
||||
+ AC_SUBST([CODE_COVERAGE_RULES])
|
||||
+ m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])])
|
||||
+])
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index c695a882e..17cc80462 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -76,37 +76,6 @@ AC_DEFUN([ZFS_AC_DEBUGINFO], [
|
||||
AC_MSG_RESULT([$enable_debuginfo])
|
||||
])
|
||||
|
||||
-AC_DEFUN([ZFS_AC_GCOV_KERNEL], [
|
||||
-])
|
||||
-
|
||||
-AC_DEFUN([ZFS_AC_GCOV_USER], [
|
||||
- DEBUG_CFLAGS="$DEBUG_CFLAGS -fprofile-arcs -ftest-coverage"
|
||||
-])
|
||||
-
|
||||
-AC_DEFUN([ZFS_AC_GCOV], [
|
||||
- AC_MSG_CHECKING([whether gcov profiling will be enabled])
|
||||
- AC_ARG_ENABLE([gcov],
|
||||
- [AS_HELP_STRING([--enable-gcov],
|
||||
- [Enable gcov profiling @<:@default=no@:>@])],
|
||||
- [],
|
||||
- [enable_gcov=no])
|
||||
-
|
||||
- AS_CASE(["x$enable_gcov"],
|
||||
- ["xyes"],
|
||||
- [ZFS_AC_GCOV_KERNEL
|
||||
- ZFS_AC_GCOV_USER],
|
||||
- ["xkernel"],
|
||||
- [ZFS_AC_GCOV_KERNEL],
|
||||
- ["xuser"],
|
||||
- [ZFS_AC_GCOV_USER],
|
||||
- ["xno"],
|
||||
- [],
|
||||
- [AC_MSG_ERROR([Unknown option $enable_gcov])])
|
||||
-
|
||||
- AC_SUBST(DEBUG_CFLAGS)
|
||||
- AC_MSG_RESULT([$enable_gcov])
|
||||
-])
|
||||
-
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_UNUSED_BUT_SET_VARIABLE
|
||||
ZFS_AC_CONFIG_ALWAYS_NO_BOOL_COMPARE
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <tuxoko@gmail.com>
|
||||
Date: Mon, 21 Aug 2017 13:11:11 -0700
|
||||
Subject: [PATCH] Fix zfs_ioc_pool_sync should not use fnvlist
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Use fnvlist on user input would allow user to easily panic zfs.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Alek Pinchuk <apinchuk@datto.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
|
||||
Closes #6529
|
||||
(cherry picked from commit 7192ec7942f233e267bf631b433eb2414dc5f332)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/zfs_ioctl.c | 12 +++++++++---
|
||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c
|
||||
index d195eded7..f4f509a7e 100644
|
||||
--- a/module/zfs/zfs_ioctl.c
|
||||
+++ b/module/zfs/zfs_ioctl.c
|
||||
@@ -5901,20 +5901,26 @@ static int
|
||||
zfs_ioc_pool_sync(const char *pool, nvlist_t *innvl, nvlist_t *onvl)
|
||||
{
|
||||
int err;
|
||||
- boolean_t force;
|
||||
+ boolean_t force = B_FALSE;
|
||||
spa_t *spa;
|
||||
|
||||
if ((err = spa_open(pool, &spa, FTAG)) != 0)
|
||||
return (err);
|
||||
|
||||
- force = fnvlist_lookup_boolean_value(innvl, "force");
|
||||
+ if (innvl) {
|
||||
+ if (nvlist_lookup_boolean_value(innvl, "force", &force) != 0) {
|
||||
+ err = SET_ERROR(EINVAL);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (force) {
|
||||
spa_config_enter(spa, SCL_CONFIG, FTAG, RW_WRITER);
|
||||
vdev_config_dirty(spa->spa_root_vdev);
|
||||
spa_config_exit(spa, SCL_CONFIG, FTAG);
|
||||
}
|
||||
txg_wait_synced(spa_get_dsl(spa), 0);
|
||||
-
|
||||
+out:
|
||||
spa_close(spa, FTAG);
|
||||
|
||||
return (err);
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Fri, 22 Sep 2017 18:54:34 -0700
|
||||
Subject: [PATCH] Update codecov.yml
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Update the codecov.yml to make the following functional changes.
|
||||
|
||||
* Do not require the CI testing to pass before posting results.
|
||||
* Set red-yellow-green coverage percent from 50%-100%
|
||||
* Allow a 1% drop in coverage to still be considered a pass.
|
||||
* Reduce the size of the comment posted to the issue.
|
||||
|
||||
Additionally, the top level README.markdown has been updated
|
||||
to include the codecov.io badge and the project summary reworded.
|
||||
|
||||
Reviewed-by: Prakash Surya <prakash.surya@delphix.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6669
|
||||
(cherry picked from commit 3790bfa80f9b26fd750b4a554c5707b9d380aac4)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
README.markdown | 12 ++++++------
|
||||
.github/codecov.yml | 31 ++++++++++++++++++++++++++-----
|
||||
2 files changed, 32 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/README.markdown b/README.markdown
|
||||
index fd2ca8c86..1c305b35d 100644
|
||||
--- a/README.markdown
|
||||
+++ b/README.markdown
|
||||
@@ -1,9 +1,9 @@
|
||||
-<p align="center"><img src="http://zfsonlinux.org/images/zfs-linux.png"/></p>
|
||||
-ZFS is an advanced file system and volume manager which was originally
|
||||
-developed for Solaris and is now maintained by the Illumos community.
|
||||
+
|
||||
|
||||
-ZFS on Linux, which is also known as ZoL, is currently feature complete. It
|
||||
-includes fully functional and stable SPA, DMU, ZVOL, and ZPL layers. And it's native!
|
||||
+ZFS on Linux is an advanced file system and volume manager which was originally
|
||||
+developed for Solaris and is now maintained by the OpenZFS community.
|
||||
+
|
||||
+[](https://codecov.io/gh/zfsonlinux/zfs)
|
||||
|
||||
# Official Resources
|
||||
* [Site](http://zfsonlinux.org)
|
||||
@@ -16,4 +16,4 @@ Full documentation for installing ZoL on your favorite Linux distribution can
|
||||
be found at [our site](http://zfsonlinux.org/).
|
||||
|
||||
# Contribute & Develop
|
||||
-We have a separate document with [contribution guidelines](./.github/CONTRIBUTING.md).
|
||||
\ No newline at end of file
|
||||
+We have a separate document with [contribution guidelines](./.github/CONTRIBUTING.md).
|
||||
diff --git a/.github/codecov.yml b/.github/codecov.yml
|
||||
index f36be39cb..e74c59a0f 100644
|
||||
--- a/.github/codecov.yml
|
||||
+++ b/.github/codecov.yml
|
||||
@@ -1,9 +1,30 @@
|
||||
codecov:
|
||||
- strict_yaml_branch: master # only use the latest copy on master branch
|
||||
-
|
||||
-comment: off
|
||||
+ notify:
|
||||
+ require_ci_to_pass: no
|
||||
|
||||
coverage:
|
||||
+ precision: 2
|
||||
+ round: down
|
||||
+ range: "50...100"
|
||||
+
|
||||
status:
|
||||
- project: off
|
||||
- patch: off
|
||||
+ project:
|
||||
+ default:
|
||||
+ threshold: 1%
|
||||
+
|
||||
+ patch:
|
||||
+ default:
|
||||
+ threshold: 1%
|
||||
+
|
||||
+parsers:
|
||||
+ gcov:
|
||||
+ branch_detection:
|
||||
+ conditional: yes
|
||||
+ loop: yes
|
||||
+ method: no
|
||||
+ macro: no
|
||||
+
|
||||
+comment:
|
||||
+ layout: "header, sunburst, diff"
|
||||
+ behavior: default
|
||||
+ require_changes: no
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Date: Wed, 30 Aug 2017 21:09:18 +0200
|
||||
Subject: [PATCH] dmu_objset: release bonus buffer in failure path
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reported by kmemleak during testing of a new patch:
|
||||
|
||||
```
|
||||
unreferenced object 0xffff9f1c12e38800 (size 1024):
|
||||
comm "z_upgrade", pid 17842, jiffies 4296870904 (age 8746.268s)
|
||||
backtrace:
|
||||
kmemleak_alloc+0x7a/0x100
|
||||
__kmalloc_node+0x26c/0x510
|
||||
range_tree_create+0x39/0xa0 [zfs]
|
||||
dmu_zfetch_init+0x73/0xe0 [zfs]
|
||||
dnode_create+0x12c/0x3b0 [zfs]
|
||||
dnode_hold_impl+0x1096/0x1130 [zfs]
|
||||
dnode_hold+0x23/0x30 [zfs]
|
||||
dmu_bonus_hold_impl+0x6b/0x370 [zfs]
|
||||
dmu_bonus_hold+0x1e/0x30 [zfs]
|
||||
dmu_objset_space_upgrade+0x114/0x310 [zfs]
|
||||
dmu_objset_userobjspace_upgrade_cb+0xd8/0x150 [zfs]
|
||||
dmu_objset_upgrade_task_cb+0x136/0x1e0 [zfs]
|
||||
kthread+0x119/0x150
|
||||
```
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Closes #6575
|
||||
(cherry picked from commit a94447ddf3e8632e1e0476a3b1c985f41a0ae899)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/dmu_objset.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c
|
||||
index 9a7a6968d..3425d542f 100644
|
||||
--- a/module/zfs/dmu_objset.c
|
||||
+++ b/module/zfs/dmu_objset.c
|
||||
@@ -1853,6 +1853,7 @@ dmu_objset_space_upgrade(objset_t *os)
|
||||
dmu_tx_hold_bonus(tx, obj);
|
||||
objerr = dmu_tx_assign(tx, TXG_WAIT);
|
||||
if (objerr != 0) {
|
||||
+ dmu_buf_rele(db, FTAG);
|
||||
dmu_tx_abort(tx);
|
||||
continue;
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: David Quigley <dpquigl@users.noreply.github.com>
|
||||
Date: Wed, 13 Sep 2017 12:45:04 -0600
|
||||
Subject: [PATCH] Fix bug in distclean which removes needed files
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Running distclean removes the following files because of an error
|
||||
in Makefile.am
|
||||
|
||||
deleted: tests/zfs-tests/include/commands.cfg
|
||||
deleted: tests/zfs-tests/include/libtest.shlib
|
||||
deleted: tests/zfs-tests/include/math.shlib
|
||||
deleted: tests/zfs-tests/include/properties.shlib
|
||||
deleted: tests/zfs-tests/include/zpool_script.shlib
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: David Quigley <david.quigley@intel.com>
|
||||
Closes #6636
|
||||
(cherry picked from commit 53e5890cff8b7c21d34e1142ae717ae79af54da6)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
tests/zfs-tests/include/Makefile.am | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/zfs-tests/include/Makefile.am b/tests/zfs-tests/include/Makefile.am
|
||||
index 579e1356e..24633ccc3 100644
|
||||
--- a/tests/zfs-tests/include/Makefile.am
|
||||
+++ b/tests/zfs-tests/include/Makefile.am
|
||||
@@ -10,4 +10,4 @@ dist_pkgdata_SCRIPTS = \
|
||||
EXTRA_DIST=default.cfg.in
|
||||
|
||||
distclean-local::
|
||||
- -$(RM) $(dist_pkgdata_SCRIPTS)
|
||||
+ -$(RM) default.cfg
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Fri, 22 Sep 2017 22:16:18 -0700
|
||||
Subject: [PATCH] Fix "--enable-code-coverage" debug build
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When --enable-code-coverage is provided it should not result
|
||||
in NDEBUG being defined. This is controlled by --enable-debug.
|
||||
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6674
|
||||
(cherry picked from commit 6897ea475fd0c82a74edacf374d4e339f9a9b86b)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/ax_code_coverage.m4 | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/config/ax_code_coverage.m4 b/config/ax_code_coverage.m4
|
||||
index 6484f0332..4417d4444 100644
|
||||
--- a/config/ax_code_coverage.m4
|
||||
+++ b/config/ax_code_coverage.m4
|
||||
@@ -124,7 +124,7 @@ AC_DEFUN([AX_CODE_COVERAGE],[
|
||||
|
||||
dnl Build the code coverage flags
|
||||
dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility
|
||||
- CODE_COVERAGE_CPPFLAGS="-DNDEBUG"
|
||||
+ CODE_COVERAGE_CPPFLAGS=""
|
||||
CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
|
||||
CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage"
|
||||
CODE_COVERAGE_LIBS="-lgcov"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Thu, 19 Oct 2017 10:06:55 -0700
|
||||
Subject: [PATCH] Remove vn_rename and vn_remove dependency
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The only place vn_rename and vn_remove are used is when writing
|
||||
out an updated pool configuration file. By truncating the file
|
||||
instead of renaming and removing it we can avoid having to implement
|
||||
these interfaces entirely. Functionally an empty cache file is
|
||||
treated the same as a missing cache file. This is particularly
|
||||
advantageous because the Linux kernel has never provided a way
|
||||
to reliably implement vn_rename and vn_remove.
|
||||
|
||||
The cachefile_004_pos.ksh test case was updated to understand
|
||||
that an empty cache file is the same as a missing one.
|
||||
|
||||
The zfs-import-* systemd service files were not updated to use
|
||||
ConditionFileNotEmpty in place of ConditionPathExists. This
|
||||
means that after exporting all pools and rebooting new pools
|
||||
will not the scanned for on the next boot. This small change
|
||||
should not impact normal usage since pools are not exported
|
||||
as part of a normal shutdown.
|
||||
|
||||
Documentation was updated accordingly.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Arkadiusz Bubała <arkadiusz.bubala@open-e.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes zfsonlinux/spl#648
|
||||
Closes #6753
|
||||
(cherry picked from commit 5d62588032aa1d13d7f789cf564a0d20c77a5762)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/spa_config.c | 34 ++++++++++++++++++----
|
||||
man/man8/zpool.8 | 2 +-
|
||||
.../functional/cachefile/cachefile_004_pos.ksh | 6 ++--
|
||||
3 files changed, 32 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/spa_config.c b/module/zfs/spa_config.c
|
||||
index 5b792b868..fea239014 100644
|
||||
--- a/module/zfs/spa_config.c
|
||||
+++ b/module/zfs/spa_config.c
|
||||
@@ -147,6 +147,26 @@ out:
|
||||
kobj_close_file(file);
|
||||
}
|
||||
|
||||
+static int
|
||||
+spa_config_remove(spa_config_dirent_t *dp)
|
||||
+{
|
||||
+#if defined(__linux__) && defined(_KERNEL)
|
||||
+ int error, flags = FWRITE | FTRUNC;
|
||||
+ uio_seg_t seg = UIO_SYSSPACE;
|
||||
+ vnode_t *vp;
|
||||
+
|
||||
+ error = vn_open(dp->scd_path, seg, flags, 0644, &vp, 0, 0);
|
||||
+ if (error == 0) {
|
||||
+ (void) VOP_FSYNC(vp, FSYNC, kcred, NULL);
|
||||
+ (void) VOP_CLOSE(vp, 0, 1, 0, kcred, NULL);
|
||||
+ }
|
||||
+
|
||||
+ return (error);
|
||||
+#else
|
||||
+ return (vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE));
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static int
|
||||
spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl)
|
||||
{
|
||||
@@ -161,7 +181,10 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl)
|
||||
* If the nvlist is empty (NULL), then remove the old cachefile.
|
||||
*/
|
||||
if (nvl == NULL) {
|
||||
- err = vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE);
|
||||
+ err = spa_config_remove(dp);
|
||||
+ if (err == ENOENT)
|
||||
+ err = 0;
|
||||
+
|
||||
return (err);
|
||||
}
|
||||
|
||||
@@ -174,9 +197,9 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl)
|
||||
#if defined(__linux__) && defined(_KERNEL)
|
||||
/*
|
||||
* Write the configuration to disk. Due to the complexity involved
|
||||
- * in performing a rename from within the kernel the file is truncated
|
||||
- * and overwritten in place. In the event of an error the file is
|
||||
- * unlinked to make sure we always have a consistent view of the data.
|
||||
+ * in performing a rename and remove from within the kernel the file
|
||||
+ * is instead truncated and overwritten in place. This way we always
|
||||
+ * have a consistent view of the data or a zero length file.
|
||||
*/
|
||||
err = vn_open(dp->scd_path, UIO_SYSSPACE, oflags, 0644, &vp, 0, 0);
|
||||
if (err == 0) {
|
||||
@@ -186,9 +209,8 @@ spa_config_write(spa_config_dirent_t *dp, nvlist_t *nvl)
|
||||
err = VOP_FSYNC(vp, FSYNC, kcred, NULL);
|
||||
|
||||
(void) VOP_CLOSE(vp, oflags, 1, 0, kcred, NULL);
|
||||
-
|
||||
if (err)
|
||||
- (void) vn_remove(dp->scd_path, UIO_SYSSPACE, RMFILE);
|
||||
+ (void) spa_config_remove(dp);
|
||||
}
|
||||
#else
|
||||
/*
|
||||
diff --git a/man/man8/zpool.8 b/man/man8/zpool.8
|
||||
index 328ba3dce..22579101a 100644
|
||||
--- a/man/man8/zpool.8
|
||||
+++ b/man/man8/zpool.8
|
||||
@@ -655,7 +655,7 @@ Because the kernel destroys and recreates this file when pools are added and
|
||||
removed, care should be taken when attempting to access this file.
|
||||
When the last pool using a
|
||||
.Sy cachefile
|
||||
-is exported or destroyed, the file is removed.
|
||||
+is exported or destroyed, the file will be empty.
|
||||
.It Sy comment Ns = Ns Ar text
|
||||
A text string consisting of printable ASCII characters that will be stored
|
||||
such that it is available even if the pool becomes faulted.
|
||||
diff --git a/tests/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh b/tests/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
|
||||
index ae54a9365..e0b81e166 100755
|
||||
--- a/tests/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
|
||||
@@ -98,13 +98,13 @@ log_must zpool set cachefile=$CPATH2 $TESTPOOL1
|
||||
log_must pool_in_cache $TESTPOOL1 $CPATH2
|
||||
log_must zpool set cachefile=$CPATH2 $TESTPOOL2
|
||||
log_must pool_in_cache $TESTPOOL2 $CPATH2
|
||||
-if [[ -f $CPATH1 ]]; then
|
||||
+if [[ -s $CPATH1 ]]; then
|
||||
log_fail "Verify set when cachefile is set on pool."
|
||||
fi
|
||||
|
||||
log_must zpool export $TESTPOOL1
|
||||
log_must zpool export $TESTPOOL2
|
||||
-if [[ -f $CPATH2 ]]; then
|
||||
+if [[ -s $CPATH2 ]]; then
|
||||
log_fail "Verify export when cachefile is set on pool."
|
||||
fi
|
||||
|
||||
@@ -117,7 +117,7 @@ log_must pool_in_cache $TESTPOOL2 $CPATH2
|
||||
|
||||
log_must zpool destroy $TESTPOOL1
|
||||
log_must zpool destroy $TESTPOOL2
|
||||
-if [[ -f $CPATH2 ]]; then
|
||||
+if [[ -s $CPATH2 ]]; then
|
||||
log_fail "Verify destroy when cachefile is set on pool."
|
||||
fi
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Wed, 25 Oct 2017 08:29:02 +0200
|
||||
Subject: [PATCH] Rewrite of function fBytes() in arc_summary.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Replace if-elif-else construction with shorter loop;
|
||||
remove unused parameter "Decimal"; centralize format
|
||||
string; add function documentation string; conform to
|
||||
PEP8.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6784
|
||||
(cherry picked from commit 5dc25de668ce8c4e43ebd8c589202392297699b9)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 60 ++++++++++++++++++++++--------------------
|
||||
1 file changed, 31 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index 93918a08f..e19278cef 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -88,36 +88,38 @@ def div2():
|
||||
sys.stdout.write("\n")
|
||||
|
||||
|
||||
-def fBytes(Bytes=0, Decimal=2):
|
||||
- kbytes = (2 ** 10)
|
||||
- mbytes = (2 ** 20)
|
||||
- gbytes = (2 ** 30)
|
||||
- tbytes = (2 ** 40)
|
||||
- pbytes = (2 ** 50)
|
||||
- ebytes = (2 ** 60)
|
||||
- zbytes = (2 ** 70)
|
||||
- ybytes = (2 ** 80)
|
||||
-
|
||||
- if Bytes >= ybytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / ybytes) + "\tYiB"
|
||||
- elif Bytes >= zbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / zbytes) + "\tZiB"
|
||||
- elif Bytes >= ebytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / ebytes) + "\tEiB"
|
||||
- elif Bytes >= pbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / pbytes) + "\tPiB"
|
||||
- elif Bytes >= tbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / tbytes) + "\tTiB"
|
||||
- elif Bytes >= gbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / gbytes) + "\tGiB"
|
||||
- elif Bytes >= mbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / mbytes) + "\tMiB"
|
||||
- elif Bytes >= kbytes:
|
||||
- return str("%0." + str(Decimal) + "f") % (Bytes / kbytes) + "\tKiB"
|
||||
- elif Bytes == 0:
|
||||
- return str("%d" % 0) + "\tBytes"
|
||||
+def fBytes(b=0):
|
||||
+ """Return human-readable representation of a byte value in
|
||||
+ powers of 2 (eg "KiB" for "kibibytes", etc) to two decimal
|
||||
+ points. Values smaller than one KiB are returned without
|
||||
+ decimal points.
|
||||
+ """
|
||||
+
|
||||
+ prefixes = [
|
||||
+ [2**80, "YiB"], # yobibytes (yotta)
|
||||
+ [2**70, "ZiB"], # zebibytes (zetta)
|
||||
+ [2**60, "EiB"], # exbibytes (exa)
|
||||
+ [2**50, "PiB"], # pebibytes (peta)
|
||||
+ [2**40, "TiB"], # tebibytes (tera)
|
||||
+ [2**30, "GiB"], # gibibytes (giga)
|
||||
+ [2**20, "MiB"], # mebibytes (mega)
|
||||
+ [2**10, "KiB"]] # kibibytes (kilo)
|
||||
+
|
||||
+ if b >= 2**10:
|
||||
+
|
||||
+ for limit, unit in prefixes:
|
||||
+
|
||||
+ if b >= limit:
|
||||
+ value = b / limit
|
||||
+ break
|
||||
+
|
||||
+ result = "%0.2f\t%s" % (value, unit)
|
||||
+
|
||||
else:
|
||||
- return str("%d" % Bytes) + "\tBytes"
|
||||
+
|
||||
+ result = "%d\tBytes" % b
|
||||
+
|
||||
+ return result
|
||||
|
||||
|
||||
def fHits(Hits=0, Decimal=2):
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Sun, 17 Dec 2017 23:08:48 +0100
|
||||
Subject: [PATCH] Fix --with-systemd on Debian-based distributions (#6963)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
These changes propagate the "--with-systemd" configure option to the
|
||||
RPM spec file, allowing Debian-based distributions to package
|
||||
systemd-related files.
|
||||
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #6591
|
||||
Closes #6963
|
||||
(cherry picked from commit 03658d5081c64e14898cc9be45da3305b27fac9e)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
rpm/generic/zfs.spec.in | 2 +-
|
||||
config/user-systemd.m4 | 20 ++++++++++++++++----
|
||||
config/zfs-build.m4 | 2 +-
|
||||
3 files changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in
|
||||
index 8df57fa46..4a911b4c2 100644
|
||||
--- a/rpm/generic/zfs.spec.in
|
||||
+++ b/rpm/generic/zfs.spec.in
|
||||
@@ -87,11 +87,11 @@ BuildRequires: libblkid-devel
|
||||
BuildRequires: libudev-devel
|
||||
BuildRequires: libattr-devel
|
||||
%endif
|
||||
+
|
||||
%if 0%{?_systemd}
|
||||
Requires(post): systemd
|
||||
Requires(preun): systemd
|
||||
Requires(postun): systemd
|
||||
-BuildRequires: systemd
|
||||
%endif
|
||||
|
||||
# The zpool iostat/status -c scripts call some utilities like lsblk and iostat
|
||||
diff --git a/config/user-systemd.m4 b/config/user-systemd.m4
|
||||
index c2105abce..de2a44f10 100644
|
||||
--- a/config/user-systemd.m4
|
||||
+++ b/config/user-systemd.m4
|
||||
@@ -2,7 +2,8 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_SYSTEMD], [
|
||||
AC_ARG_ENABLE(systemd,
|
||||
AC_HELP_STRING([--enable-systemd],
|
||||
[install systemd unit/preset files [[default: yes]]]),
|
||||
- [],enable_systemd=yes)
|
||||
+ [enable_systemd=$enableval],
|
||||
+ [enable_systemd=check])
|
||||
|
||||
AC_ARG_WITH(systemdunitdir,
|
||||
AC_HELP_STRING([--with-systemdunitdir=DIR],
|
||||
@@ -19,16 +20,27 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_SYSTEMD], [
|
||||
[install systemd module load files into dir [[/usr/lib/modules-load.d]]]),
|
||||
systemdmoduleloaddir=$withval,systemdmodulesloaddir=/usr/lib/modules-load.d)
|
||||
|
||||
+ AS_IF([test "x$enable_systemd" = xcheck], [
|
||||
+ AS_IF([systemctl --version >/dev/null 2>&1],
|
||||
+ [enable_systemd=yes],
|
||||
+ [enable_systemd=no])
|
||||
+ ])
|
||||
|
||||
- AS_IF([test "x$enable_systemd" = xyes],
|
||||
- [
|
||||
+ AC_MSG_CHECKING(for systemd support)
|
||||
+ AC_MSG_RESULT([$enable_systemd])
|
||||
+
|
||||
+ AS_IF([test "x$enable_systemd" = xyes], [
|
||||
ZFS_INIT_SYSTEMD=systemd
|
||||
ZFS_MODULE_LOAD=modules-load.d
|
||||
+ DEFINE_SYSTEMD='--with systemd --define "_unitdir $(systemdunitdir)" --define "_presetdir $(systemdpresetdir)"'
|
||||
modulesloaddir=$systemdmodulesloaddir
|
||||
- ])
|
||||
+ ],[
|
||||
+ DEFINE_SYSTEMD='--without systemd'
|
||||
+ ])
|
||||
|
||||
AC_SUBST(ZFS_INIT_SYSTEMD)
|
||||
AC_SUBST(ZFS_MODULE_LOAD)
|
||||
+ AC_SUBST(DEFINE_SYSTEMD)
|
||||
AC_SUBST(systemdunitdir)
|
||||
AC_SUBST(systemdpresetdir)
|
||||
AC_SUBST(modulesloaddir)
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index 17cc80462..5eaa49c87 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -160,7 +160,7 @@ AC_DEFUN([ZFS_AC_RPM], [
|
||||
])
|
||||
|
||||
RPM_DEFINE_COMMON='--define "$(DEBUG_ZFS) 1"'
|
||||
- RPM_DEFINE_UTIL='--define "_dracutdir $(dracutdir)" --define "_udevdir $(udevdir)" --define "_udevruledir $(udevruledir)" --define "_initconfdir $(DEFAULT_INITCONF_DIR)" $(DEFINE_INITRAMFS)'
|
||||
+ RPM_DEFINE_UTIL='--define "_dracutdir $(dracutdir)" --define "_udevdir $(udevdir)" --define "_udevruledir $(udevruledir)" --define "_initconfdir $(DEFAULT_INITCONF_DIR)" $(DEFINE_INITRAMFS) $(DEFINE_SYSTEMD)'
|
||||
RPM_DEFINE_KMOD='--define "kernels $(LINUX_VERSION)" --define "require_spldir $(SPL)" --define "require_splobj $(SPL_OBJ)" --define "ksrc $(LINUX)" --define "kobj $(LINUX_OBJ)"'
|
||||
RPM_DEFINE_DKMS=
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Fri, 3 Nov 2017 23:43:53 +0100
|
||||
Subject: [PATCH] Minor code cleanup in arc_summary.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Simplify and inline single-use function div1(); inline twice-used
|
||||
function div2(); add function comment to zfs_header(); replace
|
||||
variable "unused" in get_Kstat() with "_" following convention.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6802
|
||||
(cherry picked from commit 03f638a8efe4f8e5901fc0e07fad5604e2550f22)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 25 ++++++++-----------------
|
||||
1 file changed, 8 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index e19278cef..6b818edc7 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -63,7 +63,7 @@ def get_Kstat():
|
||||
del kstats[0:2]
|
||||
for kstat in kstats:
|
||||
kstat = kstat.strip()
|
||||
- name, unused, value = kstat.split()
|
||||
+ name, _, value = kstat.split()
|
||||
Kstat[namespace + name] = D(value)
|
||||
|
||||
Kstat = {}
|
||||
@@ -77,17 +77,6 @@ def get_Kstat():
|
||||
return Kstat
|
||||
|
||||
|
||||
-def div1():
|
||||
- sys.stdout.write("\n")
|
||||
- for i in range(18):
|
||||
- sys.stdout.write("%s" % "----")
|
||||
- sys.stdout.write("\n")
|
||||
-
|
||||
-
|
||||
-def div2():
|
||||
- sys.stdout.write("\n")
|
||||
-
|
||||
-
|
||||
def fBytes(b=0):
|
||||
"""Return human-readable representation of a byte value in
|
||||
powers of 2 (eg "KiB" for "kibibytes", etc) to two decimal
|
||||
@@ -908,11 +897,13 @@ unSub = [
|
||||
|
||||
|
||||
def zfs_header():
|
||||
- daydate = time.strftime("%a %b %d %H:%M:%S %Y")
|
||||
+ """Print title string with date
|
||||
+ """
|
||||
+ daydate = time.strftime('%a %b %d %H:%M:%S %Y')
|
||||
|
||||
- div1()
|
||||
- sys.stdout.write("ZFS Subsystem Report\t\t\t\t%s" % daydate)
|
||||
- div2()
|
||||
+ sys.stdout.write('\n'+'-'*72+'\n')
|
||||
+ sys.stdout.write('ZFS Subsystem Report\t\t\t\t%s' % daydate)
|
||||
+ sys.stdout.write('\n')
|
||||
|
||||
|
||||
def usage():
|
||||
@@ -975,7 +966,7 @@ def main():
|
||||
zfs_header()
|
||||
for page in pages:
|
||||
page(Kstat)
|
||||
- div2()
|
||||
+ sys.stdout.write("\n")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Sat, 4 Nov 2017 21:33:28 +0100
|
||||
Subject: [PATCH] Rewrite fHits() in arc_summary.py with SI units
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Complete rewrite of fHits(). Move units from non-standard English
|
||||
abbreviations to SI units, thereby avoiding confusion because of
|
||||
"long scale" and "short scale" numbers. Remove unused parameter
|
||||
"Decimal". Add function string. Aim to confirm to PEP8.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6815
|
||||
(cherry picked from commit 88e4e0d5dd1800add5191633d65797ce1c2eb4cf)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 62 ++++++++++++++++++++++--------------------
|
||||
1 file changed, 33 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index 6b818edc7..cbb7d20bc 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -111,36 +111,40 @@ def fBytes(b=0):
|
||||
return result
|
||||
|
||||
|
||||
-def fHits(Hits=0, Decimal=2):
|
||||
- khits = (10 ** 3)
|
||||
- mhits = (10 ** 6)
|
||||
- bhits = (10 ** 9)
|
||||
- thits = (10 ** 12)
|
||||
- qhits = (10 ** 15)
|
||||
- Qhits = (10 ** 18)
|
||||
- shits = (10 ** 21)
|
||||
- Shits = (10 ** 24)
|
||||
-
|
||||
- if Hits >= Shits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / Shits) + "S"
|
||||
- elif Hits >= shits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / shits) + "s"
|
||||
- elif Hits >= Qhits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / Qhits) + "Q"
|
||||
- elif Hits >= qhits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / qhits) + "q"
|
||||
- elif Hits >= thits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / thits) + "t"
|
||||
- elif Hits >= bhits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / bhits) + "b"
|
||||
- elif Hits >= mhits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / mhits) + "m"
|
||||
- elif Hits >= khits:
|
||||
- return str("%0." + str(Decimal) + "f") % (Hits / khits) + "k"
|
||||
- elif Hits == 0:
|
||||
- return str("%d" % 0)
|
||||
+def fHits(hits=0):
|
||||
+ """Create a human-readable representation of the number of hits.
|
||||
+ The single-letter symbols used are SI to avoid the confusion caused
|
||||
+ by the different "short scale" and "long scale" representations in
|
||||
+ English, which use the same words for different values. See
|
||||
+ https://en.wikipedia.org/wiki/Names_of_large_numbers and
|
||||
+ https://physics.nist.gov/cuu/Units/prefixes.html
|
||||
+ """
|
||||
+
|
||||
+ numbers = [
|
||||
+ [10**24, 'Y'], # yotta (septillion)
|
||||
+ [10**21, 'Z'], # zetta (sextillion)
|
||||
+ [10**18, 'E'], # exa (quintrillion)
|
||||
+ [10**15, 'P'], # peta (quadrillion)
|
||||
+ [10**12, 'T'], # tera (trillion)
|
||||
+ [10**9, 'G'], # giga (billion)
|
||||
+ [10**6, 'M'], # mega (million)
|
||||
+ [10**3, 'k']] # kilo (thousand)
|
||||
+
|
||||
+ if hits >= 1000:
|
||||
+
|
||||
+ for limit, symbol in numbers:
|
||||
+
|
||||
+ if hits >= limit:
|
||||
+ value = hits/limit
|
||||
+ break
|
||||
+
|
||||
+ result = "%0.2f%s" % (value, symbol)
|
||||
+
|
||||
else:
|
||||
- return str("%d" % Hits)
|
||||
+
|
||||
+ result = "%d" % hits
|
||||
+
|
||||
+ return result
|
||||
|
||||
|
||||
def fPerc(lVal=0, rVal=0, Decimal=2):
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Tue, 19 Dec 2017 19:49:33 +0100
|
||||
Subject: [PATCH] ZTS: Fix create-o_ashift test case
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The function that fills the uberblock ring buffer on every device label
|
||||
has been reworked to avoid occasional failures caused by a race
|
||||
condition that prevents 'zpool sync' from writing some uberblock
|
||||
sequentially: this happens when the pool sync ioctl dispatch code calls
|
||||
txg_wait_synced() while we're already waiting for a TXG to sync.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #6924
|
||||
Closes #6977
|
||||
(cherry picked from commit 6c891ade8bee9c54484d5cf9b939582b7a9b7eeb)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zdb/zdb.c | 8 ++--
|
||||
.../cli_root/zpool_create/create-o_ashift.ksh | 47 ++++++++++------------
|
||||
2 files changed, 26 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
|
||||
index 1097501e8..442685486 100644
|
||||
--- a/cmd/zdb/zdb.c
|
||||
+++ b/cmd/zdb/zdb.c
|
||||
@@ -2716,10 +2716,6 @@ dump_label(const char *dev)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
- if (ioctl(fd, BLKFLSBUF) != 0)
|
||||
- (void) printf("failed to invalidate cache '%s' : %s\n", path,
|
||||
- strerror(errno));
|
||||
-
|
||||
if (fstat64_blk(fd, &statbuf) != 0) {
|
||||
(void) printf("failed to stat '%s': %s\n", path,
|
||||
strerror(errno));
|
||||
@@ -2727,6 +2723,10 @@ dump_label(const char *dev)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
+ if (S_ISBLK(statbuf.st_mode) && ioctl(fd, BLKFLSBUF) != 0)
|
||||
+ (void) printf("failed to invalidate cache '%s' : %s\n", path,
|
||||
+ strerror(errno));
|
||||
+
|
||||
avl_create(&config_tree, cksum_record_compare,
|
||||
sizeof (cksum_record_t), offsetof(cksum_record_t, link));
|
||||
avl_create(&uberblock_tree, cksum_record_compare,
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh b/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh
|
||||
index 6449c8a91..6a9c3e28c 100755
|
||||
--- a/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh
|
||||
@@ -44,47 +44,45 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
- poolexists $TESTPOOL && destroy_pool $TESTPOOL
|
||||
+ destroy_pool $TESTPOOL
|
||||
log_must rm -f $disk
|
||||
}
|
||||
|
||||
#
|
||||
-# Commit the specified number of TXGs to the provided pool
|
||||
-# We use 'zpool sync' here because we can't force it via sync(1) like on illumos
|
||||
-# $1 pool name
|
||||
-# $2 number of txg syncs
|
||||
+# Fill the uberblock ring in every <device> label: we do this by committing
|
||||
+# TXGs to the provided <pool> until every slot contains a valid uberblock.
|
||||
+# NOTE: We use 'zpool sync' here because we can't force it via sync(1) like on
|
||||
+# illumos
|
||||
#
|
||||
-function txg_sync
|
||||
+function write_device_uberblocks # <device> <pool>
|
||||
{
|
||||
- typeset pool=$1
|
||||
- typeset -i count=$2
|
||||
- typeset -i i=0;
|
||||
+ typeset device=$1
|
||||
+ typeset pool=$2
|
||||
|
||||
- while [ $i -lt $count ]
|
||||
+ while [ "$(zdb -quuul $device | grep -c 'invalid')" -ne 0 ]
|
||||
do
|
||||
- log_must sync_pool $pool true
|
||||
- ((i = i + 1))
|
||||
+ sync_pool $pool true
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
-# Verify device $1 labels contains $2 valid uberblocks in every label
|
||||
-# $1 device
|
||||
-# $2 uberblocks count
|
||||
+# Verify every label on <device> contains <count> (valid) uberblocks
|
||||
#
|
||||
-function verify_device_uberblocks
|
||||
+function verify_device_uberblocks # <device> <count>
|
||||
{
|
||||
typeset device=$1
|
||||
typeset ubcount=$2
|
||||
|
||||
zdb -quuul $device | egrep '^(\s+)?Uberblock' |
|
||||
- egrep -v 'invalid$' | awk \
|
||||
- -v ubcount=$ubcount '{ uberblocks[$0]++; }
|
||||
- END { for (i in uberblocks) {
|
||||
- count++;
|
||||
- if (uberblocks[i] != 4) { exit 1; }
|
||||
- }
|
||||
- if (count != ubcount) { exit 1; } }'
|
||||
+ awk -v ubcount=$ubcount 'BEGIN { count=0 } { uberblocks[$0]++; }
|
||||
+ END {
|
||||
+ for (i in uberblocks) {
|
||||
+ if (i ~ /invalid/) { continue; }
|
||||
+ if (uberblocks[i] != 4) { exit 1; }
|
||||
+ count++;
|
||||
+ }
|
||||
+ if (count != ubcount) { exit 1; }
|
||||
+ }'
|
||||
|
||||
return $?
|
||||
}
|
||||
@@ -110,8 +108,7 @@ do
|
||||
log_fail "Pool was created without setting ashift value to "\
|
||||
"$ashift (current = $pprop)"
|
||||
fi
|
||||
- # force 128 txg sync to fill the uberblock ring
|
||||
- txg_sync $TESTPOOL 128
|
||||
+ write_device_uberblocks $disk $TESTPOOL
|
||||
verify_device_uberblocks $disk ${ubcount[$i]}
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,213 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Sun, 5 Nov 2017 22:11:37 +0100
|
||||
Subject: [PATCH] Add documentation strings to arc_summary.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Include docstrings (PEP8, PEP257) for module and all functions.
|
||||
Separately, remove outdated section in comment at start of
|
||||
module. Separately, remove unused global constant "usetunable".
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6818
|
||||
(cherry picked from commit 03955e348803a942048db8b32827f7ff6715c02e)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 56 +++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 42 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index cbb7d20bc..f4968fb6a 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -31,34 +31,37 @@
|
||||
#
|
||||
# If you are having troubles when using this script from cron(8) please try
|
||||
# adjusting your PATH before reporting problems.
|
||||
-#
|
||||
-# /usr/bin & /sbin
|
||||
-#
|
||||
-# Binaries used are:
|
||||
-#
|
||||
-# dc(1), kldstat(8), sed(1), sysctl(8) & vmstat(8)
|
||||
-#
|
||||
-# Binaries that I am working on phasing out are:
|
||||
-#
|
||||
-# dc(1) & sed(1)
|
||||
+"""Print statistics on the ZFS Adjustable Replacement Cache (ARC)
|
||||
+
|
||||
+Provides basic information on the ARC, its efficiency, the L2ARC (if present),
|
||||
+the Data Management Unit (DMU), Virtual Devices (VDEVs), and tunables. See the
|
||||
+in-source documentation and code at
|
||||
+https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details.
|
||||
+"""
|
||||
|
||||
import sys
|
||||
import time
|
||||
import getopt
|
||||
import re
|
||||
+
|
||||
from os import listdir
|
||||
from subprocess import Popen, PIPE
|
||||
from decimal import Decimal as D
|
||||
|
||||
-
|
||||
-usetunable = True
|
||||
show_tunable_descriptions = False
|
||||
alternate_tunable_layout = False
|
||||
kstat_pobj = re.compile("^([^:]+):\s+(.+)\s*$", flags=re.M)
|
||||
|
||||
|
||||
def get_Kstat():
|
||||
+ """Collect information on the ZFS subsystem from the /proc virtual
|
||||
+ file system. The name "kstat" is a holdover from the Solaris utility
|
||||
+ of the same name.
|
||||
+ """
|
||||
+
|
||||
def load_proc_kstats(fn, namespace):
|
||||
+ """Collect information on a specific subsystem of the ARC"""
|
||||
+
|
||||
kstats = [line.strip() for line in open(fn)]
|
||||
del kstats[0:2]
|
||||
for kstat in kstats:
|
||||
@@ -148,6 +151,8 @@ def fHits(hits=0):
|
||||
|
||||
|
||||
def fPerc(lVal=0, rVal=0, Decimal=2):
|
||||
+ """Calculate percentage value and return in human-readable format"""
|
||||
+
|
||||
if rVal > 0:
|
||||
return str("%0." + str(Decimal) + "f") % (100 * (lVal / rVal)) + "%"
|
||||
else:
|
||||
@@ -155,6 +160,7 @@ def fPerc(lVal=0, rVal=0, Decimal=2):
|
||||
|
||||
|
||||
def get_arc_summary(Kstat):
|
||||
+ """Collect general data on the ARC"""
|
||||
|
||||
output = {}
|
||||
memory_throttle_count = Kstat[
|
||||
@@ -256,6 +262,8 @@ def get_arc_summary(Kstat):
|
||||
|
||||
|
||||
def _arc_summary(Kstat):
|
||||
+ """Print information on the ARC"""
|
||||
+
|
||||
# ARC Sizing
|
||||
arc = get_arc_summary(Kstat)
|
||||
|
||||
@@ -330,6 +338,8 @@ def _arc_summary(Kstat):
|
||||
|
||||
|
||||
def get_arc_efficiency(Kstat):
|
||||
+ """Collect information on the efficiency of the ARC"""
|
||||
+
|
||||
output = {}
|
||||
|
||||
arc_hits = Kstat["kstat.zfs.misc.arcstats.hits"]
|
||||
@@ -453,6 +463,8 @@ def get_arc_efficiency(Kstat):
|
||||
|
||||
|
||||
def _arc_efficiency(Kstat):
|
||||
+ """Print information on the efficiency of the ARC"""
|
||||
+
|
||||
arc = get_arc_efficiency(Kstat)
|
||||
|
||||
sys.stdout.write("ARC Total accesses:\t\t\t\t\t%s\n" %
|
||||
@@ -563,6 +575,8 @@ def _arc_efficiency(Kstat):
|
||||
|
||||
|
||||
def get_l2arc_summary(Kstat):
|
||||
+ """Collection information on the L2ARC"""
|
||||
+
|
||||
output = {}
|
||||
|
||||
l2_abort_lowmem = Kstat["kstat.zfs.misc.arcstats.l2_abort_lowmem"]
|
||||
@@ -657,6 +671,7 @@ def get_l2arc_summary(Kstat):
|
||||
|
||||
|
||||
def _l2arc_summary(Kstat):
|
||||
+ """Print information on the L2ARC"""
|
||||
|
||||
arc = get_l2arc_summary(Kstat)
|
||||
|
||||
@@ -741,6 +756,8 @@ def _l2arc_summary(Kstat):
|
||||
|
||||
|
||||
def get_dmu_summary(Kstat):
|
||||
+ """Collect information on the DMU"""
|
||||
+
|
||||
output = {}
|
||||
|
||||
zfetch_hits = Kstat["kstat.zfs.misc.zfetchstats.hits"]
|
||||
@@ -766,6 +783,7 @@ def get_dmu_summary(Kstat):
|
||||
|
||||
|
||||
def _dmu_summary(Kstat):
|
||||
+ """Print information on the DMU"""
|
||||
|
||||
arc = get_dmu_summary(Kstat)
|
||||
|
||||
@@ -787,6 +805,8 @@ def _dmu_summary(Kstat):
|
||||
|
||||
|
||||
def get_vdev_summary(Kstat):
|
||||
+ """Collect information on the VDEVs"""
|
||||
+
|
||||
output = {}
|
||||
|
||||
vdev_cache_delegations = \
|
||||
@@ -817,6 +837,8 @@ def get_vdev_summary(Kstat):
|
||||
|
||||
|
||||
def _vdev_summary(Kstat):
|
||||
+ """Print information on the VDEVs"""
|
||||
+
|
||||
arc = get_vdev_summary(Kstat)
|
||||
|
||||
if arc['vdev_cache_total'] > 0:
|
||||
@@ -836,6 +858,8 @@ def _vdev_summary(Kstat):
|
||||
|
||||
|
||||
def _tunable_summary(Kstat):
|
||||
+ """Print information on tunables"""
|
||||
+
|
||||
global show_tunable_descriptions
|
||||
global alternate_tunable_layout
|
||||
|
||||
@@ -901,8 +925,8 @@ unSub = [
|
||||
|
||||
|
||||
def zfs_header():
|
||||
- """Print title string with date
|
||||
- """
|
||||
+ """Print title string with date"""
|
||||
+
|
||||
daydate = time.strftime('%a %b %d %H:%M:%S %Y')
|
||||
|
||||
sys.stdout.write('\n'+'-'*72+'\n')
|
||||
@@ -911,6 +935,8 @@ def zfs_header():
|
||||
|
||||
|
||||
def usage():
|
||||
+ """Print usage information"""
|
||||
+
|
||||
sys.stdout.write("Usage: arc_summary.py [-h] [-a] [-d] [-p PAGE]\n\n")
|
||||
sys.stdout.write("\t -h, --help : "
|
||||
"Print this help message and exit\n")
|
||||
@@ -931,6 +957,8 @@ def usage():
|
||||
|
||||
|
||||
def main():
|
||||
+ """Main function"""
|
||||
+
|
||||
global show_tunable_descriptions
|
||||
global alternate_tunable_layout
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "John L. Hammond" <35266395+jhammond-intel@users.noreply.github.com>
|
||||
Date: Wed, 17 Jan 2018 14:24:42 -0600
|
||||
Subject: [PATCH] Emit an error message before MMP suspends pool
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In mmp_thread(), emit an MMP specific error message before calling
|
||||
zio_suspend() so that the administrator will understand why the pool
|
||||
is being suspended.
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: John L. Hammond <john.hammond@intel.com>
|
||||
Closes #7048
|
||||
(cherry picked from commit ecc972c7f009e1fa75900e276a4c1306c55b5722)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/mmp.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
|
||||
index 6f2aa3f59..e91ae628a 100644
|
||||
--- a/module/zfs/mmp.c
|
||||
+++ b/module/zfs/mmp.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <sys/mmp.h>
|
||||
#include <sys/spa.h>
|
||||
#include <sys/spa_impl.h>
|
||||
+#include <sys/time.h>
|
||||
#include <sys/vdev.h>
|
||||
#include <sys/vdev_impl.h>
|
||||
#include <sys/zfs_context.h>
|
||||
@@ -428,6 +429,10 @@ mmp_thread(spa_t *spa)
|
||||
*/
|
||||
if (!suspended && mmp_fail_intervals && multihost &&
|
||||
(start - mmp->mmp_last_write) > max_fail_ns) {
|
||||
+ cmn_err(CE_WARN, "MMP writes to pool '%s' have not "
|
||||
+ "succeeded in over %llus; suspending pool",
|
||||
+ spa_name(spa),
|
||||
+ NSEC2SEC(start - mmp->mmp_last_write));
|
||||
zio_suspend(spa, NULL);
|
||||
}
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Fri, 2 Feb 2018 22:50:42 +0100
|
||||
Subject: [PATCH] Fix systemd_ RPM macros usage on Debian-based distributions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Debian-based distributions do not seem to provide RPM macros for
|
||||
dealing with systemd pre- and post- (un)install actions: this results
|
||||
in errors when installing or upgrading .deb packages because the
|
||||
resulting control scripts contain the following unresolved macros:
|
||||
|
||||
* %systemd_post
|
||||
* %systemd_preun
|
||||
* %systemd_postun
|
||||
|
||||
Fix this by providing default values for postinstall, preuninstall and
|
||||
postuninstall scripts when these macros are not defined.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #7074
|
||||
Closes #7100
|
||||
(cherry picked from commit 29b79dcfe90a67a919c2f42fbaa2e557ea484bd5)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
rpm/generic/zfs.spec.in | 21 ++++++++++++++++++++-
|
||||
1 file changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in
|
||||
index 4a911b4c2..ce028794c 100644
|
||||
--- a/rpm/generic/zfs.spec.in
|
||||
+++ b/rpm/generic/zfs.spec.in
|
||||
@@ -245,8 +245,15 @@ find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \;
|
||||
|
||||
%post
|
||||
%if 0%{?_systemd}
|
||||
+%if 0%{?systemd_post:1}
|
||||
%systemd_post %{systemd_svcs}
|
||||
%else
|
||||
+if [ "$1" = "1" -o "$1" = "install" ] ; then
|
||||
+ # Initial installation
|
||||
+ systemctl preset %{systemd_svcs} >/dev/null || true
|
||||
+fi
|
||||
+%endif
|
||||
+%else
|
||||
if [ -x /sbin/chkconfig ]; then
|
||||
/sbin/chkconfig --add zfs-import
|
||||
/sbin/chkconfig --add zfs-mount
|
||||
@@ -258,9 +265,17 @@ exit 0
|
||||
|
||||
%preun
|
||||
%if 0%{?_systemd}
|
||||
+%if 0%{?systemd_preun:1}
|
||||
%systemd_preun %{systemd_svcs}
|
||||
%else
|
||||
-if [ "$1" = "0" ] && [ -x /sbin/chkconfig ]; then
|
||||
+if [ "$1" = "0" -o "$1" = "remove" ] ; then
|
||||
+ # Package removal, not upgrade
|
||||
+ systemctl --no-reload disable %{systemd_svcs} >/dev/null || true
|
||||
+ systemctl stop %{systemd_svcs} >/dev/null || true
|
||||
+fi
|
||||
+%endif
|
||||
+%else
|
||||
+if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then
|
||||
/sbin/chkconfig --del zfs-import
|
||||
/sbin/chkconfig --del zfs-mount
|
||||
/sbin/chkconfig --del zfs-share
|
||||
@@ -271,7 +286,11 @@ exit 0
|
||||
|
||||
%postun
|
||||
%if 0%{?_systemd}
|
||||
+%if 0%{?systemd_postun:1}
|
||||
%systemd_postun %{systemd_svcs}
|
||||
+%else
|
||||
+systemctl --system daemon-reload >/dev/null || true
|
||||
+%endif
|
||||
%endif
|
||||
|
||||
%files
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Tue, 7 Nov 2017 23:50:15 +0100
|
||||
Subject: [PATCH] Sort output of tunables in arc_summary.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Sort list of tunables printed by _tunable_summary()
|
||||
alphabetically
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6828
|
||||
(cherry picked from commit 904c03672beeadf4c74b919f55b5f78be882b7f8)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index f4968fb6a..4c513d63d 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -900,14 +900,18 @@ def _tunable_summary(Kstat):
|
||||
sys.stderr.write("Tunable descriptions will be disabled.\n")
|
||||
|
||||
sys.stdout.write("ZFS Tunable:\n")
|
||||
+ names.sort()
|
||||
+
|
||||
+ if alternate_tunable_layout:
|
||||
+ format = "\t%s=%s\n"
|
||||
+ else:
|
||||
+ format = "\t%-50s%s\n"
|
||||
+
|
||||
for name in names:
|
||||
+
|
||||
if not name:
|
||||
continue
|
||||
|
||||
- format = "\t%-50s%s\n"
|
||||
- if alternate_tunable_layout:
|
||||
- format = "\t%s=%s\n"
|
||||
-
|
||||
if show_tunable_descriptions and name in descriptions:
|
||||
sys.stdout.write("\t# %s\n" % descriptions[name])
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: wli5 <weigang.li@intel.com>
|
||||
Date: Tue, 6 Feb 2018 02:26:27 +0800
|
||||
Subject: [PATCH] Bug fix in qat_compress.c for vmalloc addr check
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Remove the unused vmalloc address check, and function mem_to_page
|
||||
will handle the non-vmalloc address when map it to a physical
|
||||
address.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Weigang Li <weigang.li@intel.com>
|
||||
Closes #7125
|
||||
(cherry picked from commit 5f38142e7b3a8994afef60faa2e65d72e7993807)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/qat_compress.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/qat_compress.c b/module/zfs/qat_compress.c
|
||||
index 4d17d7ac9..62655f56d 100644
|
||||
--- a/module/zfs/qat_compress.c
|
||||
+++ b/module/zfs/qat_compress.c
|
||||
@@ -364,10 +364,6 @@ qat_compress(qat_compress_dir_t dir, char *src, int src_len,
|
||||
Cpa32U dst_buffer_list_mem_size = sizeof (CpaBufferList) +
|
||||
(num_dst_buf * sizeof (CpaFlatBuffer));
|
||||
|
||||
- if (!is_vmalloc_addr(src) || !is_vmalloc_addr(src + src_len - 1) ||
|
||||
- !is_vmalloc_addr(dst) || !is_vmalloc_addr(dst + dst_len - 1))
|
||||
- return (-1);
|
||||
-
|
||||
if (PHYS_CONTIG_ALLOC(&in_pages,
|
||||
num_src_buf * sizeof (struct page *)) != CPA_STATUS_SUCCESS)
|
||||
goto fail;
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Sun, 12 Nov 2017 05:27:43 +0100
|
||||
Subject: [PATCH] Fix arc_summary.py -d crash with Python3
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Prevents arc_summary.py crashing when called with parameter -d or
|
||||
long form --description with Python3.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6849
|
||||
Closes #6850
|
||||
(cherry picked from commit 7de8fb33a206fabb06261c0a5b79656d66efb32f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 24 ++++++++++++++++--------
|
||||
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index 4c513d63d..ec0468ecc 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -39,12 +39,12 @@ in-source documentation and code at
|
||||
https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details.
|
||||
"""
|
||||
|
||||
-import sys
|
||||
-import time
|
||||
import getopt
|
||||
+import os
|
||||
import re
|
||||
+import sys
|
||||
+import time
|
||||
|
||||
-from os import listdir
|
||||
from subprocess import Popen, PIPE
|
||||
from decimal import Decimal as D
|
||||
|
||||
@@ -858,12 +858,12 @@ def _vdev_summary(Kstat):
|
||||
|
||||
|
||||
def _tunable_summary(Kstat):
|
||||
- """Print information on tunables"""
|
||||
+ """Print information on tunables, including descriptions if requested"""
|
||||
|
||||
global show_tunable_descriptions
|
||||
global alternate_tunable_layout
|
||||
|
||||
- names = listdir("/sys/module/zfs/parameters/")
|
||||
+ names = os.listdir("/sys/module/zfs/parameters/")
|
||||
|
||||
values = {}
|
||||
for name in names:
|
||||
@@ -874,13 +874,21 @@ def _tunable_summary(Kstat):
|
||||
descriptions = {}
|
||||
|
||||
if show_tunable_descriptions:
|
||||
+
|
||||
+ command = ["/sbin/modinfo", "zfs", "-0"]
|
||||
+
|
||||
try:
|
||||
- command = ["/sbin/modinfo", "zfs", "-0"]
|
||||
p = Popen(command, stdin=PIPE, stdout=PIPE,
|
||||
stderr=PIPE, shell=False, close_fds=True)
|
||||
p.wait()
|
||||
|
||||
- description_list = p.communicate()[0].strip().split('\0')
|
||||
+ # By default, Python 2 returns a string as the first element of the
|
||||
+ # tuple from p.communicate(), while Python 3 returns bytes which
|
||||
+ # must be decoded first. The better way to do this would be with
|
||||
+ # subprocess.run() or at least .check_output(), but this fails on
|
||||
+ # CentOS 6 because of its old version of Python 2
|
||||
+ desc = bytes.decode(p.communicate()[0])
|
||||
+ description_list = desc.strip().split('\0')
|
||||
|
||||
if p.returncode == 0:
|
||||
for tunable in description_list:
|
||||
@@ -899,7 +907,7 @@ def _tunable_summary(Kstat):
|
||||
(sys.argv[0], command[0], e.strerror))
|
||||
sys.stderr.write("Tunable descriptions will be disabled.\n")
|
||||
|
||||
- sys.stdout.write("ZFS Tunable:\n")
|
||||
+ sys.stdout.write("ZFS Tunables:\n")
|
||||
names.sort()
|
||||
|
||||
if alternate_tunable_layout:
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Mon, 5 Feb 2018 20:42:52 -0800
|
||||
Subject: [PATCH] Fix default libdir for Debian/Ubuntu
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The distribution provided architecture specific RPM macro files
|
||||
for x86_64 and other architectures on Debian/Ubuntu specify the
|
||||
wrong default libdir install location. When building deb packages
|
||||
override _lib with the correct location.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #7083
|
||||
Closes #7101
|
||||
(cherry picked from commit f1dde3fb20eb27c05b57ad82e0905a587ced8ee8)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/zfs-build.m4 | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/config/zfs-build.m4 b/config/zfs-build.m4
|
||||
index 5eaa49c87..7c19cecd6 100644
|
||||
--- a/config/zfs-build.m4
|
||||
+++ b/config/zfs-build.m4
|
||||
@@ -164,6 +164,19 @@ AC_DEFUN([ZFS_AC_RPM], [
|
||||
RPM_DEFINE_KMOD='--define "kernels $(LINUX_VERSION)" --define "require_spldir $(SPL)" --define "require_splobj $(SPL_OBJ)" --define "ksrc $(LINUX)" --define "kobj $(LINUX_OBJ)"'
|
||||
RPM_DEFINE_DKMS=
|
||||
|
||||
+ dnl # Override default lib directory on Debian/Ubuntu systems. The provided
|
||||
+ dnl # /usr/lib/rpm/platform/<arch>/macros files do not specify the correct
|
||||
+ dnl # path for multiarch systems as described by the packaging guidelines.
|
||||
+ dnl #
|
||||
+ dnl # https://wiki.ubuntu.com/MultiarchSpec
|
||||
+ dnl # https://wiki.debian.org/Multiarch/Implementation
|
||||
+ dnl #
|
||||
+ AS_IF([test "$DEFAULT_PACKAGE" = "deb"], [
|
||||
+ MULTIARCH_LIBDIR="lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
|
||||
+ RPM_DEFINE_UTIL+=' --define "_lib $(MULTIARCH_LIBDIR)"'
|
||||
+ AC_SUBST(MULTIARCH_LIBDIR)
|
||||
+ ])
|
||||
+
|
||||
SRPM_DEFINE_COMMON='--define "build_src_rpm 1"'
|
||||
SRPM_DEFINE_UTIL=
|
||||
SRPM_DEFINE_KMOD=
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Wed, 15 Nov 2017 19:28:11 +0100
|
||||
Subject: [PATCH] Minor code cleanups in arc_python.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Remove unused library re and associated variable kstat_pobj. Add note
|
||||
to documentation at start of program about required support for old
|
||||
versions of Python. Change variable "format" (which is a built-in
|
||||
function) to "fmt".
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6869
|
||||
(cherry picked from commit d486dee89e54560536a759f3c5fb1eb8b07efc3f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 12 +++++++-----
|
||||
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index ec0468ecc..c9a2c5d03 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -31,6 +31,10 @@
|
||||
#
|
||||
# If you are having troubles when using this script from cron(8) please try
|
||||
# adjusting your PATH before reporting problems.
|
||||
+#
|
||||
+# Note some of this code uses older code (eg getopt instead of argparse,
|
||||
+# subprocess.Popen() instead of subprocess.run()) because we need to support
|
||||
+# some very old versions of Python.
|
||||
"""Print statistics on the ZFS Adjustable Replacement Cache (ARC)
|
||||
|
||||
Provides basic information on the ARC, its efficiency, the L2ARC (if present),
|
||||
@@ -41,7 +45,6 @@ https://github.com/zfsonlinux/zfs/blob/master/module/zfs/arc.c for details.
|
||||
|
||||
import getopt
|
||||
import os
|
||||
-import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
@@ -50,7 +53,6 @@ from decimal import Decimal as D
|
||||
|
||||
show_tunable_descriptions = False
|
||||
alternate_tunable_layout = False
|
||||
-kstat_pobj = re.compile("^([^:]+):\s+(.+)\s*$", flags=re.M)
|
||||
|
||||
|
||||
def get_Kstat():
|
||||
@@ -911,9 +913,9 @@ def _tunable_summary(Kstat):
|
||||
names.sort()
|
||||
|
||||
if alternate_tunable_layout:
|
||||
- format = "\t%s=%s\n"
|
||||
+ fmt = "\t%s=%s\n"
|
||||
else:
|
||||
- format = "\t%-50s%s\n"
|
||||
+ fmt = "\t%-50s%s\n"
|
||||
|
||||
for name in names:
|
||||
|
||||
@@ -923,7 +925,7 @@ def _tunable_summary(Kstat):
|
||||
if show_tunable_descriptions and name in descriptions:
|
||||
sys.stdout.write("\t# %s\n" % descriptions[name])
|
||||
|
||||
- sys.stdout.write(format % (name, values[name]))
|
||||
+ sys.stdout.write(fmt % (name, values[name]))
|
||||
|
||||
|
||||
unSub = [
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Scot W. Stevenson" <scot.stevenson@gmail.com>
|
||||
Date: Sat, 18 Nov 2017 23:07:04 +0100
|
||||
Subject: [PATCH] Fix data on evict_skips in arc_summary.py
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Display correct data from kstat arcstats for evict_skips,
|
||||
which is currently repeating the data from mutex_misses.
|
||||
Fixes #6882
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Scot W. Stevenson <scot.stevenson@gmail.com>
|
||||
Closes #6882
|
||||
Closes #6883
|
||||
(cherry picked from commit 7a8bef39838cdb9f996bf400add5a8583fe10e87)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index c9a2c5d03..5da81347c 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -179,12 +179,13 @@ def get_arc_summary(Kstat):
|
||||
# ARC Misc.
|
||||
deleted = Kstat["kstat.zfs.misc.arcstats.deleted"]
|
||||
mutex_miss = Kstat["kstat.zfs.misc.arcstats.mutex_miss"]
|
||||
+ evict_skip = Kstat["kstat.zfs.misc.arcstats.evict_skip"]
|
||||
|
||||
# ARC Misc.
|
||||
output["arc_misc"] = {}
|
||||
output["arc_misc"]["deleted"] = fHits(deleted)
|
||||
output["arc_misc"]['mutex_miss'] = fHits(mutex_miss)
|
||||
- output["arc_misc"]['evict_skips'] = fHits(mutex_miss)
|
||||
+ output["arc_misc"]['evict_skips'] = fHits(evict_skip)
|
||||
|
||||
# ARC Sizing
|
||||
arc_size = Kstat["kstat.zfs.misc.arcstats.size"]
|
||||
@@ -281,7 +282,7 @@ def _arc_summary(Kstat):
|
||||
sys.stdout.write("\tMutex Misses:\t\t\t\t%s\n" %
|
||||
arc['arc_misc']['mutex_miss'])
|
||||
sys.stdout.write("\tEvict Skips:\t\t\t\t%s\n" %
|
||||
- arc['arc_misc']['mutex_miss'])
|
||||
+ arc['arc_misc']['evict_skips'])
|
||||
sys.stdout.write("\n")
|
||||
|
||||
# ARC Sizing
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Elling <Richard.Elling@RichardElling.com>
|
||||
Date: Wed, 7 Feb 2018 11:54:20 -0800
|
||||
Subject: [PATCH] Remove deprecated zfs_arc_p_aggressive_disable
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
zfs_arc_p_aggressive_disable is no more. This PR removes docs
|
||||
and module parameters for zfs_arc_p_aggressive_disable.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Richard Elling <Richard.Elling@RichardElling.com>
|
||||
Closes #7135
|
||||
|
||||
(cherry picked from commit a58e1284d8998b0d7e409a6ec009d9d372aad41b)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/arc.c | 4 ----
|
||||
man/man5/zfs-module-parameters.5 | 11 -----------
|
||||
2 files changed, 15 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
|
||||
index 264e67735..9d1d0db1d 100644
|
||||
--- a/module/zfs/arc.c
|
||||
+++ b/module/zfs/arc.c
|
||||
@@ -391,7 +391,6 @@ unsigned long zfs_arc_dnode_limit_percent = 10;
|
||||
*/
|
||||
unsigned long zfs_arc_sys_free = 0;
|
||||
int zfs_arc_min_prefetch_lifespan = 0;
|
||||
-int zfs_arc_p_aggressive_disable = 1;
|
||||
int zfs_arc_p_dampener_disable = 1;
|
||||
int zfs_arc_meta_prune = 10000;
|
||||
int zfs_arc_meta_strategy = ARC_STRATEGY_META_BALANCED;
|
||||
@@ -7928,9 +7927,6 @@ MODULE_PARM_DESC(zfs_arc_meta_strategy, "Meta reclaim strategy");
|
||||
module_param(zfs_arc_grow_retry, int, 0644);
|
||||
MODULE_PARM_DESC(zfs_arc_grow_retry, "Seconds before growing arc size");
|
||||
|
||||
-module_param(zfs_arc_p_aggressive_disable, int, 0644);
|
||||
-MODULE_PARM_DESC(zfs_arc_p_aggressive_disable, "disable aggressive arc_p grow");
|
||||
-
|
||||
module_param(zfs_arc_p_dampener_disable, int, 0644);
|
||||
MODULE_PARM_DESC(zfs_arc_p_dampener_disable, "disable arc_p adapt dampener");
|
||||
|
||||
diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5
|
||||
index 19e6becfd..d4daffde6 100644
|
||||
--- a/man/man5/zfs-module-parameters.5
|
||||
+++ b/man/man5/zfs-module-parameters.5
|
||||
@@ -674,17 +674,6 @@ max arc_p
|
||||
Default value: \fB0\fR.
|
||||
.RE
|
||||
|
||||
-.sp
|
||||
-.ne 2
|
||||
-.na
|
||||
-\fBzfs_arc_p_aggressive_disable\fR (int)
|
||||
-.ad
|
||||
-.RS 12n
|
||||
-Disable aggressive arc_p growth
|
||||
-.sp
|
||||
-Use \fB1\fR for yes (default) and \fB0\fR to disable.
|
||||
-.RE
|
||||
-
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: WHR <msl0000023508@gmail.com>
|
||||
Date: Sun, 14 Jan 2018 23:57:54 +0300
|
||||
Subject: [PATCH] OpenZFS 8966 - Source file zfs_acl.c, function
|
||||
zfs_aclset_common contains a use after end of the lifetime of a local
|
||||
variable
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Authored by: WHR <msl0000023508@gmail.com>
|
||||
Reviewed by: Matt Ahrens <mahrens@delphix.com>
|
||||
Reviewed by: Andriy Gapon <avg@FreeBSD.org>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Approved by: Richard Lowe <richlowe@richlowe.net>
|
||||
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
|
||||
OpenZFS-issue: https://www.illumos.org/issues/8966
|
||||
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/c95549fcdc
|
||||
Closes #7141
|
||||
|
||||
(cherry picked from commit a196b3bc3dcc14bda32b2fbed40d5e436319aca6)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/zfs_acl.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/module/zfs/zfs_acl.c b/module/zfs/zfs_acl.c
|
||||
index 7ddedeaaf..1fcfca0c7 100644
|
||||
--- a/module/zfs/zfs_acl.c
|
||||
+++ b/module/zfs/zfs_acl.c
|
||||
@@ -1323,6 +1323,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
|
||||
sa_bulk_attr_t bulk[5];
|
||||
uint64_t ctime[2];
|
||||
int count = 0;
|
||||
+ zfs_acl_phys_t acl_phys;
|
||||
|
||||
mode = zp->z_mode;
|
||||
|
||||
@@ -1369,7 +1370,6 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
|
||||
} else { /* Painful legacy way */
|
||||
zfs_acl_node_t *aclnode;
|
||||
uint64_t off = 0;
|
||||
- zfs_acl_phys_t acl_phys;
|
||||
uint64_t aoid;
|
||||
|
||||
if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zfsvfs),
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,280 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Sat, 18 Nov 2017 14:08:00 -0800
|
||||
Subject: [PATCH] Update for cppcheck v1.80
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Resolve new warnings and errors from cppcheck v1.80.
|
||||
|
||||
* [lib/libshare/libshare.c:543]: (warning)
|
||||
Possible null pointer dereference: protocol
|
||||
* [lib/libzfs/libzfs_dataset.c:2323]: (warning)
|
||||
Possible null pointer dereference: srctype
|
||||
* [lib/libzfs/libzfs_import.c:318]: (error)
|
||||
Uninitialized variable: link
|
||||
* [module/zfs/abd.c:353]: (error) Uninitialized variable: sg
|
||||
* [module/zfs/abd.c:353]: (error) Uninitialized variable: i
|
||||
* [module/zfs/abd.c:385]: (error) Uninitialized variable: sg
|
||||
* [module/zfs/abd.c:385]: (error) Uninitialized variable: i
|
||||
* [module/zfs/abd.c:553]: (error) Uninitialized variable: i
|
||||
* [module/zfs/abd.c:553]: (error) Uninitialized variable: sg
|
||||
* [module/zfs/abd.c:763]: (error) Uninitialized variable: i
|
||||
* [module/zfs/abd.c:763]: (error) Uninitialized variable: sg
|
||||
* [module/zfs/abd.c:305]: (error) Uninitialized variable: tmp_page
|
||||
* [module/zfs/zpl_xattr.c:342]: (warning)
|
||||
Possible null pointer dereference: value
|
||||
* [module/zfs/zvol.c:208]: (error) Uninitialized variable: p
|
||||
|
||||
Convert the following suppression to inline.
|
||||
|
||||
* [module/zfs/zfs_vnops.c:840]: (error)
|
||||
Possible null pointer dereference: aiov
|
||||
|
||||
Exclude HAVE_UIO_ZEROCOPY and HAVE_DNLC from analysis since
|
||||
these macro's will never be defined until this functionality
|
||||
is implemented.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6879
|
||||
(cherry picked from commit aebc5df418cb52cc2ec9fa6c9c147ca3b048bc49)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
Makefile.am | 6 +++---
|
||||
lib/libshare/libshare.c | 37 ++++---------------------------------
|
||||
lib/libzfs/libzfs_dataset.c | 4 +++-
|
||||
lib/libzfs/libzfs_import.c | 2 +-
|
||||
module/zfs/abd.c | 18 +++++++++---------
|
||||
module/zfs/zfs_vnops.c | 1 +
|
||||
module/zfs/zpl_xattr.c | 2 +-
|
||||
module/zfs/zvol.c | 2 +-
|
||||
8 files changed, 23 insertions(+), 49 deletions(-)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index e46ac2dbe..508d3f40e 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -65,10 +65,10 @@ lint: cppcheck paxcheck
|
||||
|
||||
cppcheck:
|
||||
@if type cppcheck > /dev/null 2>&1; then \
|
||||
- cppcheck --quiet --force --error-exitcode=2 \
|
||||
+ cppcheck --quiet --force --error-exitcode=2 --inline-suppr \
|
||||
--suppressions-list=.github/suppressions.txt \
|
||||
- -UHAVE_SSE2 -UHAVE_AVX512F \
|
||||
- ${top_srcdir}; \
|
||||
+ -UHAVE_SSE2 -UHAVE_AVX512F -UHAVE_UIO_ZEROCOPY \
|
||||
+ -UHAVE_DNLC ${top_srcdir}; \
|
||||
fi
|
||||
|
||||
paxcheck:
|
||||
diff --git a/lib/libshare/libshare.c b/lib/libshare/libshare.c
|
||||
index aa565ca82..022df016f 100644
|
||||
--- a/lib/libshare/libshare.c
|
||||
+++ b/lib/libshare/libshare.c
|
||||
@@ -493,20 +493,10 @@ int
|
||||
sa_enable_share(sa_share_t share, char *protocol)
|
||||
{
|
||||
sa_share_impl_t impl_share = (sa_share_impl_t)share;
|
||||
- int rc, ret;
|
||||
- boolean_t found_protocol;
|
||||
+ int rc, ret = SA_OK;
|
||||
+ boolean_t found_protocol = B_FALSE;
|
||||
sa_fstype_t *fstype;
|
||||
|
||||
-#ifdef DEBUG
|
||||
- fprintf(stderr, "sa_enable_share: share->sharepath=%s, protocol=%s\n",
|
||||
- impl_share->sharepath, protocol);
|
||||
-#endif
|
||||
-
|
||||
- assert(impl_share->handle != NULL);
|
||||
-
|
||||
- ret = SA_OK;
|
||||
- found_protocol = B_FALSE;
|
||||
-
|
||||
fstype = fstypes;
|
||||
while (fstype != NULL) {
|
||||
if (protocol == NULL || strcmp(fstype->name, protocol) == 0) {
|
||||
@@ -534,18 +524,10 @@ int
|
||||
sa_disable_share(sa_share_t share, char *protocol)
|
||||
{
|
||||
sa_share_impl_t impl_share = (sa_share_impl_t)share;
|
||||
- int rc, ret;
|
||||
- boolean_t found_protocol;
|
||||
+ int rc, ret = SA_OK;
|
||||
+ boolean_t found_protocol = B_FALSE;
|
||||
sa_fstype_t *fstype;
|
||||
|
||||
-#ifdef DEBUG
|
||||
- fprintf(stderr, "sa_disable_share: share->sharepath=%s, protocol=%s\n",
|
||||
- impl_share->sharepath, protocol);
|
||||
-#endif
|
||||
-
|
||||
- ret = SA_OK;
|
||||
- found_protocol = B_FALSE;
|
||||
-
|
||||
fstype = fstypes;
|
||||
while (fstype != NULL) {
|
||||
if (protocol == NULL || strcmp(fstype->name, protocol) == 0) {
|
||||
@@ -696,11 +678,6 @@ sa_parse_legacy_options(sa_group_t group, char *options, char *proto)
|
||||
{
|
||||
sa_fstype_t *fstype;
|
||||
|
||||
-#ifdef DEBUG
|
||||
- fprintf(stderr, "sa_parse_legacy_options: options=%s, proto=%s\n",
|
||||
- options, proto);
|
||||
-#endif
|
||||
-
|
||||
fstype = fstypes;
|
||||
while (fstype != NULL) {
|
||||
if (strcmp(fstype->name, proto) != 0) {
|
||||
@@ -787,12 +764,6 @@ sa_zfs_process_share(sa_handle_t handle, sa_group_t group, sa_share_t share,
|
||||
sa_handle_impl_t impl_handle = (sa_handle_impl_t)handle;
|
||||
sa_share_impl_t impl_share = (sa_share_impl_t)share;
|
||||
|
||||
-#ifdef DEBUG
|
||||
- fprintf(stderr, "sa_zfs_process_share: mountpoint=%s, proto=%s, "
|
||||
- "shareopts=%s, sourcestr=%s, dataset=%s\n", mountpoint, proto,
|
||||
- shareopts, sourcestr, dataset);
|
||||
-#endif
|
||||
-
|
||||
return (process_share(impl_handle, impl_share, mountpoint, NULL,
|
||||
proto, shareopts, NULL, dataset, B_FALSE));
|
||||
}
|
||||
diff --git a/lib/libzfs/libzfs_dataset.c b/lib/libzfs/libzfs_dataset.c
|
||||
index d6e85024d..b65dbc826 100644
|
||||
--- a/lib/libzfs/libzfs_dataset.c
|
||||
+++ b/lib/libzfs/libzfs_dataset.c
|
||||
@@ -2244,8 +2244,10 @@ static void
|
||||
get_source(zfs_handle_t *zhp, zprop_source_t *srctype, char *source,
|
||||
char *statbuf, size_t statlen)
|
||||
{
|
||||
- if (statbuf == NULL || *srctype == ZPROP_SRC_TEMPORARY)
|
||||
+ if (statbuf == NULL ||
|
||||
+ srctype == NULL || *srctype == ZPROP_SRC_TEMPORARY) {
|
||||
return;
|
||||
+ }
|
||||
|
||||
if (source == NULL) {
|
||||
*srctype = ZPROP_SRC_NONE;
|
||||
diff --git a/lib/libzfs/libzfs_import.c b/lib/libzfs/libzfs_import.c
|
||||
index 8b5222475..39c067293 100644
|
||||
--- a/lib/libzfs/libzfs_import.c
|
||||
+++ b/lib/libzfs/libzfs_import.c
|
||||
@@ -309,7 +309,7 @@ zpool_label_disk_wait(char *path, int timeout_ms)
|
||||
dev = udev_device_new_from_subsystem_sysname(udev,
|
||||
"block", sysname);
|
||||
if ((dev != NULL) && udev_device_is_ready(dev)) {
|
||||
- struct udev_list_entry *links, *link;
|
||||
+ struct udev_list_entry *links, *link = NULL;
|
||||
|
||||
ret = 0;
|
||||
links = udev_device_get_devlinks_list_entry(dev);
|
||||
diff --git a/module/zfs/abd.c b/module/zfs/abd.c
|
||||
index 765ac7fb7..138b041c8 100644
|
||||
--- a/module/zfs/abd.c
|
||||
+++ b/module/zfs/abd.c
|
||||
@@ -250,7 +250,7 @@ abd_alloc_pages(abd_t *abd, size_t size)
|
||||
struct list_head pages;
|
||||
struct sg_table table;
|
||||
struct scatterlist *sg;
|
||||
- struct page *page, *tmp_page;
|
||||
+ struct page *page, *tmp_page = NULL;
|
||||
gfp_t gfp = __GFP_NOWARN | GFP_NOIO;
|
||||
gfp_t gfp_comp = (gfp | __GFP_NORETRY | __GFP_COMP) & ~__GFP_RECLAIM;
|
||||
int max_order = MIN(zfs_abd_scatter_max_order, MAX_ORDER - 1);
|
||||
@@ -334,12 +334,12 @@ abd_alloc_pages(abd_t *abd, size_t size)
|
||||
static void
|
||||
abd_alloc_pages(abd_t *abd, size_t size)
|
||||
{
|
||||
- struct scatterlist *sg;
|
||||
+ struct scatterlist *sg = NULL;
|
||||
struct sg_table table;
|
||||
struct page *page;
|
||||
gfp_t gfp = __GFP_NOWARN | GFP_NOIO;
|
||||
int nr_pages = abd_chunkcnt_for_bytes(size);
|
||||
- int i;
|
||||
+ int i = 0;
|
||||
|
||||
while (sg_alloc_table(&table, nr_pages, gfp)) {
|
||||
ABDSTAT_BUMP(abdstat_scatter_sg_table_retry);
|
||||
@@ -370,11 +370,11 @@ abd_alloc_pages(abd_t *abd, size_t size)
|
||||
static void
|
||||
abd_free_pages(abd_t *abd)
|
||||
{
|
||||
- struct scatterlist *sg;
|
||||
+ struct scatterlist *sg = NULL;
|
||||
struct sg_table table;
|
||||
struct page *page;
|
||||
int nr_pages = ABD_SCATTER(abd).abd_nents;
|
||||
- int order, i;
|
||||
+ int order, i = 0;
|
||||
|
||||
if (abd->abd_flags & ABD_FLAG_MULTI_ZONE)
|
||||
ABDSTAT_BUMPDOWN(abdstat_scatter_page_multi_zone);
|
||||
@@ -543,8 +543,8 @@ abd_verify(abd_t *abd)
|
||||
ASSERT3P(abd->abd_u.abd_linear.abd_buf, !=, NULL);
|
||||
} else {
|
||||
size_t n;
|
||||
- int i;
|
||||
- struct scatterlist *sg;
|
||||
+ int i = 0;
|
||||
+ struct scatterlist *sg = NULL;
|
||||
|
||||
ASSERT3U(ABD_SCATTER(abd).abd_nents, >, 0);
|
||||
ASSERT3U(ABD_SCATTER(abd).abd_offset, <,
|
||||
@@ -749,8 +749,8 @@ abd_get_offset_impl(abd_t *sabd, size_t off, size_t size)
|
||||
abd->abd_u.abd_linear.abd_buf =
|
||||
(char *)sabd->abd_u.abd_linear.abd_buf + off;
|
||||
} else {
|
||||
- int i;
|
||||
- struct scatterlist *sg;
|
||||
+ int i = 0;
|
||||
+ struct scatterlist *sg = NULL;
|
||||
size_t new_offset = sabd->abd_u.abd_scatter.abd_offset + off;
|
||||
|
||||
abd = abd_alloc_struct();
|
||||
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
|
||||
index 6a1dab5c9..6f6ce79db 100644
|
||||
--- a/module/zfs/zfs_vnops.c
|
||||
+++ b/module/zfs/zfs_vnops.c
|
||||
@@ -836,6 +836,7 @@ zfs_write(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
|
||||
aiov->iov_base != abuf->b_data)) {
|
||||
ASSERT(xuio);
|
||||
dmu_write(zfsvfs->z_os, zp->z_id, woff,
|
||||
+ /* cppcheck-suppress nullPointer */
|
||||
aiov->iov_len, aiov->iov_base, tx);
|
||||
dmu_return_arcbuf(abuf);
|
||||
xuio_stat_wbuf_copied();
|
||||
diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c
|
||||
index 0c626b122..ebb6e7be2 100644
|
||||
--- a/module/zfs/zpl_xattr.c
|
||||
+++ b/module/zfs/zpl_xattr.c
|
||||
@@ -333,7 +333,7 @@ zpl_xattr_get_sa(struct inode *ip, const char *name, void *value, size_t size)
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
- if (!size)
|
||||
+ if (size == 0 || value == NULL)
|
||||
return (nv_size);
|
||||
|
||||
if (size < nv_size)
|
||||
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c
|
||||
index 5293f95fb..aac494209 100644
|
||||
--- a/module/zfs/zvol.c
|
||||
+++ b/module/zfs/zvol.c
|
||||
@@ -202,7 +202,7 @@ static zvol_state_t *
|
||||
zvol_find_by_name_hash(const char *name, uint64_t hash, int mode)
|
||||
{
|
||||
zvol_state_t *zv;
|
||||
- struct hlist_node *p;
|
||||
+ struct hlist_node *p = NULL;
|
||||
|
||||
mutex_enter(&zvol_state_lock);
|
||||
hlist_for_each(p, ZVOL_HT_HEAD(hash)) {
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Thu, 8 Feb 2018 14:27:59 -0800
|
||||
Subject: [PATCH] Linux 4.16 compat: inode_set_iversion()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A new interface was added to manipulate the version field of an
|
||||
inode. Add a inode_set_iversion() wrapper for older kernels and
|
||||
use the new interface when available.
|
||||
|
||||
The i_version field was dropped from the trace point due to the
|
||||
switch to an atomic64_t i_version type.
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #7148
|
||||
(cherry picked from commit 310e63dfd18f59ad583631dfa2f55d40cedf1415)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/linux/vfs_compat.h | 14 ++++++++++++++
|
||||
include/sys/trace_acl.h | 6 ++----
|
||||
module/zfs/zpl_super.c | 2 +-
|
||||
config/kernel-inode-set-iversion.m4 | 19 +++++++++++++++++++
|
||||
config/kernel.m4 | 1 +
|
||||
5 files changed, 37 insertions(+), 5 deletions(-)
|
||||
create mode 100644 config/kernel-inode-set-iversion.m4
|
||||
|
||||
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
|
||||
index 6111f0afc..f51ff887d 100644
|
||||
--- a/include/linux/vfs_compat.h
|
||||
+++ b/include/linux/vfs_compat.h
|
||||
@@ -578,4 +578,18 @@ current_time(struct inode *ip)
|
||||
}
|
||||
#endif
|
||||
|
||||
+/*
|
||||
+ * 4.16 API change
|
||||
+ * Added iversion interface for managing inode version field.
|
||||
+ */
|
||||
+#ifdef HAVE_INODE_SET_IVERSION
|
||||
+#include <linux/iversion.h>
|
||||
+#else
|
||||
+static inline void
|
||||
+inode_set_iversion(struct inode *ip, u64 val)
|
||||
+{
|
||||
+ ip->i_version = val;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#endif /* _ZFS_VFS_H */
|
||||
diff --git a/include/sys/trace_acl.h b/include/sys/trace_acl.h
|
||||
index 1057e560b..610bbe29c 100644
|
||||
--- a/include/sys/trace_acl.h
|
||||
+++ b/include/sys/trace_acl.h
|
||||
@@ -68,7 +68,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||||
__field(uint32_t, i_gid)
|
||||
__field(unsigned long, i_ino)
|
||||
__field(unsigned int, i_nlink)
|
||||
- __field(u64, i_version)
|
||||
__field(loff_t, i_size)
|
||||
__field(unsigned int, i_blkbits)
|
||||
__field(unsigned short, i_bytes)
|
||||
@@ -103,7 +102,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||||
__entry->i_gid = KGID_TO_SGID(ZTOI(zn)->i_gid);
|
||||
__entry->i_ino = zn->z_inode.i_ino;
|
||||
__entry->i_nlink = zn->z_inode.i_nlink;
|
||||
- __entry->i_version = zn->z_inode.i_version;
|
||||
__entry->i_size = zn->z_inode.i_size;
|
||||
__entry->i_blkbits = zn->z_inode.i_blkbits;
|
||||
__entry->i_bytes = zn->z_inode.i_bytes;
|
||||
@@ -121,7 +119,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||||
"mapcnt %llu size %llu pflags %llu "
|
||||
"sync_cnt %u mode 0x%x is_sa %d "
|
||||
"is_mapped %d is_ctldir %d is_stale %d inode { "
|
||||
- "uid %u gid %u ino %lu nlink %u version %llu size %lli "
|
||||
+ "uid %u gid %u ino %lu nlink %u size %lli "
|
||||
"blkbits %u bytes %u mode 0x%x generation %x } } "
|
||||
"ace { type %u flags %u access_mask %u } mask_matched %u",
|
||||
__entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
|
||||
@@ -131,7 +129,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||||
__entry->z_is_sa, __entry->z_is_mapped,
|
||||
__entry->z_is_ctldir, __entry->z_is_stale, __entry->i_uid,
|
||||
__entry->i_gid, __entry->i_ino, __entry->i_nlink,
|
||||
- __entry->i_version, __entry->i_size, __entry->i_blkbits,
|
||||
+ __entry->i_size, __entry->i_blkbits,
|
||||
__entry->i_bytes, __entry->i_mode, __entry->i_generation,
|
||||
__entry->z_type, __entry->z_flags, __entry->z_access_mask,
|
||||
__entry->mask_matched)
|
||||
diff --git a/module/zfs/zpl_super.c b/module/zfs/zpl_super.c
|
||||
index b6ef60277..25e75a897 100644
|
||||
--- a/module/zfs/zpl_super.c
|
||||
+++ b/module/zfs/zpl_super.c
|
||||
@@ -36,7 +36,7 @@ zpl_inode_alloc(struct super_block *sb)
|
||||
struct inode *ip;
|
||||
|
||||
VERIFY3S(zfs_inode_alloc(sb, &ip), ==, 0);
|
||||
- ip->i_version = 1;
|
||||
+ inode_set_iversion(ip, 1);
|
||||
|
||||
return (ip);
|
||||
}
|
||||
diff --git a/config/kernel-inode-set-iversion.m4 b/config/kernel-inode-set-iversion.m4
|
||||
new file mode 100644
|
||||
index 000000000..9a7d7890e
|
||||
--- /dev/null
|
||||
+++ b/config/kernel-inode-set-iversion.m4
|
||||
@@ -0,0 +1,19 @@
|
||||
+dnl #
|
||||
+dnl # 4.16 API change
|
||||
+dnl # inode_set_iversion introduced to set i_version
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_INODE_SET_IVERSION], [
|
||||
+ AC_MSG_CHECKING([whether inode_set_iversion() exists])
|
||||
+ ZFS_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/iversion.h>
|
||||
+ ],[
|
||||
+ struct inode inode;
|
||||
+ inode_set_iversion(&inode, 1);
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(HAVE_INODE_SET_IVERSION, 1,
|
||||
+ [inode_set_iversion() exists])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||
index b759ccd39..b83f021e8 100644
|
||||
--- a/config/kernel.m4
|
||||
+++ b/config/kernel.m4
|
||||
@@ -65,6 +65,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
|
||||
ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
|
||||
ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR
|
||||
ZFS_AC_KERNEL_INODE_SET_FLAGS
|
||||
+ ZFS_AC_KERNEL_INODE_SET_IVERSION
|
||||
ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
|
||||
ZFS_AC_KERNEL_SHOW_OPTIONS
|
||||
ZFS_AC_KERNEL_FILE_INODE
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,157 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dominik Hassler <hadfl@omniosce.org>
|
||||
Date: Thu, 9 Nov 2017 15:22:07 +0100
|
||||
Subject: [PATCH] OpenZFS 8794 - cstyle generates warnings with recent perl
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Authored by: Dominik Hassler <hadfl@omniosce.org>
|
||||
Reviewed by: Andy Fiddaman <andy@omniosce.org>
|
||||
Reviewed by: Igor Kozhukhov <igor@dilos.org>
|
||||
Reviewed by: Toomas Soome <tsoome@me.com>
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Approved by: Dan McDonald <danmcd@joyent.com>
|
||||
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
|
||||
OpenZFS-issue: https://www.illumos.org/issues/8794
|
||||
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/578f67364c
|
||||
Closes #6973
|
||||
|
||||
(cherry picked from commit d27a40d28f96cfd9f7b32337306f64935ee749bc)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
scripts/cstyle.pl | 36 ++++++++++++++++++------------------
|
||||
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/scripts/cstyle.pl b/scripts/cstyle.pl
|
||||
index 73c708c0b..00b33dddf 100755
|
||||
--- a/scripts/cstyle.pl
|
||||
+++ b/scripts/cstyle.pl
|
||||
@@ -383,7 +383,7 @@ line: while (<$filehandle>) {
|
||||
|
||||
# is this the beginning or ending of a function?
|
||||
# (not if "struct foo\n{\n")
|
||||
- if (/^{$/ && $prev =~ /\)\s*(const\s*)?(\/\*.*\*\/\s*)?\\?$/) {
|
||||
+ if (/^\{$/ && $prev =~ /\)\s*(const\s*)?(\/\*.*\*\/\s*)?\\?$/) {
|
||||
$in_function = 1;
|
||||
$in_declaration = 1;
|
||||
$in_function_header = 0;
|
||||
@@ -391,7 +391,7 @@ line: while (<$filehandle>) {
|
||||
$prev = $line;
|
||||
next line;
|
||||
}
|
||||
- if (/^}\s*(\/\*.*\*\/\s*)*$/) {
|
||||
+ if (/^\}\s*(\/\*.*\*\/\s*)*$/) {
|
||||
if ($prev =~ /^\s*return\s*;/) {
|
||||
err_prev("unneeded return at end of function");
|
||||
}
|
||||
@@ -401,7 +401,7 @@ line: while (<$filehandle>) {
|
||||
next line;
|
||||
}
|
||||
if ($in_function_header && ! /^ (\w|\.)/ ) {
|
||||
- if (/^{}$/ # empty functions
|
||||
+ if (/^\{\}$/ # empty functions
|
||||
|| /;/ #run function with multiline arguments
|
||||
|| /#/ #preprocessor commands
|
||||
|| /^[^\s\\]*\(.*\)$/ #functions without ; at the end
|
||||
@@ -431,7 +431,7 @@ line: while (<$filehandle>) {
|
||||
$function_header_full_indent = 1;
|
||||
}
|
||||
}
|
||||
- if ($in_function_header && /^{$/) {
|
||||
+ if ($in_function_header && /^\{$/) {
|
||||
$in_function_header = 0;
|
||||
$function_header_full_indent = 0;
|
||||
$in_function = 1;
|
||||
@@ -440,7 +440,7 @@ line: while (<$filehandle>) {
|
||||
$in_function_header = 0;
|
||||
$function_header_full_indent = 0;
|
||||
}
|
||||
- if ($in_function_header && /{$/ ) {
|
||||
+ if ($in_function_header && /\{$/ ) {
|
||||
if ($picky) {
|
||||
err("opening brace on same line as function header");
|
||||
}
|
||||
@@ -670,14 +670,14 @@ line: while (<$filehandle>) {
|
||||
if (/\S\{/ && !/\{\{/) {
|
||||
err("missing space before left brace");
|
||||
}
|
||||
- if ($in_function && /^\s+{/ &&
|
||||
+ if ($in_function && /^\s+\{/ &&
|
||||
($prev =~ /\)\s*$/ || $prev =~ /\bstruct\s+\w+$/)) {
|
||||
err("left brace starting a line");
|
||||
}
|
||||
- if (/}(else|while)/) {
|
||||
+ if (/\}(else|while)/) {
|
||||
err("missing space after right brace");
|
||||
}
|
||||
- if (/}\s\s+(else|while)/) {
|
||||
+ if (/\}\s\s+(else|while)/) {
|
||||
err("extra space after right brace");
|
||||
}
|
||||
if (/\b_VOID\b|\bVOID\b|\bSTATIC\b/) {
|
||||
@@ -730,18 +730,18 @@ line: while (<$filehandle>) {
|
||||
if ($heuristic) {
|
||||
# cannot check this everywhere due to "struct {\n...\n} foo;"
|
||||
if ($in_function && !$in_declaration &&
|
||||
- /}./ && !/}\s+=/ && !/{.*}[;,]$/ && !/}(\s|)*$/ &&
|
||||
- !/} (else|while)/ && !/}}/) {
|
||||
+ /\}./ && !/\}\s+=/ && !/\{.*\}[;,]$/ && !/\}(\s|)*$/ &&
|
||||
+ !/\} (else|while)/ && !/\}\}/) {
|
||||
err("possible bad text following right brace");
|
||||
}
|
||||
# cannot check this because sub-blocks in
|
||||
# the middle of code are ok
|
||||
- if ($in_function && /^\s+{/) {
|
||||
+ if ($in_function && /^\s+\{/) {
|
||||
err("possible left brace starting a line");
|
||||
}
|
||||
}
|
||||
if (/^\s*else\W/) {
|
||||
- if ($prev =~ /^\s*}$/) {
|
||||
+ if ($prev =~ /^\s*\}$/) {
|
||||
err_prefix($prev,
|
||||
"else and right brace should be on same line");
|
||||
}
|
||||
@@ -827,8 +827,8 @@ process_indent($)
|
||||
|
||||
# skip over enumerations, array definitions, initializers, etc.
|
||||
if ($cont_off <= 0 && !/^\s*$special/ &&
|
||||
- (/(?:(?:\b(?:enum|struct|union)\s*[^\{]*)|(?:\s+=\s*)){/ ||
|
||||
- (/^\s*{/ && $prev =~ /=\s*(?:\/\*.*\*\/\s*)*$/))) {
|
||||
+ (/(?:(?:\b(?:enum|struct|union)\s*[^\{]*)|(?:\s+=\s*))\{/ ||
|
||||
+ (/^\s*\{/ && $prev =~ /=\s*(?:\/\*.*\*\/\s*)*$/))) {
|
||||
$cont_in = 0;
|
||||
$cont_off = tr/{/{/ - tr/}/}/;
|
||||
return;
|
||||
@@ -851,14 +851,14 @@ process_indent($)
|
||||
return if (/^\s*\}?$/);
|
||||
return if (/^\s*\}?\s*else\s*\{?$/);
|
||||
return if (/^\s*do\s*\{?$/);
|
||||
- return if (/{$/);
|
||||
- return if (/}[,;]?$/);
|
||||
+ return if (/\{$/);
|
||||
+ return if (/\}[,;]?$/);
|
||||
|
||||
# Allow macros on their own lines
|
||||
return if (/^\s*[A-Z_][A-Z_0-9]*$/);
|
||||
|
||||
# cases we don't deal with, generally non-kosher
|
||||
- if (/{/) {
|
||||
+ if (/\{/) {
|
||||
err("stuff after {");
|
||||
return;
|
||||
}
|
||||
@@ -927,7 +927,7 @@ process_indent($)
|
||||
#
|
||||
next if (@cont_paren != 0);
|
||||
if ($cont_special) {
|
||||
- if ($rest =~ /^\s*{?$/) {
|
||||
+ if ($rest =~ /^\s*\{?$/) {
|
||||
$cont_in = 0;
|
||||
last;
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,137 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Tue, 19 Dec 2017 22:02:40 +0100
|
||||
Subject: [PATCH] Handle invalid options in arc_summary
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If an invalid option is provided to arc_summary.py we handle any error
|
||||
thrown from the getopt Python module and print the usage help message.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #6983
|
||||
(cherry picked from commit 9a6c57845a431f55fd617c38e180b26215f0ca6f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
.../tests/functional/cli_user/misc/Makefile.am | 1 +
|
||||
cmd/arc_summary/arc_summary.py | 16 ++++++---
|
||||
tests/runfiles/linux.run | 2 +-
|
||||
.../cli_user/misc/arc_summary_002_neg.ksh | 38 ++++++++++++++++++++++
|
||||
4 files changed, 51 insertions(+), 6 deletions(-)
|
||||
create mode 100755 tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_002_neg.ksh
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_user/misc/Makefile.am b/tests/zfs-tests/tests/functional/cli_user/misc/Makefile.am
|
||||
index cf7502c27..75a3d0886 100644
|
||||
--- a/tests/zfs-tests/tests/functional/cli_user/misc/Makefile.am
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_user/misc/Makefile.am
|
||||
@@ -46,4 +46,5 @@ dist_pkgdata_SCRIPTS = \
|
||||
zpool_upgrade_001_neg.ksh \
|
||||
arcstat_001_pos.ksh \
|
||||
arc_summary_001_pos.ksh \
|
||||
+ arc_summary_002_neg.ksh \
|
||||
dbufstat_001_pos.ksh
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index 5da81347c..2472f87ea 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -977,9 +977,15 @@ def main():
|
||||
global show_tunable_descriptions
|
||||
global alternate_tunable_layout
|
||||
|
||||
- opts, args = getopt.getopt(
|
||||
- sys.argv[1:], "adp:h", ["alternate", "description", "page=", "help"]
|
||||
- )
|
||||
+ try:
|
||||
+ opts, args = getopt.getopt(
|
||||
+ sys.argv[1:],
|
||||
+ "adp:h", ["alternate", "description", "page=", "help"]
|
||||
+ )
|
||||
+ except getopt.error as e:
|
||||
+ sys.stderr.write("Error: %s\n" % e.msg)
|
||||
+ usage()
|
||||
+ sys.exit(1)
|
||||
|
||||
args = {}
|
||||
for opt, arg in opts:
|
||||
@@ -991,7 +997,7 @@ def main():
|
||||
args['p'] = arg
|
||||
if opt in ('-h', '--help'):
|
||||
usage()
|
||||
- sys.exit()
|
||||
+ sys.exit(0)
|
||||
|
||||
Kstat = get_Kstat()
|
||||
|
||||
@@ -1006,7 +1012,7 @@ def main():
|
||||
except IndexError:
|
||||
sys.stderr.write('the argument to -p must be between 1 and ' +
|
||||
str(len(unSub)) + '\n')
|
||||
- sys.exit()
|
||||
+ sys.exit(1)
|
||||
else:
|
||||
pages = unSub
|
||||
|
||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
||||
index 10bd110a6..f872c0cbf 100644
|
||||
--- a/tests/runfiles/linux.run
|
||||
+++ b/tests/runfiles/linux.run
|
||||
@@ -366,7 +366,7 @@ tests = ['zdb_001_neg', 'zfs_001_neg', 'zfs_allow_001_neg',
|
||||
'zpool_offline_001_neg', 'zpool_online_001_neg', 'zpool_remove_001_neg',
|
||||
'zpool_replace_001_neg', 'zpool_scrub_001_neg', 'zpool_set_001_neg',
|
||||
'zpool_status_001_neg', 'zpool_upgrade_001_neg', 'arcstat_001_pos',
|
||||
- 'arc_summary_001_pos', 'dbufstat_001_pos']
|
||||
+ 'arc_summary_001_pos', 'arc_summary_002_neg', 'dbufstat_001_pos']
|
||||
user =
|
||||
tags = ['functional', 'cli_user', 'misc']
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_002_neg.ksh b/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_002_neg.ksh
|
||||
new file mode 100755
|
||||
index 000000000..e63552feb
|
||||
--- /dev/null
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_002_neg.ksh
|
||||
@@ -0,0 +1,38 @@
|
||||
+#!/bin/ksh -p
|
||||
+#
|
||||
+# CDDL HEADER START
|
||||
+#
|
||||
+# The contents of this file are subject to the terms of the
|
||||
+# Common Development and Distribution License (the "License").
|
||||
+# You may not use this file except in compliance with the License.
|
||||
+#
|
||||
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
+# or http://www.opensolaris.org/os/licensing.
|
||||
+# See the License for the specific language governing permissions
|
||||
+# and limitations under the License.
|
||||
+#
|
||||
+# When distributing Covered Code, include this CDDL HEADER in each
|
||||
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
+# If applicable, add the following below this CDDL HEADER, with the
|
||||
+# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
+# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
+#
|
||||
+# CDDL HEADER END
|
||||
+#
|
||||
+
|
||||
+#
|
||||
+# Copyright (c) 2015 by Lawrence Livermore National Security, LLC.
|
||||
+# All rights reserved.
|
||||
+#
|
||||
+
|
||||
+. $STF_SUITE/include/libtest.shlib
|
||||
+
|
||||
+typeset args=("-x" "-r" "-5" "-p 7" "--err" "-@")
|
||||
+
|
||||
+log_assert "arc_summary.py generates an error code with invalid options"
|
||||
+
|
||||
+for arg in "${args[@]}"; do
|
||||
+ log_mustnot eval "arc_summary.py $arg > /dev/null"
|
||||
+done
|
||||
+
|
||||
+log_pass "arc_summary.py generates an error code with invalid options"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Thu, 8 Feb 2018 14:31:08 -0800
|
||||
Subject: [PATCH] Linux 4.11 compat: avoid refcount_t name conflict
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Related to commit 4859fe796, when directly using the kernel's
|
||||
refcount functions in kernel compatibility code do not map
|
||||
refcount_t to zfs_refcount_t. This leads to a type mismatch.
|
||||
|
||||
Longer term we should consider renaming refcount_t to
|
||||
zfs_refcount_t in the zfs code base.
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #7148
|
||||
(cherry picked from commit 3713b7333532f221733f7b74189d996359ed4311)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/linux/vfs_compat.h | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
|
||||
index f51ff887d..7fcf3c055 100644
|
||||
--- a/include/linux/vfs_compat.h
|
||||
+++ b/include/linux/vfs_compat.h
|
||||
@@ -272,6 +272,10 @@ lseek_execute(
|
||||
* This is several orders of magnitude larger than expected grace period.
|
||||
* At 60 seconds the kernel will also begin issuing RCU stall warnings.
|
||||
*/
|
||||
+#ifdef refcount_t
|
||||
+#undef refcount_t
|
||||
+#endif
|
||||
+
|
||||
#include <linux/posix_acl.h>
|
||||
|
||||
#if defined(HAVE_POSIX_ACL_RELEASE) && !defined(HAVE_POSIX_ACL_RELEASE_GPL_ONLY)
|
||||
@@ -397,6 +401,8 @@ typedef mode_t zpl_equivmode_t;
|
||||
#define zpl_posix_acl_valid(ip, acl) posix_acl_valid(acl)
|
||||
#endif
|
||||
|
||||
+#define refcount_t zfs_refcount_t
|
||||
+
|
||||
#endif /* CONFIG_FS_POSIX_ACL */
|
||||
|
||||
/*
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Tue, 30 Jan 2018 13:39:11 -0800
|
||||
Subject: [PATCH] Fix zdb -c traverse stop on damaged objset root
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If a corruption happens to be on a root block of an objset, zdb -c will
|
||||
not correctly report the error, and it will not traverse the datasets
|
||||
that come after. This is because traverse_visitbp, which does the
|
||||
callback and reset error for TRAVERSE_HARD, is skipped when traversing
|
||||
zil is failed in traverse_impl.
|
||||
|
||||
Here's example of what 'zdb -eLcc' command looks like on a pool with
|
||||
damaged objset root:
|
||||
|
||||
== before patch:
|
||||
|
||||
Traversing all blocks to verify checksums ...
|
||||
|
||||
Error counts:
|
||||
|
||||
errno count
|
||||
block traversal size 379392 != alloc 33987072 (unreachable 33607680)
|
||||
|
||||
bp count: 172
|
||||
ganged count: 0
|
||||
bp logical: 1678336 avg: 9757
|
||||
bp physical: 130560 avg: 759 compression: 12.85
|
||||
bp allocated: 379392 avg: 2205 compression: 4.42
|
||||
bp deduped: 0 ref>1: 0 deduplication: 1.00
|
||||
SPA allocated: 33987072 used: 0.80%
|
||||
|
||||
additional, non-pointer bps of type 0: 71
|
||||
Dittoed blocks on same vdev: 101
|
||||
|
||||
== after patch:
|
||||
|
||||
Traversing all blocks to verify checksums ...
|
||||
|
||||
zdb_blkptr_cb: Got error 52 reading <54, 0, -1, 0> -- skipping
|
||||
|
||||
Error counts:
|
||||
|
||||
errno count
|
||||
52 1
|
||||
block traversal size 33963520 != alloc 33987072 (unreachable 23552)
|
||||
|
||||
bp count: 447
|
||||
ganged count: 0
|
||||
bp logical: 36093440 avg: 80745
|
||||
bp physical: 33699840 avg: 75391 compression: 1.07
|
||||
bp allocated: 33963520 avg: 75981 compression: 1.06
|
||||
bp deduped: 0 ref>1: 0 deduplication: 1.00
|
||||
SPA allocated: 33987072 used: 0.80%
|
||||
|
||||
additional, non-pointer bps of type 0: 76
|
||||
Dittoed blocks on same vdev: 115
|
||||
|
||||
==
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
(cherry picked from commit 23227313a2016449176cbfcbae2d4fc463a2bc09)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/dmu_traverse.c | 26 +++++++++++++++++---------
|
||||
1 file changed, 17 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/dmu_traverse.c b/module/zfs/dmu_traverse.c
|
||||
index c78228d74..b494bef35 100644
|
||||
--- a/module/zfs/dmu_traverse.c
|
||||
+++ b/module/zfs/dmu_traverse.c
|
||||
@@ -599,19 +599,27 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
|
||||
|
||||
/* See comment on ZIL traversal in dsl_scan_visitds. */
|
||||
if (ds != NULL && !ds->ds_is_snapshot && !BP_IS_HOLE(rootbp)) {
|
||||
+ enum zio_flag zio_flags = ZIO_FLAG_CANFAIL;
|
||||
uint32_t flags = ARC_FLAG_WAIT;
|
||||
objset_phys_t *osp;
|
||||
arc_buf_t *buf;
|
||||
|
||||
- err = arc_read(NULL, td->td_spa, rootbp,
|
||||
- arc_getbuf_func, &buf,
|
||||
- ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, czb);
|
||||
- if (err != 0)
|
||||
- return (err);
|
||||
-
|
||||
- osp = buf->b_data;
|
||||
- traverse_zil(td, &osp->os_zil_header);
|
||||
- arc_buf_destroy(buf, &buf);
|
||||
+ err = arc_read(NULL, td->td_spa, rootbp, arc_getbuf_func,
|
||||
+ &buf, ZIO_PRIORITY_ASYNC_READ, zio_flags, &flags, czb);
|
||||
+ if (err != 0) {
|
||||
+ /*
|
||||
+ * If both TRAVERSE_HARD and TRAVERSE_PRE are set,
|
||||
+ * continue to visitbp so that td_func can be called
|
||||
+ * in pre stage, and err will reset to zero.
|
||||
+ */
|
||||
+ if (!(td->td_flags & TRAVERSE_HARD) ||
|
||||
+ !(td->td_flags & TRAVERSE_PRE))
|
||||
+ return (err);
|
||||
+ } else {
|
||||
+ osp = buf->b_data;
|
||||
+ traverse_zil(td, &osp->os_zil_header);
|
||||
+ arc_buf_destroy(buf, &buf);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!(flags & TRAVERSE_PREFETCH_DATA) ||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Giuseppe Di Natale <dinatale2@users.noreply.github.com>
|
||||
Date: Tue, 19 Dec 2017 13:19:24 -0800
|
||||
Subject: [PATCH] Handle broken pipes in arc_summary
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Using a command similar to 'arc_summary.py | head' causes
|
||||
a broken pipe exception. Gracefully exit in the case of a
|
||||
broken pipe in arc_summary.py.
|
||||
|
||||
Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Closes #6965
|
||||
Closes #6969
|
||||
(cherry picked from commit c2aacf20872856559972a27f7c3f9b4a6fe10cd2)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arc_summary/arc_summary.py | 13 +++++++++++++
|
||||
.../tests/functional/cli_user/misc/arc_summary_001_pos.ksh | 3 +++
|
||||
2 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/cmd/arc_summary/arc_summary.py b/cmd/arc_summary/arc_summary.py
|
||||
index 2472f87ea..f6dbb9bfb 100755
|
||||
--- a/cmd/arc_summary/arc_summary.py
|
||||
+++ b/cmd/arc_summary/arc_summary.py
|
||||
@@ -47,6 +47,7 @@ import getopt
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
+import errno
|
||||
|
||||
from subprocess import Popen, PIPE
|
||||
from decimal import Decimal as D
|
||||
@@ -55,6 +56,18 @@ show_tunable_descriptions = False
|
||||
alternate_tunable_layout = False
|
||||
|
||||
|
||||
+def handle_Exception(ex_cls, ex, tb):
|
||||
+ if ex is IOError:
|
||||
+ if ex.errno == errno.EPIPE:
|
||||
+ sys.exit()
|
||||
+
|
||||
+ if ex is KeyboardInterrupt:
|
||||
+ sys.exit()
|
||||
+
|
||||
+
|
||||
+sys.excepthook = handle_Exception
|
||||
+
|
||||
+
|
||||
def get_Kstat():
|
||||
"""Collect information on the ZFS subsystem from the /proc virtual
|
||||
file system. The name "kstat" is a holdover from the Solaris utility
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_001_pos.ksh b/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_001_pos.ksh
|
||||
index 67c11c8ab..6653b9c1a 100755
|
||||
--- a/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_001_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_user/misc/arc_summary_001_pos.ksh
|
||||
@@ -37,4 +37,7 @@ while [[ $i -lt ${#args[*]} ]]; do
|
||||
((i = i + 1))
|
||||
done
|
||||
|
||||
+log_must eval "arc_summary.py | head > /dev/null"
|
||||
+log_must eval "arc_summary.py | head -1 > /dev/null"
|
||||
+
|
||||
log_pass "arc_summary.py generates output and doesn't return an error code"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: lidongyang <gnaygnodil@gmail.com>
|
||||
Date: Sat, 23 Dec 2017 05:19:51 +1100
|
||||
Subject: [PATCH] Call commit callbacks from the tail of the list
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Our zfs backed Lustre MDT had soft lockups while under heavy metadata
|
||||
workloads while handling transaction callbacks from osd_zfs.
|
||||
|
||||
The problem is zfs is not taking advantage of the fast path in
|
||||
Lustre's trans callback handling, where Lustre will skip the calls
|
||||
to ptlrpc_commit_replies() when it already saw a higher transaction
|
||||
number.
|
||||
|
||||
This patch corrects this, it also has a positive impact on metadata
|
||||
performance on Lustre with osd_zfs, plus some cleanup in the headers.
|
||||
|
||||
A similar issue for ext4/ldiskfs is described on:
|
||||
https://jira.hpdd.intel.com/browse/LU-6527
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Li Dongyang <dongyang.li@anu.edu.au>
|
||||
Closes #6986
|
||||
(cherry picked from commit 8d82a19def540bba43c8c7597142ff53f7a0b7e5)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/dmu.h | 5 +++++
|
||||
include/sys/dmu_tx.h | 4 ----
|
||||
module/zfs/dmu_tx.c | 2 +-
|
||||
3 files changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/include/sys/dmu.h b/include/sys/dmu.h
|
||||
index d24615262..bcdf7d646 100644
|
||||
--- a/include/sys/dmu.h
|
||||
+++ b/include/sys/dmu.h
|
||||
@@ -713,11 +713,16 @@ void dmu_tx_mark_netfree(dmu_tx_t *tx);
|
||||
* to stable storage and will also be called if the dmu_tx is aborted.
|
||||
* If there is any error which prevents the transaction from being committed to
|
||||
* disk, the callback will be called with a value of error != 0.
|
||||
+ *
|
||||
+ * When multiple callbacks are registered to the transaction, the callbacks
|
||||
+ * will be called in reverse order to let Lustre, the only user of commit
|
||||
+ * callback currently, take the fast path of its commit callback handling.
|
||||
*/
|
||||
typedef void dmu_tx_callback_func_t(void *dcb_data, int error);
|
||||
|
||||
void dmu_tx_callback_register(dmu_tx_t *tx, dmu_tx_callback_func_t *dcb_func,
|
||||
void *dcb_data);
|
||||
+void dmu_tx_do_callbacks(list_t *cb_list, int error);
|
||||
|
||||
/*
|
||||
* Free up the data blocks for a defined range of a file. If size is
|
||||
diff --git a/include/sys/dmu_tx.h b/include/sys/dmu_tx.h
|
||||
index f16e1e858..d82a79310 100644
|
||||
--- a/include/sys/dmu_tx.h
|
||||
+++ b/include/sys/dmu_tx.h
|
||||
@@ -145,10 +145,6 @@ uint64_t dmu_tx_get_txg(dmu_tx_t *tx);
|
||||
struct dsl_pool *dmu_tx_pool(dmu_tx_t *tx);
|
||||
void dmu_tx_wait(dmu_tx_t *tx);
|
||||
|
||||
-void dmu_tx_callback_register(dmu_tx_t *tx, dmu_tx_callback_func_t *dcb_func,
|
||||
- void *dcb_data);
|
||||
-void dmu_tx_do_callbacks(list_t *cb_list, int error);
|
||||
-
|
||||
/*
|
||||
* These routines are defined in dmu_spa.h, and are called by the SPA.
|
||||
*/
|
||||
diff --git a/module/zfs/dmu_tx.c b/module/zfs/dmu_tx.c
|
||||
index 097fa774a..c3cc03a69 100644
|
||||
--- a/module/zfs/dmu_tx.c
|
||||
+++ b/module/zfs/dmu_tx.c
|
||||
@@ -1200,7 +1200,7 @@ dmu_tx_do_callbacks(list_t *cb_list, int error)
|
||||
{
|
||||
dmu_tx_callback_t *dcb;
|
||||
|
||||
- while ((dcb = list_head(cb_list)) != NULL) {
|
||||
+ while ((dcb = list_tail(cb_list)) != NULL) {
|
||||
list_remove(cb_list, dcb);
|
||||
dcb->dcb_func(dcb->dcb_data, error);
|
||||
kmem_free(dcb, sizeof (dmu_tx_callback_t));
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Thu, 1 Feb 2018 15:41:05 -0800
|
||||
Subject: [PATCH] Fix zle_decompress out of bound access
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
(cherry picked from commit 5e566c57726226ceeca09b1eb19cb1c373622763)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/zle.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/module/zfs/zle.c b/module/zfs/zle.c
|
||||
index 13c5673fb..613607faa 100644
|
||||
--- a/module/zfs/zle.c
|
||||
+++ b/module/zfs/zle.c
|
||||
@@ -74,10 +74,14 @@ zle_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
|
||||
while (src < s_end && dst < d_end) {
|
||||
int len = 1 + *src++;
|
||||
if (len <= n) {
|
||||
+ if (src + len > s_end || dst + len > d_end)
|
||||
+ return (-1);
|
||||
while (len-- != 0)
|
||||
*dst++ = *src++;
|
||||
} else {
|
||||
len -= n;
|
||||
+ if (dst + len > d_end)
|
||||
+ return (-1);
|
||||
while (len-- != 0)
|
||||
*dst++ = 0;
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Thu, 1 Feb 2018 15:42:41 -0800
|
||||
Subject: [PATCH] Fix racy assignment of zcb.zcb_haderrors
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
zcb_haderrors will be modified in zdb_blkptr_done, which is
|
||||
asynchronous. So we must move this assignment after zio_wait.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
(cherry picked from commit c797f0898ec11669427e2fc481118bc2e2d8ef3f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zdb/zdb.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
|
||||
index 442685486..0cc1656a8 100644
|
||||
--- a/cmd/zdb/zdb.c
|
||||
+++ b/cmd/zdb/zdb.c
|
||||
@@ -3313,7 +3313,7 @@ dump_block_stats(spa_t *spa)
|
||||
uint64_t norm_alloc, norm_space, total_alloc, total_found;
|
||||
int flags = TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA | TRAVERSE_HARD;
|
||||
boolean_t leaks = B_FALSE;
|
||||
- int e, c;
|
||||
+ int e, c, err;
|
||||
bp_embedded_type_t i;
|
||||
|
||||
(void) printf("\nTraversing all blocks %s%s%s%s%s...\n\n",
|
||||
@@ -3354,7 +3354,7 @@ dump_block_stats(spa_t *spa)
|
||||
|
||||
zcb.zcb_totalasize = metaslab_class_get_alloc(spa_normal_class(spa));
|
||||
zcb.zcb_start = zcb.zcb_lastprint = gethrtime();
|
||||
- zcb.zcb_haderrors |= traverse_pool(spa, 0, flags, zdb_blkptr_cb, &zcb);
|
||||
+ err = traverse_pool(spa, 0, flags, zdb_blkptr_cb, &zcb);
|
||||
|
||||
/*
|
||||
* If we've traversed the data blocks then we need to wait for those
|
||||
@@ -3370,6 +3370,12 @@ dump_block_stats(spa_t *spa)
|
||||
}
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Done after zio_wait() since zcb_haderrors is modified in
|
||||
+ * zdb_blkptr_done()
|
||||
+ */
|
||||
+ zcb.zcb_haderrors |= err;
|
||||
+
|
||||
if (zcb.zcb_haderrors) {
|
||||
(void) printf("\nError counts:\n\n");
|
||||
(void) printf("\t%5s %s\n", "errno", "count");
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,302 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Thu, 28 Dec 2017 19:15:32 +0100
|
||||
Subject: [PATCH] Fix 'zpool add' handling of nested interior VDEVs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When replacing a faulted device which was previously handled by a spare
|
||||
multiple levels of nested interior VDEVs will be present in the pool
|
||||
configuration; the following example illustrates one of the possible
|
||||
situations:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
testpool DEGRADED 0 0 0
|
||||
raidz1-0 DEGRADED 0 0 0
|
||||
spare-0 DEGRADED 0 0 0
|
||||
replacing-0 DEGRADED 0 0 0
|
||||
/var/tmp/fault-dev UNAVAIL 0 0 0 cannot open
|
||||
/var/tmp/replace-dev ONLINE 0 0 0
|
||||
/var/tmp/spare-dev1 ONLINE 0 0 0
|
||||
/var/tmp/safe-dev ONLINE 0 0 0
|
||||
spares
|
||||
/var/tmp/spare-dev1 INUSE currently in use
|
||||
|
||||
This is safe and allowed, but get_replication() needs to handle this
|
||||
situation gracefully to let zpool add new devices to the pool.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #6678
|
||||
Closes #6996
|
||||
(cherry picked from commit a8fa31b50b958306cd39c21e8518f776ee59f1b6)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
.../functional/cli_root/zpool_add/Makefile.am | 3 +-
|
||||
cmd/zpool/zpool_vdev.c | 6 +-
|
||||
tests/runfiles/linux.run | 2 +-
|
||||
tests/zfs-tests/include/libtest.shlib | 66 +++++++++++-
|
||||
.../zpool_add/add_nested_replacing_spare.ksh | 111 +++++++++++++++++++++
|
||||
5 files changed, 182 insertions(+), 6 deletions(-)
|
||||
create mode 100755 tests/zfs-tests/tests/functional/cli_root/zpool_add/add_nested_replacing_spare.ksh
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_add/Makefile.am b/tests/zfs-tests/tests/functional/cli_root/zpool_add/Makefile.am
|
||||
index 4b6b533fe..062028299 100644
|
||||
--- a/tests/zfs-tests/tests/functional/cli_root/zpool_add/Makefile.am
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zpool_add/Makefile.am
|
||||
@@ -15,4 +15,5 @@ dist_pkgdata_SCRIPTS = \
|
||||
zpool_add_009_neg.ksh \
|
||||
zpool_add_010_pos.ksh \
|
||||
add-o_ashift.ksh \
|
||||
- add_prop_ashift.ksh
|
||||
+ add_prop_ashift.ksh \
|
||||
+ add_nested_replacing_spare.ksh
|
||||
diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c
|
||||
index 97faa5f9b..fd6bd9e76 100644
|
||||
--- a/cmd/zpool/zpool_vdev.c
|
||||
+++ b/cmd/zpool/zpool_vdev.c
|
||||
@@ -860,9 +860,11 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
|
||||
|
||||
/*
|
||||
* If this is a replacing or spare vdev, then
|
||||
- * get the real first child of the vdev.
|
||||
+ * get the real first child of the vdev: do this
|
||||
+ * in a loop because replacing and spare vdevs
|
||||
+ * can be nested.
|
||||
*/
|
||||
- if (strcmp(childtype,
|
||||
+ while (strcmp(childtype,
|
||||
VDEV_TYPE_REPLACING) == 0 ||
|
||||
strcmp(childtype, VDEV_TYPE_SPARE) == 0) {
|
||||
nvlist_t **rchild;
|
||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
||||
index f872c0cbf..303c27529 100644
|
||||
--- a/tests/runfiles/linux.run
|
||||
+++ b/tests/runfiles/linux.run
|
||||
@@ -228,7 +228,7 @@ tests = ['zpool_add_001_pos', 'zpool_add_002_pos', 'zpool_add_003_pos',
|
||||
'zpool_add_004_pos', 'zpool_add_005_pos', 'zpool_add_006_pos',
|
||||
'zpool_add_007_neg', 'zpool_add_008_neg', 'zpool_add_009_neg',
|
||||
'zpool_add_010_pos',
|
||||
- 'add-o_ashift', 'add_prop_ashift']
|
||||
+ 'add-o_ashift', 'add_prop_ashift', 'add_nested_replacing_spare']
|
||||
tags = ['functional', 'cli_root', 'zpool_add']
|
||||
|
||||
[tests/functional/cli_root/zpool_attach]
|
||||
diff --git a/tests/zfs-tests/include/libtest.shlib b/tests/zfs-tests/include/libtest.shlib
|
||||
index 345d1903d..86f172a6d 100644
|
||||
--- a/tests/zfs-tests/include/libtest.shlib
|
||||
+++ b/tests/zfs-tests/include/libtest.shlib
|
||||
@@ -1988,6 +1988,31 @@ function check_hotspare_state # pool disk state{inuse,avail}
|
||||
return 0
|
||||
}
|
||||
|
||||
+#
|
||||
+# Wait until a hotspare transitions to a given state or times out.
|
||||
+#
|
||||
+# Return 0 when pool/disk matches expected state, 1 on timeout.
|
||||
+#
|
||||
+function wait_hotspare_state # pool disk state timeout
|
||||
+{
|
||||
+ typeset pool=$1
|
||||
+ typeset disk=${2#$/DEV_DSKDIR/}
|
||||
+ typeset state=$3
|
||||
+ typeset timeout=${4:-60}
|
||||
+ typeset -i i=0
|
||||
+
|
||||
+ while [[ $i -lt $timeout ]]; do
|
||||
+ if check_hotspare_state $pool $disk $state; then
|
||||
+ return 0
|
||||
+ fi
|
||||
+
|
||||
+ i=$((i+1))
|
||||
+ sleep 1
|
||||
+ done
|
||||
+
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
#
|
||||
# Verify a given slog disk is inuse or avail
|
||||
#
|
||||
@@ -2026,6 +2051,31 @@ function check_vdev_state # pool disk state{online,offline,unavail}
|
||||
return 0
|
||||
}
|
||||
|
||||
+#
|
||||
+# Wait until a vdev transitions to a given state or times out.
|
||||
+#
|
||||
+# Return 0 when pool/disk matches expected state, 1 on timeout.
|
||||
+#
|
||||
+function wait_vdev_state # pool disk state timeout
|
||||
+{
|
||||
+ typeset pool=$1
|
||||
+ typeset disk=${2#$/DEV_DSKDIR/}
|
||||
+ typeset state=$3
|
||||
+ typeset timeout=${4:-60}
|
||||
+ typeset -i i=0
|
||||
+
|
||||
+ while [[ $i -lt $timeout ]]; do
|
||||
+ if check_vdev_state $pool $disk $state; then
|
||||
+ return 0
|
||||
+ fi
|
||||
+
|
||||
+ i=$((i+1))
|
||||
+ sleep 1
|
||||
+ done
|
||||
+
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
#
|
||||
# Check the output of 'zpool status -v <pool>',
|
||||
# and to see if the content of <token> contain the <keyword> specified.
|
||||
@@ -3394,13 +3444,25 @@ function zed_stop
|
||||
if [[ -f ${ZEDLET_DIR}/zed.pid ]]; then
|
||||
zedpid=$(cat ${ZEDLET_DIR}/zed.pid)
|
||||
kill $zedpid
|
||||
- wait $zedpid
|
||||
+ while ps -p $zedpid > /dev/null; do
|
||||
+ sleep 1
|
||||
+ done
|
||||
rm -f ${ZEDLET_DIR}/zed.pid
|
||||
fi
|
||||
-
|
||||
return 0
|
||||
}
|
||||
|
||||
+#
|
||||
+# Drain all zevents
|
||||
+#
|
||||
+function zed_events_drain
|
||||
+{
|
||||
+ while [ $(zpool events -H | wc -l) -ne 0 ]; do
|
||||
+ sleep 1
|
||||
+ zpool events -c >/dev/null
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
#
|
||||
# Check is provided device is being active used as a swap device.
|
||||
#
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_add/add_nested_replacing_spare.ksh b/tests/zfs-tests/tests/functional/cli_root/zpool_add/add_nested_replacing_spare.ksh
|
||||
new file mode 100755
|
||||
index 000000000..b38079852
|
||||
--- /dev/null
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zpool_add/add_nested_replacing_spare.ksh
|
||||
@@ -0,0 +1,111 @@
|
||||
+#!/bin/ksh -p
|
||||
+#
|
||||
+# CDDL HEADER START
|
||||
+#
|
||||
+# The contents of this file are subject to the terms of the
|
||||
+# Common Development and Distribution License (the "License").
|
||||
+# You may not use this file except in compliance with the License.
|
||||
+#
|
||||
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
+# or http://www.opensolaris.org/os/licensing.
|
||||
+# See the License for the specific language governing permissions
|
||||
+# and limitations under the License.
|
||||
+#
|
||||
+# When distributing Covered Code, include this CDDL HEADER in each
|
||||
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
+# If applicable, add the following below this CDDL HEADER, with the
|
||||
+# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
+# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
+#
|
||||
+# CDDL HEADER END
|
||||
+#
|
||||
+
|
||||
+#
|
||||
+# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
|
||||
+#
|
||||
+
|
||||
+. $STF_SUITE/include/libtest.shlib
|
||||
+. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib
|
||||
+
|
||||
+#
|
||||
+# DESCRIPTION:
|
||||
+# 'zpool add' works with nested replacing/spare vdevs
|
||||
+#
|
||||
+# STRATEGY:
|
||||
+# 1. Create a redundant pool with a spare device
|
||||
+# 2. Manually fault a device, wait for the hot-spare and then replace it:
|
||||
+# this creates a situation where replacing and spare vdevs are nested.
|
||||
+# 3. Verify 'zpool add' is able to add new devices to the pool.
|
||||
+#
|
||||
+
|
||||
+verify_runnable "global"
|
||||
+
|
||||
+function cleanup
|
||||
+{
|
||||
+ zed_stop
|
||||
+ zed_cleanup
|
||||
+ log_must zinject -c all
|
||||
+ destroy_pool $TESTPOOL
|
||||
+ log_must rm -f $DATA_DEVS $SPARE_DEVS
|
||||
+}
|
||||
+
|
||||
+log_assert "'zpool add' works with nested replacing/spare vdevs"
|
||||
+log_onexit cleanup
|
||||
+
|
||||
+FAULT_DEV="$TEST_BASE_DIR/fault-dev"
|
||||
+SAFE_DEV1="$TEST_BASE_DIR/safe-dev1"
|
||||
+SAFE_DEV2="$TEST_BASE_DIR/safe-dev2"
|
||||
+SAFE_DEV3="$TEST_BASE_DIR/safe-dev3"
|
||||
+SAFE_DEVS="$SAFE_DEV1 $SAFE_DEV2 $SAFE_DEV3"
|
||||
+REPLACE_DEV="$TEST_BASE_DIR/replace-dev"
|
||||
+ADD_DEV="$TEST_BASE_DIR/add-dev"
|
||||
+DATA_DEVS="$FAULT_DEV $SAFE_DEVS $REPLACE_DEV $ADD_DEV"
|
||||
+SPARE_DEV1="$TEST_BASE_DIR/spare-dev1"
|
||||
+SPARE_DEV2="$TEST_BASE_DIR/spare-dev2"
|
||||
+SPARE_DEVS="$SPARE_DEV1 $SPARE_DEV2"
|
||||
+
|
||||
+# We need ZED running to work with spares
|
||||
+zed_setup
|
||||
+zed_start
|
||||
+# Clear events from previous runs
|
||||
+zed_events_drain
|
||||
+
|
||||
+for type in "mirror" "raidz1" "raidz2" "raidz3"
|
||||
+do
|
||||
+ # 1. Create a redundant pool with a spare device
|
||||
+ truncate -s $SPA_MINDEVSIZE $DATA_DEVS $SPARE_DEVS
|
||||
+ log_must zpool create $TESTPOOL $type $FAULT_DEV $SAFE_DEVS
|
||||
+ log_must zpool add $TESTPOOL spare $SPARE_DEV1
|
||||
+
|
||||
+ # 2.1 Fault a device, verify the spare is kicked in
|
||||
+ log_must zinject -d $FAULT_DEV -e nxio -T all -f 100 $TESTPOOL
|
||||
+ log_must zpool scrub $TESTPOOL
|
||||
+ log_must wait_vdev_state $TESTPOOL $FAULT_DEV "UNAVAIL" 60
|
||||
+ log_must wait_vdev_state $TESTPOOL $SPARE_DEV1 "ONLINE" 60
|
||||
+ log_must wait_hotspare_state $TESTPOOL $SPARE_DEV1 "INUSE"
|
||||
+ log_must check_state $TESTPOOL "" "DEGRADED"
|
||||
+
|
||||
+ # 2.2 Replace the faulted device: this creates a replacing vdev inside a
|
||||
+ # spare vdev
|
||||
+ log_must zpool replace $TESTPOOL $FAULT_DEV $REPLACE_DEV
|
||||
+ log_must wait_vdev_state $TESTPOOL $REPLACE_DEV "ONLINE" 60
|
||||
+ zpool status | awk -v poolname="$TESTPOOL" -v type="$type" 'BEGIN {s=""}
|
||||
+ $1 ~ poolname {c=4}; (c && c--) { s=s$1":" }
|
||||
+ END { if (s != poolname":"type"-0:spare-0:replacing-0:") exit 1; }'
|
||||
+ if [[ $? -ne 0 ]]; then
|
||||
+ log_fail "Pool does not contain nested replacing/spare vdevs"
|
||||
+ fi
|
||||
+
|
||||
+ # 3. Verify 'zpool add' is able to add new devices
|
||||
+ log_must zpool add $TESTPOOL spare $SPARE_DEV2
|
||||
+ log_must wait_hotspare_state $TESTPOOL $SPARE_DEV2 "AVAIL"
|
||||
+ log_must zpool add -f $TESTPOOL $ADD_DEV
|
||||
+ log_must wait_vdev_state $TESTPOOL $ADD_DEV "ONLINE" 60
|
||||
+
|
||||
+ # Cleanup
|
||||
+ log_must zinject -c all
|
||||
+ destroy_pool $TESTPOOL
|
||||
+ log_must rm -f $DATA_DEVS $SPARE_DEVS
|
||||
+done
|
||||
+
|
||||
+log_pass "'zpool add' works with nested replacing/spare vdevs"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Thu, 1 Feb 2018 16:19:36 -0800
|
||||
Subject: [PATCH] Fix zdb -R decompression
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are some issues in the zdb -R decompression implementation.
|
||||
|
||||
The first is that ZLE can easily decompress non-ZLE streams. So we add
|
||||
ZDB_NO_ZLE env to make zdb skip ZLE.
|
||||
|
||||
The second is the random bytes appended to pabd, pbuf2 stuff. This serve
|
||||
no purpose at all, those bytes shouldn't be read during decompression
|
||||
anyway. Instead, we randomize lbuf2, so that we can make sure
|
||||
decompression fill exactly to lsize by bcmp lbuf and lbuf2.
|
||||
|
||||
The last one is the condition to detect fail is wrong.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
Closes #4984
|
||||
(cherry picked from commit 18c662b84566cd34e6f6fb982d6a01a415a4e3cd)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zdb/zdb.c | 38 ++++++++++++++++++--------------------
|
||||
man/man8/zdb.8 | 4 +++-
|
||||
2 files changed, 21 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
|
||||
index 0cc1656a8..2d80589ca 100644
|
||||
--- a/cmd/zdb/zdb.c
|
||||
+++ b/cmd/zdb/zdb.c
|
||||
@@ -3895,13 +3895,6 @@ name:
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
-/* ARGSUSED */
|
||||
-static int
|
||||
-random_get_pseudo_bytes_cb(void *buf, size_t len, void *unused)
|
||||
-{
|
||||
- return (random_get_pseudo_bytes(buf, len));
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Read a block from a pool and print it out. The syntax of the
|
||||
* block descriptor is:
|
||||
@@ -4064,17 +4057,8 @@ zdb_read_block(char *thing, spa_t *spa)
|
||||
* every decompress function at every inflated blocksize.
|
||||
*/
|
||||
enum zio_compress c;
|
||||
- void *pbuf2 = umem_alloc(SPA_MAXBLOCKSIZE, UMEM_NOFAIL);
|
||||
void *lbuf2 = umem_alloc(SPA_MAXBLOCKSIZE, UMEM_NOFAIL);
|
||||
|
||||
- abd_copy_to_buf(pbuf2, pabd, psize);
|
||||
-
|
||||
- VERIFY0(abd_iterate_func(pabd, psize, SPA_MAXBLOCKSIZE - psize,
|
||||
- random_get_pseudo_bytes_cb, NULL));
|
||||
-
|
||||
- VERIFY0(random_get_pseudo_bytes((uint8_t *)pbuf2 + psize,
|
||||
- SPA_MAXBLOCKSIZE - psize));
|
||||
-
|
||||
/*
|
||||
* XXX - On the one hand, with SPA_MAXBLOCKSIZE at 16MB,
|
||||
* this could take a while and we should let the user know
|
||||
@@ -4084,13 +4068,29 @@ zdb_read_block(char *thing, spa_t *spa)
|
||||
for (lsize = psize + SPA_MINBLOCKSIZE;
|
||||
lsize <= SPA_MAXBLOCKSIZE; lsize += SPA_MINBLOCKSIZE) {
|
||||
for (c = 0; c < ZIO_COMPRESS_FUNCTIONS; c++) {
|
||||
+ /*
|
||||
+ * ZLE can easily decompress non zle stream.
|
||||
+ * So have an option to disable it.
|
||||
+ */
|
||||
+ if (c == ZIO_COMPRESS_ZLE &&
|
||||
+ getenv("ZDB_NO_ZLE"))
|
||||
+ continue;
|
||||
+
|
||||
(void) fprintf(stderr,
|
||||
"Trying %05llx -> %05llx (%s)\n",
|
||||
(u_longlong_t)psize, (u_longlong_t)lsize,
|
||||
zio_compress_table[c].ci_name);
|
||||
+
|
||||
+ /*
|
||||
+ * We randomize lbuf2, and decompress to both
|
||||
+ * lbuf and lbuf2. This way, we will know if
|
||||
+ * decompression fill exactly to lsize.
|
||||
+ */
|
||||
+ VERIFY0(random_get_pseudo_bytes(lbuf2, lsize));
|
||||
+
|
||||
if (zio_decompress_data(c, pabd,
|
||||
lbuf, psize, lsize) == 0 &&
|
||||
- zio_decompress_data_buf(c, pbuf2,
|
||||
+ zio_decompress_data(c, pabd,
|
||||
lbuf2, psize, lsize) == 0 &&
|
||||
bcmp(lbuf, lbuf2, lsize) == 0)
|
||||
break;
|
||||
@@ -4098,11 +4098,9 @@ zdb_read_block(char *thing, spa_t *spa)
|
||||
if (c != ZIO_COMPRESS_FUNCTIONS)
|
||||
break;
|
||||
}
|
||||
-
|
||||
- umem_free(pbuf2, SPA_MAXBLOCKSIZE);
|
||||
umem_free(lbuf2, SPA_MAXBLOCKSIZE);
|
||||
|
||||
- if (lsize <= psize) {
|
||||
+ if (lsize > SPA_MAXBLOCKSIZE) {
|
||||
(void) printf("Decompress of %s failed\n", thing);
|
||||
goto out;
|
||||
}
|
||||
diff --git a/man/man8/zdb.8 b/man/man8/zdb.8
|
||||
index 4e47de7be..d991aae4c 100644
|
||||
--- a/man/man8/zdb.8
|
||||
+++ b/man/man8/zdb.8
|
||||
@@ -246,7 +246,9 @@ and, optionally,
|
||||
.It Sy b Ar offset
|
||||
Print block pointer
|
||||
.It Sy d
|
||||
-Decompress the block
|
||||
+Decompress the block. Set environment variable
|
||||
+.Nm ZBD_NO_ZLE
|
||||
+to skip zle when guessing.
|
||||
.It Sy e
|
||||
Byte swap the block
|
||||
.It Sy g
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Nathaniel Wesley Filardo
|
||||
<VP331RHQ115POU58JFRLKB7OPA0L18E3@cmx.ietfng.org>
|
||||
Date: Tue, 9 Jan 2018 14:14:45 -0500
|
||||
Subject: [PATCH] zhack: fix getopt return type
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This fixes zhack's command processing on ARM. On ARM char
|
||||
is unsigned, and so, in promotion to an int, it will never
|
||||
compare equal to -1.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Nathaniel Wesley Filardo <nwf@cs.jhu.edu>
|
||||
Closes #7016
|
||||
(cherry picked from commit a2ee6568c604fb455d6ee7fa51728fb2bc700dac)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zhack/zhack.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/cmd/zhack/zhack.c b/cmd/zhack/zhack.c
|
||||
index 70f88fc69..e15af8f4e 100644
|
||||
--- a/cmd/zhack/zhack.c
|
||||
+++ b/cmd/zhack/zhack.c
|
||||
@@ -268,7 +268,7 @@ zhack_feature_enable_sync(void *arg, dmu_tx_t *tx)
|
||||
static void
|
||||
zhack_do_feature_enable(int argc, char **argv)
|
||||
{
|
||||
- char c;
|
||||
+ int c;
|
||||
char *desc, *target;
|
||||
spa_t *spa;
|
||||
objset_t *mos;
|
||||
@@ -363,7 +363,7 @@ feature_decr_sync(void *arg, dmu_tx_t *tx)
|
||||
static void
|
||||
zhack_do_feature_ref(int argc, char **argv)
|
||||
{
|
||||
- char c;
|
||||
+ int c;
|
||||
char *target;
|
||||
boolean_t decr = B_FALSE;
|
||||
spa_t *spa;
|
||||
@@ -483,7 +483,7 @@ main(int argc, char **argv)
|
||||
char *path[MAX_NUM_PATHS];
|
||||
const char *subcommand;
|
||||
int rv = 0;
|
||||
- char c;
|
||||
+ int c;
|
||||
|
||||
g_importargs.path = path;
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Thu, 1 Feb 2018 16:28:11 -0800
|
||||
Subject: [PATCH] Fix zdb -E segfault
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
SPA_MAXBLOCKSIZE is too large for stack.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
(cherry picked from commit 31ff122aa2e20c7ed48617868085ddba7b4ad174)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zdb/zdb.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
|
||||
index 2d80589ca..90847d8d9 100644
|
||||
--- a/cmd/zdb/zdb.c
|
||||
+++ b/cmd/zdb/zdb.c
|
||||
@@ -4139,11 +4139,12 @@ zdb_embedded_block(char *thing)
|
||||
{
|
||||
blkptr_t bp;
|
||||
unsigned long long *words = (void *)&bp;
|
||||
- char buf[SPA_MAXBLOCKSIZE];
|
||||
+ char *buf;
|
||||
int err;
|
||||
|
||||
- memset(&bp, 0, sizeof (blkptr_t));
|
||||
+ buf = umem_alloc(SPA_MAXBLOCKSIZE, UMEM_NOFAIL);
|
||||
|
||||
+ bzero(&bp, sizeof (bp));
|
||||
err = sscanf(thing, "%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx:"
|
||||
"%llx:%llx:%llx:%llx:%llx:%llx:%llx:%llx",
|
||||
words + 0, words + 1, words + 2, words + 3,
|
||||
@@ -4161,6 +4162,7 @@ zdb_embedded_block(char *thing)
|
||||
exit(1);
|
||||
}
|
||||
zdb_dump_block_raw(buf, BPE_GET_LSIZE(&bp), 0);
|
||||
+ umem_free(buf, SPA_MAXBLOCKSIZE);
|
||||
}
|
||||
|
||||
int
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Nathaniel Wesley Filardo
|
||||
<VP331RHQ115POU58JFRLKB7OPA0L18E3@cmx.ietfng.org>
|
||||
Date: Tue, 9 Jan 2018 17:46:52 -0500
|
||||
Subject: [PATCH] Revert raidz_map and _col structure types
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
As part of the refactoring of ab9f4b0b824ab4cc64a4fa382c037f4154de12d6,
|
||||
several uint64_t-s and uint8_t-s were changed to other types. This
|
||||
caused ZoL github issue #6981, an overflow of a size_t on a 32-bit ARM
|
||||
machine. In absense of any strong motivation for the type changes, this
|
||||
simply puts them back, modulo the changes accumulated for ABD.
|
||||
|
||||
Compile-tested on amd64 and run-tested on armhf.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Signed-off-by: Nathaniel Wesley Filardo <nwf@cs.jhu.edu>
|
||||
Closes #6981
|
||||
Closes #7023
|
||||
(cherry picked from commit 9fb09f79e573d377b2b041f620eac703be3acc3f)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/vdev_raidz_impl.h | 34 +++++++++++++++++-----------------
|
||||
1 file changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/include/sys/vdev_raidz_impl.h b/include/sys/vdev_raidz_impl.h
|
||||
index 4bd15e3d5..0799ed19d 100644
|
||||
--- a/include/sys/vdev_raidz_impl.h
|
||||
+++ b/include/sys/vdev_raidz_impl.h
|
||||
@@ -102,30 +102,30 @@ typedef struct raidz_impl_ops {
|
||||
} raidz_impl_ops_t;
|
||||
|
||||
typedef struct raidz_col {
|
||||
- size_t rc_devidx; /* child device index for I/O */
|
||||
- size_t rc_offset; /* device offset */
|
||||
- size_t rc_size; /* I/O size */
|
||||
+ uint64_t rc_devidx; /* child device index for I/O */
|
||||
+ uint64_t rc_offset; /* device offset */
|
||||
+ uint64_t rc_size; /* I/O size */
|
||||
abd_t *rc_abd; /* I/O data */
|
||||
void *rc_gdata; /* used to store the "good" version */
|
||||
int rc_error; /* I/O error for this device */
|
||||
- unsigned int rc_tried; /* Did we attempt this I/O column? */
|
||||
- unsigned int rc_skipped; /* Did we skip this I/O column? */
|
||||
+ uint8_t rc_tried; /* Did we attempt this I/O column? */
|
||||
+ uint8_t rc_skipped; /* Did we skip this I/O column? */
|
||||
} raidz_col_t;
|
||||
|
||||
typedef struct raidz_map {
|
||||
- size_t rm_cols; /* Regular column count */
|
||||
- size_t rm_scols; /* Count including skipped columns */
|
||||
- size_t rm_bigcols; /* Number of oversized columns */
|
||||
- size_t rm_asize; /* Actual total I/O size */
|
||||
- size_t rm_missingdata; /* Count of missing data devices */
|
||||
- size_t rm_missingparity; /* Count of missing parity devices */
|
||||
- size_t rm_firstdatacol; /* First data column/parity count */
|
||||
- size_t rm_nskip; /* Skipped sectors for padding */
|
||||
- size_t rm_skipstart; /* Column index of padding start */
|
||||
+ uint64_t rm_cols; /* Regular column count */
|
||||
+ uint64_t rm_scols; /* Count including skipped columns */
|
||||
+ uint64_t rm_bigcols; /* Number of oversized columns */
|
||||
+ uint64_t rm_asize; /* Actual total I/O size */
|
||||
+ uint64_t rm_missingdata; /* Count of missing data devices */
|
||||
+ uint64_t rm_missingparity; /* Count of missing parity devices */
|
||||
+ uint64_t rm_firstdatacol; /* First data column/parity count */
|
||||
+ uint64_t rm_nskip; /* Skipped sectors for padding */
|
||||
+ uint64_t rm_skipstart; /* Column index of padding start */
|
||||
abd_t *rm_abd_copy; /* rm_asize-buffer of copied data */
|
||||
- size_t rm_reports; /* # of referencing checksum reports */
|
||||
- unsigned int rm_freed; /* map no longer has referencing ZIO */
|
||||
- unsigned int rm_ecksuminjected; /* checksum error was injected */
|
||||
+ uintptr_t rm_reports; /* # of referencing checksum reports */
|
||||
+ uint8_t rm_freed; /* map no longer has referencing ZIO */
|
||||
+ uint8_t rm_ecksuminjected; /* checksum error was injected */
|
||||
raidz_impl_ops_t *rm_ops; /* RAIDZ math operations */
|
||||
raidz_col_t rm_col[1]; /* Flexible array of I/O columns */
|
||||
} raidz_map_t;
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Chunwei Chen <david.chen@nutanix.com>
|
||||
Date: Thu, 1 Feb 2018 16:36:40 -0800
|
||||
Subject: [PATCH] Fix zdb -ed on objset for exported pool
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
zdb -ed on objset for exported pool would failed with:
|
||||
failed to own dataset 'qq/fs0': No such file or directory
|
||||
|
||||
The reason is that zdb pass objset name to spa_import, it uses that
|
||||
name to create a spa. Later, when dmu_objset_own tries to lookup the spa
|
||||
using real pool name, it can't find one.
|
||||
|
||||
We fix this by make sure we pass pool name rather than objset name to
|
||||
spa_import.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Closes #7099
|
||||
Closes #6464
|
||||
(cherry picked from commit 478754a8f5ff0f3b9f6dfe4ce272efc1681d243e)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
.../tests/functional/cli_root/zdb/Makefile.am | 3 +-
|
||||
cmd/zdb/zdb.c | 32 +++++++----
|
||||
tests/runfiles/linux.run | 2 +-
|
||||
.../tests/functional/clean_mirror/cleanup.ksh | 4 +-
|
||||
.../tests/functional/cli_root/zdb/zdb_006_pos.ksh | 64 ++++++++++++++++++++++
|
||||
5 files changed, 90 insertions(+), 15 deletions(-)
|
||||
create mode 100755 tests/zfs-tests/tests/functional/cli_root/zdb/zdb_006_pos.ksh
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am b/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am
|
||||
index 51170fbc8..d37bcf607 100644
|
||||
--- a/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am
|
||||
@@ -4,4 +4,5 @@ dist_pkgdata_SCRIPTS = \
|
||||
zdb_002_pos.ksh \
|
||||
zdb_003_pos.ksh \
|
||||
zdb_004_pos.ksh \
|
||||
- zdb_005_pos.ksh
|
||||
+ zdb_005_pos.ksh \
|
||||
+ zdb_006_pos.ksh
|
||||
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
|
||||
index 90847d8d9..17a0ae251 100644
|
||||
--- a/cmd/zdb/zdb.c
|
||||
+++ b/cmd/zdb/zdb.c
|
||||
@@ -4177,7 +4177,7 @@ main(int argc, char **argv)
|
||||
int error = 0;
|
||||
char **searchdirs = NULL;
|
||||
int nsearch = 0;
|
||||
- char *target;
|
||||
+ char *target, *target_pool;
|
||||
nvlist_t *policy = NULL;
|
||||
uint64_t max_txg = UINT64_MAX;
|
||||
int flags = ZFS_IMPORT_MISSING_LOG;
|
||||
@@ -4380,6 +4380,20 @@ main(int argc, char **argv)
|
||||
error = 0;
|
||||
target = argv[0];
|
||||
|
||||
+ if (strpbrk(target, "/@") != NULL) {
|
||||
+ size_t targetlen;
|
||||
+
|
||||
+ target_pool = strdup(target);
|
||||
+ *strpbrk(target_pool, "/@") = '\0';
|
||||
+
|
||||
+ target_is_spa = B_FALSE;
|
||||
+ targetlen = strlen(target);
|
||||
+ if (targetlen && target[targetlen - 1] == '/')
|
||||
+ target[targetlen - 1] = '\0';
|
||||
+ } else {
|
||||
+ target_pool = target;
|
||||
+ }
|
||||
+
|
||||
if (dump_opt['e']) {
|
||||
importargs_t args = { 0 };
|
||||
nvlist_t *cfg = NULL;
|
||||
@@ -4388,8 +4402,10 @@ main(int argc, char **argv)
|
||||
args.path = searchdirs;
|
||||
args.can_be_active = B_TRUE;
|
||||
|
||||
- error = zpool_tryimport(g_zfs, target, &cfg, &args);
|
||||
+ error = zpool_tryimport(g_zfs, target_pool, &cfg, &args);
|
||||
+
|
||||
if (error == 0) {
|
||||
+
|
||||
if (nvlist_add_nvlist(cfg,
|
||||
ZPOOL_REWIND_POLICY, policy) != 0) {
|
||||
fatal("can't open '%s': %s",
|
||||
@@ -4404,19 +4420,13 @@ main(int argc, char **argv)
|
||||
(void) printf("\nConfiguration for import:\n");
|
||||
dump_nvlist(cfg, 8);
|
||||
}
|
||||
- error = spa_import(target, cfg, NULL,
|
||||
+ error = spa_import(target_pool, cfg, NULL,
|
||||
flags | ZFS_IMPORT_SKIP_MMP);
|
||||
}
|
||||
}
|
||||
|
||||
- if (strpbrk(target, "/@") != NULL) {
|
||||
- size_t targetlen;
|
||||
-
|
||||
- target_is_spa = B_FALSE;
|
||||
- targetlen = strlen(target);
|
||||
- if (targetlen && target[targetlen - 1] == '/')
|
||||
- target[targetlen - 1] = '\0';
|
||||
- }
|
||||
+ if (target_pool != target)
|
||||
+ free(target_pool);
|
||||
|
||||
if (error == 0) {
|
||||
if (target_is_spa || dump_opt['R']) {
|
||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
||||
index 303c27529..ea2dbb282 100644
|
||||
--- a/tests/runfiles/linux.run
|
||||
+++ b/tests/runfiles/linux.run
|
||||
@@ -73,7 +73,7 @@ tags = ['functional', 'clean_mirror']
|
||||
|
||||
[tests/functional/cli_root/zdb]
|
||||
tests = ['zdb_001_neg', 'zdb_002_pos', 'zdb_003_pos', 'zdb_004_pos',
|
||||
- 'zdb_005_pos']
|
||||
+ 'zdb_005_pos', 'zdb_006_pos']
|
||||
pre =
|
||||
post =
|
||||
tags = ['functional', 'cli_root', 'zdb']
|
||||
diff --git a/tests/zfs-tests/tests/functional/clean_mirror/cleanup.ksh b/tests/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
|
||||
index ac3bfbca8..fb0db312e 100755
|
||||
--- a/tests/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
|
||||
@@ -38,10 +38,10 @@ df -F zfs -h | grep "$TESTFS " >/dev/null
|
||||
[[ $? == 0 ]] && log_must zfs umount -f $TESTDIR
|
||||
destroy_pool $TESTPOOL
|
||||
|
||||
-if is_mpath_device $MIRROR_PRIMARY; then
|
||||
+if ( is_mpath_device $MIRROR_PRIMARY || is_loop_device $MIRROR_SECONDARY); then
|
||||
parted $DEV_DSKDIR/$MIRROR_PRIMARY -s rm 1
|
||||
fi
|
||||
-if is_mpath_device $MIRROR_SECONDARY; then
|
||||
+if ( is_mpath_device $MIRROR_SECONDARY || is_loop_device $MIRROR_SECONDARY); then
|
||||
parted $DEV_DSKDIR/$MIRROR_SECONDARY -s rm 1
|
||||
fi
|
||||
# recreate and destroy a zpool over the disks to restore the partitions to
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_006_pos.ksh b/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_006_pos.ksh
|
||||
new file mode 100755
|
||||
index 000000000..97b00e9e1
|
||||
--- /dev/null
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_006_pos.ksh
|
||||
@@ -0,0 +1,64 @@
|
||||
+#!/bin/ksh
|
||||
+
|
||||
+#
|
||||
+# This file and its contents are supplied under the terms of the
|
||||
+# Common Development and Distribution License ("CDDL"), version 1.0.
|
||||
+# You may only use this file in accordance with the terms of version
|
||||
+# 1.0 of the CDDL.
|
||||
+#
|
||||
+# A full copy of the text of the CDDL should have accompanied this
|
||||
+# source. A copy of the CDDL is also available via the Internet at
|
||||
+# http://www.illumos.org/license/CDDL.
|
||||
+#
|
||||
+
|
||||
+#
|
||||
+# Copyright (c) 2018 by Nutanix. All rights reserved.
|
||||
+#
|
||||
+
|
||||
+. $STF_SUITE/include/libtest.shlib
|
||||
+
|
||||
+#
|
||||
+# Description:
|
||||
+# zdb -d will work on imported/exported pool with pool/dataset argument
|
||||
+#
|
||||
+# Strategy:
|
||||
+# 1. Create a pool
|
||||
+# 2. Run zdb -d with pool and dataset arguments.
|
||||
+# 3. Export the pool
|
||||
+# 4. Run zdb -ed with pool and dataset arguments.
|
||||
+#
|
||||
+
|
||||
+function cleanup
|
||||
+{
|
||||
+ datasetexists $TESTPOOL && destroy_pool $TESTPOOL
|
||||
+ for DISK in $DISKS; do
|
||||
+ zpool labelclear -f $DEV_RDSKDIR/$DISK
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+log_assert "Verify zdb -d works on imported/exported pool with pool/dataset argument"
|
||||
+log_onexit cleanup
|
||||
+
|
||||
+verify_runnable "global"
|
||||
+verify_disk_count "$DISKS" 2
|
||||
+
|
||||
+default_mirror_setup_noexit $DISKS
|
||||
+log_must zfs snap $TESTPOOL/$TESTFS@snap
|
||||
+
|
||||
+log_must zdb -d $TESTPOOL
|
||||
+log_must zdb -d $TESTPOOL/
|
||||
+log_must zdb -d $TESTPOOL/$TESTFS
|
||||
+log_must zdb -d $TESTPOOL/$TESTFS@snap
|
||||
+
|
||||
+log_must zpool export $TESTPOOL
|
||||
+
|
||||
+log_must zdb -ed $TESTPOOL
|
||||
+log_must zdb -ed $TESTPOOL/
|
||||
+log_must zdb -ed $TESTPOOL/$TESTFS
|
||||
+log_must zdb -ed $TESTPOOL/$TESTFS@snap
|
||||
+
|
||||
+log_must zpool import $TESTPOOL
|
||||
+
|
||||
+cleanup
|
||||
+
|
||||
+log_pass "zdb -d works on imported/exported pool with pool/dataset argument"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Zhuravlev <alexey.zhuravlev@intel.com>
|
||||
Date: Mon, 8 Jan 2018 10:57:47 -0800
|
||||
Subject: [PATCH] Use zap_count instead of cached z_size for unlink
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
As a performance optimization Lustre does not strictly update
|
||||
the SA_ZPL_SIZE when adding/removing from non-directory entries.
|
||||
This results in entries which cannot be removed through the ZPL
|
||||
layer even though the ZAP is empty and safe to remove.
|
||||
|
||||
Resolve this issue by checking the zap_count() directly instead
|
||||
on relying on the cached SA_ZPL_SIZE. Micro-benchmarks show no
|
||||
significant performance impact due to the additional overhead
|
||||
of using zap_count().
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #7019
|
||||
(cherry picked from commit 129e3e8dc32673809d1d3523a0e773567e281a4a)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/zfs_dir.c | 16 +++++++++++++++-
|
||||
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/module/zfs/zfs_dir.c b/module/zfs/zfs_dir.c
|
||||
index c6ee30291..9a8bbccd9 100644
|
||||
--- a/module/zfs/zfs_dir.c
|
||||
+++ b/module/zfs/zfs_dir.c
|
||||
@@ -977,11 +977,25 @@ zfs_link_destroy(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag,
|
||||
* Indicate whether the directory is empty. Works with or without z_lock
|
||||
* held, but can only be consider a hint in the latter case. Returns true
|
||||
* if only "." and ".." remain and there's no work in progress.
|
||||
+ *
|
||||
+ * The internal ZAP size, rather than zp->z_size, needs to be checked since
|
||||
+ * some consumers (Lustre) do not strictly maintain an accurate SA_ZPL_SIZE.
|
||||
*/
|
||||
boolean_t
|
||||
zfs_dirempty(znode_t *dzp)
|
||||
{
|
||||
- return (dzp->z_size == 2 && dzp->z_dirlocks == 0);
|
||||
+ zfsvfs_t *zfsvfs = ZTOZSB(dzp);
|
||||
+ uint64_t count;
|
||||
+ int error;
|
||||
+
|
||||
+ if (dzp->z_dirlocks != NULL)
|
||||
+ return (B_FALSE);
|
||||
+
|
||||
+ error = zap_count(zfsvfs->z_os, dzp->z_id, &count);
|
||||
+ if (error != 0 || count != 0)
|
||||
+ return (B_FALSE);
|
||||
+
|
||||
+ return (B_TRUE);
|
||||
}
|
||||
|
||||
int
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Yao <ryao@gentoo.org>
|
||||
Date: Tue, 9 Jan 2018 19:18:19 -0500
|
||||
Subject: [PATCH] Fix incompatibility with Reiser4 patched kernels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In ZFSOnLinux, our sources and build system are self contained such that
|
||||
we do not need to make changes to the Linux kernel sources. Reiser4 on
|
||||
the other hand exists solely as a kernel tree patch and opts to make
|
||||
changes to the kernel rather than adapt to it. After Linux 4.1 made a
|
||||
VFS change that replaced new_sync_read with do_sync_read, Reiser4's
|
||||
maintainer decided to modify the kernel VFS to export the old function.
|
||||
This caused our autotools check to misidentify the kernel API as
|
||||
predating Linux 4.1 on kernels that have been patched with Reiser4
|
||||
support, which breaks our build.
|
||||
|
||||
Reiser4 really should be patched to stop doing this, but lets modify our
|
||||
check to be more strict to help the affected users of both filesystems.
|
||||
|
||||
Also, we were not checking the types of arguments and return value of
|
||||
new_sync_read() and new_sync_write() . Lets fix that too.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Richard Yao <ryao@gentoo.org>
|
||||
Closes #6241
|
||||
Closes #7021
|
||||
(cherry picked from commit ecc8af18125728bf03841ceb48b057e15d96362c)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/kernel-vfs-rw-iterate.m4 | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/config/kernel-vfs-rw-iterate.m4 b/config/kernel-vfs-rw-iterate.m4
|
||||
index 9f8fe6559..ace54f707 100644
|
||||
--- a/config/kernel-vfs-rw-iterate.m4
|
||||
+++ b/config/kernel-vfs-rw-iterate.m4
|
||||
@@ -32,15 +32,23 @@ dnl #
|
||||
dnl # Linux 4.1 API
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_NEW_SYNC_READ],
|
||||
- [AC_MSG_CHECKING([whether new_sync_read() is available])
|
||||
+ [AC_MSG_CHECKING([whether new_sync_read/write() are available])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/fs.h>
|
||||
],[
|
||||
- new_sync_read(NULL, NULL, 0, NULL);
|
||||
+ ssize_t ret __attribute__ ((unused));
|
||||
+ struct file *filp = NULL;
|
||||
+ char __user *rbuf = NULL;
|
||||
+ const char __user *wbuf = NULL;
|
||||
+ size_t len = 0;
|
||||
+ loff_t ppos;
|
||||
+
|
||||
+ ret = new_sync_read(filp, rbuf, len, &ppos);
|
||||
+ ret = new_sync_write(filp, wbuf, len, &ppos);
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_NEW_SYNC_READ, 1,
|
||||
- [new_sync_read() is available])
|
||||
+ [new_sync_read()/new_sync_write() are available])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,553 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: sanjeevbagewadi <sanjeev.bagewadi@gmail.com>
|
||||
Date: Fri, 9 Feb 2018 23:45:53 +0530
|
||||
Subject: [PATCH] Handle zap_add() failures in mixed case mode
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
With "casesensitivity=mixed", zap_add() could fail when the number of
|
||||
files/directories with the same name (varying in case) exceed the
|
||||
capacity of the leaf node of a Fatzap. This results in a ASSERT()
|
||||
failure as zfs_link_create() does not expect zap_add() to fail. The fix
|
||||
is to handle these failures and rollback the transactions.
|
||||
|
||||
Reviewed by: Matt Ahrens <mahrens@delphix.com>
|
||||
Reviewed-by: Chunwei Chen <david.chen@nutanix.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Sanjeev Bagewadi <sanjeev.bagewadi@gmail.com>
|
||||
Closes #7011
|
||||
Closes #7054
|
||||
(cherry picked from commit b3da003ebfad673bb4ada35f87a18a1ef175e95d)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
.../tests/functional/casenorm/Makefile.am | 1 +
|
||||
include/sys/zap_leaf.h | 15 ++-
|
||||
module/zfs/zap.c | 25 +++-
|
||||
module/zfs/zap_leaf.c | 2 +-
|
||||
module/zfs/zap_micro.c | 38 +++++-
|
||||
module/zfs/zfs_dir.c | 29 ++++-
|
||||
module/zfs/zfs_vnops.c | 73 ++++++++---
|
||||
tests/runfiles/linux.run | 2 +-
|
||||
.../functional/casenorm/mixed_create_failure.ksh | 136 +++++++++++++++++++++
|
||||
9 files changed, 289 insertions(+), 32 deletions(-)
|
||||
create mode 100755 tests/zfs-tests/tests/functional/casenorm/mixed_create_failure.ksh
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/casenorm/Makefile.am b/tests/zfs-tests/tests/functional/casenorm/Makefile.am
|
||||
index 00a19c7ff..00cb59074 100644
|
||||
--- a/tests/zfs-tests/tests/functional/casenorm/Makefile.am
|
||||
+++ b/tests/zfs-tests/tests/functional/casenorm/Makefile.am
|
||||
@@ -9,6 +9,7 @@ dist_pkgdata_SCRIPTS = \
|
||||
insensitive_formd_lookup.ksh \
|
||||
insensitive_none_delete.ksh \
|
||||
insensitive_none_lookup.ksh \
|
||||
+ mixed_create_failure.ksh \
|
||||
mixed_formd_delete.ksh \
|
||||
mixed_formd_lookup_ci.ksh \
|
||||
mixed_formd_lookup.ksh \
|
||||
diff --git a/include/sys/zap_leaf.h b/include/sys/zap_leaf.h
|
||||
index e784c5963..a3da1036a 100644
|
||||
--- a/include/sys/zap_leaf.h
|
||||
+++ b/include/sys/zap_leaf.h
|
||||
@@ -46,10 +46,15 @@ struct zap_stats;
|
||||
* block size (1<<l->l_bs) - hash entry size (2) * number of hash
|
||||
* entries - header space (2*chunksize)
|
||||
*/
|
||||
-#define ZAP_LEAF_NUMCHUNKS(l) \
|
||||
- (((1<<(l)->l_bs) - 2*ZAP_LEAF_HASH_NUMENTRIES(l)) / \
|
||||
+#define ZAP_LEAF_NUMCHUNKS_BS(bs) \
|
||||
+ (((1<<(bs)) - 2*ZAP_LEAF_HASH_NUMENTRIES_BS(bs)) / \
|
||||
ZAP_LEAF_CHUNKSIZE - 2)
|
||||
|
||||
+#define ZAP_LEAF_NUMCHUNKS(l) (ZAP_LEAF_NUMCHUNKS_BS(((l)->l_bs)))
|
||||
+
|
||||
+#define ZAP_LEAF_NUMCHUNKS_DEF \
|
||||
+ (ZAP_LEAF_NUMCHUNKS_BS(fzap_default_block_shift))
|
||||
+
|
||||
/*
|
||||
* The amount of space within the chunk available for the array is:
|
||||
* chunk size - space for type (1) - space for next pointer (2)
|
||||
@@ -74,8 +79,10 @@ struct zap_stats;
|
||||
* which is less than block size / CHUNKSIZE (24) / minimum number of
|
||||
* chunks per entry (3).
|
||||
*/
|
||||
-#define ZAP_LEAF_HASH_SHIFT(l) ((l)->l_bs - 5)
|
||||
-#define ZAP_LEAF_HASH_NUMENTRIES(l) (1 << ZAP_LEAF_HASH_SHIFT(l))
|
||||
+#define ZAP_LEAF_HASH_SHIFT_BS(bs) ((bs) - 5)
|
||||
+#define ZAP_LEAF_HASH_NUMENTRIES_BS(bs) (1 << ZAP_LEAF_HASH_SHIFT_BS(bs))
|
||||
+#define ZAP_LEAF_HASH_SHIFT(l) (ZAP_LEAF_HASH_SHIFT_BS(((l)->l_bs)))
|
||||
+#define ZAP_LEAF_HASH_NUMENTRIES(l) (ZAP_LEAF_HASH_NUMENTRIES_BS(((l)->l_bs)))
|
||||
|
||||
/*
|
||||
* The chunks start immediately after the hash table. The end of the
|
||||
diff --git a/module/zfs/zap.c b/module/zfs/zap.c
|
||||
index ee9962bff..9843d8c50 100644
|
||||
--- a/module/zfs/zap.c
|
||||
+++ b/module/zfs/zap.c
|
||||
@@ -819,15 +819,19 @@ fzap_lookup(zap_name_t *zn,
|
||||
return (err);
|
||||
}
|
||||
|
||||
+#define MAX_EXPAND_RETRIES 2
|
||||
+
|
||||
int
|
||||
fzap_add_cd(zap_name_t *zn,
|
||||
uint64_t integer_size, uint64_t num_integers,
|
||||
const void *val, uint32_t cd, void *tag, dmu_tx_t *tx)
|
||||
{
|
||||
zap_leaf_t *l;
|
||||
+ zap_leaf_t *prev_l = NULL;
|
||||
int err;
|
||||
zap_entry_handle_t zeh;
|
||||
zap_t *zap = zn->zn_zap;
|
||||
+ int expand_retries = 0;
|
||||
|
||||
ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
|
||||
ASSERT(!zap->zap_ismicro);
|
||||
@@ -851,10 +855,29 @@ retry:
|
||||
if (err == 0) {
|
||||
zap_increment_num_entries(zap, 1, tx);
|
||||
} else if (err == EAGAIN) {
|
||||
+ /*
|
||||
+ * If the last two expansions did not help, there is no point
|
||||
+ * trying to expand again
|
||||
+ */
|
||||
+ if (expand_retries > MAX_EXPAND_RETRIES && prev_l == l) {
|
||||
+ err = SET_ERROR(ENOSPC);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
err = zap_expand_leaf(zn, l, tag, tx, &l);
|
||||
zap = zn->zn_zap; /* zap_expand_leaf() may change zap */
|
||||
- if (err == 0)
|
||||
+ if (err == 0) {
|
||||
+ prev_l = l;
|
||||
+ expand_retries++;
|
||||
goto retry;
|
||||
+ } else if (err == ENOSPC) {
|
||||
+ /*
|
||||
+ * If we failed to expand the leaf, then bailout
|
||||
+ * as there is no point trying
|
||||
+ * zap_put_leaf_maybe_grow_ptrtbl().
|
||||
+ */
|
||||
+ return (err);
|
||||
+ }
|
||||
}
|
||||
|
||||
out:
|
||||
diff --git a/module/zfs/zap_leaf.c b/module/zfs/zap_leaf.c
|
||||
index c342695c7..526e46606 100644
|
||||
--- a/module/zfs/zap_leaf.c
|
||||
+++ b/module/zfs/zap_leaf.c
|
||||
@@ -53,7 +53,7 @@ static uint16_t *zap_leaf_rehash_entry(zap_leaf_t *l, uint16_t entry);
|
||||
((h) >> \
|
||||
(64 - ZAP_LEAF_HASH_SHIFT(l) - zap_leaf_phys(l)->l_hdr.lh_prefix_len)))
|
||||
|
||||
-#define LEAF_HASH_ENTPTR(l, h) (&zap_leaf_phys(l)->l_hash[LEAF_HASH(l, h)])
|
||||
+#define LEAF_HASH_ENTPTR(l, h) (&zap_leaf_phys(l)->l_hash[LEAF_HASH(l, h)])
|
||||
|
||||
extern inline zap_leaf_phys_t *zap_leaf_phys(zap_leaf_t *l);
|
||||
|
||||
diff --git a/module/zfs/zap_micro.c b/module/zfs/zap_micro.c
|
||||
index 3ebf995c6..34bef3e63 100644
|
||||
--- a/module/zfs/zap_micro.c
|
||||
+++ b/module/zfs/zap_micro.c
|
||||
@@ -363,6 +363,41 @@ mze_find_unused_cd(zap_t *zap, uint64_t hash)
|
||||
return (cd);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Each mzap entry requires at max : 4 chunks
|
||||
+ * 3 chunks for names + 1 chunk for value.
|
||||
+ */
|
||||
+#define MZAP_ENT_CHUNKS (1 + ZAP_LEAF_ARRAY_NCHUNKS(MZAP_NAME_LEN) + \
|
||||
+ ZAP_LEAF_ARRAY_NCHUNKS(sizeof (uint64_t)))
|
||||
+
|
||||
+/*
|
||||
+ * Check if the current entry keeps the colliding entries under the fatzap leaf
|
||||
+ * size.
|
||||
+ */
|
||||
+static boolean_t
|
||||
+mze_canfit_fzap_leaf(zap_name_t *zn, uint64_t hash)
|
||||
+{
|
||||
+ zap_t *zap = zn->zn_zap;
|
||||
+ mzap_ent_t mze_tofind;
|
||||
+ mzap_ent_t *mze;
|
||||
+ avl_index_t idx;
|
||||
+ avl_tree_t *avl = &zap->zap_m.zap_avl;
|
||||
+ uint32_t mzap_ents = 0;
|
||||
+
|
||||
+ mze_tofind.mze_hash = hash;
|
||||
+ mze_tofind.mze_cd = 0;
|
||||
+
|
||||
+ for (mze = avl_find(avl, &mze_tofind, &idx);
|
||||
+ mze && mze->mze_hash == hash; mze = AVL_NEXT(avl, mze)) {
|
||||
+ mzap_ents++;
|
||||
+ }
|
||||
+
|
||||
+ /* Include the new entry being added */
|
||||
+ mzap_ents++;
|
||||
+
|
||||
+ return (ZAP_LEAF_NUMCHUNKS_DEF > (mzap_ents * MZAP_ENT_CHUNKS));
|
||||
+}
|
||||
+
|
||||
static void
|
||||
mze_remove(zap_t *zap, mzap_ent_t *mze)
|
||||
{
|
||||
@@ -1191,7 +1226,8 @@ zap_add_impl(zap_t *zap, const char *key,
|
||||
err = fzap_add(zn, integer_size, num_integers, val, tag, tx);
|
||||
zap = zn->zn_zap; /* fzap_add() may change zap */
|
||||
} else if (integer_size != 8 || num_integers != 1 ||
|
||||
- strlen(key) >= MZAP_NAME_LEN) {
|
||||
+ strlen(key) >= MZAP_NAME_LEN ||
|
||||
+ !mze_canfit_fzap_leaf(zn, zn->zn_hash)) {
|
||||
err = mzap_upgrade(&zn->zn_zap, tag, tx, 0);
|
||||
if (err == 0) {
|
||||
err = fzap_add(zn, integer_size, num_integers, val,
|
||||
diff --git a/module/zfs/zfs_dir.c b/module/zfs/zfs_dir.c
|
||||
index 9a8bbccd9..6398a1d15 100644
|
||||
--- a/module/zfs/zfs_dir.c
|
||||
+++ b/module/zfs/zfs_dir.c
|
||||
@@ -742,7 +742,11 @@ zfs_dirent(znode_t *zp, uint64_t mode)
|
||||
}
|
||||
|
||||
/*
|
||||
- * Link zp into dl. Can only fail if zp has been unlinked.
|
||||
+ * Link zp into dl. Can fail in the following cases :
|
||||
+ * - if zp has been unlinked.
|
||||
+ * - if the number of entries with the same hash (aka. colliding entries)
|
||||
+ * exceed the capacity of a leaf-block of fatzap and splitting of the
|
||||
+ * leaf-block does not help.
|
||||
*/
|
||||
int
|
||||
zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
|
||||
@@ -776,6 +780,24 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
|
||||
NULL, &links, sizeof (links));
|
||||
}
|
||||
}
|
||||
+
|
||||
+ value = zfs_dirent(zp, zp->z_mode);
|
||||
+ error = zap_add(ZTOZSB(zp)->z_os, dzp->z_id, dl->dl_name, 8, 1,
|
||||
+ &value, tx);
|
||||
+
|
||||
+ /*
|
||||
+ * zap_add could fail to add the entry if it exceeds the capacity of the
|
||||
+ * leaf-block and zap_leaf_split() failed to help.
|
||||
+ * The caller of this routine is responsible for failing the transaction
|
||||
+ * which will rollback the SA updates done above.
|
||||
+ */
|
||||
+ if (error != 0) {
|
||||
+ if (!(flag & ZRENAMING) && !(flag & ZNEW))
|
||||
+ drop_nlink(ZTOI(zp));
|
||||
+ mutex_exit(&zp->z_lock);
|
||||
+ return (error);
|
||||
+ }
|
||||
+
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL,
|
||||
&dzp->z_id, sizeof (dzp->z_id));
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
|
||||
@@ -813,11 +835,6 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
|
||||
ASSERT(error == 0);
|
||||
mutex_exit(&dzp->z_lock);
|
||||
|
||||
- value = zfs_dirent(zp, zp->z_mode);
|
||||
- error = zap_add(ZTOZSB(zp)->z_os, dzp->z_id, dl->dl_name,
|
||||
- 8, 1, &value, tx);
|
||||
- ASSERT(error == 0);
|
||||
-
|
||||
return (0);
|
||||
}
|
||||
|
||||
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
|
||||
index 6f6ce79db..8a7ad702c 100644
|
||||
--- a/module/zfs/zfs_vnops.c
|
||||
+++ b/module/zfs/zfs_vnops.c
|
||||
@@ -1443,10 +1443,22 @@ top:
|
||||
}
|
||||
zfs_mknode(dzp, vap, tx, cr, 0, &zp, &acl_ids);
|
||||
|
||||
+ error = zfs_link_create(dl, zp, tx, ZNEW);
|
||||
+ if (error != 0) {
|
||||
+ /*
|
||||
+ * Since, we failed to add the directory entry for it,
|
||||
+ * delete the newly created dnode.
|
||||
+ */
|
||||
+ zfs_znode_delete(zp, tx);
|
||||
+ remove_inode_hash(ZTOI(zp));
|
||||
+ zfs_acl_ids_free(&acl_ids);
|
||||
+ dmu_tx_commit(tx);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
if (fuid_dirtied)
|
||||
zfs_fuid_sync(zfsvfs, tx);
|
||||
|
||||
- (void) zfs_link_create(dl, zp, tx, ZNEW);
|
||||
txtype = zfs_log_create_txtype(Z_FILE, vsecp, vap);
|
||||
if (flag & FIGNORECASE)
|
||||
txtype |= TX_CI;
|
||||
@@ -2037,13 +2049,18 @@ top:
|
||||
*/
|
||||
zfs_mknode(dzp, vap, tx, cr, 0, &zp, &acl_ids);
|
||||
|
||||
- if (fuid_dirtied)
|
||||
- zfs_fuid_sync(zfsvfs, tx);
|
||||
-
|
||||
/*
|
||||
* Now put new name in parent dir.
|
||||
*/
|
||||
- (void) zfs_link_create(dl, zp, tx, ZNEW);
|
||||
+ error = zfs_link_create(dl, zp, tx, ZNEW);
|
||||
+ if (error != 0) {
|
||||
+ zfs_znode_delete(zp, tx);
|
||||
+ remove_inode_hash(ZTOI(zp));
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (fuid_dirtied)
|
||||
+ zfs_fuid_sync(zfsvfs, tx);
|
||||
|
||||
*ipp = ZTOI(zp);
|
||||
|
||||
@@ -2053,6 +2070,7 @@ top:
|
||||
zfs_log_create(zilog, tx, txtype, dzp, zp, dirname, vsecp,
|
||||
acl_ids.z_fuidp, vap);
|
||||
|
||||
+out:
|
||||
zfs_acl_ids_free(&acl_ids);
|
||||
|
||||
dmu_tx_commit(tx);
|
||||
@@ -2062,10 +2080,14 @@ top:
|
||||
if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
|
||||
zil_commit(zilog, 0);
|
||||
|
||||
- zfs_inode_update(dzp);
|
||||
- zfs_inode_update(zp);
|
||||
+ if (error != 0) {
|
||||
+ iput(ZTOI(zp));
|
||||
+ } else {
|
||||
+ zfs_inode_update(dzp);
|
||||
+ zfs_inode_update(zp);
|
||||
+ }
|
||||
ZFS_EXIT(zfsvfs);
|
||||
- return (0);
|
||||
+ return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3683,6 +3705,13 @@ top:
|
||||
VERIFY3U(zfs_link_destroy(tdl, szp, tx,
|
||||
ZRENAMING, NULL), ==, 0);
|
||||
}
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * If we had removed the existing target, subsequent
|
||||
+ * call to zfs_link_create() to add back the same entry
|
||||
+ * but, the new dnode (szp) should not fail.
|
||||
+ */
|
||||
+ ASSERT(tzp == NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3853,14 +3882,18 @@ top:
|
||||
/*
|
||||
* Insert the new object into the directory.
|
||||
*/
|
||||
- (void) zfs_link_create(dl, zp, tx, ZNEW);
|
||||
-
|
||||
- if (flags & FIGNORECASE)
|
||||
- txtype |= TX_CI;
|
||||
- zfs_log_symlink(zilog, tx, txtype, dzp, zp, name, link);
|
||||
+ error = zfs_link_create(dl, zp, tx, ZNEW);
|
||||
+ if (error != 0) {
|
||||
+ zfs_znode_delete(zp, tx);
|
||||
+ remove_inode_hash(ZTOI(zp));
|
||||
+ } else {
|
||||
+ if (flags & FIGNORECASE)
|
||||
+ txtype |= TX_CI;
|
||||
+ zfs_log_symlink(zilog, tx, txtype, dzp, zp, name, link);
|
||||
|
||||
- zfs_inode_update(dzp);
|
||||
- zfs_inode_update(zp);
|
||||
+ zfs_inode_update(dzp);
|
||||
+ zfs_inode_update(zp);
|
||||
+ }
|
||||
|
||||
zfs_acl_ids_free(&acl_ids);
|
||||
|
||||
@@ -3868,10 +3901,14 @@ top:
|
||||
|
||||
zfs_dirent_unlock(dl);
|
||||
|
||||
- *ipp = ZTOI(zp);
|
||||
+ if (error == 0) {
|
||||
+ *ipp = ZTOI(zp);
|
||||
|
||||
- if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
|
||||
- zil_commit(zilog, 0);
|
||||
+ if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
|
||||
+ zil_commit(zilog, 0);
|
||||
+ } else {
|
||||
+ iput(ZTOI(zp));
|
||||
+ }
|
||||
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
||||
index ea2dbb282..8be3e1c62 100644
|
||||
--- a/tests/runfiles/linux.run
|
||||
+++ b/tests/runfiles/linux.run
|
||||
@@ -55,7 +55,7 @@ tags = ['functional', 'cachefile']
|
||||
# 'mixed_none_lookup', 'mixed_none_lookup_ci', 'mixed_none_delete',
|
||||
# 'mixed_formd_lookup', 'mixed_formd_lookup_ci', 'mixed_formd_delete']
|
||||
[tests/functional/casenorm]
|
||||
-tests = ['case_all_values', 'norm_all_values']
|
||||
+tests = ['case_all_values', 'norm_all_values', 'mixed_create_failure']
|
||||
tags = ['functional', 'casenorm']
|
||||
|
||||
[tests/functional/chattr]
|
||||
diff --git a/tests/zfs-tests/tests/functional/casenorm/mixed_create_failure.ksh b/tests/zfs-tests/tests/functional/casenorm/mixed_create_failure.ksh
|
||||
new file mode 100755
|
||||
index 000000000..51b5bb3f6
|
||||
--- /dev/null
|
||||
+++ b/tests/zfs-tests/tests/functional/casenorm/mixed_create_failure.ksh
|
||||
@@ -0,0 +1,136 @@
|
||||
+#!/bin/ksh -p
|
||||
+#
|
||||
+#
|
||||
+# This file and its contents are supplied under the terms of the
|
||||
+# Common Development and Distribution License ("CDDL"), version 1.0.
|
||||
+# You may only use this file in accordance with the terms of version
|
||||
+# 1.0 of the CDDL.
|
||||
+#
|
||||
+# A full copy of the text of the CDDL should have accompanied this
|
||||
+# source. A copy of the CDDL is also available via the Internet at
|
||||
+# http://www.illumos.org/license/CDDL.
|
||||
+#
|
||||
+#
|
||||
+# Copyright 2018 Nutanix Inc. All rights reserved.
|
||||
+#
|
||||
+
|
||||
+. $STF_SUITE/tests/functional/casenorm/casenorm.kshlib
|
||||
+
|
||||
+# DESCRIPTION:
|
||||
+# For the filesystem with casesensitivity=mixed, normalization=none,
|
||||
+# when multiple files with the same name (differing only in case) are created,
|
||||
+# the number of files is limited to what can fit in a fatzap leaf-block.
|
||||
+# And beyond that, it fails with ENOSPC.
|
||||
+#
|
||||
+# Ensure that the create/rename operations fail gracefully and not trigger an
|
||||
+# ASSERT.
|
||||
+#
|
||||
+# STRATEGY:
|
||||
+# Repeat the below steps for objects: files, directories, symlinks and hardlinks
|
||||
+# 1. Create objects with same name but varying in case.
|
||||
+# E.g. 'abcdefghijklmnop', 'Abcdefghijklmnop', 'ABcdefghijklmnop' etc.
|
||||
+# The create should fail with ENOSPC.
|
||||
+# 2. Create an object with name 'tmp_obj' and try to rename it to name that we
|
||||
+# failed to add in step 1 above.
|
||||
+# This should fail as well.
|
||||
+
|
||||
+verify_runnable "global"
|
||||
+
|
||||
+function cleanup
|
||||
+{
|
||||
+ destroy_testfs
|
||||
+}
|
||||
+
|
||||
+log_onexit cleanup
|
||||
+log_assert "With mixed mode: ensure create fails with ENOSPC beyond a certain limit"
|
||||
+
|
||||
+create_testfs "-o casesensitivity=mixed -o normalization=none"
|
||||
+
|
||||
+# Different object types
|
||||
+obj_type=('file' 'dir' 'symlink' 'hardlink')
|
||||
+
|
||||
+# Commands to create different object types
|
||||
+typeset -A ops
|
||||
+ops['file']='touch'
|
||||
+ops['dir']='mkdir'
|
||||
+ops['symlink']='ln -s'
|
||||
+ops['hardlink']='ln'
|
||||
+
|
||||
+# This function tests the following for a give object type :
|
||||
+# - Create multiple objects with the same name (varying only in case).
|
||||
+# Ensure that it eventually fails once the leaf-block limit is exceeded.
|
||||
+# - Create another object with a different name. And attempt rename it to the
|
||||
+# name (for which the create had failed in the previous step).
|
||||
+# This should fail as well.
|
||||
+# Args :
|
||||
+# $1 - object type (file/dir/symlink/hardlink)
|
||||
+# $2 - test directory
|
||||
+#
|
||||
+function test_ops
|
||||
+{
|
||||
+ typeset obj_type=$1
|
||||
+ typeset testdir=$2
|
||||
+
|
||||
+ target_obj='target-file'
|
||||
+
|
||||
+ op="${ops[$obj_type]}"
|
||||
+
|
||||
+ log_note "The op : $op"
|
||||
+ log_note "testdir=$testdir obj_type=$obj_type"
|
||||
+
|
||||
+ test_path="$testdir/$obj_type"
|
||||
+ mkdir $test_path
|
||||
+ log_note "Created test dir $test_path"
|
||||
+
|
||||
+ if [[ $obj_type = "symlink" || $obj_type = "hardlink" ]]; then
|
||||
+ touch $test_path/$target_obj
|
||||
+ log_note "Created target: $test_path/$target_obj"
|
||||
+ op="$op $test_path/$target_obj"
|
||||
+ fi
|
||||
+
|
||||
+ log_note "op : $op"
|
||||
+ names='{a,A}{b,B}{c,C}{d,D}{e,E}{f,F}{g,G}{h,H}{i,I}{j,J}{k,K}{l,L}'
|
||||
+ for name in $names; do
|
||||
+ cmd="$op $test_path/$name"
|
||||
+ out=$($cmd 2>&1)
|
||||
+ ret=$?
|
||||
+ log_note "cmd: $cmd ret: $ret out=$out"
|
||||
+ if (($ret != 0)); then
|
||||
+ if [[ $out = *@(No space left on device)* ]]; then
|
||||
+ save_name="$test_path/$name"
|
||||
+ break;
|
||||
+ else
|
||||
+ log_err "$cmd failed with unexpected error : $out"
|
||||
+ fi
|
||||
+ fi
|
||||
+ done
|
||||
+
|
||||
+ log_note 'Test rename \"sample_name\" rename'
|
||||
+ TMP_OBJ="$test_path/tmp_obj"
|
||||
+ cmd="$op $TMP_OBJ"
|
||||
+ out=$($cmd 2>&1)
|
||||
+ ret=$?
|
||||
+ if (($ret != 0)); then
|
||||
+ log_err "cmd:$cmd failed out:$out"
|
||||
+ fi
|
||||
+
|
||||
+ # Now, try to rename the tmp_obj to the name which we failed to add earlier.
|
||||
+ # This should fail as well.
|
||||
+ out=$(mv $TMP_OBJ $save_name 2>&1)
|
||||
+ ret=$?
|
||||
+ if (($ret != 0)); then
|
||||
+ if [[ $out = *@(No space left on device)* ]]; then
|
||||
+ log_note "$cmd failed as expected : $out"
|
||||
+ else
|
||||
+ log_err "$cmd failed with : $out"
|
||||
+ fi
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+for obj_type in ${obj_type[*]};
|
||||
+do
|
||||
+ log_note "Testing create of $obj_type"
|
||||
+ test_ops $obj_type $TESTDIR
|
||||
+done
|
||||
+
|
||||
+log_pass "Mixed mode FS: Ops on large number of colliding names fail gracefully"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: DeHackEd <DeHackEd@users.noreply.github.com>
|
||||
Date: Tue, 16 Jan 2018 13:18:08 -0500
|
||||
Subject: [PATCH] Remove l2arc_nocompress from zfs-module-parameters(5)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Parameter was removed in d3c2ae1c0806
|
||||
(OpenZFS 6950 - ARC should cache compressed data)
|
||||
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: DHE <git@dehacked.net>
|
||||
Closes #7043
|
||||
(cherry picked from commit 2a7b736dcea1abad62cceb36947e757b98c0e330)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
man/man5/zfs-module-parameters.5 | 11 -----------
|
||||
1 file changed, 11 deletions(-)
|
||||
|
||||
diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5
|
||||
index 4c957029d..19e6becfd 100644
|
||||
--- a/man/man5/zfs-module-parameters.5
|
||||
+++ b/man/man5/zfs-module-parameters.5
|
||||
@@ -96,17 +96,6 @@ successfully compressed before writing. A value of 100 disables this feature.
|
||||
Default value: \fB200\fR.
|
||||
.RE
|
||||
|
||||
-.sp
|
||||
-.ne 2
|
||||
-.na
|
||||
-\fBl2arc_nocompress\fR (int)
|
||||
-.ad
|
||||
-.RS 12n
|
||||
-Skip compressing L2ARC buffers
|
||||
-.sp
|
||||
-Use \fB1\fR for yes and \fB0\fR for no (default).
|
||||
-.RE
|
||||
-
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: sanjeevbagewadi <sanjeev.bagewadi@gmail.com>
|
||||
Date: Tue, 13 Feb 2018 01:00:38 +0530
|
||||
Subject: [PATCH] mmp should use a fixed tag for spa_config locks
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
mmp_write_uberblock() and mmp_write_done() should the same tag
|
||||
for spa_config_locks.
|
||||
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Sanjeev Bagewadi <sanjeev.bagewadi@gmail.com>
|
||||
Closes #6530
|
||||
Closes #7155
|
||||
(cherry picked from commit d85011ed696b41f4de963f7932dfb53ea871278b)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/mmp.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
|
||||
index e91ae628a..1dfb7c05b 100644
|
||||
--- a/module/zfs/mmp.c
|
||||
+++ b/module/zfs/mmp.c
|
||||
@@ -125,6 +125,7 @@ uint_t zfs_multihost_import_intervals = MMP_DEFAULT_IMPORT_INTERVALS;
|
||||
uint_t zfs_multihost_fail_intervals = MMP_DEFAULT_FAIL_INTERVALS;
|
||||
|
||||
static void mmp_thread(spa_t *spa);
|
||||
+char *mmp_tag = "mmp_write_uberblock";
|
||||
|
||||
void
|
||||
mmp_init(spa_t *spa)
|
||||
@@ -278,7 +279,7 @@ mmp_write_done(zio_t *zio)
|
||||
|
||||
unlock:
|
||||
mutex_exit(&mts->mmp_io_lock);
|
||||
- spa_config_exit(spa, SCL_STATE, FTAG);
|
||||
+ spa_config_exit(spa, SCL_STATE, mmp_tag);
|
||||
|
||||
abd_free(zio->io_abd);
|
||||
}
|
||||
@@ -314,7 +315,7 @@ mmp_write_uberblock(spa_t *spa)
|
||||
int label;
|
||||
uint64_t offset;
|
||||
|
||||
- spa_config_enter(spa, SCL_STATE, FTAG, RW_READER);
|
||||
+ spa_config_enter(spa, SCL_STATE, mmp_tag, RW_READER);
|
||||
vd = mmp_random_leaf(spa->spa_root_vdev);
|
||||
if (vd == NULL) {
|
||||
spa_config_exit(spa, SCL_STATE, FTAG);
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Wed, 17 Jan 2018 10:17:16 -0800
|
||||
Subject: [PATCH] Fix shellcheck v0.4.6 warnings
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Resolve new warnings reported after upgrading to shellcheck
|
||||
version 0.4.6. This patch contains no functional changes.
|
||||
|
||||
* egrep is non-standard and deprecated. Use grep -E instead. [SC2196]
|
||||
* Check exit code directly with e.g. 'if mycmd;', not indirectly
|
||||
with $?. [SC2181] Suppressed.
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #7040
|
||||
(cherry picked from commit 9d1a39cec6ba98c33cf0e358d2bac35dc1552d01)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zed/zed.d/zed-functions.sh | 4 ++--
|
||||
scripts/zloop.sh | 6 +++---
|
||||
tests/zfs-tests/tests/functional/acl/acl_common.kshlib | 2 +-
|
||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/cmd/zed/zed.d/zed-functions.sh b/cmd/zed/zed.d/zed-functions.sh
|
||||
index b7de5104f..ed6a95914 100644
|
||||
--- a/cmd/zed/zed.d/zed-functions.sh
|
||||
+++ b/cmd/zed/zed.d/zed-functions.sh
|
||||
@@ -397,7 +397,7 @@ zed_rate_limit()
|
||||
|
||||
zed_lock "${lockfile}" "${lockfile_fd}"
|
||||
time_now="$(date +%s)"
|
||||
- time_prev="$(egrep "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
|
||||
+ time_prev="$(grep -E "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
|
||||
| tail -1 | cut -d\; -f1)"
|
||||
|
||||
if [ -n "${time_prev}" ] \
|
||||
@@ -406,7 +406,7 @@ zed_rate_limit()
|
||||
else
|
||||
umask_bak="$(umask)"
|
||||
umask 077
|
||||
- egrep -v "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
|
||||
+ grep -E -v "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
|
||||
> "${statefile}.$$"
|
||||
echo "${time_now};${tag}" >> "${statefile}.$$"
|
||||
mv -f "${statefile}.$$" "${statefile}"
|
||||
diff --git a/scripts/zloop.sh b/scripts/zloop.sh
|
||||
index 854c2048a..03e825059 100755
|
||||
--- a/scripts/zloop.sh
|
||||
+++ b/scripts/zloop.sh
|
||||
@@ -70,12 +70,12 @@ function or_die
|
||||
|
||||
# core file helpers
|
||||
origcorepattern="$(cat /proc/sys/kernel/core_pattern)"
|
||||
-coreglob="$(egrep -o '^([^|%[:space:]]*)' /proc/sys/kernel/core_pattern)*"
|
||||
+coreglob="$(grep -E -o '^([^|%[:space:]]*)' /proc/sys/kernel/core_pattern)*"
|
||||
|
||||
if [[ $coreglob = "*" ]]; then
|
||||
echo "Setting core file pattern..."
|
||||
echo "core" > /proc/sys/kernel/core_pattern
|
||||
- coreglob="$(egrep -o '^([^|%[:space:]]*)' \
|
||||
+ coreglob="$(grep -E -o '^([^|%[:space:]]*)' \
|
||||
/proc/sys/kernel/core_pattern)*"
|
||||
fi
|
||||
|
||||
@@ -235,7 +235,7 @@ while [[ $timeout -eq 0 ]] || [[ $curtime -le $((starttime + timeout)) ]]; do
|
||||
echo "$desc" >>ztest.out
|
||||
$cmd >>ztest.out 2>&1
|
||||
ztrc=$?
|
||||
- egrep '===|WARNING' ztest.out >>ztest.history
|
||||
+ grep -E '===|WARNING' ztest.out >>ztest.history
|
||||
$ZDB -U "$workdir/zpool.cache" -DD ztest >>ztest.ddt
|
||||
|
||||
store_core
|
||||
diff --git a/tests/zfs-tests/tests/functional/acl/acl_common.kshlib b/tests/zfs-tests/tests/functional/acl/acl_common.kshlib
|
||||
index def25d390..75bb82455 100644
|
||||
--- a/tests/zfs-tests/tests/functional/acl/acl_common.kshlib
|
||||
+++ b/tests/zfs-tests/tests/functional/acl/acl_common.kshlib
|
||||
@@ -410,7 +410,7 @@ function get_xattr #<obj>
|
||||
fi
|
||||
|
||||
for xattr in `runat $obj ls | \
|
||||
- /usr/xpg4/bin/egrep -v -e SUNWattr_ro -e SUNWattr_rw` ; do
|
||||
+ grep -E -v -e SUNWattr_ro -e SUNWattr_rw` ; do
|
||||
runat $obj sum $xattr
|
||||
done
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Mon, 12 Feb 2018 20:40:00 +0100
|
||||
Subject: [PATCH] contrib/initramfs: add missing conf.d/zfs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When upgrading from the distribution-provided zfs-initramfs package on
|
||||
root-on-zfs Ubuntu and Debian the system may fail to boot: this change
|
||||
adds the missing initramfs configuration file.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Richard Laager <rlaager@wiktel.com>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #7158
|
||||
(cherry picked from commit a9ff89e05cd2f420e44b0e50c92d97c166772d2b)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
contrib/initramfs/Makefile.am | 6 ++++--
|
||||
contrib/initramfs/conf.d/zfs | 8 ++++++++
|
||||
2 files changed, 12 insertions(+), 2 deletions(-)
|
||||
create mode 100644 contrib/initramfs/conf.d/zfs
|
||||
|
||||
diff --git a/contrib/initramfs/Makefile.am b/contrib/initramfs/Makefile.am
|
||||
index 998e588ab..b22940821 100644
|
||||
--- a/contrib/initramfs/Makefile.am
|
||||
+++ b/contrib/initramfs/Makefile.am
|
||||
@@ -1,8 +1,10 @@
|
||||
initrddir = $(datarootdir)/initramfs-tools
|
||||
|
||||
-initrd_SCRIPTS = conf-hooks.d/zfs hooks/zfs scripts/zfs scripts/local-top/zfs
|
||||
+initrd_SCRIPTS = \
|
||||
+ conf.d/zfs conf-hooks.d/zfs hooks/zfs scripts/zfs scripts/local-top/zfs
|
||||
|
||||
EXTRA_DIST = \
|
||||
+ $(top_srcdir)/contrib/initramfs/conf.d/zfs \
|
||||
$(top_srcdir)/contrib/initramfs/conf-hooks.d/zfs \
|
||||
$(top_srcdir)/contrib/initramfs/hooks/zfs \
|
||||
$(top_srcdir)/contrib/initramfs/scripts/zfs \
|
||||
@@ -10,7 +12,7 @@ EXTRA_DIST = \
|
||||
$(top_srcdir)/contrib/initramfs/README.initramfs.markdown
|
||||
|
||||
install-initrdSCRIPTS: $(EXTRA_DIST)
|
||||
- for d in conf-hooks.d hooks scripts scripts/local-top; do \
|
||||
+ for d in conf.d conf-hooks.d hooks scripts scripts/local-top; do \
|
||||
$(MKDIR_P) $(DESTDIR)$(initrddir)/$$d; \
|
||||
cp $(top_srcdir)/contrib/initramfs/$$d/zfs \
|
||||
$(DESTDIR)$(initrddir)/$$d/; \
|
||||
diff --git a/contrib/initramfs/conf.d/zfs b/contrib/initramfs/conf.d/zfs
|
||||
new file mode 100644
|
||||
index 000000000..c67d75ba8
|
||||
--- /dev/null
|
||||
+++ b/contrib/initramfs/conf.d/zfs
|
||||
@@ -0,0 +1,8 @@
|
||||
+for x in $(cat /proc/cmdline)
|
||||
+do
|
||||
+ case $x in
|
||||
+ root=ZFS=*|root=zfs:*)
|
||||
+ BOOT=zfs
|
||||
+ ;;
|
||||
+ esac
|
||||
+done
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Thu, 18 Jan 2018 19:15:41 +0100
|
||||
Subject: [PATCH] Fix Debian packaging on ARMv7/ARM64
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When building packages on Debian-based systems specify the target
|
||||
architecture used by 'alien' to convert .rpm packages into .deb: this
|
||||
avoids detecting an incorrect value which results in the following
|
||||
errors:
|
||||
|
||||
<package>.aarch64.rpm is for architecture aarch64 ; the package cannot be built on this system
|
||||
<package>.armv7l.rpm is for architecture armel ; the package cannot be built on this system
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #7046
|
||||
Closes #7058
|
||||
(cherry picked from commit 5b8ec2cf391f2b7fb2b3a254b4ec9cf9664a2502)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/deb.am | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/config/deb.am b/config/deb.am
|
||||
index 98e98e45f..1b51f9316 100644
|
||||
--- a/config/deb.am
|
||||
+++ b/config/deb.am
|
||||
@@ -18,8 +18,9 @@ deb-kmod: deb-local rpm-kmod
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-kmod-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=kmod-$${name}*$${version}.$${arch}.rpm; \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb $$pkg1; \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch $$pkg1; \
|
||||
$(RM) $$pkg1
|
||||
|
||||
|
||||
@@ -27,14 +28,16 @@ deb-dkms: deb-local rpm-dkms
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-dkms-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=$${name}-dkms-$${version}.$${arch}.rpm; \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb $$pkg1; \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch $$pkg1; \
|
||||
$(RM) $$pkg1
|
||||
|
||||
deb-utils: deb-local rpm-utils
|
||||
name=${PACKAGE}; \
|
||||
version=${VERSION}-${RELEASE}; \
|
||||
arch=`$(RPM) -qp $${name}-$${version}.src.rpm --qf %{arch} | tail -1`; \
|
||||
+ debarch=`$(DPKG) --print-architecture`; \
|
||||
pkg1=$${name}-$${version}.$${arch}.rpm; \
|
||||
pkg2=libnvpair1-$${version}.$${arch}.rpm; \
|
||||
pkg3=libuutil1-$${version}.$${arch}.rpm; \
|
||||
@@ -57,7 +60,7 @@ deb-utils: deb-local rpm-utils
|
||||
## which should NOT be mixed with the alien-generated debs created here
|
||||
chmod +x $${path_prepend}/dh_shlibdeps; \
|
||||
env PATH=$${path_prepend}:$${PATH} \
|
||||
- fakeroot $(ALIEN) --bump=0 --scripts --to-deb \
|
||||
+ fakeroot $(ALIEN) --bump=0 --scripts --to-deb --target=$$debarch \
|
||||
$$pkg1 $$pkg2 $$pkg3 $$pkg4 $$pkg5 $$pkg6 $$pkg7 \
|
||||
$$pkg8 $$pkg9; \
|
||||
$(RM) $${path_prepend}/dh_shlibdeps; \
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Mon, 12 Feb 2018 21:28:59 +0100
|
||||
Subject: [PATCH] 'zfs receive' fails with "dataset is busy"
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Receiving an incremental stream after an interrupted "zfs receive -s"
|
||||
fails with the message "dataset is busy": this is because we still have
|
||||
the hidden clone ../%recv from the resumable receive.
|
||||
|
||||
Improve the error message suggesting the existence of a partially
|
||||
complete resumable stream from "zfs receive -s" which can be either
|
||||
aborted ("zfs receive -A") or resumed ("zfs send -t").
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #7129
|
||||
Closes #7154
|
||||
(cherry picked from commit 1d805a534b5e1768413a0242b8e92b97cb1a796c)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zfs/zfs_main.c | 2 +-
|
||||
lib/libzfs/libzfs_sendrecv.c | 18 +++++++++++++++++-
|
||||
2 files changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
|
||||
index e8fe6a9fa..f57df8581 100644
|
||||
--- a/cmd/zfs/zfs_main.c
|
||||
+++ b/cmd/zfs/zfs_main.c
|
||||
@@ -6072,7 +6072,7 @@ share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
|
||||
|
||||
(void) fprintf(stderr, gettext("cannot %s '%s': "
|
||||
"Contains partially-completed state from "
|
||||
- "\"zfs receive -r\", which can be resumed with "
|
||||
+ "\"zfs receive -s\", which can be resumed with "
|
||||
"\"zfs send -t\"\n"),
|
||||
cmdname, zfs_get_name(zhp));
|
||||
return (1);
|
||||
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
|
||||
index ec190022f..66d89067b 100644
|
||||
--- a/lib/libzfs/libzfs_sendrecv.c
|
||||
+++ b/lib/libzfs/libzfs_sendrecv.c
|
||||
@@ -3254,6 +3254,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||
zfs_type_t type;
|
||||
boolean_t toplevel = B_FALSE;
|
||||
boolean_t zoned = B_FALSE;
|
||||
+ boolean_t hastoken = B_FALSE;
|
||||
|
||||
begin_time = time(NULL);
|
||||
bzero(origin, MAXNAMELEN);
|
||||
@@ -3535,6 +3536,11 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||
/* we want to know if we're zoned when validating -o|-x props */
|
||||
zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED);
|
||||
|
||||
+ /* may need this info later, get it now we have zhp around */
|
||||
+ if (zfs_prop_get(zhp, ZFS_PROP_RECEIVE_RESUME_TOKEN, NULL, 0,
|
||||
+ NULL, NULL, 0, B_TRUE) == 0)
|
||||
+ hastoken = B_TRUE;
|
||||
+
|
||||
/* gather existing properties on destination */
|
||||
origprops = fnvlist_alloc();
|
||||
fnvlist_merge(origprops, zhp->zfs_props);
|
||||
@@ -3741,9 +3747,19 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||
break;
|
||||
case EDQUOT:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
- "destination %s space quota exceeded"), name);
|
||||
+ "destination %s space quota exceeded."), name);
|
||||
(void) zfs_error(hdl, EZFS_NOSPC, errbuf);
|
||||
break;
|
||||
+ case EBUSY:
|
||||
+ if (hastoken) {
|
||||
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
+ "destination %s contains "
|
||||
+ "partially-complete state from "
|
||||
+ "\"zfs receive -s\"."), name);
|
||||
+ (void) zfs_error(hdl, EZFS_BUSY, errbuf);
|
||||
+ break;
|
||||
+ }
|
||||
+ /* fallthru */
|
||||
default:
|
||||
(void) zfs_standard_error(hdl, ioctl_errno, errbuf);
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Motin <mav@FreeBSD.org>
|
||||
Date: Mon, 20 Nov 2017 19:56:01 +0200
|
||||
Subject: [PATCH] OpenZFS 8835 - Speculative prefetch in ZFS not working for
|
||||
misaligned reads
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In case of misaligned I/O sequential requests are not detected as such
|
||||
due to overlaps in logical block sequence:
|
||||
|
||||
dmu_zfetch(fffff80198dd0ae0, 27347, 9, 1)
|
||||
dmu_zfetch(fffff80198dd0ae0, 27355, 9, 1)
|
||||
dmu_zfetch(fffff80198dd0ae0, 27363, 9, 1)
|
||||
dmu_zfetch(fffff80198dd0ae0, 27371, 9, 1)
|
||||
dmu_zfetch(fffff80198dd0ae0, 27379, 9, 1)
|
||||
dmu_zfetch(fffff80198dd0ae0, 27387, 9, 1)
|
||||
|
||||
This patch makes single block overlap to be counted as a stream hit,
|
||||
improving performance up to several times.
|
||||
|
||||
Authored by: Alexander Motin <mav@FreeBSD.org>
|
||||
Approved by: Gordon Ross <gwr@nexenta.com>
|
||||
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
|
||||
Reviewed by: Allan Jude <allanjude@freebsd.org>
|
||||
Reviewed by: Gvozden Neskovic <neskovic@gmail.com>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
|
||||
OpenZFS-issue: https://www.illumos.org/issues/8835
|
||||
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/aab6dd482a
|
||||
Closes #7062
|
||||
|
||||
(cherry picked from commit 701ebd014af3a0c7485056d8c96ecfb379867fd8)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/dmu_zfetch.c | 24 +++++++++++++++++++-----
|
||||
1 file changed, 19 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/dmu_zfetch.c b/module/zfs/dmu_zfetch.c
|
||||
index 1bf5c4e34..e72e9ef9c 100644
|
||||
--- a/module/zfs/dmu_zfetch.c
|
||||
+++ b/module/zfs/dmu_zfetch.c
|
||||
@@ -228,19 +228,33 @@ dmu_zfetch(zfetch_t *zf, uint64_t blkid, uint64_t nblks, boolean_t fetch_data)
|
||||
|
||||
rw_enter(&zf->zf_rwlock, RW_READER);
|
||||
|
||||
+ /*
|
||||
+ * Find matching prefetch stream. Depending on whether the accesses
|
||||
+ * are block-aligned, first block of the new access may either follow
|
||||
+ * the last block of the previous access, or be equal to it.
|
||||
+ */
|
||||
for (zs = list_head(&zf->zf_stream); zs != NULL;
|
||||
zs = list_next(&zf->zf_stream, zs)) {
|
||||
- if (blkid == zs->zs_blkid) {
|
||||
+ if (blkid == zs->zs_blkid || blkid + 1 == zs->zs_blkid) {
|
||||
mutex_enter(&zs->zs_lock);
|
||||
/*
|
||||
* zs_blkid could have changed before we
|
||||
* acquired zs_lock; re-check them here.
|
||||
*/
|
||||
- if (blkid != zs->zs_blkid) {
|
||||
- mutex_exit(&zs->zs_lock);
|
||||
- continue;
|
||||
+ if (blkid == zs->zs_blkid) {
|
||||
+ break;
|
||||
+ } else if (blkid + 1 == zs->zs_blkid) {
|
||||
+ blkid++;
|
||||
+ nblks--;
|
||||
+ if (nblks == 0) {
|
||||
+ /* Already prefetched this before. */
|
||||
+ mutex_exit(&zs->zs_lock);
|
||||
+ rw_exit(&zf->zf_rwlock);
|
||||
+ return;
|
||||
+ }
|
||||
+ break;
|
||||
}
|
||||
- break;
|
||||
+ mutex_exit(&zs->zs_lock);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: George Wilson <george.wilson@delphix.com>
|
||||
Date: Thu, 8 Feb 2018 15:04:14 -0500
|
||||
Subject: [PATCH] OpenZFS 8857 - zio_remove_child() panic due to already
|
||||
destroyed parent zio
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
PROBLEM
|
||||
=======
|
||||
It's possible for a parent zio to complete even though it has children
|
||||
which have not completed. This can result in the following panic:
|
||||
> $C
|
||||
ffffff01809128c0 vpanic()
|
||||
ffffff01809128e0 mutex_panic+0x58(fffffffffb94c904, ffffff597dde7f80)
|
||||
ffffff0180912950 mutex_vector_enter+0x347(ffffff597dde7f80)
|
||||
ffffff01809129b0 zio_remove_child+0x50(ffffff597dde7c58, ffffff32bd901ac0,
|
||||
ffffff3373370908)
|
||||
ffffff0180912a40 zio_done+0x390(ffffff32bd901ac0)
|
||||
ffffff0180912a70 zio_execute+0x78(ffffff32bd901ac0)
|
||||
ffffff0180912b30 taskq_thread+0x2d0(ffffff33bae44140)
|
||||
ffffff0180912b40 thread_start+8()
|
||||
> ::status
|
||||
debugging crash dump vmcore.2 (64-bit) from batfs0390
|
||||
operating system: 5.11 joyent_20170911T171900Z (i86pc)
|
||||
image uuid: (not set)
|
||||
panic message: mutex_enter: bad mutex, lp=ffffff597dde7f80
|
||||
owner=ffffff3c59b39480 thread=ffffff0180912c40
|
||||
dump content: kernel pages only
|
||||
The problem is that dbuf_prefetch along with l2arc can create a zio tree
|
||||
which confuses the parent zio and allows it to complete with while children
|
||||
still exist. Here's the scenario:
|
||||
zio tree:
|
||||
pio
|
||||
|--- lio
|
||||
The parent zio, pio, has entered the zio_done stage and begins to check its
|
||||
children to see there are still some that have not completed. In zio_done(),
|
||||
the children are checked in the following order:
|
||||
zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE)
|
||||
zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE)
|
||||
zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE)
|
||||
zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_DONE)
|
||||
If pio, finds any child which has not completed then it stops executing and
|
||||
goes to sleep. Each call to zio_wait_for_children() will grab the io_lock
|
||||
while checking the particular child.
|
||||
In this scenario, the pio has completed the first call to
|
||||
zio_wait_for_children() to check for any ZIO_CHILD_VDEV children. Since
|
||||
the only zio in the zio tree right now is the logical zio, lio, then it
|
||||
completes that call and prepares to check the next child type.
|
||||
In the meantime, the lio completes and in its callback creates a child vdev
|
||||
zio, cio. The zio tree looks like this:
|
||||
zio tree:
|
||||
pio
|
||||
|--- lio
|
||||
|--- cio
|
||||
The lio then grabs the parent's io_lock and removes itself.
|
||||
zio tree:
|
||||
pio
|
||||
|--- cio
|
||||
The pio continues to run but has already completed its check for ZIO_CHILD_VDEV
|
||||
and will erroneously complete. When the child zio, cio, completes it will panic
|
||||
the system trying to reference the parent zio which has been destroyed.
|
||||
SOLUTION
|
||||
========
|
||||
The fix is to rework the zio_wait_for_children() logic to accept a bitfield
|
||||
for all the children types that it's interested in checking. The
|
||||
io_lock will is held the entire time we check all the children types. Since
|
||||
the function now accepts a bitfield, a simple ZIO_CHILD_BIT() macro is provided
|
||||
to allow for the conversion between a ZIO_CHILD type and the bitfield used by
|
||||
the zio_wiat_for_children logic.
|
||||
|
||||
Authored by: George Wilson <george.wilson@delphix.com>
|
||||
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
|
||||
Reviewed by: Andriy Gapon <avg@FreeBSD.org>
|
||||
Reviewed by: Youzhong Yang <youzhong@gmail.com>
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Approved by: Dan McDonald <danmcd@omniti.com>
|
||||
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
|
||||
OpenZFS-issue: https://www.illumos.org/issues/8857
|
||||
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/862ff6d99c
|
||||
Issue #5918
|
||||
Closes #7168
|
||||
|
||||
(cherry picked from commit 07ce5d739024cf9c638716c09f9934b4e629678c)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/zio.h | 11 +++++++++++
|
||||
module/zfs/zio.c | 49 +++++++++++++++++++++++++++++--------------------
|
||||
2 files changed, 40 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/include/sys/zio.h b/include/sys/zio.h
|
||||
index 4eaabc38c..0d741f8e2 100644
|
||||
--- a/include/sys/zio.h
|
||||
+++ b/include/sys/zio.h
|
||||
@@ -215,6 +215,9 @@ enum zio_flag {
|
||||
(((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) | \
|
||||
ZIO_FLAG_CANFAIL)
|
||||
|
||||
+#define ZIO_CHILD_BIT(x) (1 << (x))
|
||||
+#define ZIO_CHILD_BIT_IS_SET(val, x) ((val) & (1 << (x)))
|
||||
+
|
||||
enum zio_child {
|
||||
ZIO_CHILD_VDEV = 0,
|
||||
ZIO_CHILD_GANG,
|
||||
@@ -223,6 +226,14 @@ enum zio_child {
|
||||
ZIO_CHILD_TYPES
|
||||
};
|
||||
|
||||
+#define ZIO_CHILD_VDEV_BIT ZIO_CHILD_BIT(ZIO_CHILD_VDEV)
|
||||
+#define ZIO_CHILD_GANG_BIT ZIO_CHILD_BIT(ZIO_CHILD_GANG)
|
||||
+#define ZIO_CHILD_DDT_BIT ZIO_CHILD_BIT(ZIO_CHILD_DDT)
|
||||
+#define ZIO_CHILD_LOGICAL_BIT ZIO_CHILD_BIT(ZIO_CHILD_LOGICAL)
|
||||
+#define ZIO_CHILD_ALL_BITS \
|
||||
+ (ZIO_CHILD_VDEV_BIT | ZIO_CHILD_GANG_BIT | \
|
||||
+ ZIO_CHILD_DDT_BIT | ZIO_CHILD_LOGICAL_BIT)
|
||||
+
|
||||
enum zio_wait_type {
|
||||
ZIO_WAIT_READY = 0,
|
||||
ZIO_WAIT_DONE,
|
||||
diff --git a/module/zfs/zio.c b/module/zfs/zio.c
|
||||
index 1d69d8d8d..cd0a473e0 100644
|
||||
--- a/module/zfs/zio.c
|
||||
+++ b/module/zfs/zio.c
|
||||
@@ -491,21 +491,26 @@ zio_remove_child(zio_t *pio, zio_t *cio, zio_link_t *zl)
|
||||
}
|
||||
|
||||
static boolean_t
|
||||
-zio_wait_for_children(zio_t *zio, enum zio_child child, enum zio_wait_type wait)
|
||||
+zio_wait_for_children(zio_t *zio, uint8_t childbits, enum zio_wait_type wait)
|
||||
{
|
||||
- uint64_t *countp = &zio->io_children[child][wait];
|
||||
boolean_t waiting = B_FALSE;
|
||||
|
||||
mutex_enter(&zio->io_lock);
|
||||
ASSERT(zio->io_stall == NULL);
|
||||
- if (*countp != 0) {
|
||||
- zio->io_stage >>= 1;
|
||||
- ASSERT3U(zio->io_stage, !=, ZIO_STAGE_OPEN);
|
||||
- zio->io_stall = countp;
|
||||
- waiting = B_TRUE;
|
||||
+ for (int c = 0; c < ZIO_CHILD_TYPES; c++) {
|
||||
+ if (!(ZIO_CHILD_BIT_IS_SET(childbits, c)))
|
||||
+ continue;
|
||||
+
|
||||
+ uint64_t *countp = &zio->io_children[c][wait];
|
||||
+ if (*countp != 0) {
|
||||
+ zio->io_stage >>= 1;
|
||||
+ ASSERT3U(zio->io_stage, !=, ZIO_STAGE_OPEN);
|
||||
+ zio->io_stall = countp;
|
||||
+ waiting = B_TRUE;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
mutex_exit(&zio->io_lock);
|
||||
-
|
||||
return (waiting);
|
||||
}
|
||||
|
||||
@@ -1296,9 +1301,10 @@ zio_write_compress(zio_t *zio)
|
||||
* If our children haven't all reached the ready stage,
|
||||
* wait for them and then repeat this pipeline stage.
|
||||
*/
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY) ||
|
||||
- zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_READY))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_LOGICAL_BIT |
|
||||
+ ZIO_CHILD_GANG_BIT, ZIO_WAIT_READY)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
if (!IO_IS_ALLOCATING(zio))
|
||||
return (ZIO_PIPELINE_CONTINUE);
|
||||
@@ -2229,8 +2235,9 @@ zio_gang_issue(zio_t *zio)
|
||||
{
|
||||
blkptr_t *bp = zio->io_bp;
|
||||
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_GANG_BIT, ZIO_WAIT_DONE)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == zio);
|
||||
ASSERT(zio->io_child_type > ZIO_CHILD_GANG);
|
||||
@@ -2561,8 +2568,9 @@ zio_ddt_read_done(zio_t *zio)
|
||||
{
|
||||
blkptr_t *bp = zio->io_bp;
|
||||
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_DDT_BIT, ZIO_WAIT_DONE)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
ASSERT(BP_GET_DEDUP(bp));
|
||||
ASSERT(BP_GET_PSIZE(bp) == zio->io_size);
|
||||
@@ -3292,8 +3300,9 @@ zio_vdev_io_done(zio_t *zio)
|
||||
vdev_ops_t *ops = vd ? vd->vdev_ops : &vdev_mirror_ops;
|
||||
boolean_t unexpected_error = B_FALSE;
|
||||
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_VDEV_BIT, ZIO_WAIT_DONE)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
ASSERT(zio->io_type == ZIO_TYPE_READ || zio->io_type == ZIO_TYPE_WRITE);
|
||||
|
||||
@@ -3362,8 +3371,9 @@ zio_vdev_io_assess(zio_t *zio)
|
||||
{
|
||||
vdev_t *vd = zio->io_vd;
|
||||
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_VDEV_BIT, ZIO_WAIT_DONE)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
if (vd == NULL && !(zio->io_flags & ZIO_FLAG_CONFIG_WRITER))
|
||||
spa_config_exit(zio->io_spa, SCL_ZIO, zio);
|
||||
@@ -3578,9 +3588,10 @@ zio_ready(zio_t *zio)
|
||||
zio_t *pio, *pio_next;
|
||||
zio_link_t *zl = NULL;
|
||||
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY) ||
|
||||
- zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_READY))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_GANG_BIT | ZIO_CHILD_DDT_BIT,
|
||||
+ ZIO_WAIT_READY)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
if (zio->io_ready) {
|
||||
ASSERT(IO_IS_ALLOCATING(zio));
|
||||
@@ -3721,11 +3732,9 @@ zio_done(zio_t *zio)
|
||||
* If our children haven't all completed,
|
||||
* wait for them and then repeat this pipeline stage.
|
||||
*/
|
||||
- if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE) ||
|
||||
- zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE) ||
|
||||
- zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE) ||
|
||||
- zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_DONE))
|
||||
+ if (zio_wait_for_children(zio, ZIO_CHILD_ALL_BITS, ZIO_WAIT_DONE)) {
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
+ }
|
||||
|
||||
/*
|
||||
* If the allocation throttle is enabled, then update the accounting.
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Olaf Faaland <faaland1@llnl.gov>
|
||||
Date: Thu, 15 Feb 2018 09:50:06 -0800
|
||||
Subject: [PATCH] Clarify zinject(8) explanation of -e
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Error injection of EIO or ENXIO simply sets the zio's io_error value,
|
||||
rather than preventing the read or write from occurring. This is
|
||||
important information as it affects how the probes must be used.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Closes #7172
|
||||
(cherry picked from commit 26941ce90b8f056949a3bc29da606513af799781)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
man/man8/zinject.8 | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/man/man8/zinject.8 b/man/man8/zinject.8
|
||||
index 50fecfb64..7f363974b 100644
|
||||
--- a/man/man8/zinject.8
|
||||
+++ b/man/man8/zinject.8
|
||||
@@ -111,6 +111,9 @@ Specify
|
||||
.BR "dtl" " for an ECHILD error,"
|
||||
.BR "io" " for an EIO error where reopening the device will succeed, or"
|
||||
.BR "nxio" " for an ENXIO error where reopening the device will fail."
|
||||
+For EIO and ENXIO, the "failed" reads or writes still occur. The probe simply
|
||||
+sets the error value reported by the I/O pipeline so it appears the read or
|
||||
+write failed.
|
||||
.TP
|
||||
.BI "\-f" " frequency"
|
||||
Only inject errors a fraction of the time. Expressed as a real number
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Don Brady <dev.fs.zfs@gmail.com>
|
||||
Date: Thu, 21 Sep 2017 11:17:56 -0600
|
||||
Subject: [PATCH] Cleanup zloop working directory after each pass
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed by: John Kennedy <jwk404@gmail.com>
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Signed-off-by: Don Brady <don.brady@delphix.com>
|
||||
Issue #6595
|
||||
Closes #6663
|
||||
(cherry picked from commit d1630dda5857175bad0ac7f6e142ae299606d88a)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
scripts/zloop.sh | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/scripts/zloop.sh b/scripts/zloop.sh
|
||||
index 03e825059..f0af87553 100755
|
||||
--- a/scripts/zloop.sh
|
||||
+++ b/scripts/zloop.sh
|
||||
@@ -101,6 +101,7 @@ function store_core
|
||||
{
|
||||
core="$(core_file)"
|
||||
if [[ $ztrc -ne 0 ]] || [[ -f "$core" ]]; then
|
||||
+ df -h "$workdir" >>ztest.out
|
||||
coreid=$(date "+zloop-%y%m%d-%H%M%S")
|
||||
foundcrashes=$((foundcrashes + 1))
|
||||
|
||||
@@ -150,7 +151,8 @@ function store_core
|
||||
# parse arguments
|
||||
# expected format: zloop [-t timeout] [-c coredir] [-- extra ztest args]
|
||||
coredir=$DEFAULTCOREDIR
|
||||
-workdir=$DEFAULTWORKDIR
|
||||
+basedir=$DEFAULTWORKDIR
|
||||
+rundir="zloop-run"
|
||||
timeout=0
|
||||
size="512m"
|
||||
while getopts ":ht:s:c:f:" opt; do
|
||||
@@ -158,7 +160,7 @@ while getopts ":ht:s:c:f:" opt; do
|
||||
t ) [[ $OPTARG -gt 0 ]] && timeout=$OPTARG ;;
|
||||
s ) [[ $OPTARG ]] && size=$OPTARG ;;
|
||||
c ) [[ $OPTARG ]] && coredir=$OPTARG ;;
|
||||
- f ) [[ $OPTARG ]] && workdir=$(readlink -f "$OPTARG") ;;
|
||||
+ f ) [[ $OPTARG ]] && basedir=$(readlink -f "$OPTARG") ;;
|
||||
h ) usage
|
||||
exit 2
|
||||
;;
|
||||
@@ -202,6 +204,11 @@ curtime=$starttime
|
||||
while [[ $timeout -eq 0 ]] || [[ $curtime -le $((starttime + timeout)) ]]; do
|
||||
zopt="-VVVVV"
|
||||
|
||||
+ # start each run with an empty directory
|
||||
+ workdir="$basedir/$rundir"
|
||||
+ or_die rm -rf "$workdir"
|
||||
+ or_die mkdir "$workdir"
|
||||
+
|
||||
# switch between common arrangements & fully randomized
|
||||
if [[ $((RANDOM % 2)) -eq 0 ]]; then
|
||||
mirrors=2
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Mon, 22 Jan 2018 12:48:39 -0800
|
||||
Subject: [PATCH] Extend zloop.sh for automated testing
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In order to debug issues encountered by ztest during automated
|
||||
testing it's important that as much debugging information as
|
||||
possible by dumped at the time of the failure. The following
|
||||
changes extend the zloop.sh script in order to make it easier
|
||||
to integrate with buildbot.
|
||||
|
||||
* Add the `-m <maximum cores>` option to zloop.sh to place a
|
||||
limit of the number of core dumps generated. By default, the
|
||||
existing behavior is maintained and no limit is set.
|
||||
|
||||
* Add the `-l` option to create a 'ztest.core.N' symlink in the
|
||||
current directory to the core directory. This functionality
|
||||
is provided primarily for buildbot which expects log files to
|
||||
have well known names.
|
||||
|
||||
* Rename 'ztest.ddt' to 'ztest.zdb' and extend it to dump
|
||||
additional basic information on failure for latter analysis.
|
||||
|
||||
Reviewed-by: Tim Chase <tim@chase2k.com>
|
||||
Reviewed by: Thomas Caputi <tcaputi@datto.com>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #6999
|
||||
|
||||
Conflicts:
|
||||
scripts/zloop.sh
|
||||
(cherry picked from commit 137b3e6cff5552c5b0e137008fd274ad9a6f7a0d)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
scripts/zloop.sh | 42 ++++++++++++++++++++++++++++++++----------
|
||||
1 file changed, 32 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/scripts/zloop.sh b/scripts/zloop.sh
|
||||
index f0af87553..f39e91ef9 100755
|
||||
--- a/scripts/zloop.sh
|
||||
+++ b/scripts/zloop.sh
|
||||
@@ -52,6 +52,8 @@ function usage
|
||||
" -s Size of vdev devices.\n" \
|
||||
" -f Specify working directory for ztest vdev files.\n" \
|
||||
" -c Specify a core dump directory to use.\n" \
|
||||
+ " -m Max number of core dumps to allow before exiting.\n" \
|
||||
+ " -l Create 'ztest.core.N' symlink to core directory.\n" \
|
||||
" -h Print this help message.\n" \
|
||||
"" >&2
|
||||
}
|
||||
@@ -105,14 +107,24 @@ function store_core
|
||||
coreid=$(date "+zloop-%y%m%d-%H%M%S")
|
||||
foundcrashes=$((foundcrashes + 1))
|
||||
|
||||
+ # zdb debugging
|
||||
+ zdbcmd="$ZDB -U "$workdir/zpool.cache" -dddMmDDG ztest"
|
||||
+ zdbdebug=$($zdbcmd 2>&1)
|
||||
+ echo -e "$zdbcmd\n" >>ztest.zdb
|
||||
+ echo "$zdbdebug" >>ztest.zdb
|
||||
+
|
||||
dest=$coredir/$coreid
|
||||
or_die mkdir -p "$dest"
|
||||
or_die mkdir -p "$dest/vdev"
|
||||
|
||||
+ if [[ $symlink -ne 0 ]]; then
|
||||
+ or_die ln -sf "$dest" ztest.core.$foundcrashes
|
||||
+ fi
|
||||
+
|
||||
echo "*** ztest crash found - moving logs to $dest"
|
||||
|
||||
or_die mv ztest.history "$dest/"
|
||||
- or_die mv ztest.ddt "$dest/"
|
||||
+ or_die mv ztest.zdb "$dest/"
|
||||
or_die mv ztest.out "$dest/"
|
||||
or_die mv "$workdir/ztest*" "$dest/vdev/"
|
||||
or_die mv "$workdir/zpool.cache" "$dest/vdev/"
|
||||
@@ -120,7 +132,7 @@ function store_core
|
||||
# check for core
|
||||
if [[ -f "$core" ]]; then
|
||||
coreprog=$(core_prog "$core")
|
||||
- corestatus=$($GDB --batch --quiet \
|
||||
+ coredebug=$($GDB --batch --quiet \
|
||||
-ex "set print thread-events off" \
|
||||
-ex "printf \"*\n* Backtrace \n*\n\"" \
|
||||
-ex "bt" \
|
||||
@@ -132,19 +144,25 @@ function store_core
|
||||
-ex "thread apply all bt" \
|
||||
-ex "printf \"*\n* Backtraces (full) \n*\n\"" \
|
||||
-ex "thread apply all bt full" \
|
||||
- -ex "quit" "$coreprog" "$core" | grep -v "New LWP")
|
||||
+ -ex "quit" "$coreprog" "$core" 2>&1 | \
|
||||
+ grep -v "New LWP")
|
||||
|
||||
# Dump core + logs to stored directory
|
||||
- echo "$corestatus" >>"$dest/status"
|
||||
+ echo "$coredebug" >>"$dest/ztest.gdb"
|
||||
or_die mv "$core" "$dest/"
|
||||
|
||||
# Record info in cores logfile
|
||||
echo "*** core @ $coredir/$coreid/$core:" | \
|
||||
tee -a ztest.cores
|
||||
- echo "$corestatus" | tee -a ztest.cores
|
||||
- echo "" | tee -a ztest.cores
|
||||
fi
|
||||
- echo "continuing..."
|
||||
+
|
||||
+ if [[ $coremax -gt 0 ]] &&
|
||||
+ [[ $foundcrashes -ge $coremax ]]; then
|
||||
+ echo "exiting... max $coremax allowed cores"
|
||||
+ exit 1
|
||||
+ else
|
||||
+ echo "continuing..."
|
||||
+ fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -155,12 +173,16 @@ basedir=$DEFAULTWORKDIR
|
||||
rundir="zloop-run"
|
||||
timeout=0
|
||||
size="512m"
|
||||
-while getopts ":ht:s:c:f:" opt; do
|
||||
+coremax=0
|
||||
+symlink=0
|
||||
+while getopts ":ht:m:s:c:f:l" opt; do
|
||||
case $opt in
|
||||
t ) [[ $OPTARG -gt 0 ]] && timeout=$OPTARG ;;
|
||||
+ m ) [[ $OPTARG -gt 0 ]] && coremax=$OPTARG ;;
|
||||
s ) [[ $OPTARG ]] && size=$OPTARG ;;
|
||||
c ) [[ $OPTARG ]] && coredir=$OPTARG ;;
|
||||
f ) [[ $OPTARG ]] && basedir=$(readlink -f "$OPTARG") ;;
|
||||
+ l ) symlink=1 ;;
|
||||
h ) usage
|
||||
exit 2
|
||||
;;
|
||||
@@ -178,6 +200,7 @@ ulimit -c unlimited
|
||||
if [[ -f "$(core_file)" ]]; then
|
||||
echo -n "There's a core dump here you might want to look at first... "
|
||||
core_file
|
||||
+ echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -192,7 +215,7 @@ if [[ ! -w $coredir ]]; then
|
||||
fi
|
||||
|
||||
or_die rm -f ztest.history
|
||||
-or_die rm -f ztest.ddt
|
||||
+or_die rm -f ztest.zdb
|
||||
or_die rm -f ztest.cores
|
||||
|
||||
ztrc=0 # ztest return value
|
||||
@@ -243,7 +266,6 @@ while [[ $timeout -eq 0 ]] || [[ $curtime -le $((starttime + timeout)) ]]; do
|
||||
$cmd >>ztest.out 2>&1
|
||||
ztrc=$?
|
||||
grep -E '===|WARNING' ztest.out >>ztest.history
|
||||
- $ZDB -U "$workdir/zpool.cache" -DD ztest >>ztest.ddt
|
||||
|
||||
store_core
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: chrisrd <chris@onthe.net.au>
|
||||
Date: Fri, 16 Feb 2018 07:58:23 +1100
|
||||
Subject: [PATCH] Fix config issues: frame size and headers
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1. With various (debug and/or tracing?) kernel options enabled it's
|
||||
possible for 'struct inode' and 'struct super_block' to exceed the
|
||||
default frame size, leaving errors like this in config.log:
|
||||
|
||||
build/conftest.c:116:1: error: the frame size of 1048 bytes is larger
|
||||
than 1024 bytes [-Werror=frame-larger-than=]
|
||||
|
||||
Fix this by removing the frame size warning for config checks
|
||||
|
||||
2. Without the correct headers included, it's possible for declarations
|
||||
to be missed, leaving errors like this in the config.log:
|
||||
|
||||
build/conftest.c:131:14: error: ‘struct nameidata’ declared inside
|
||||
parameter list [-Werror]
|
||||
|
||||
Fix this by adding appropriate headers.
|
||||
|
||||
Note: Both these issues can result in silent config failures because
|
||||
the compile failure is taken to mean "this option is not supported by
|
||||
this kernel" rather than "there's something wrong with the config
|
||||
test". This can lead to something merely annoying (compile failures) to
|
||||
something potentially serious (miscompiled or misused kernel primitives
|
||||
or functions). E.g. the fixes included here resulted in these
|
||||
additional defines in zfs_config.h with linux v4.14.19:
|
||||
|
||||
Also, drive-by whitespace fixes in config/* files which don't mention
|
||||
"GNU" (those ones look to be imported from elsewhere so leave them
|
||||
alone).
|
||||
|
||||
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Chris Dunlop <chris@onthe.net.au>
|
||||
Closes #7169
|
||||
(cherry picked from commit 5a84c60fb95ee7ca1393efe93d9d17c80497c6b6)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
config/deb.am | 8 ++++----
|
||||
config/kernel-acl.m4 | 1 +
|
||||
config/kernel-create-nameidata.m4 | 1 +
|
||||
config/kernel-dentry-operations.m4 | 1 +
|
||||
config/kernel-get-link.m4 | 2 +-
|
||||
config/kernel-lookup-nameidata.m4 | 1 +
|
||||
config/kernel-vm_node_stat.m4 | 2 +-
|
||||
config/kernel.m4 | 2 +-
|
||||
config/tgz.am | 4 ++--
|
||||
config/user-libblkid.m4 | 2 +-
|
||||
10 files changed, 14 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/config/deb.am b/config/deb.am
|
||||
index 1b51f9316..58ab96e18 100644
|
||||
--- a/config/deb.am
|
||||
+++ b/config/deb.am
|
||||
@@ -2,16 +2,16 @@ deb-local:
|
||||
@(if test "${HAVE_DPKGBUILD}" = "no"; then \
|
||||
echo -e "\n" \
|
||||
"*** Required util ${DPKGBUILD} missing. Please install the\n" \
|
||||
- "*** package for your distribution which provides ${DPKGBUILD},\n" \
|
||||
+ "*** package for your distribution which provides ${DPKGBUILD},\n" \
|
||||
"*** re-run configure, and try again.\n"; \
|
||||
- exit 1; \
|
||||
+ exit 1; \
|
||||
fi; \
|
||||
if test "${HAVE_ALIEN}" = "no"; then \
|
||||
echo -e "\n" \
|
||||
"*** Required util ${ALIEN} missing. Please install the\n" \
|
||||
- "*** package for your distribution which provides ${ALIEN},\n" \
|
||||
+ "*** package for your distribution which provides ${ALIEN},\n" \
|
||||
"*** re-run configure, and try again.\n"; \
|
||||
- exit 1; \
|
||||
+ exit 1; \
|
||||
fi)
|
||||
|
||||
deb-kmod: deb-local rpm-kmod
|
||||
diff --git a/config/kernel-acl.m4 b/config/kernel-acl.m4
|
||||
index 311484349..02cc020e5 100644
|
||||
--- a/config/kernel-acl.m4
|
||||
+++ b/config/kernel-acl.m4
|
||||
@@ -184,6 +184,7 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_PERMISSION_WITH_NAMEIDATA], [
|
||||
AC_MSG_CHECKING([whether iops->permission() wants nameidata])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/fs.h>
|
||||
+ #include <linux/sched.h>
|
||||
|
||||
int permission_fn(struct inode *inode, int mask,
|
||||
struct nameidata *nd) { return 0; }
|
||||
diff --git a/config/kernel-create-nameidata.m4 b/config/kernel-create-nameidata.m4
|
||||
index a71490a00..d4c155c57 100644
|
||||
--- a/config/kernel-create-nameidata.m4
|
||||
+++ b/config/kernel-create-nameidata.m4
|
||||
@@ -5,6 +5,7 @@ AC_DEFUN([ZFS_AC_KERNEL_CREATE_NAMEIDATA], [
|
||||
AC_MSG_CHECKING([whether iops->create() passes nameidata])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/fs.h>
|
||||
+ #include <linux/sched.h>
|
||||
|
||||
#ifdef HAVE_MKDIR_UMODE_T
|
||||
int inode_create(struct inode *inode ,struct dentry *dentry,
|
||||
diff --git a/config/kernel-dentry-operations.m4 b/config/kernel-dentry-operations.m4
|
||||
index 3182490c9..61f5a27af 100644
|
||||
--- a/config/kernel-dentry-operations.m4
|
||||
+++ b/config/kernel-dentry-operations.m4
|
||||
@@ -5,6 +5,7 @@ AC_DEFUN([ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA], [
|
||||
AC_MSG_CHECKING([whether dops->d_revalidate() takes struct nameidata])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/dcache.h>
|
||||
+ #include <linux/sched.h>
|
||||
|
||||
int revalidate (struct dentry *dentry,
|
||||
struct nameidata *nidata) { return 0; }
|
||||
diff --git a/config/kernel-get-link.m4 b/config/kernel-get-link.m4
|
||||
index 022c49c54..3cda08c1b 100644
|
||||
--- a/config/kernel-get-link.m4
|
||||
+++ b/config/kernel-get-link.m4
|
||||
@@ -41,7 +41,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FOLLOW_LINK], [
|
||||
AC_DEFINE(HAVE_FOLLOW_LINK_NAMEIDATA, 1,
|
||||
[iops->follow_link() nameidata])
|
||||
],[
|
||||
- AC_MSG_ERROR(no; please file a bug report)
|
||||
+ AC_MSG_ERROR(no; please file a bug report)
|
||||
])
|
||||
])
|
||||
])
|
||||
diff --git a/config/kernel-lookup-nameidata.m4 b/config/kernel-lookup-nameidata.m4
|
||||
index 43f5fb4cb..5453be5e8 100644
|
||||
--- a/config/kernel-lookup-nameidata.m4
|
||||
+++ b/config/kernel-lookup-nameidata.m4
|
||||
@@ -5,6 +5,7 @@ AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_NAMEIDATA], [
|
||||
AC_MSG_CHECKING([whether iops->lookup() passes nameidata])
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/fs.h>
|
||||
+ #include <linux/sched.h>
|
||||
|
||||
struct dentry *inode_lookup(struct inode *inode,
|
||||
struct dentry *dentry, struct nameidata *nidata)
|
||||
diff --git a/config/kernel-vm_node_stat.m4 b/config/kernel-vm_node_stat.m4
|
||||
index e1c42f884..5dcd9d827 100644
|
||||
--- a/config/kernel-vm_node_stat.m4
|
||||
+++ b/config/kernel-vm_node_stat.m4
|
||||
@@ -7,7 +7,7 @@ AC_DEFUN([ZFS_AC_KERNEL_VM_NODE_STAT], [
|
||||
ZFS_LINUX_TRY_COMPILE([
|
||||
#include <linux/mm.h>
|
||||
#include <linux/vmstat.h>
|
||||
- ],[
|
||||
+ ],[
|
||||
int a __attribute__ ((unused)) = NR_VM_NODE_STAT_ITEMS;
|
||||
long x __attribute__ ((unused)) =
|
||||
atomic_long_read(&vm_node_stat[0]);
|
||||
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||
index b83f021e8..d4a84b2b2 100644
|
||||
--- a/config/kernel.m4
|
||||
+++ b/config/kernel.m4
|
||||
@@ -722,7 +722,7 @@ AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
|
||||
modpost_flag=''
|
||||
test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
|
||||
AS_IF(
|
||||
- [AC_TRY_COMMAND(cp conftest.c conftest.h build && make [$2] -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag) >/dev/null && AC_TRY_COMMAND([$3])],
|
||||
+ [AC_TRY_COMMAND(cp conftest.c conftest.h build && make [$2] -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $FRAME_LARGER_THAN $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag) >/dev/null && AC_TRY_COMMAND([$3])],
|
||||
[$4],
|
||||
[_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])]
|
||||
)
|
||||
diff --git a/config/tgz.am b/config/tgz.am
|
||||
index 2997b1de2..0657d045d 100644
|
||||
--- a/config/tgz.am
|
||||
+++ b/config/tgz.am
|
||||
@@ -2,9 +2,9 @@ tgz-local:
|
||||
@(if test "${HAVE_ALIEN}" = "no"; then \
|
||||
echo -e "\n" \
|
||||
"*** Required util ${ALIEN} missing. Please install the\n" \
|
||||
- "*** package for your distribution which provides ${ALIEN},\n" \
|
||||
+ "*** package for your distribution which provides ${ALIEN},\n" \
|
||||
"*** re-run configure, and try again.\n"; \
|
||||
- exit 1; \
|
||||
+ exit 1; \
|
||||
fi)
|
||||
|
||||
tgz-kmod: tgz-local rpm-kmod
|
||||
diff --git a/config/user-libblkid.m4 b/config/user-libblkid.m4
|
||||
index 5bc7f466a..88e6f990b 100644
|
||||
--- a/config/user-libblkid.m4
|
||||
+++ b/config/user-libblkid.m4
|
||||
@@ -6,7 +6,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [
|
||||
LIBBLKID=
|
||||
|
||||
AC_CHECK_HEADER([blkid/blkid.h], [], [AC_MSG_FAILURE([
|
||||
- *** blkid.h missing, libblkid-devel package required])])
|
||||
+ *** blkid.h missing, libblkid-devel package required])])
|
||||
|
||||
AC_SUBST([LIBBLKID], ["-lblkid"])
|
||||
AC_DEFINE([HAVE_LIBBLKID], 1, [Define if you have libblkid])
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Giuseppe Di Natale <dinatale2@users.noreply.github.com>
|
||||
Date: Tue, 20 Feb 2018 16:28:52 -0800
|
||||
Subject: [PATCH] Correct count_uberblocks in mmp.kshlib
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A log_must call was causing count_uberblocks to return more
|
||||
than just the uberblock count. Remove the log_must since it
|
||||
was only logging a sleep.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Closes #7191
|
||||
(cherry picked from commit d5b10b3ef3b5e82b9e5a9bee122f1a0be007dae2)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
tests/zfs-tests/tests/functional/mmp/mmp.kshlib | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/zfs-tests/tests/functional/mmp/mmp.kshlib b/tests/zfs-tests/tests/functional/mmp/mmp.kshlib
|
||||
index 4c46ae7a2..1f8d66fd9 100644
|
||||
--- a/tests/zfs-tests/tests/functional/mmp/mmp.kshlib
|
||||
+++ b/tests/zfs-tests/tests/functional/mmp/mmp.kshlib
|
||||
@@ -198,6 +198,6 @@ function count_uberblocks # pool duration
|
||||
typeset -i duration=$2
|
||||
typeset hist_path="/proc/spl/kstat/zfs/$pool/multihost"
|
||||
|
||||
- log_must sleep $duration
|
||||
+ sleep $duration
|
||||
echo $(cat "$hist_path" | sed '1,2d' | wc -l)
|
||||
}
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: LOLi <loli10K@users.noreply.github.com>
|
||||
Date: Wed, 31 Jan 2018 00:54:33 +0100
|
||||
Subject: [PATCH] Fix 'zfs receive -o' when used with '-e|-d'
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When used in conjunction with one of '-e' or '-d' zfs receive options
|
||||
none of the properties requested to be set (-o) are actually applied:
|
||||
this is caused by a wrong assumption made about the toplevel dataset
|
||||
in zfs_receive_one().
|
||||
|
||||
Fix this by correctly detecting the toplevel dataset.
|
||||
|
||||
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Closes #7088
|
||||
|
||||
Requires-spl: refs/pull/679/head
|
||||
(cherry picked from commit 2f62fdd6447b1a765dfea3cc5bf9e35dc0901aff)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
lib/libzfs/libzfs_sendrecv.c | 5 +--
|
||||
.../zfs_receive/receive-o-x_props_override.ksh | 36 ++++++++++++++++++++++
|
||||
2 files changed, 39 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
|
||||
index db8079fb3..ec190022f 100644
|
||||
--- a/lib/libzfs/libzfs_sendrecv.c
|
||||
+++ b/lib/libzfs/libzfs_sendrecv.c
|
||||
@@ -3252,7 +3252,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||
nvlist_t *oxprops = NULL; /* override (-o) and exclude (-x) props */
|
||||
nvlist_t *origprops = NULL; /* original props (if destination exists) */
|
||||
zfs_type_t type;
|
||||
- boolean_t toplevel;
|
||||
+ boolean_t toplevel = B_FALSE;
|
||||
boolean_t zoned = B_FALSE;
|
||||
|
||||
begin_time = time(NULL);
|
||||
@@ -3586,7 +3586,8 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
|
||||
goto out;
|
||||
}
|
||||
|
||||
- toplevel = chopprefix[0] != '/';
|
||||
+ if (top_zfs && *top_zfs == NULL)
|
||||
+ toplevel = B_TRUE;
|
||||
if (drrb->drr_type == DMU_OST_ZVOL) {
|
||||
type = ZFS_TYPE_VOLUME;
|
||||
} else if (drrb->drr_type == DMU_OST_ZFS) {
|
||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
|
||||
index 7137fe278..e4e69851f 100755
|
||||
--- a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
|
||||
@@ -371,6 +371,42 @@ log_must eval "check_prop_source $dest type filesystem -"
|
||||
log_must eval "check_prop_source $dest atime off local"
|
||||
log_must eval "check_prop_source $destsub type volume -"
|
||||
log_must eval "check_prop_source $destsub atime - -"
|
||||
+# Cleanup
|
||||
+log_must zfs destroy -r -f $orig
|
||||
+log_must zfs destroy -r -f $dest
|
||||
+
|
||||
+#
|
||||
+# 3.8 Verify 'zfs recv -x|-o' works correctly when used in conjunction with -d
|
||||
+# and -e options.
|
||||
+#
|
||||
+log_must zfs create -p $orig/1/2/3/4
|
||||
+log_must eval "zfs set copies=2 $orig"
|
||||
+log_must eval "zfs set atime=on $orig"
|
||||
+log_must eval "zfs set '$userprop:orig'='oldval' $orig"
|
||||
+log_must zfs snapshot -r $orig@snap1
|
||||
+log_must eval "zfs send -R $orig/1/2@snap1 > $streamfile_repl"
|
||||
+# Verify 'zfs recv -e'
|
||||
+log_must zfs create $dest
|
||||
+log_must eval "zfs receive -e -o copies=3 -x atime "\
|
||||
+ "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
|
||||
+log_must datasetexists $dest/2/3/4
|
||||
+log_must eval "check_prop_source $dest/2 copies 3 local"
|
||||
+log_must eval "check_prop_inherit $dest/2/3/4 copies $dest/2"
|
||||
+log_must eval "check_prop_source $dest/2/3/4 atime on default"
|
||||
+log_must eval "check_prop_source $dest/2 '$userprop:orig' 'newval' local"
|
||||
+log_must eval "check_prop_inherit $dest/2/3/4 '$userprop:orig' $dest/2"
|
||||
+log_must zfs destroy -r -f $dest
|
||||
+# Verify 'zfs recv -d'
|
||||
+log_must zfs create $dest
|
||||
+typeset fs="$(echo $orig | awk -F'/' '{print $NF}')"
|
||||
+log_must eval "zfs receive -d -o copies=3 -x atime "\
|
||||
+ "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
|
||||
+log_must datasetexists $dest/$fs/1/2/3/4
|
||||
+log_must eval "check_prop_source $dest/$fs/1/2 copies 3 local"
|
||||
+log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 copies $dest/$fs/1/2"
|
||||
+log_must eval "check_prop_source $dest/$fs/1/2/3/4 atime on default"
|
||||
+log_must eval "check_prop_source $dest/$fs/1/2 '$userprop:orig' 'newval' local"
|
||||
+log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 '$userprop:orig' $dest/$fs/1/2"
|
||||
# We don't need to cleanup here
|
||||
|
||||
log_pass "ZFS receive property override and exclude options passed."
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: bunder2015 <omfgbunder@gmail.com>
|
||||
Date: Wed, 21 Feb 2018 16:52:47 -0500
|
||||
Subject: [PATCH] Add SMART attributes for SSD and NVMe
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This adds the SMART attributes required to probe Samsung SSD and NVMe
|
||||
(and possibly others) disks when using the "zpool status -c" command.
|
||||
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: bunder2015 <omfgbunder@gmail.com>
|
||||
Closes #7183
|
||||
Closes #7193
|
||||
(cherry picked from commit c705d8386b21b08aefdc62b6b1a556aab6717316)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zpool/Makefile.am | 2 ++
|
||||
cmd/zpool/zpool.d/nvme_err | 1 +
|
||||
cmd/zpool/zpool.d/smart | 23 +++++++++++++++++++++--
|
||||
3 files changed, 24 insertions(+), 2 deletions(-)
|
||||
create mode 120000 cmd/zpool/zpool.d/nvme_err
|
||||
|
||||
diff --git a/cmd/zpool/Makefile.am b/cmd/zpool/Makefile.am
|
||||
index 6eff1d143..c7b8b76e3 100644
|
||||
--- a/cmd/zpool/Makefile.am
|
||||
+++ b/cmd/zpool/Makefile.am
|
||||
@@ -60,6 +60,7 @@ dist_zpoolexec_SCRIPTS = \
|
||||
zpool.d/pend_sec \
|
||||
zpool.d/off_ucor \
|
||||
zpool.d/ata_err \
|
||||
+ zpool.d/nvme_err \
|
||||
zpool.d/pwr_cyc \
|
||||
zpool.d/upath \
|
||||
zpool.d/vendor
|
||||
@@ -98,6 +99,7 @@ zpoolconfdefaults = \
|
||||
pend_sec \
|
||||
off_ucor \
|
||||
ata_err \
|
||||
+ nvme_err \
|
||||
pwr_cyc \
|
||||
upath \
|
||||
vendor
|
||||
diff --git a/cmd/zpool/zpool.d/nvme_err b/cmd/zpool/zpool.d/nvme_err
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/nvme_err
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
diff --git a/cmd/zpool/zpool.d/smart b/cmd/zpool/zpool.d/smart
|
||||
index 3721f30ed..4bc3af39d 100755
|
||||
--- a/cmd/zpool/zpool.d/smart
|
||||
+++ b/cmd/zpool/zpool.d/smart
|
||||
@@ -23,6 +23,7 @@ off_ucor: Show SMART offline uncorrectable errors (ATA).
|
||||
ata_err: Show SMART ATA errors (ATA).
|
||||
pwr_cyc: Show SMART power cycle count (ATA).
|
||||
serial: Show disk serial number.
|
||||
+nvme_err: Show SMART NVMe errors (NVMe).
|
||||
"
|
||||
|
||||
script=$(basename "$0")
|
||||
@@ -37,7 +38,7 @@ smartctl_path=$(which smartctl)
|
||||
if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
raw_out=$(eval "sudo $smartctl_path -a $VDEV_UPATH")
|
||||
|
||||
- # Are we a SAS or ATA drive? Look for the right line in smartctl:
|
||||
+ # What kind of drive are we? Look for the right line in smartctl:
|
||||
#
|
||||
# SAS:
|
||||
# Transport protocol: SAS
|
||||
@@ -45,7 +46,10 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
# SATA:
|
||||
# ATA Version is: 8
|
||||
#
|
||||
- type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|SAS$')
|
||||
+ # NVMe:
|
||||
+ # SMART/Health Information (NVMe Log 0xnn, NSID 0xnn)
|
||||
+ #
|
||||
+ type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|NVMe|SAS$')
|
||||
out=$(echo "$raw_out" | awk '
|
||||
# SAS specific
|
||||
/read:/{print "rrd="$4"\nr_cor="$5"\nr_proc="$7"\nr_ucor="$8}
|
||||
@@ -71,10 +75,21 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
|
||||
# SATA common
|
||||
/Temperature_Celsius/{print "temp="$10}
|
||||
+/Airflow_Temperature_Cel/{print "temp="$10}
|
||||
/SMART overall-health self-assessment test result:/{print "health="$6}
|
||||
/Power_On_Hours/{print "hours_on="$10}
|
||||
/Serial Number:/{print "serial="$3}
|
||||
|
||||
+# NVMe common
|
||||
+/Temperature:/{print "temp="$2}
|
||||
+/SMART overall-health self-assessment test result:/{print "health="$6}
|
||||
+/Power On Hours:/{gsub("[^0-9]","",$4); print "hours_on="$4}
|
||||
+/Serial Number:/{print "serial="$3}
|
||||
+/Power Cycles:/{print "pwr_cyc="$3}
|
||||
+
|
||||
+# NVMe specific
|
||||
+/Media and Data Integrity Errors:/{print "nvme_err="$6}
|
||||
+
|
||||
END {ORS="\n"; print ""}
|
||||
');
|
||||
fi
|
||||
@@ -94,6 +109,8 @@ smart)
|
||||
scripts="temp|health|r_ucor|w_ucor"
|
||||
elif [ "$type" = "ATA" ] ; then
|
||||
scripts="temp|health|ata_err|realloc|rep_ucor|cmd_to|pend_sec|off_ucor"
|
||||
+ elif [ "$type" = "NVMe" ] ; then
|
||||
+ scripts="temp|health|nvme_err"
|
||||
fi
|
||||
;;
|
||||
smartx)
|
||||
@@ -102,6 +119,8 @@ smartx)
|
||||
scripts="hours_on|defect|nonmed|r_proc|w_proc"
|
||||
elif [ "$type" = "ATA" ] ; then
|
||||
scripts="hours_on|pwr_cyc"
|
||||
+ elif [ "$type" = "NVMe" ] ; then
|
||||
+ scripts="hours_on|pwr_cyc"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Thode <mthode@mthode.org>
|
||||
Date: Wed, 21 Feb 2018 22:45:35 +0000
|
||||
Subject: [PATCH] Allow modprobe to fail when called within systemd
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows for systems with zfs built into the kernel manually to run
|
||||
these services. Otherwise the service will fail to start.
|
||||
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Reviewed-by: Kash Pande <kash@tripleback.net>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Matthew Thode <mthode@mthode.org>
|
||||
Closes #7174
|
||||
(cherry picked from commit 30ac8de48a2bb680e15dfe8879faaa7b461b771c)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
etc/systemd/system/zfs-import-cache.service.in | 2 +-
|
||||
etc/systemd/system/zfs-import-scan.service.in | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/etc/systemd/system/zfs-import-cache.service.in b/etc/systemd/system/zfs-import-cache.service.in
|
||||
index 9d677f8dd..726c468ca 100644
|
||||
--- a/etc/systemd/system/zfs-import-cache.service.in
|
||||
+++ b/etc/systemd/system/zfs-import-cache.service.in
|
||||
@@ -12,7 +12,7 @@ ConditionPathExists=@sysconfdir@/zfs/zpool.cache
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
-ExecStartPre=/sbin/modprobe zfs
|
||||
+ExecStartPre=-/sbin/modprobe zfs
|
||||
ExecStart=@sbindir@/zpool import -c @sysconfdir@/zfs/zpool.cache -aN
|
||||
|
||||
[Install]
|
||||
diff --git a/etc/systemd/system/zfs-import-scan.service.in b/etc/systemd/system/zfs-import-scan.service.in
|
||||
index cc428b0d0..8fe2c1072 100644
|
||||
--- a/etc/systemd/system/zfs-import-scan.service.in
|
||||
+++ b/etc/systemd/system/zfs-import-scan.service.in
|
||||
@@ -11,7 +11,7 @@ ConditionPathExists=!@sysconfdir@/zfs/zpool.cache
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
-ExecStartPre=/sbin/modprobe zfs
|
||||
+ExecStartPre=-/sbin/modprobe zfs
|
||||
ExecStart=@sbindir@/zpool import -aN -d /dev/disk/by-id -o cachefile=none
|
||||
|
||||
[Install]
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
||||
Date: Wed, 21 Feb 2018 09:40:06 +0100
|
||||
Subject: [PATCH] Revert "cherry-pick: fix distclean which removes needed
|
||||
files"
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This reverts commit b7361d56f7039ad69e93e3e9b647da69b5fb647a.
|
||||
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
...g-in-distclean-which-removes-needed-files.patch | 36 ----------------------
|
||||
debian/patches/series | 1 -
|
||||
2 files changed, 37 deletions(-)
|
||||
delete mode 100644 debian/patches/0001-Fix-bug-in-distclean-which-removes-needed-files.patch
|
||||
|
||||
diff --git a/debian/patches/0001-Fix-bug-in-distclean-which-removes-needed-files.patch b/debian/patches/0001-Fix-bug-in-distclean-which-removes-needed-files.patch
|
||||
deleted file mode 100644
|
||||
index e16758b03..000000000
|
||||
--- a/debian/patches/0001-Fix-bug-in-distclean-which-removes-needed-files.patch
|
||||
+++ /dev/null
|
||||
@@ -1,36 +0,0 @@
|
||||
-From b1490dd43e3c98649c7d23928d908f5bb019411b Mon Sep 17 00:00:00 2001
|
||||
-From: David Quigley <dpquigl@users.noreply.github.com>
|
||||
-Date: Wed, 13 Sep 2017 12:45:04 -0600
|
||||
-Subject: [PATCH 001/144] Fix bug in distclean which removes needed files
|
||||
-
|
||||
-Running distclean removes the following files because of an error
|
||||
-in Makefile.am
|
||||
-
|
||||
-deleted: tests/zfs-tests/include/commands.cfg
|
||||
-deleted: tests/zfs-tests/include/libtest.shlib
|
||||
-deleted: tests/zfs-tests/include/math.shlib
|
||||
-deleted: tests/zfs-tests/include/properties.shlib
|
||||
-deleted: tests/zfs-tests/include/zpool_script.shlib
|
||||
-
|
||||
-Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
-Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
-Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
-Signed-off-by: David Quigley <david.quigley@intel.com>
|
||||
-Closes #6636
|
||||
----
|
||||
- tests/zfs-tests/include/Makefile.am | 2 +-
|
||||
- 1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
-
|
||||
-diff --git a/tests/zfs-tests/include/Makefile.am b/tests/zfs-tests/include/Makefile.am
|
||||
-index 579e1356e..24633ccc3 100644
|
||||
---- a/tests/zfs-tests/include/Makefile.am
|
||||
-+++ b/tests/zfs-tests/include/Makefile.am
|
||||
-@@ -10,4 +10,4 @@ dist_pkgdata_SCRIPTS = \
|
||||
- EXTRA_DIST=default.cfg.in
|
||||
-
|
||||
- distclean-local::
|
||||
-- -$(RM) $(dist_pkgdata_SCRIPTS)
|
||||
-+ -$(RM) default.cfg
|
||||
---
|
||||
-2.11.0
|
||||
-
|
||||
diff --git a/debian/patches/series b/debian/patches/series
|
||||
index e4189aa05..6d5874440 100644
|
||||
--- a/debian/patches/series
|
||||
+++ b/debian/patches/series
|
||||
@@ -7,5 +7,4 @@ enable-zed.patch
|
||||
0008-dracut-make-module-setup.sh-shebang-explicit.patch
|
||||
0009-add-man-page-reference-to-systemd-units.patch
|
||||
0010-fix-install-path-of-zpool.d-scripts.patch
|
||||
-0001-Fix-bug-in-distclean-which-removes-needed-files.patch
|
||||
2000-increase-default-zcmd-allocation-to-256K.patch
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Thu, 22 Feb 2018 09:02:06 -0800
|
||||
Subject: [PATCH] Linux 4.16 compat: use correct *_dec_and_test()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Use refcount_dec_and_test() on 4.16+ kernels, atomic_dec_and_test()
|
||||
on older kernels. https://lwn.net/Articles/714974/
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Closes: #7179
|
||||
Closes: #7211
|
||||
(cherry picked from commit e5ba614d05bde1e98ba46d5b75cf6b8a0701c2ca)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/linux/vfs_compat.h | 6 +++++-
|
||||
config/kernel-acl-refcount.m4 | 20 ++++++++++++++++++++
|
||||
config/kernel.m4 | 1 +
|
||||
3 files changed, 26 insertions(+), 1 deletion(-)
|
||||
create mode 100644 config/kernel-acl-refcount.m4
|
||||
|
||||
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
|
||||
index 7fcf3c055..6347268af 100644
|
||||
--- a/include/linux/vfs_compat.h
|
||||
+++ b/include/linux/vfs_compat.h
|
||||
@@ -288,9 +288,13 @@ zpl_posix_acl_release(struct posix_acl *acl)
|
||||
{
|
||||
if ((acl == NULL) || (acl == ACL_NOT_CACHED))
|
||||
return;
|
||||
-
|
||||
+#ifdef HAVE_ACL_REFCOUNT
|
||||
+ if (refcount_dec_and_test(&acl->a_refcount))
|
||||
+ zpl_posix_acl_release_impl(acl);
|
||||
+#else
|
||||
if (atomic_dec_and_test(&acl->a_refcount))
|
||||
zpl_posix_acl_release_impl(acl);
|
||||
+#endif
|
||||
}
|
||||
#endif /* HAVE_POSIX_ACL_RELEASE */
|
||||
|
||||
diff --git a/config/kernel-acl-refcount.m4 b/config/kernel-acl-refcount.m4
|
||||
new file mode 100644
|
||||
index 000000000..43e3c442d
|
||||
--- /dev/null
|
||||
+++ b/config/kernel-acl-refcount.m4
|
||||
@@ -0,0 +1,20 @@
|
||||
+dnl #
|
||||
+dnl # 4.16 kernel: check if struct posix_acl acl.a_refcount is a refcount_t.
|
||||
+dnl # It's an atomic_t on older kernels.
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_ACL_HAS_REFCOUNT], [
|
||||
+ AC_MSG_CHECKING([whether posix_acl has refcount_t])
|
||||
+ ZFS_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/backing-dev.h>
|
||||
+ #include <linux/refcount.h>
|
||||
+ #include <linux/posix_acl.h>
|
||||
+ ],[
|
||||
+ struct posix_acl acl;
|
||||
+ refcount_t *r __attribute__ ((unused)) = &acl.a_refcount;
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(HAVE_ACL_REFCOUNT, 1, [posix_acl has refcount_t])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||
index d4a84b2b2..7bb86a96e 100644
|
||||
--- a/config/kernel.m4
|
||||
+++ b/config/kernel.m4
|
||||
@@ -124,6 +124,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
|
||||
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
|
||||
ZFS_AC_KERNEL_CURRENT_TIME
|
||||
ZFS_AC_KERNEL_VM_NODE_STAT
|
||||
+ ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
|
||||
|
||||
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
|
||||
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Olaf Faaland <faaland1@llnl.gov>
|
||||
Date: Thu, 22 Feb 2018 09:14:46 -0800
|
||||
Subject: [PATCH] Do not initiate MMP writes while pool is suspended
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
While the pool is suspended on host A, it may be imported on host B.
|
||||
If host A continued to write MMP blocks, it would be blindly
|
||||
overwriting MMP blocks written by host B, and the blocks written by
|
||||
host A would have outdated txg information.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Closes #7182
|
||||
(cherry picked from commit b1f61f05b4b2edc77ec5f3d28d041d7b3c873f01)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/mmp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
|
||||
index 1dfb7c05b..d003d79de 100644
|
||||
--- a/module/zfs/mmp.c
|
||||
+++ b/module/zfs/mmp.c
|
||||
@@ -437,7 +437,7 @@ mmp_thread(spa_t *spa)
|
||||
zio_suspend(spa, NULL);
|
||||
}
|
||||
|
||||
- if (multihost)
|
||||
+ if (multihost && !suspended)
|
||||
mmp_write_uberblock(spa);
|
||||
|
||||
CALLB_CPR_SAFE_BEGIN(&cpr);
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Olaf Faaland <faaland1@llnl.gov>
|
||||
Date: Thu, 22 Feb 2018 15:34:34 -0800
|
||||
Subject: [PATCH] Report duration and error in mmp_history entries
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
After an MMP write completes, update the relevant mmp_history entry
|
||||
with the time between submission and completion, and the error
|
||||
status of the write.
|
||||
|
||||
[faaland1@toss3a zfs]$ cat /proc/spl/kstat/zfs/pool/multihost
|
||||
39 0 0x01 100 8800 69147946270893 72723903122926
|
||||
id txg timestamp error duration mmp_delay vdev_guid
|
||||
10607 1166 1518985089 0 138301 637785455 4882...
|
||||
10608 1166 1518985089 0 136154 635407747 1151...
|
||||
10609 1166 1518985089 0 803618560 633048078 9740...
|
||||
10610 1166 1518985090 0 144826 633048078 4882...
|
||||
10611 1166 1518985090 0 164527 666187671 1151...
|
||||
|
||||
Where duration = gethrtime_in_done_fn - gethrtime_at_submission, and
|
||||
error = zio->io_error.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
|
||||
Closes #7190
|
||||
(cherry picked from commit 2644784f49a6b6be063d54ca0e1662ee6bef7ebd)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/mmp.h | 1 +
|
||||
include/sys/spa.h | 4 +++-
|
||||
include/sys/vdev_impl.h | 1 +
|
||||
module/zfs/mmp.c | 13 ++++++++++--
|
||||
module/zfs/spa_stats.c | 54 ++++++++++++++++++++++++++++++++++++++++---------
|
||||
5 files changed, 60 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/include/sys/mmp.h b/include/sys/mmp.h
|
||||
index 5b2fea1a6..1ce685f9c 100644
|
||||
--- a/include/sys/mmp.h
|
||||
+++ b/include/sys/mmp.h
|
||||
@@ -42,6 +42,7 @@ typedef struct mmp_thread {
|
||||
uint64_t mmp_delay; /* decaying avg ns between MMP writes */
|
||||
uberblock_t mmp_ub; /* last ub written by sync */
|
||||
zio_t *mmp_zio_root; /* root of mmp write zios */
|
||||
+ uint64_t mmp_kstat_id; /* unique id for next MMP write kstat */
|
||||
} mmp_thread_t;
|
||||
|
||||
|
||||
diff --git a/include/sys/spa.h b/include/sys/spa.h
|
||||
index 67235871f..53fa5514a 100644
|
||||
--- a/include/sys/spa.h
|
||||
+++ b/include/sys/spa.h
|
||||
@@ -759,8 +759,10 @@ extern txg_stat_t *spa_txg_history_init_io(spa_t *, uint64_t,
|
||||
struct dsl_pool *);
|
||||
extern void spa_txg_history_fini_io(spa_t *, txg_stat_t *);
|
||||
extern void spa_tx_assign_add_nsecs(spa_t *spa, uint64_t nsecs);
|
||||
+extern int spa_mmp_history_set(spa_t *spa, uint64_t mmp_kstat_id, int io_error,
|
||||
+ hrtime_t duration);
|
||||
extern void spa_mmp_history_add(uint64_t txg, uint64_t timestamp,
|
||||
- uint64_t mmp_delay, vdev_t *vd, int label);
|
||||
+ uint64_t mmp_delay, vdev_t *vd, int label, uint64_t mmp_kstat_id);
|
||||
|
||||
/* Pool configuration locks */
|
||||
extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
|
||||
diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h
|
||||
index 4c2e3cd2e..13c495822 100644
|
||||
--- a/include/sys/vdev_impl.h
|
||||
+++ b/include/sys/vdev_impl.h
|
||||
@@ -238,6 +238,7 @@ struct vdev {
|
||||
vdev_aux_t vdev_label_aux; /* on-disk aux state */
|
||||
uint64_t vdev_leaf_zap;
|
||||
hrtime_t vdev_mmp_pending; /* 0 if write finished */
|
||||
+ uint64_t vdev_mmp_kstat_id; /* to find kstat entry */
|
||||
|
||||
/*
|
||||
* For DTrace to work in userland (libzpool) context, these fields must
|
||||
diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
|
||||
index d003d79de..ee8e9201b 100644
|
||||
--- a/module/zfs/mmp.c
|
||||
+++ b/module/zfs/mmp.c
|
||||
@@ -135,6 +135,7 @@ mmp_init(spa_t *spa)
|
||||
mutex_init(&mmp->mmp_thread_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
cv_init(&mmp->mmp_thread_cv, NULL, CV_DEFAULT, NULL);
|
||||
mutex_init(&mmp->mmp_io_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
+ mmp->mmp_kstat_id = 1;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -244,7 +245,8 @@ mmp_write_done(zio_t *zio)
|
||||
mmp_thread_t *mts = zio->io_private;
|
||||
|
||||
mutex_enter(&mts->mmp_io_lock);
|
||||
- vd->vdev_mmp_pending = 0;
|
||||
+ uint64_t mmp_kstat_id = vd->vdev_mmp_kstat_id;
|
||||
+ hrtime_t mmp_write_duration = gethrtime() - vd->vdev_mmp_pending;
|
||||
|
||||
if (zio->io_error)
|
||||
goto unlock;
|
||||
@@ -278,9 +280,15 @@ mmp_write_done(zio_t *zio)
|
||||
mts->mmp_last_write = gethrtime();
|
||||
|
||||
unlock:
|
||||
+ vd->vdev_mmp_pending = 0;
|
||||
+ vd->vdev_mmp_kstat_id = 0;
|
||||
+
|
||||
mutex_exit(&mts->mmp_io_lock);
|
||||
spa_config_exit(spa, SCL_STATE, mmp_tag);
|
||||
|
||||
+ spa_mmp_history_set(spa, mmp_kstat_id, zio->io_error,
|
||||
+ mmp_write_duration);
|
||||
+
|
||||
abd_free(zio->io_abd);
|
||||
}
|
||||
|
||||
@@ -333,6 +341,7 @@ mmp_write_uberblock(spa_t *spa)
|
||||
ub->ub_mmp_magic = MMP_MAGIC;
|
||||
ub->ub_mmp_delay = mmp->mmp_delay;
|
||||
vd->vdev_mmp_pending = gethrtime();
|
||||
+ vd->vdev_mmp_kstat_id = mmp->mmp_kstat_id++;
|
||||
|
||||
zio_t *zio = zio_null(mmp->mmp_zio_root, spa, NULL, NULL, NULL, flags);
|
||||
abd_t *ub_abd = abd_alloc_for_io(VDEV_UBERBLOCK_SIZE(vd), B_TRUE);
|
||||
@@ -350,7 +359,7 @@ mmp_write_uberblock(spa_t *spa)
|
||||
flags | ZIO_FLAG_DONT_PROPAGATE);
|
||||
|
||||
spa_mmp_history_add(ub->ub_txg, ub->ub_timestamp, ub->ub_mmp_delay, vd,
|
||||
- label);
|
||||
+ label, vd->vdev_mmp_kstat_id);
|
||||
|
||||
zio_nowait(zio);
|
||||
}
|
||||
diff --git a/module/zfs/spa_stats.c b/module/zfs/spa_stats.c
|
||||
index 7ca359806..58967e9fc 100644
|
||||
--- a/module/zfs/spa_stats.c
|
||||
+++ b/module/zfs/spa_stats.c
|
||||
@@ -718,21 +718,24 @@ spa_io_history_destroy(spa_t *spa)
|
||||
*/
|
||||
|
||||
typedef struct spa_mmp_history {
|
||||
+ uint64_t mmp_kstat_id; /* unique # for updates */
|
||||
uint64_t txg; /* txg of last sync */
|
||||
uint64_t timestamp; /* UTC time of of last sync */
|
||||
uint64_t mmp_delay; /* nanosec since last MMP write */
|
||||
uint64_t vdev_guid; /* unique ID of leaf vdev */
|
||||
char *vdev_path;
|
||||
uint64_t vdev_label; /* vdev label */
|
||||
+ int io_error; /* error status of MMP write */
|
||||
+ hrtime_t duration; /* time from submission to completion */
|
||||
list_node_t smh_link;
|
||||
} spa_mmp_history_t;
|
||||
|
||||
static int
|
||||
spa_mmp_history_headers(char *buf, size_t size)
|
||||
{
|
||||
- (void) snprintf(buf, size, "%-10s %-10s %-12s %-24s %-10s %s\n",
|
||||
- "txg", "timestamp", "mmp_delay", "vdev_guid", "vdev_label",
|
||||
- "vdev_path");
|
||||
+ (void) snprintf(buf, size, "%-10s %-10s %-10s %-6s %-10s %-12s %-24s "
|
||||
+ "%-10s %s\n", "id", "txg", "timestamp", "error", "duration",
|
||||
+ "mmp_delay", "vdev_guid", "vdev_label", "vdev_path");
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -741,11 +744,12 @@ spa_mmp_history_data(char *buf, size_t size, void *data)
|
||||
{
|
||||
spa_mmp_history_t *smh = (spa_mmp_history_t *)data;
|
||||
|
||||
- (void) snprintf(buf, size, "%-10llu %-10llu %-12llu %-24llu %-10llu "
|
||||
- "%s\n",
|
||||
- (u_longlong_t)smh->txg, (u_longlong_t)smh->timestamp,
|
||||
- (u_longlong_t)smh->mmp_delay, (u_longlong_t)smh->vdev_guid,
|
||||
- (u_longlong_t)smh->vdev_label,
|
||||
+ (void) snprintf(buf, size, "%-10llu %-10llu %-10llu %-6lld %-10lld "
|
||||
+ "%-12llu %-24llu %-10llu %s\n",
|
||||
+ (u_longlong_t)smh->mmp_kstat_id, (u_longlong_t)smh->txg,
|
||||
+ (u_longlong_t)smh->timestamp, (longlong_t)smh->io_error,
|
||||
+ (longlong_t)smh->duration, (u_longlong_t)smh->mmp_delay,
|
||||
+ (u_longlong_t)smh->vdev_guid, (u_longlong_t)smh->vdev_label,
|
||||
(smh->vdev_path ? smh->vdev_path : "-"));
|
||||
|
||||
return (0);
|
||||
@@ -861,11 +865,40 @@ spa_mmp_history_destroy(spa_t *spa)
|
||||
}
|
||||
|
||||
/*
|
||||
- * Add a new MMP update to historical record.
|
||||
+ * Set MMP write duration and error status in existing record.
|
||||
+ */
|
||||
+int
|
||||
+spa_mmp_history_set(spa_t *spa, uint64_t mmp_kstat_id, int io_error,
|
||||
+ hrtime_t duration)
|
||||
+{
|
||||
+ spa_stats_history_t *ssh = &spa->spa_stats.mmp_history;
|
||||
+ spa_mmp_history_t *smh;
|
||||
+ int error = ENOENT;
|
||||
+
|
||||
+ if (zfs_multihost_history == 0 && ssh->size == 0)
|
||||
+ return (0);
|
||||
+
|
||||
+ mutex_enter(&ssh->lock);
|
||||
+ for (smh = list_head(&ssh->list); smh != NULL;
|
||||
+ smh = list_next(&ssh->list, smh)) {
|
||||
+ if (smh->mmp_kstat_id == mmp_kstat_id) {
|
||||
+ smh->io_error = io_error;
|
||||
+ smh->duration = duration;
|
||||
+ error = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ mutex_exit(&ssh->lock);
|
||||
+
|
||||
+ return (error);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Add a new MMP write to historical record.
|
||||
*/
|
||||
void
|
||||
spa_mmp_history_add(uint64_t txg, uint64_t timestamp, uint64_t mmp_delay,
|
||||
- vdev_t *vd, int label)
|
||||
+ vdev_t *vd, int label, uint64_t mmp_kstat_id)
|
||||
{
|
||||
spa_t *spa = vd->vdev_spa;
|
||||
spa_stats_history_t *ssh = &spa->spa_stats.mmp_history;
|
||||
@@ -882,6 +915,7 @@ spa_mmp_history_add(uint64_t txg, uint64_t timestamp, uint64_t mmp_delay,
|
||||
if (vd->vdev_path)
|
||||
smh->vdev_path = strdup(vd->vdev_path);
|
||||
smh->vdev_label = label;
|
||||
+ smh->mmp_kstat_id = mmp_kstat_id;
|
||||
|
||||
mutex_enter(&ssh->lock);
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,451 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: chrisrd <chris@onthe.net.au>
|
||||
Date: Sat, 24 Feb 2018 03:50:06 +1100
|
||||
Subject: [PATCH] Fix free memory calculation on v3.14+
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Provide infrastructure to auto-configure to enum and API changes in the
|
||||
global page stats used for our free memory calculations.
|
||||
|
||||
arc_free_memory has been broken since an API change in Linux v3.14:
|
||||
|
||||
2016-07-28 v4.8 599d0c95 mm, vmscan: move LRU lists to node
|
||||
2016-07-28 v4.8 75ef7184 mm, vmstat: add infrastructure for per-node
|
||||
vmstats
|
||||
|
||||
These commits moved some of global_page_state() into
|
||||
global_node_page_state(). The API change was particularly egregious as,
|
||||
instead of breaking the old code, it silently did the wrong thing and we
|
||||
continued using global_page_state() where we should have been using
|
||||
global_node_page_state(), thus indexing into the wrong array via
|
||||
NR_SLAB_RECLAIMABLE et al.
|
||||
|
||||
There have been further API changes along the way:
|
||||
|
||||
2017-07-06 v4.13 385386cf mm: vmstat: move slab statistics from zone to
|
||||
node counters
|
||||
2017-09-06 v4.14 c41f012a mm: rename global_page_state to
|
||||
global_zone_page_state
|
||||
|
||||
...and various (incomplete, as it turns out) attempts to accomodate
|
||||
these changes in ZoL:
|
||||
|
||||
2017-08-24 2209e409 Linux 4.8+ compatibility fix for vm stats
|
||||
2017-09-16 787acae0 Linux 3.14 compat: IO acct, global_page_state, etc
|
||||
2017-09-19 661907e6 Linux 4.14 compat: IO acct, global_page_state, etc
|
||||
|
||||
The config infrastructure provided here resolves these issues going back
|
||||
to the original API change in v3.14 and is robust against further Linux
|
||||
changes in this area.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: Chris Dunlop <chris@onthe.net.au>
|
||||
Closes #7170
|
||||
(cherry picked from commit 338523dd6ec641cc4d552c3f67e1becfb9e22b0a)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/linux/Makefile.am | 3 +-
|
||||
scripts/Makefile.am | 2 +
|
||||
include/linux/page_compat.h | 78 ++++++++++++++++++++++++++
|
||||
module/zfs/arc.c | 23 ++------
|
||||
config/kernel-global_page_state.m4 | 109 +++++++++++++++++++++++++++++++++++++
|
||||
config/kernel-vm_node_stat.m4 | 22 --------
|
||||
config/kernel.m4 | 2 +-
|
||||
scripts/enum-extract.pl | 58 ++++++++++++++++++++
|
||||
8 files changed, 256 insertions(+), 41 deletions(-)
|
||||
create mode 100644 include/linux/page_compat.h
|
||||
create mode 100644 config/kernel-global_page_state.m4
|
||||
delete mode 100644 config/kernel-vm_node_stat.m4
|
||||
create mode 100755 scripts/enum-extract.pl
|
||||
|
||||
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
|
||||
index 9bb0b3493..89c2689f6 100644
|
||||
--- a/include/linux/Makefile.am
|
||||
+++ b/include/linux/Makefile.am
|
||||
@@ -9,7 +9,8 @@ KERNEL_H = \
|
||||
$(top_srcdir)/include/linux/kmap_compat.h \
|
||||
$(top_srcdir)/include/linux/simd_x86.h \
|
||||
$(top_srcdir)/include/linux/simd_aarch64.h \
|
||||
- $(top_srcdir)/include/linux/mod_compat.h
|
||||
+ $(top_srcdir)/include/linux/mod_compat.h \
|
||||
+ $(top_srcdir)/include/linux/page_compat.h
|
||||
|
||||
USER_H =
|
||||
|
||||
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
|
||||
index 74b8b31a5..5a8abd135 100644
|
||||
--- a/scripts/Makefile.am
|
||||
+++ b/scripts/Makefile.am
|
||||
@@ -5,6 +5,7 @@ EXTRA_DIST = dkms.mkconf dkms.postbuild kmodtool zfs2zol-patch.sed cstyle.pl
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
dist_pkgdata_SCRIPTS = \
|
||||
$(top_builddir)/scripts/common.sh \
|
||||
+ $(top_srcdir)/scripts/enum-extract.pl \
|
||||
$(top_srcdir)/scripts/zimport.sh \
|
||||
$(top_srcdir)/scripts/zfs.sh \
|
||||
$(top_srcdir)/scripts/zfs-tests.sh \
|
||||
@@ -15,3 +16,4 @@ dist_pkgdata_SCRIPTS = \
|
||||
$(top_srcdir)/scripts/zpios-survey.sh \
|
||||
$(top_srcdir)/scripts/smb.sh \
|
||||
$(top_srcdir)/scripts/zfs-helpers.sh
|
||||
+
|
||||
diff --git a/include/linux/page_compat.h b/include/linux/page_compat.h
|
||||
new file mode 100644
|
||||
index 000000000..95acb7d53
|
||||
--- /dev/null
|
||||
+++ b/include/linux/page_compat.h
|
||||
@@ -0,0 +1,78 @@
|
||||
+#ifndef _ZFS_PAGE_COMPAT_H
|
||||
+#define _ZFS_PAGE_COMPAT_H
|
||||
+
|
||||
+/*
|
||||
+ * We have various enum members moving between two separate enum types,
|
||||
+ * and accessed by different functions at various times. Centralise the
|
||||
+ * insanity.
|
||||
+ *
|
||||
+ * < v4.8: all enums in zone_stat_item, via global_page_state()
|
||||
+ * v4.8: some enums moved to node_stat_item, global_node_page_state() introduced
|
||||
+ * v4.13: some enums moved from zone_stat_item to node_state_item
|
||||
+ * v4.14: global_page_state() rename to global_zone_page_state()
|
||||
+ *
|
||||
+ * The defines used here are created by config/kernel-global_page_state.m4
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * Create our own accessor functions to follow the Linux API changes
|
||||
+ */
|
||||
+#if defined(ZFS_GLOBAL_ZONE_PAGE_STATE)
|
||||
+
|
||||
+/* global_zone_page_state() introduced */
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_FILE_PAGES)
|
||||
+#define nr_file_pages() global_node_page_state(NR_FILE_PAGES)
|
||||
+#else
|
||||
+#define nr_file_pages() global_zone_page_state(NR_FILE_PAGES)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_INACTIVE_ANON)
|
||||
+#define nr_inactive_anon_pages() global_node_page_state(NR_INACTIVE_ANON)
|
||||
+#else
|
||||
+#define nr_inactive_anon_pages() global_zone_page_state(NR_INACTIVE_ANON)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_INACTIVE_FILE)
|
||||
+#define nr_inactive_file_pages() global_node_page_state(NR_INACTIVE_FILE)
|
||||
+#else
|
||||
+#define nr_inactive_file_pages() global_zone_page_state(NR_INACTIVE_FILE)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_SLAB_RECLAIMABLE)
|
||||
+#define nr_slab_reclaimable_pages() global_node_page_state(NR_SLAB_RECLAIMABLE)
|
||||
+#else
|
||||
+#define nr_slab_reclaimable_pages() global_zone_page_state(NR_SLAB_RECLAIMABLE)
|
||||
+#endif
|
||||
+
|
||||
+#elif defined(ZFS_GLOBAL_NODE_PAGE_STATE)
|
||||
+
|
||||
+/* global_node_page_state() introduced */
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_FILE_PAGES)
|
||||
+#define nr_file_pages() global_node_page_state(NR_FILE_PAGES)
|
||||
+#else
|
||||
+#define nr_file_pages() global_page_state(NR_FILE_PAGES)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_INACTIVE_ANON)
|
||||
+#define nr_inactive_anon_pages() global_node_page_state(NR_INACTIVE_ANON)
|
||||
+#else
|
||||
+#define nr_inactive_anon_pages() global_page_state(NR_INACTIVE_ANON)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_INACTIVE_FILE)
|
||||
+#define nr_inactive_file_pages() global_node_page_state(NR_INACTIVE_FILE)
|
||||
+#else
|
||||
+#define nr_inactive_file_pages() global_page_state(NR_INACTIVE_FILE)
|
||||
+#endif
|
||||
+#if defined(ZFS_ENUM_NODE_STAT_ITEM_NR_SLAB_RECLAIMABLE)
|
||||
+#define nr_slab_reclaimable_pages() global_node_page_state(NR_SLAB_RECLAIMABLE)
|
||||
+#else
|
||||
+#define nr_slab_reclaimable_pages() global_page_state(NR_SLAB_RECLAIMABLE)
|
||||
+#endif
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+/* global_page_state() only */
|
||||
+#define nr_file_pages() global_page_state(NR_FILE_PAGES)
|
||||
+#define nr_inactive_anon_pages() global_page_state(NR_INACTIVE_ANON)
|
||||
+#define nr_inactive_file_pages() global_page_state(NR_INACTIVE_FILE)
|
||||
+#define nr_slab_reclaimable_pages() global_page_state(NR_SLAB_RECLAIMABLE)
|
||||
+
|
||||
+#endif /* ZFS_GLOBAL_ZONE_PAGE_STATE */
|
||||
+
|
||||
+#endif /* _ZFS_PAGE_COMPAT_H */
|
||||
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
|
||||
index 9d1d0db1d..236794672 100644
|
||||
--- a/module/zfs/arc.c
|
||||
+++ b/module/zfs/arc.c
|
||||
@@ -280,6 +280,7 @@
|
||||
#include <sys/fs/swapnode.h>
|
||||
#include <sys/zpl.h>
|
||||
#include <linux/mm_compat.h>
|
||||
+#include <linux/page_compat.h>
|
||||
#endif
|
||||
#include <sys/callb.h>
|
||||
#include <sys/kstat.h>
|
||||
@@ -4016,17 +4017,11 @@ arc_free_memory(void)
|
||||
si_meminfo(&si);
|
||||
return (ptob(si.freeram - si.freehigh));
|
||||
#else
|
||||
-#ifdef ZFS_GLOBAL_NODE_PAGE_STATE
|
||||
return (ptob(nr_free_pages() +
|
||||
- global_node_page_state(NR_INACTIVE_FILE) +
|
||||
- global_node_page_state(NR_INACTIVE_ANON) +
|
||||
- global_node_page_state(NR_SLAB_RECLAIMABLE)));
|
||||
-#else
|
||||
- return (ptob(nr_free_pages() +
|
||||
- global_page_state(NR_INACTIVE_FILE) +
|
||||
- global_page_state(NR_INACTIVE_ANON) +
|
||||
- global_page_state(NR_SLAB_RECLAIMABLE)));
|
||||
-#endif /* ZFS_GLOBAL_NODE_PAGE_STATE */
|
||||
+ nr_inactive_file_pages() +
|
||||
+ nr_inactive_anon_pages() +
|
||||
+ nr_slab_reclaimable_pages()));
|
||||
+
|
||||
#endif /* CONFIG_HIGHMEM */
|
||||
#else
|
||||
return (spa_get_random(arc_all_memory() * 20 / 100));
|
||||
@@ -4437,13 +4432,7 @@ arc_evictable_memory(void)
|
||||
* Scale reported evictable memory in proportion to page cache, cap
|
||||
* at specified min/max.
|
||||
*/
|
||||
-#ifdef ZFS_GLOBAL_NODE_PAGE_STATE
|
||||
- uint64_t min = (ptob(global_node_page_state(NR_FILE_PAGES)) / 100) *
|
||||
- zfs_arc_pc_percent;
|
||||
-#else
|
||||
- uint64_t min = (ptob(global_page_state(NR_FILE_PAGES)) / 100) *
|
||||
- zfs_arc_pc_percent;
|
||||
-#endif
|
||||
+ uint64_t min = (ptob(nr_file_pages()) / 100) * zfs_arc_pc_percent;
|
||||
min = MAX(arc_c_min, MIN(arc_c_max, min));
|
||||
|
||||
if (arc_dirty >= min)
|
||||
diff --git a/config/kernel-global_page_state.m4 b/config/kernel-global_page_state.m4
|
||||
new file mode 100644
|
||||
index 000000000..f4a40011f
|
||||
--- /dev/null
|
||||
+++ b/config/kernel-global_page_state.m4
|
||||
@@ -0,0 +1,109 @@
|
||||
+dnl #
|
||||
+dnl # 4.8 API change
|
||||
+dnl #
|
||||
+dnl # 75ef71840539 mm, vmstat: add infrastructure for per-node vmstats
|
||||
+dnl # 599d0c954f91 mm, vmscan: move LRU lists to node
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_NODE_PAGE_STATE], [
|
||||
+ AC_MSG_CHECKING([whether global_node_page_state() exists])
|
||||
+ ZFS_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/mm.h>
|
||||
+ #include <linux/vmstat.h>
|
||||
+ ],[
|
||||
+ (void) global_node_page_state(0);
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(ZFS_GLOBAL_NODE_PAGE_STATE, 1, [global_node_page_state() exists])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # 4.14 API change
|
||||
+dnl #
|
||||
+dnl # c41f012ade0b mm: rename global_page_state to global_zone_page_state
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_ZONE_PAGE_STATE], [
|
||||
+ AC_MSG_CHECKING([whether global_zone_page_state() exists])
|
||||
+ ZFS_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/mm.h>
|
||||
+ #include <linux/vmstat.h>
|
||||
+ ],[
|
||||
+ (void) global_zone_page_state(0);
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(ZFS_GLOBAL_ZONE_PAGE_STATE, 1, [global_zone_page_state() exists])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # Create a define and autoconf variable for an enum member
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_ENUM_MEMBER], [
|
||||
+ AC_MSG_CHECKING([whether enum $2 contains $1])
|
||||
+ AS_IF([AC_TRY_COMMAND("${srcdir}/scripts/enum-extract.pl" "$2" "$3" | egrep -qx $1)],[
|
||||
+ AC_MSG_RESULT([yes])
|
||||
+ AC_DEFINE(m4_join([_], [ZFS_ENUM], m4_toupper($2), $1), 1, [enum $2 contains $1])
|
||||
+ m4_join([_], [ZFS_ENUM], m4_toupper($2), $1)=1
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT([no])
|
||||
+ ])
|
||||
+])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # Sanity check helpers
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_ERROR],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ AC_MSG_RESULT([$1 in either node_stat_item or zone_stat_item: $2])
|
||||
+ AC_MSG_RESULT([configure needs updating, see: config/kernel-global_page_state.m4])
|
||||
+ AC_MSG_FAILURE([SHUT 'ER DOWN CLANCY, SHE'S PUMPIN' MUD!])
|
||||
+])
|
||||
+
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_CHECK], [
|
||||
+ enum_check_a="m4_join([_], [$ZFS_ENUM_NODE_STAT_ITEM], $1)"
|
||||
+ enum_check_b="m4_join([_], [$ZFS_ENUM_ZONE_STAT_ITEM], $1)"
|
||||
+ AS_IF([test -n "$enum_check_a" -a -n "$enum_check_b"],[
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_ERROR([$1], [DUPLICATE])
|
||||
+ ])
|
||||
+ AS_IF([test -z "$enum_check_a" -a -z "$enum_check_b"],[
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_ERROR([$1], [NOT FOUND])
|
||||
+ ])
|
||||
+])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # Ensure the config tests are finding one and only one of each enum of interest
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_ZONE_PAGE_STATE_SANITY], [
|
||||
+ AC_MSG_CHECKING([global_page_state enums are sane])
|
||||
+
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_CHECK([NR_FILE_PAGES])
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_CHECK([NR_INACTIVE_ANON])
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_CHECK([NR_INACTIVE_FILE])
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE_ENUM_CHECK([NR_SLAB_RECLAIMABLE])
|
||||
+
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # enum members in which we're interested
|
||||
+dnl #
|
||||
+AC_DEFUN([ZFS_AC_KERNEL_GLOBAL_PAGE_STATE], [
|
||||
+ ZFS_AC_KERNEL_GLOBAL_NODE_PAGE_STATE
|
||||
+ ZFS_AC_KERNEL_GLOBAL_ZONE_PAGE_STATE
|
||||
+
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_FILE_PAGES], [node_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_INACTIVE_ANON], [node_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_INACTIVE_FILE], [node_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_SLAB_RECLAIMABLE], [node_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_FILE_PAGES], [zone_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_INACTIVE_ANON], [zone_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_INACTIVE_FILE], [zone_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+ ZFS_AC_KERNEL_ENUM_MEMBER([NR_SLAB_RECLAIMABLE], [zone_stat_item], [$LINUX/include/linux/mmzone.h])
|
||||
+
|
||||
+ ZFS_AC_KERNEL_GLOBAL_ZONE_PAGE_STATE_SANITY
|
||||
+])
|
||||
diff --git a/config/kernel-vm_node_stat.m4 b/config/kernel-vm_node_stat.m4
|
||||
deleted file mode 100644
|
||||
index 5dcd9d827..000000000
|
||||
--- a/config/kernel-vm_node_stat.m4
|
||||
+++ /dev/null
|
||||
@@ -1,22 +0,0 @@
|
||||
-dnl #
|
||||
-dnl # 4.8 API change
|
||||
-dnl # kernel vm counters change
|
||||
-dnl #
|
||||
-AC_DEFUN([ZFS_AC_KERNEL_VM_NODE_STAT], [
|
||||
- AC_MSG_CHECKING([whether to use vm_node_stat based fn's])
|
||||
- ZFS_LINUX_TRY_COMPILE([
|
||||
- #include <linux/mm.h>
|
||||
- #include <linux/vmstat.h>
|
||||
- ],[
|
||||
- int a __attribute__ ((unused)) = NR_VM_NODE_STAT_ITEMS;
|
||||
- long x __attribute__ ((unused)) =
|
||||
- atomic_long_read(&vm_node_stat[0]);
|
||||
- (void) global_node_page_state(0);
|
||||
- ],[
|
||||
- AC_MSG_RESULT(yes)
|
||||
- AC_DEFINE(ZFS_GLOBAL_NODE_PAGE_STATE, 1,
|
||||
- [using global_node_page_state()])
|
||||
- ],[
|
||||
- AC_MSG_RESULT(no)
|
||||
- ])
|
||||
-])
|
||||
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||
index 7bb86a96e..3e499e447 100644
|
||||
--- a/config/kernel.m4
|
||||
+++ b/config/kernel.m4
|
||||
@@ -123,7 +123,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
|
||||
ZFS_AC_KERNEL_RENAME_WANTS_FLAGS
|
||||
ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR
|
||||
ZFS_AC_KERNEL_CURRENT_TIME
|
||||
- ZFS_AC_KERNEL_VM_NODE_STAT
|
||||
+ ZFS_AC_KERNEL_GLOBAL_PAGE_STATE
|
||||
ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
|
||||
|
||||
AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
|
||||
diff --git a/scripts/enum-extract.pl b/scripts/enum-extract.pl
|
||||
new file mode 100755
|
||||
index 000000000..5112cc807
|
||||
--- /dev/null
|
||||
+++ b/scripts/enum-extract.pl
|
||||
@@ -0,0 +1,58 @@
|
||||
+#!/usr/bin/perl -w
|
||||
+
|
||||
+my $usage = <<EOT;
|
||||
+usage: config-enum enum [file ...]
|
||||
+
|
||||
+Returns the elements from an enum declaration.
|
||||
+
|
||||
+"Best effort": we're not building an entire C interpreter here!
|
||||
+EOT
|
||||
+
|
||||
+use warnings;
|
||||
+use strict;
|
||||
+use Getopt::Std;
|
||||
+
|
||||
+my %opts;
|
||||
+
|
||||
+if (!getopts("", \%opts) || @ARGV < 1) {
|
||||
+ print $usage;
|
||||
+ exit 2;
|
||||
+}
|
||||
+
|
||||
+my $enum = shift;
|
||||
+
|
||||
+my $in_enum = 0;
|
||||
+
|
||||
+while (<>) {
|
||||
+ # comments
|
||||
+ s/\/\*.*\*\///;
|
||||
+ if (m/\/\*/) {
|
||||
+ while ($_ .= <>) {
|
||||
+ last if s/\/\*.*\*\///s;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ # preprocessor stuff
|
||||
+ next if /^#/;
|
||||
+
|
||||
+ # find our enum
|
||||
+ $in_enum = 1 if s/^\s*enum\s+${enum}(?:\s|$)//;
|
||||
+ next unless $in_enum;
|
||||
+
|
||||
+ # remove explicit values
|
||||
+ s/\s*=[^,]+,/,/g;
|
||||
+
|
||||
+ # extract each identifier
|
||||
+ while (m/\b([a-z_][a-z0-9_]*)\b/ig) {
|
||||
+ print $1, "\n";
|
||||
+ }
|
||||
+
|
||||
+ #
|
||||
+ # don't exit: there may be multiple versions of the same enum, e.g.
|
||||
+ # inside different #ifdef blocks. Let's explicitly return all of
|
||||
+ # them and let external tooling deal with it.
|
||||
+ #
|
||||
+ $in_enum = 0 if m/}\s*;/;
|
||||
+}
|
||||
+
|
||||
+exit 0;
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,516 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Fri, 23 Feb 2018 11:38:05 -0800
|
||||
Subject: [PATCH] Add scrub after resilver zed script
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
* Add a zed script to kick off a scrub after a resilver. The script is
|
||||
disabled by default.
|
||||
|
||||
* Add a optional $PATH (-P) option to zed to allow it to use a custom
|
||||
$PATH for its zedlets. This is needed when you're running zed under
|
||||
the ZTS in a local workspace.
|
||||
|
||||
* Update test scripts to not copy in all-debug.sh and all-syslog.sh by
|
||||
default. They can be optionally copied in as part of zed_setup().
|
||||
These scripts slow down zed considerably under heavy events loads and
|
||||
can cause events to be dropped or their delivery delayed. This was
|
||||
causing some sporadic failures in the 'fault' tests.
|
||||
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Richard Laager <rlaager@wiktel.com>
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Closes #4662
|
||||
Closes #7086
|
||||
(cherry picked from commit 99920d823e8e1510a0ad133c985bd2aa11a02834)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zed/Makefile.am | 6 +-
|
||||
tests/zfs-tests/tests/functional/fault/Makefile.am | 3 +-
|
||||
cmd/zed/zed_conf.h | 1 +
|
||||
man/man8/zed.8.in | 10 +++-
|
||||
cmd/zed/zed_conf.c | 7 ++-
|
||||
cmd/zed/zed_event.c | 34 +++++++++--
|
||||
cmd/zed/zed.d/resilver_finish-start-scrub.sh | 17 ++++++
|
||||
cmd/zed/zed.d/zed.rc | 3 +
|
||||
tests/runfiles/linux.run | 2 +-
|
||||
tests/zfs-tests/include/commands.cfg | 1 +
|
||||
tests/zfs-tests/include/libtest.shlib | 50 ++++++++++++++---
|
||||
.../zfs-tests/tests/functional/events/cleanup.ksh | 2 +-
|
||||
tests/zfs-tests/tests/functional/events/setup.ksh | 2 +-
|
||||
tests/zfs-tests/tests/functional/fault/cleanup.ksh | 2 +-
|
||||
.../functional/fault/scrub_after_resilver.ksh | 65 ++++++++++++++++++++++
|
||||
tests/zfs-tests/tests/functional/fault/setup.ksh | 2 +-
|
||||
16 files changed, 186 insertions(+), 21 deletions(-)
|
||||
create mode 100755 cmd/zed/zed.d/resilver_finish-start-scrub.sh
|
||||
create mode 100755 tests/zfs-tests/tests/functional/fault/scrub_after_resilver.ksh
|
||||
|
||||
diff --git a/cmd/zed/Makefile.am b/cmd/zed/Makefile.am
|
||||
index 97733a512..ee44898cd 100644
|
||||
--- a/cmd/zed/Makefile.am
|
||||
+++ b/cmd/zed/Makefile.am
|
||||
@@ -69,7 +69,8 @@ dist_zedexec_SCRIPTS = \
|
||||
zed.d/statechange-notify.sh \
|
||||
zed.d/vdev_clear-led.sh \
|
||||
zed.d/vdev_attach-led.sh \
|
||||
- zed.d/pool_import-led.sh
|
||||
+ zed.d/pool_import-led.sh \
|
||||
+ zed.d/resilver_finish-start-scrub.sh
|
||||
|
||||
zedconfdefaults = \
|
||||
all-syslog.sh \
|
||||
@@ -80,7 +81,8 @@ zedconfdefaults = \
|
||||
statechange-notify.sh \
|
||||
vdev_clear-led.sh \
|
||||
vdev_attach-led.sh \
|
||||
- pool_import-led.sh
|
||||
+ pool_import-led.sh \
|
||||
+ resilver_finish-start-scrub.sh
|
||||
|
||||
install-data-hook:
|
||||
$(MKDIR_P) "$(DESTDIR)$(zedconfdir)"
|
||||
diff --git a/tests/zfs-tests/tests/functional/fault/Makefile.am b/tests/zfs-tests/tests/functional/fault/Makefile.am
|
||||
index eeff31261..abe28501d 100644
|
||||
--- a/tests/zfs-tests/tests/functional/fault/Makefile.am
|
||||
+++ b/tests/zfs-tests/tests/functional/fault/Makefile.am
|
||||
@@ -4,4 +4,5 @@ dist_pkgdata_SCRIPTS = \
|
||||
setup.ksh \
|
||||
cleanup.ksh \
|
||||
auto_online_001_pos.ksh \
|
||||
- auto_replace_001_pos.ksh
|
||||
+ auto_replace_001_pos.ksh \
|
||||
+ scrub_after_resilver.ksh
|
||||
diff --git a/cmd/zed/zed_conf.h b/cmd/zed/zed_conf.h
|
||||
index 2bc634134..7d6b63b1d 100644
|
||||
--- a/cmd/zed/zed_conf.h
|
||||
+++ b/cmd/zed/zed_conf.h
|
||||
@@ -37,6 +37,7 @@ struct zed_conf {
|
||||
int state_fd; /* fd to state file */
|
||||
libzfs_handle_t *zfs_hdl; /* handle to libzfs */
|
||||
int zevent_fd; /* fd for access to zevents */
|
||||
+ char *path; /* custom $PATH for zedlets to use */
|
||||
};
|
||||
|
||||
struct zed_conf *zed_conf_create(void);
|
||||
diff --git a/man/man8/zed.8.in b/man/man8/zed.8.in
|
||||
index 2ab088d98..645e91795 100644
|
||||
--- a/man/man8/zed.8.in
|
||||
+++ b/man/man8/zed.8.in
|
||||
@@ -27,6 +27,7 @@ ZED \- ZFS Event Daemon
|
||||
[\fB\-L\fR]
|
||||
[\fB\-M\fR]
|
||||
[\fB\-p\fR \fIpidfile\fR]
|
||||
+[\fB\-P\fR \fIpath\fR]
|
||||
[\fB\-s\fR \fIstatefile\fR]
|
||||
[\fB\-v\fR]
|
||||
[\fB\-V\fR]
|
||||
@@ -78,9 +79,16 @@ Read the enabled ZEDLETs from the specified directory.
|
||||
.BI \-p\ pidfile
|
||||
Write the daemon's process ID to the specified file.
|
||||
.TP
|
||||
+.BI \-P\ path
|
||||
+Custom $PATH for zedlets to use. Normally zedlets run in a locked-down
|
||||
+environment, with hardcoded paths to the ZFS commands ($ZFS, $ZPOOL, $ZED, ...),
|
||||
+and a hardcoded $PATH. This is done for security reasons. However, the
|
||||
+ZFS test suite uses a custom PATH for its ZFS commands, and passes it to zed
|
||||
+with -P. In short, -P is only to be used by the ZFS test suite; never use
|
||||
+it in production!
|
||||
+.TP
|
||||
.BI \-s\ statefile
|
||||
Write the daemon's state to the specified file.
|
||||
-
|
||||
.SH ZEVENTS
|
||||
.PP
|
||||
A zevent is comprised of a list of nvpairs (name/value pairs). Each zevent
|
||||
diff --git a/cmd/zed/zed_conf.c b/cmd/zed/zed_conf.c
|
||||
index 5b27f1e4f..86671369c 100644
|
||||
--- a/cmd/zed/zed_conf.c
|
||||
+++ b/cmd/zed/zed_conf.c
|
||||
@@ -155,6 +155,8 @@ _zed_conf_display_help(const char *prog, int got_err)
|
||||
"Run daemon in the foreground.");
|
||||
fprintf(fp, "%*c%*s %s\n", w1, 0x20, -w2, "-M",
|
||||
"Lock all pages in memory.");
|
||||
+ fprintf(fp, "%*c%*s %s\n", w1, 0x20, -w2, "-P",
|
||||
+ "$PATH for ZED to use (only used by ZTS).");
|
||||
fprintf(fp, "%*c%*s %s\n", w1, 0x20, -w2, "-Z",
|
||||
"Zero state file.");
|
||||
fprintf(fp, "\n");
|
||||
@@ -247,7 +249,7 @@ _zed_conf_parse_path(char **resultp, const char *path)
|
||||
void
|
||||
zed_conf_parse_opts(struct zed_conf *zcp, int argc, char **argv)
|
||||
{
|
||||
- const char * const opts = ":hLVc:d:p:s:vfFMZ";
|
||||
+ const char * const opts = ":hLVc:d:p:P:s:vfFMZ";
|
||||
int opt;
|
||||
|
||||
if (!zcp || !argv || !argv[0])
|
||||
@@ -275,6 +277,9 @@ zed_conf_parse_opts(struct zed_conf *zcp, int argc, char **argv)
|
||||
case 'p':
|
||||
_zed_conf_parse_path(&zcp->pid_file, optarg);
|
||||
break;
|
||||
+ case 'P':
|
||||
+ _zed_conf_parse_path(&zcp->path, optarg);
|
||||
+ break;
|
||||
case 's':
|
||||
_zed_conf_parse_path(&zcp->state_file, optarg);
|
||||
break;
|
||||
diff --git a/cmd/zed/zed_event.c b/cmd/zed/zed_event.c
|
||||
index 390235019..2a7ff16fd 100644
|
||||
--- a/cmd/zed/zed_event.c
|
||||
+++ b/cmd/zed/zed_event.c
|
||||
@@ -733,12 +733,14 @@ _zed_event_add_nvpair(uint64_t eid, zed_strings_t *zsp, nvpair_t *nvp)
|
||||
|
||||
/*
|
||||
* Restrict various environment variables to safe and sane values
|
||||
- * when constructing the environment for the child process.
|
||||
+ * when constructing the environment for the child process, unless
|
||||
+ * we're running with a custom $PATH (like under the ZFS test suite).
|
||||
*
|
||||
* Reference: Secure Programming Cookbook by Viega & Messier, Section 1.1.
|
||||
*/
|
||||
static void
|
||||
-_zed_event_add_env_restrict(uint64_t eid, zed_strings_t *zsp)
|
||||
+_zed_event_add_env_restrict(uint64_t eid, zed_strings_t *zsp,
|
||||
+ const char *path)
|
||||
{
|
||||
const char *env_restrict[][2] = {
|
||||
{ "IFS", " \t\n" },
|
||||
@@ -753,11 +755,35 @@ _zed_event_add_env_restrict(uint64_t eid, zed_strings_t *zsp)
|
||||
{ "ZFS_RELEASE", ZFS_META_RELEASE },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
+
|
||||
+ /*
|
||||
+ * If we have a custom $PATH, use the default ZFS binary locations
|
||||
+ * instead of the hard-coded ones.
|
||||
+ */
|
||||
+ const char *env_path[][2] = {
|
||||
+ { "IFS", " \t\n" },
|
||||
+ { "PATH", NULL }, /* $PATH copied in later on */
|
||||
+ { "ZDB", "zdb" },
|
||||
+ { "ZED", "zed" },
|
||||
+ { "ZFS", "zfs" },
|
||||
+ { "ZINJECT", "zinject" },
|
||||
+ { "ZPOOL", "zpool" },
|
||||
+ { "ZFS_ALIAS", ZFS_META_ALIAS },
|
||||
+ { "ZFS_VERSION", ZFS_META_VERSION },
|
||||
+ { "ZFS_RELEASE", ZFS_META_RELEASE },
|
||||
+ { NULL, NULL }
|
||||
+ };
|
||||
const char *(*pa)[2];
|
||||
|
||||
assert(zsp != NULL);
|
||||
|
||||
- for (pa = env_restrict; *(*pa); pa++) {
|
||||
+ pa = path != NULL ? env_path : env_restrict;
|
||||
+
|
||||
+ for (; *(*pa); pa++) {
|
||||
+ /* Use our custom $PATH if we have one */
|
||||
+ if (path != NULL && strcmp((*pa)[0], "PATH") == 0)
|
||||
+ (*pa)[1] = path;
|
||||
+
|
||||
_zed_event_add_var(eid, zsp, NULL, (*pa)[0], "%s", (*pa)[1]);
|
||||
}
|
||||
}
|
||||
@@ -902,7 +928,7 @@ zed_event_service(struct zed_conf *zcp)
|
||||
while ((nvp = nvlist_next_nvpair(nvl, nvp)))
|
||||
_zed_event_add_nvpair(eid, zsp, nvp);
|
||||
|
||||
- _zed_event_add_env_restrict(eid, zsp);
|
||||
+ _zed_event_add_env_restrict(eid, zsp, zcp->path);
|
||||
_zed_event_add_env_preserve(eid, zsp);
|
||||
|
||||
_zed_event_add_var(eid, zsp, ZED_VAR_PREFIX, "PID",
|
||||
diff --git a/cmd/zed/zed.d/resilver_finish-start-scrub.sh b/cmd/zed/zed.d/resilver_finish-start-scrub.sh
|
||||
new file mode 100755
|
||||
index 000000000..6f9c0b309
|
||||
--- /dev/null
|
||||
+++ b/cmd/zed/zed.d/resilver_finish-start-scrub.sh
|
||||
@@ -0,0 +1,17 @@
|
||||
+#!/bin/sh
|
||||
+# resilver_finish-start-scrub.sh
|
||||
+# Run a scrub after a resilver
|
||||
+#
|
||||
+# Exit codes:
|
||||
+# 1: Internal error
|
||||
+# 2: Script wasn't enabled in zed.rc
|
||||
+[ -f "${ZED_ZEDLET_DIR}/zed.rc" ] && . "${ZED_ZEDLET_DIR}/zed.rc"
|
||||
+. "${ZED_ZEDLET_DIR}/zed-functions.sh"
|
||||
+
|
||||
+[ "${ZED_SCRUB_AFTER_RESILVER}" = "1" ] || exit 2
|
||||
+[ -n "${ZEVENT_POOL}" ] || exit 1
|
||||
+[ -n "${ZEVENT_SUBCLASS}" ] || exit 1
|
||||
+zed_check_cmd "${ZPOOL}" || exit 1
|
||||
+
|
||||
+zed_log_msg "Starting scrub after resilver on ${ZEVENT_POOL}"
|
||||
+"${ZPOOL}" scrub "${ZEVENT_POOL}"
|
||||
diff --git a/cmd/zed/zed.d/zed.rc b/cmd/zed/zed.d/zed.rc
|
||||
index a1dd33704..8b0e476d5 100644
|
||||
--- a/cmd/zed/zed.d/zed.rc
|
||||
+++ b/cmd/zed/zed.d/zed.rc
|
||||
@@ -86,6 +86,9 @@
|
||||
#
|
||||
ZED_USE_ENCLOSURE_LEDS=1
|
||||
|
||||
+##
|
||||
+# Run a scrub after every resilver
|
||||
+#ZED_SCRUB_AFTER_RESILVER=1
|
||||
|
||||
##
|
||||
# The syslog priority (e.g., specified as a "facility.level" pair).
|
||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
||||
index 8be3e1c62..89c923db1 100644
|
||||
--- a/tests/runfiles/linux.run
|
||||
+++ b/tests/runfiles/linux.run
|
||||
@@ -421,7 +421,7 @@ tests = ['exec_001_pos', 'exec_002_neg']
|
||||
tags = ['functional', 'exec']
|
||||
|
||||
[tests/functional/fault]
|
||||
-tests = ['auto_online_001_pos', 'auto_replace_001_pos']
|
||||
+tests = ['auto_online_001_pos', 'auto_replace_001_pos', 'scrub_after_resilver']
|
||||
tags = ['functional', 'fault']
|
||||
|
||||
[tests/functional/features/async_destroy]
|
||||
diff --git a/tests/zfs-tests/include/commands.cfg b/tests/zfs-tests/include/commands.cfg
|
||||
index f6fd239de..936e54c1a 100644
|
||||
--- a/tests/zfs-tests/include/commands.cfg
|
||||
+++ b/tests/zfs-tests/include/commands.cfg
|
||||
@@ -83,6 +83,7 @@ export SYSTEM_FILES='arp
|
||||
pgrep
|
||||
ping
|
||||
pkill
|
||||
+ printenv
|
||||
printf
|
||||
ps
|
||||
pwd
|
||||
diff --git a/tests/zfs-tests/include/libtest.shlib b/tests/zfs-tests/include/libtest.shlib
|
||||
index 86f172a6d..48fb5e7c5 100644
|
||||
--- a/tests/zfs-tests/include/libtest.shlib
|
||||
+++ b/tests/zfs-tests/include/libtest.shlib
|
||||
@@ -3339,9 +3339,32 @@ function wait_replacing #pool
|
||||
done
|
||||
}
|
||||
|
||||
+#
|
||||
+# Wait for a pool to be scrubbed
|
||||
+#
|
||||
+# $1 pool name
|
||||
+# $2 number of seconds to wait (optional)
|
||||
+#
|
||||
+# Returns true when pool has been scrubbed, or false if there's a timeout or if
|
||||
+# no scrub was done.
|
||||
+#
|
||||
+function wait_scrubbed
|
||||
+{
|
||||
+ typeset pool=${1:-$TESTPOOL}
|
||||
+ typeset iter=${2:-10}
|
||||
+ for i in {1..$iter} ; do
|
||||
+ if is_pool_scrubbed $pool ; then
|
||||
+ return 0
|
||||
+ fi
|
||||
+ sleep 1
|
||||
+ done
|
||||
+ return 1
|
||||
+}
|
||||
+
|
||||
#
|
||||
# Setup custom environment for the ZED.
|
||||
#
|
||||
+# $@ Optional list of zedlets to run under zed.
|
||||
function zed_setup
|
||||
{
|
||||
if ! is_linux; then
|
||||
@@ -3359,6 +3382,7 @@ function zed_setup
|
||||
if [[ -e $VDEVID_CONF_ETC ]]; then
|
||||
log_fail "Must not have $VDEVID_CONF_ETC file present on system"
|
||||
fi
|
||||
+ EXTRA_ZEDLETS=$@
|
||||
|
||||
# Create a symlink for /etc/zfs/vdev_id.conf file.
|
||||
log_must ln -s $VDEVID_CONF $VDEVID_CONF_ETC
|
||||
@@ -3368,32 +3392,44 @@ function zed_setup
|
||||
log_must cp ${ZEDLET_ETC_DIR}/zed.rc $ZEDLET_DIR
|
||||
log_must cp ${ZEDLET_ETC_DIR}/zed-functions.sh $ZEDLET_DIR
|
||||
|
||||
+ # Scripts must only be user writable.
|
||||
+ if [[ -n "$EXTRA_ZEDLETS" ]] ; then
|
||||
+ saved_umask=$(umask)
|
||||
+ log_must umask 0022
|
||||
+ for i in $EXTRA_ZEDLETS ; do
|
||||
+ log_must cp ${ZEDLET_LIBEXEC_DIR}/$i $ZEDLET_DIR
|
||||
+ done
|
||||
+ log_must umask $saved_umask
|
||||
+ fi
|
||||
+
|
||||
# Customize the zed.rc file to enable the full debug log.
|
||||
log_must sed -i '/\#ZED_DEBUG_LOG=.*/d' $ZEDLET_DIR/zed.rc
|
||||
echo "ZED_DEBUG_LOG=$ZED_DEBUG_LOG" >>$ZEDLET_DIR/zed.rc
|
||||
|
||||
- # Scripts must only be user writable.
|
||||
- saved_umask=$(umask)
|
||||
- log_must umask 0022
|
||||
- log_must cp ${ZEDLET_LIBEXEC_DIR}/all-syslog.sh $ZEDLET_DIR
|
||||
- log_must cp ${ZEDLET_LIBEXEC_DIR}/all-debug.sh $ZEDLET_DIR
|
||||
- log_must umask $saved_umask
|
||||
}
|
||||
|
||||
#
|
||||
# Cleanup custom ZED environment.
|
||||
#
|
||||
+# $@ Optional list of zedlets to remove from our test zed.d directory.
|
||||
function zed_cleanup
|
||||
{
|
||||
if ! is_linux; then
|
||||
return
|
||||
fi
|
||||
+ EXTRA_ZEDLETS=$@
|
||||
|
||||
log_must rm -f ${ZEDLET_DIR}/zed.rc
|
||||
log_must rm -f ${ZEDLET_DIR}/zed-functions.sh
|
||||
log_must rm -f ${ZEDLET_DIR}/all-syslog.sh
|
||||
log_must rm -f ${ZEDLET_DIR}/all-debug.sh
|
||||
log_must rm -f ${ZEDLET_DIR}/state
|
||||
+
|
||||
+ if [[ -n "$EXTRA_ZEDLETS" ]] ; then
|
||||
+ for i in $EXTRA_ZEDLETS ; do
|
||||
+ log_must rm -f ${ZEDLET_DIR}/$i
|
||||
+ done
|
||||
+ fi
|
||||
log_must rm -f $ZED_LOG
|
||||
log_must rm -f $ZED_DEBUG_LOG
|
||||
log_must rm -f $VDEVID_CONF_ETC
|
||||
@@ -3425,7 +3461,7 @@ function zed_start
|
||||
# run ZED in the background and redirect foreground logging
|
||||
# output to $ZED_LOG.
|
||||
log_must truncate -s 0 $ZED_DEBUG_LOG
|
||||
- log_must eval "zed -vF -d $ZEDLET_DIR -p $ZEDLET_DIR/zed.pid" \
|
||||
+ log_must eval "zed -vF -d $ZEDLET_DIR -p $ZEDLET_DIR/zed.pid -P $PATH" \
|
||||
"-s $ZEDLET_DIR/state 2>$ZED_LOG &"
|
||||
|
||||
return 0
|
||||
diff --git a/tests/zfs-tests/tests/functional/events/cleanup.ksh b/tests/zfs-tests/tests/functional/events/cleanup.ksh
|
||||
index bc536e260..4905342b7 100755
|
||||
--- a/tests/zfs-tests/tests/functional/events/cleanup.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/events/cleanup.ksh
|
||||
@@ -26,6 +26,6 @@
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
|
||||
-zed_cleanup
|
||||
+zed_cleanup all-debug.sh all-syslog.sh
|
||||
|
||||
default_cleanup
|
||||
diff --git a/tests/zfs-tests/tests/functional/events/setup.ksh b/tests/zfs-tests/tests/functional/events/setup.ksh
|
||||
index 7113c1f39..2f81d16b1 100755
|
||||
--- a/tests/zfs-tests/tests/functional/events/setup.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/events/setup.ksh
|
||||
@@ -28,6 +28,6 @@
|
||||
|
||||
DISK=${DISKS%% *}
|
||||
|
||||
-zed_setup
|
||||
+zed_setup all-debug.sh all-syslog.sh
|
||||
|
||||
default_setup $DISK
|
||||
diff --git a/tests/zfs-tests/tests/functional/fault/cleanup.ksh b/tests/zfs-tests/tests/functional/fault/cleanup.ksh
|
||||
index f39f05d6f..d3de742b3 100755
|
||||
--- a/tests/zfs-tests/tests/functional/fault/cleanup.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/fault/cleanup.ksh
|
||||
@@ -31,7 +31,7 @@ verify_runnable "global"
|
||||
cleanup_devices $DISKS
|
||||
|
||||
zed_stop
|
||||
-zed_cleanup
|
||||
+zed_cleanup resilver_finish-start-scrub.sh
|
||||
|
||||
SD=$(lsscsi | nawk '/scsi_debug/ {print $6; exit}')
|
||||
SDDEVICE=$(echo $SD | nawk -F / '{print $3}')
|
||||
diff --git a/tests/zfs-tests/tests/functional/fault/scrub_after_resilver.ksh b/tests/zfs-tests/tests/functional/fault/scrub_after_resilver.ksh
|
||||
new file mode 100755
|
||||
index 000000000..558cb065f
|
||||
--- /dev/null
|
||||
+++ b/tests/zfs-tests/tests/functional/fault/scrub_after_resilver.ksh
|
||||
@@ -0,0 +1,65 @@
|
||||
+#!/bin/ksh -p
|
||||
+#
|
||||
+# This file and its contents are supplied under the terms of the
|
||||
+# Common Development and Distribution License ("CDDL"), version 1.0.
|
||||
+# You may only use this file in accordance with the terms of version
|
||||
+# 1.0 of the CDDL.
|
||||
+#
|
||||
+# A full copy of the text of the CDDL should have accompanied this
|
||||
+# source. A copy of the CDDL is also available via the Internet at
|
||||
+# http://www.illumos.org/license/CDDL.
|
||||
+#
|
||||
+
|
||||
+#
|
||||
+# Copyright (c) 2018 by Lawrence Livermore National Security, LLC.
|
||||
+# All rights reserved.
|
||||
+#
|
||||
+
|
||||
+. $STF_SUITE/include/libtest.shlib
|
||||
+. $STF_SUITE/tests/functional/fault/fault.cfg
|
||||
+
|
||||
+#
|
||||
+# DESCRIPTION:
|
||||
+# Test the scrub after resilver zedlet
|
||||
+#
|
||||
+# STRATEGY:
|
||||
+# 1. Create a mirrored pool
|
||||
+# 2. Fault a disk
|
||||
+# 3. Replace the disk, starting a resilver
|
||||
+# 4. Verify that a scrub happens after the resilver finishes
|
||||
+#
|
||||
+
|
||||
+log_assert "Testing the scrub after resilver zedlet"
|
||||
+
|
||||
+# Backup our zed.rc
|
||||
+zedrc_backup="$(mktemp)"
|
||||
+log_must cp $ZEDLET_DIR/zed.rc $zedrc_backup
|
||||
+
|
||||
+# Enable ZED_SCRUB_AFTER_RESILVER
|
||||
+eval "sed -i 's/\#ZED_SCRUB_AFTER_RESILVER/ZED_SCRUB_AFTER_RESILVER/g' $ZEDLET_DIR/zed.rc"
|
||||
+
|
||||
+function cleanup
|
||||
+{
|
||||
+ # Restore our zed.rc
|
||||
+ log_must mv $zedrc_backup $ZEDLET_DIR/zed.rc
|
||||
+ default_cleanup_noexit
|
||||
+}
|
||||
+
|
||||
+log_onexit cleanup
|
||||
+
|
||||
+verify_disk_count "$DISKS" 3
|
||||
+default_mirror_setup_noexit $DISK1 $DISK2
|
||||
+
|
||||
+log_must zpool offline -f $TESTPOOL $DISK1
|
||||
+
|
||||
+# Write to our degraded pool so we have some data to resilver
|
||||
+log_must mkfile 16M $TESTDIR/file1
|
||||
+
|
||||
+# Replace the failed disks, forcing a resilver
|
||||
+log_must zpool replace $TESTPOOL $DISK1 $DISK3
|
||||
+
|
||||
+# Wait for the resilver to finish, and then the subsequent scrub to finish.
|
||||
+# Waiting for the scrub has the effect of waiting for both. Timeout after 10
|
||||
+# seconds if nothing is happening.
|
||||
+log_must wait_scrubbed $TESTPOOL 10
|
||||
+log_pass "Successfully ran the scrub after resilver zedlet"
|
||||
diff --git a/tests/zfs-tests/tests/functional/fault/setup.ksh b/tests/zfs-tests/tests/functional/fault/setup.ksh
|
||||
index 3d54d4f21..484bc4587 100755
|
||||
--- a/tests/zfs-tests/tests/functional/fault/setup.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/fault/setup.ksh
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
-zed_setup
|
||||
+zed_setup resilver_finish-start-scrub.sh
|
||||
zed_start
|
||||
|
||||
# Create a scsi_debug device to be used with auto-online (if using loop devices)
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Tue, 27 Feb 2018 09:31:27 -0800
|
||||
Subject: [PATCH] Add SMART self-test results to zpool status -c
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add in SMART self-test results to zpool status|iostat -c. This
|
||||
works for both SAS and SATA drives.
|
||||
|
||||
Also, add plumbing to allow the 'smart' script to take smartctl
|
||||
output from a directory of output text files instead of running
|
||||
it against the vdevs.
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Closes #7178
|
||||
(cherry picked from commit 5e3085e360161456fe2af697494c479de0ee2085)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/zpool/Makefile.am | 14 ++++-
|
||||
cmd/zpool/zpool.d/smart | 132 +++++++++++++++++++++++++++++++++++-----
|
||||
cmd/zpool/zpool.d/smart_test | 1 +
|
||||
cmd/zpool/zpool.d/test_ended | 1 +
|
||||
cmd/zpool/zpool.d/test_progress | 1 +
|
||||
cmd/zpool/zpool.d/test_status | 1 +
|
||||
cmd/zpool/zpool.d/test_type | 1 +
|
||||
7 files changed, 133 insertions(+), 18 deletions(-)
|
||||
create mode 120000 cmd/zpool/zpool.d/smart_test
|
||||
create mode 120000 cmd/zpool/zpool.d/test_ended
|
||||
create mode 120000 cmd/zpool/zpool.d/test_progress
|
||||
create mode 120000 cmd/zpool/zpool.d/test_status
|
||||
create mode 120000 cmd/zpool/zpool.d/test_type
|
||||
|
||||
diff --git a/cmd/zpool/Makefile.am b/cmd/zpool/Makefile.am
|
||||
index c7b8b76e3..d07f8d616 100644
|
||||
--- a/cmd/zpool/Makefile.am
|
||||
+++ b/cmd/zpool/Makefile.am
|
||||
@@ -63,7 +63,12 @@ dist_zpoolexec_SCRIPTS = \
|
||||
zpool.d/nvme_err \
|
||||
zpool.d/pwr_cyc \
|
||||
zpool.d/upath \
|
||||
- zpool.d/vendor
|
||||
+ zpool.d/vendor \
|
||||
+ zpool.d/smart_test \
|
||||
+ zpool.d/test_type \
|
||||
+ zpool.d/test_status \
|
||||
+ zpool.d/test_progress \
|
||||
+ zpool.d/test_ended
|
||||
|
||||
zpoolconfdefaults = \
|
||||
enc \
|
||||
@@ -102,7 +107,12 @@ zpoolconfdefaults = \
|
||||
nvme_err \
|
||||
pwr_cyc \
|
||||
upath \
|
||||
- vendor
|
||||
+ vendor \
|
||||
+ smart_test \
|
||||
+ test_type \
|
||||
+ test_status \
|
||||
+ test_progress \
|
||||
+ test_ended
|
||||
|
||||
install-data-hook:
|
||||
$(MKDIR_P) "$(DESTDIR)$(zpoolconfdir)"
|
||||
diff --git a/cmd/zpool/zpool.d/smart b/cmd/zpool/zpool.d/smart
|
||||
index 4bc3af39d..64b5f6e4e 100755
|
||||
--- a/cmd/zpool/zpool.d/smart
|
||||
+++ b/cmd/zpool/zpool.d/smart
|
||||
@@ -24,8 +24,44 @@ ata_err: Show SMART ATA errors (ATA).
|
||||
pwr_cyc: Show SMART power cycle count (ATA).
|
||||
serial: Show disk serial number.
|
||||
nvme_err: Show SMART NVMe errors (NVMe).
|
||||
+smart_test: Show SMART self-test results summary.
|
||||
+test_type: Show SMART self-test type (short, long... ).
|
||||
+test_status: Show SMART self-test status.
|
||||
+test_progress: Show SMART self-test percentage done.
|
||||
+test_ended: Show when the last SMART self-test ended (if supported).
|
||||
"
|
||||
|
||||
+# Hack for developer testing
|
||||
+#
|
||||
+# If you set $samples to a directory containing smartctl output text files,
|
||||
+# we will use them instead of running smartctl on the vdevs. This can be
|
||||
+# useful if you want to test a bunch of different smartctl outputs. Also, if
|
||||
+# $samples is set, and additional 'file' column is added to the zpool output
|
||||
+# showing the filename.
|
||||
+samples=
|
||||
+
|
||||
+# get_filename_from_dir DIR
|
||||
+#
|
||||
+# Look in directory DIR and return a filename from it. The filename returned
|
||||
+# is chosen quasi-sequentially (based off our PID). This allows us to return
|
||||
+# a different filename every time this script is invoked (which we do for each
|
||||
+# vdev), without having to maintain state.
|
||||
+get_filename_from_dir()
|
||||
+{
|
||||
+ dir=$1
|
||||
+ pid="$$"
|
||||
+ num_files=$(find "$dir" -maxdepth 1 -type f | wc -l)
|
||||
+ mod=$((pid % num_files))
|
||||
+ i=0
|
||||
+ find "$dir" -type f -printf "%f\n" | while read -r file ; do
|
||||
+ if [ "$mod" = "$i" ] ; then
|
||||
+ echo "$file"
|
||||
+ break
|
||||
+ fi
|
||||
+ i=$((i+1))
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
script=$(basename "$0")
|
||||
|
||||
if [ "$1" = "-h" ] ; then
|
||||
@@ -35,8 +71,16 @@ fi
|
||||
|
||||
smartctl_path=$(which smartctl)
|
||||
|
||||
-if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
- raw_out=$(eval "sudo $smartctl_path -a $VDEV_UPATH")
|
||||
+if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ] || [ -n "$samples" ] ; then
|
||||
+ if [ -n "$samples" ] ; then
|
||||
+ # cat a smartctl output text file instead of running smartctl
|
||||
+ # on a vdev (only used for developer testing).
|
||||
+ file=$(get_filename_from_dir $samples)
|
||||
+ echo "file=$file"
|
||||
+ raw_out=$(cat "$samples/$file")
|
||||
+ else
|
||||
+ raw_out=$(eval "sudo $smartctl_path -a $VDEV_UPATH")
|
||||
+ fi
|
||||
|
||||
# What kind of drive are we? Look for the right line in smartctl:
|
||||
#
|
||||
@@ -49,7 +93,6 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
# NVMe:
|
||||
# SMART/Health Information (NVMe Log 0xnn, NSID 0xnn)
|
||||
#
|
||||
- type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|NVMe|SAS$')
|
||||
out=$(echo "$raw_out" | awk '
|
||||
# SAS specific
|
||||
/read:/{print "rrd="$4"\nr_cor="$5"\nr_proc="$7"\nr_ucor="$8}
|
||||
@@ -58,10 +101,11 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
/Elements in grown defect list/{print "defect="$6}
|
||||
|
||||
# SAS common
|
||||
+/SAS/{type="sas"}
|
||||
/Drive Temperature:/{print "temp="$4}
|
||||
# Status can be a long string, substitute spaces for '_'
|
||||
/SMART Health Status:/{printf "health="; for(i=4;i<=NF-1;i++){printf "%s_", $i}; printf "%s\n", $i}
|
||||
-/number of hours powered up/{print "hours_on="$7}
|
||||
+/number of hours powered up/{print "hours_on="$7; hours_on=int($7)}
|
||||
/Serial number:/{print "serial="$3}
|
||||
|
||||
# SATA specific
|
||||
@@ -74,13 +118,16 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
/Power_Cycle_Count/{print "pwr_cyc="$10}
|
||||
|
||||
# SATA common
|
||||
+/SATA/{type="sata"}
|
||||
/Temperature_Celsius/{print "temp="$10}
|
||||
/Airflow_Temperature_Cel/{print "temp="$10}
|
||||
+/Current Temperature:/{print "temp="$3}
|
||||
/SMART overall-health self-assessment test result:/{print "health="$6}
|
||||
-/Power_On_Hours/{print "hours_on="$10}
|
||||
+/Power_On_Hours/{print "hours_on="$10; hours_on=int($10)}
|
||||
/Serial Number:/{print "serial="$3}
|
||||
|
||||
# NVMe common
|
||||
+/NVMe/{type="nvme"}
|
||||
/Temperature:/{print "temp="$2}
|
||||
/SMART overall-health self-assessment test result:/{print "health="$6}
|
||||
/Power On Hours:/{gsub("[^0-9]","",$4); print "hours_on="$4}
|
||||
@@ -90,39 +137,92 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
|
||||
# NVMe specific
|
||||
/Media and Data Integrity Errors:/{print "nvme_err="$6}
|
||||
|
||||
-END {ORS="\n"; print ""}
|
||||
+# SMART self-test info
|
||||
+/Self-test execution status:/{progress=tolower($4)} # SAS
|
||||
+/SMART Self-test log/{test_seen=1} # SAS
|
||||
+/SMART Extended Self-test Log/{test_seen=1} # SATA
|
||||
+/# 1/{
|
||||
+ test_type=tolower($3"_"$4);
|
||||
+ # Status could be one word ("Completed") or multiple ("Completed: read
|
||||
+ # failure"). Look for the ":" to see if we need to grab more words.
|
||||
+
|
||||
+ if ($5 ~ ":")
|
||||
+ status=tolower($5""$6"_"$7)
|
||||
+ else
|
||||
+ status=tolower($5)
|
||||
+ if (status=="self")
|
||||
+ status="running";
|
||||
+
|
||||
+ if (type == "sas") {
|
||||
+ hours=int($(NF-4))
|
||||
+ } else {
|
||||
+ hours=int($(NF-1))
|
||||
+ # SATA reports percent remaining, rather than percent done
|
||||
+ # Convert it to percent done.
|
||||
+ progress=(100-int($(NF-2)))"%"
|
||||
+ }
|
||||
+ # When we int()-ify "hours", it converts stuff like "NOW" and "-" into
|
||||
+ # 0. In those cases, set it to hours_on, so they will cancel out in
|
||||
+ # the "hours_ago" calculation later on.
|
||||
+ if (hours == 0)
|
||||
+ hours=hours_on
|
||||
+
|
||||
+ if (test_seen) {
|
||||
+ print "test="hours_on
|
||||
+ print "test_type="test_type
|
||||
+ print "test_status="status
|
||||
+ print "test_progress="progress
|
||||
+ }
|
||||
+ # Not all drives report hours_on
|
||||
+ if (hours_on && hours) {
|
||||
+ total_hours_ago=(hours_on-hours)
|
||||
+ days_ago=int(total_hours_ago/24)
|
||||
+ hours_ago=(total_hours_ago % 24)
|
||||
+ if (days_ago != 0)
|
||||
+ ago_str=days_ago"d"
|
||||
+ if (hours_ago !=0)
|
||||
+ ago_str=ago_str""hours_ago"h"
|
||||
+ print "test_ended="ago_str
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+END {print "type="type; ORS="\n"; print ""}
|
||||
');
|
||||
fi
|
||||
+type=$(echo "$out" | grep '^type=' | cut -d '=' -f 2)
|
||||
|
||||
-# if type is not set by now, either we don't have a block device
|
||||
-# or smartctl failed. Either way, default to ATA and set out to
|
||||
-# nothing
|
||||
+# If type is not set by now, either we don't have a block device
|
||||
+# or smartctl failed. Either way, default to ATA and set $out to
|
||||
+# nothing.
|
||||
if [ -z "$type" ]; then
|
||||
- type="ATA"
|
||||
+ type="sata"
|
||||
out=
|
||||
fi
|
||||
|
||||
case $script in
|
||||
smart)
|
||||
# Print temperature plus common predictors of drive failure
|
||||
- if [ "$type" = "SAS" ] ; then
|
||||
+ if [ "$type" = "sas" ] ; then
|
||||
scripts="temp|health|r_ucor|w_ucor"
|
||||
- elif [ "$type" = "ATA" ] ; then
|
||||
+ elif [ "$type" = "sata" ] ; then
|
||||
scripts="temp|health|ata_err|realloc|rep_ucor|cmd_to|pend_sec|off_ucor"
|
||||
- elif [ "$type" = "NVMe" ] ; then
|
||||
+ elif [ "$type" = "nvme" ] ; then
|
||||
scripts="temp|health|nvme_err"
|
||||
fi
|
||||
;;
|
||||
smartx)
|
||||
# Print some other interesting stats
|
||||
- if [ "$type" = "SAS" ] ; then
|
||||
+ if [ "$type" = "sas" ] ; then
|
||||
scripts="hours_on|defect|nonmed|r_proc|w_proc"
|
||||
- elif [ "$type" = "ATA" ] ; then
|
||||
+ elif [ "$type" = "sata" ] ; then
|
||||
scripts="hours_on|pwr_cyc"
|
||||
- elif [ "$type" = "NVMe" ] ; then
|
||||
+ elif [ "$type" = "nvme" ] ; then
|
||||
scripts="hours_on|pwr_cyc"
|
||||
fi
|
||||
;;
|
||||
+smart_test)
|
||||
+ scripts="test_type|test_status|test_progress|test_ended"
|
||||
+ ;;
|
||||
*)
|
||||
scripts="$script"
|
||||
esac
|
||||
diff --git a/cmd/zpool/zpool.d/smart_test b/cmd/zpool/zpool.d/smart_test
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/smart_test
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
diff --git a/cmd/zpool/zpool.d/test_ended b/cmd/zpool/zpool.d/test_ended
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/test_ended
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
diff --git a/cmd/zpool/zpool.d/test_progress b/cmd/zpool/zpool.d/test_progress
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/test_progress
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
diff --git a/cmd/zpool/zpool.d/test_status b/cmd/zpool/zpool.d/test_status
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/test_status
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
diff --git a/cmd/zpool/zpool.d/test_type b/cmd/zpool/zpool.d/test_type
|
||||
new file mode 120000
|
||||
index 000000000..94f22861f
|
||||
--- /dev/null
|
||||
+++ b/cmd/zpool/zpool.d/test_type
|
||||
@@ -0,0 +1 @@
|
||||
+smart
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
|
||||
Date: Thu, 1 Mar 2018 01:54:53 +0900
|
||||
Subject: [PATCH] Fix zpool(8) list example to match actual format
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
a05dfd00 (Illumos 5147) has swapped FRAG and EXPANDSZ,
|
||||
so it's natural to modify these examples.
|
||||
|
||||
# zpool list | head -1
|
||||
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
|
||||
Closes #7244
|
||||
(cherry picked from commit bcaba38e428be8dc90564d15c7e13f154c535edd)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
man/man8/zpool.8 | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/man/man8/zpool.8 b/man/man8/zpool.8
|
||||
index 22579101a..7c99f5868 100644
|
||||
--- a/man/man8/zpool.8
|
||||
+++ b/man/man8/zpool.8
|
||||
@@ -2087,10 +2087,10 @@ is faulted due to a missing device.
|
||||
The results from this command are similar to the following:
|
||||
.Bd -literal
|
||||
# zpool list
|
||||
-NAME SIZE ALLOC FREE FRAG EXPANDSZ CAP DEDUP HEALTH ALTROOT
|
||||
-rpool 19.9G 8.43G 11.4G 33% - 42% 1.00x ONLINE -
|
||||
-tank 61.5G 20.0G 41.5G 48% - 32% 1.00x ONLINE -
|
||||
-zion - - - - - - - FAULTED -
|
||||
+NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
+rpool 19.9G 8.43G 11.4G - 33% 42% 1.00x ONLINE -
|
||||
+tank 61.5G 20.0G 41.5G - 48% 32% 1.00x ONLINE -
|
||||
+zion - - - - - - - FAULTED -
|
||||
.Ed
|
||||
.It Sy Example 7 No Destroying a ZFS Storage Pool
|
||||
The following command destroys the pool
|
||||
@@ -2215,12 +2215,12 @@ In this example, the pool will not be able to utilize this extra capacity until
|
||||
all the devices under the raidz vdev have been expanded.
|
||||
.Bd -literal
|
||||
# zpool list -v data
|
||||
-NAME SIZE ALLOC FREE FRAG EXPANDSZ CAP DEDUP HEALTH ALTROOT
|
||||
-data 23.9G 14.6G 9.30G 48% - 61% 1.00x ONLINE -
|
||||
- raidz1 23.9G 14.6G 9.30G 48% -
|
||||
- sda - - - - -
|
||||
- sdb - - - - 10G
|
||||
- sdc - - - - -
|
||||
+NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
+data 23.9G 14.6G 9.30G - 48% 61% 1.00x ONLINE -
|
||||
+ raidz1 23.9G 14.6G 9.30G - 48%
|
||||
+ sda - - - - -
|
||||
+ sdb - - - 10G -
|
||||
+ sdc - - - - -
|
||||
.Ed
|
||||
.It Sy Example 16 No Adding output columns
|
||||
Additional columns can be added to the
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: John Eismeier <32205350+jeis2497052@users.noreply.github.com>
|
||||
Date: Wed, 28 Feb 2018 11:57:10 -0500
|
||||
Subject: [PATCH] Fix some typos
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed by: George Melikov <mail@gmelikov.ru>
|
||||
Signed-off-by: John Eismeier <john.eismeier@gmail.com>
|
||||
Closes #7237
|
||||
(cherry picked from commit 33bb1e82568a9734cc3f41d3e1d33003ebf0e123)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
cmd/arcstat/arcstat.py | 4 ++--
|
||||
cmd/dbufstat/dbufstat.py | 4 ++--
|
||||
contrib/initramfs/scripts/zfs | 2 +-
|
||||
man/man8/zpool.8 | 2 +-
|
||||
tests/zfs-tests/tests/functional/migration/migration_001_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_002_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_003_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_004_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_005_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_006_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_007_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_008_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_009_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_010_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_011_pos.ksh | 4 ++--
|
||||
tests/zfs-tests/tests/functional/migration/migration_012_pos.ksh | 4 ++--
|
||||
16 files changed, 30 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/cmd/arcstat/arcstat.py b/cmd/arcstat/arcstat.py
|
||||
index aa54ee87a..85c83ccc4 100755
|
||||
--- a/cmd/arcstat/arcstat.py
|
||||
+++ b/cmd/arcstat/arcstat.py
|
||||
@@ -280,7 +280,7 @@ def init():
|
||||
"outfile",
|
||||
"help",
|
||||
"verbose",
|
||||
- "seperator",
|
||||
+ "separator",
|
||||
"columns"
|
||||
]
|
||||
)
|
||||
@@ -299,7 +299,7 @@ def init():
|
||||
hflag = True
|
||||
if opt in ('-v', '--verbose'):
|
||||
vflag = True
|
||||
- if opt in ('-s', '--seperator'):
|
||||
+ if opt in ('-s', '--separator'):
|
||||
sep = arg
|
||||
i += 1
|
||||
if opt in ('-f', '--columns'):
|
||||
diff --git a/cmd/dbufstat/dbufstat.py b/cmd/dbufstat/dbufstat.py
|
||||
index dda0a143f..42bb0c7c7 100755
|
||||
--- a/cmd/dbufstat/dbufstat.py
|
||||
+++ b/cmd/dbufstat/dbufstat.py
|
||||
@@ -474,7 +474,7 @@ def main():
|
||||
"help",
|
||||
"infile",
|
||||
"outfile",
|
||||
- "seperator",
|
||||
+ "separator",
|
||||
"types",
|
||||
"verbose",
|
||||
"extended"
|
||||
@@ -499,7 +499,7 @@ def main():
|
||||
ofile = arg
|
||||
if opt in ('-r', '--raw'):
|
||||
raw += 1
|
||||
- if opt in ('-s', '--seperator'):
|
||||
+ if opt in ('-s', '--separator'):
|
||||
sep = arg
|
||||
if opt in ('-t', '--types'):
|
||||
tflag = True
|
||||
diff --git a/contrib/initramfs/scripts/zfs b/contrib/initramfs/scripts/zfs
|
||||
index 8770a2e8e..86329e764 100644
|
||||
--- a/contrib/initramfs/scripts/zfs
|
||||
+++ b/contrib/initramfs/scripts/zfs
|
||||
@@ -478,7 +478,7 @@ destroy_fs()
|
||||
echo "Message: $ZFS_STDERR"
|
||||
echo "Error: $ZFS_ERROR"
|
||||
echo ""
|
||||
- echo "Failed to destroy '$fs'. Please make sure that '$fs' is not availible."
|
||||
+ echo "Failed to destroy '$fs'. Please make sure that '$fs' is not available."
|
||||
echo "Hint: Try: zfs destroy -Rfn $fs"
|
||||
echo "If this dryrun looks good, then remove the 'n' from '-Rfn' and try again."
|
||||
/bin/sh
|
||||
diff --git a/man/man8/zpool.8 b/man/man8/zpool.8
|
||||
index 7c99f5868..6d7c2271c 100644
|
||||
--- a/man/man8/zpool.8
|
||||
+++ b/man/man8/zpool.8
|
||||
@@ -733,7 +733,7 @@ man page. In order to enable this property each host must set a unique hostid.
|
||||
See
|
||||
.Xr genhostid 1
|
||||
.Xr zgenhostid 8
|
||||
-.Xr spl-module-paramters 5
|
||||
+.Xr spl-module-parameters 5
|
||||
for additional details. The default value is
|
||||
.Sy off .
|
||||
.It Sy version Ns = Ns Ar version
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_001_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_001_pos.ksh
|
||||
index 4d5fbb9ff..875d2f7c7 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_001_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_001_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "tar cf $TESTDIR/tar$$.tar $BNAME"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "tar xf $TESTDIR/tar$$.tar"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_002_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_002_pos.ksh
|
||||
index e0655248d..6b97e2a40 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_002_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_002_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "tar cf $TESTDIR/tar$$.tar $BNAME"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $NONZFS_TESTDIR $SUMA $SUMB "tar xf $TESTDIR/tar$$.tar"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to UFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to UFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to UFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_003_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_003_pos.ksh
|
||||
index 904a2b1a0..dd0baeaa9 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_003_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_003_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "tar cf $NONZFS_TESTDIR/tar$$.tar $BNAME"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "tar xvf $NONZFS_TESTDIR/tar$$.tar"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"UFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from UFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from UFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_004_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_004_pos.ksh
|
||||
index 6d33dd5b3..00a6cc172 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_004_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_004_pos.ksh
|
||||
@@ -67,7 +67,7 @@ cd $cwd
|
||||
(( $? != 0 )) && log_untested "Could not change directory to $cwd"
|
||||
|
||||
migrate_cpio $TESTDIR "$TESTDIR/cpio$$.cpio" $SUMA $SUMB
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_005_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_005_pos.ksh
|
||||
index a41b19b5f..4386596f7 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_005_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_005_pos.ksh
|
||||
@@ -67,7 +67,7 @@ cd $cwd
|
||||
(( $? != 0 )) && log_untested "Could not change directory to $cwd"
|
||||
|
||||
migrate_cpio $NONZFS_TESTDIR "$TESTDIR/cpio$$.cpio" $SUMA $SUMB
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to UFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to UFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to UFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_006_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_006_pos.ksh
|
||||
index 5b444421a..9b5c9166e 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_006_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_006_pos.ksh
|
||||
@@ -67,7 +67,7 @@ cd $cwd
|
||||
(( $? != 0 )) && log_untested "Could not change directory to $cwd"
|
||||
|
||||
migrate_cpio $TESTDIR "$NONZFS_TESTDIR/cpio$$.cpio" $SUMA $SUMB
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from UFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from UFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_007_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_007_pos.ksh
|
||||
index c3197052c..0d136550f 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_007_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_007_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "dd if=$BNAME obs=128k of=$TESTDIR/dd$$.dd"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "dd if=$TESTDIR/dd$$.dd obs=128k of=$BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_008_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_008_pos.ksh
|
||||
index 2e51eef36..f62b1f33a 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_008_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_008_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "dd if=$BNAME obs=128k of=$TESTDIR/dd$$.dd"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $NONZFS_TESTDIR $SUMA $SUMB "dd if=$TESTDIR/dd$$.dd obs=128k of=$BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to UFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to UFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_009_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_009_pos.ksh
|
||||
index 7749494e5..907be39eb 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_009_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_009_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "dd if=$BNAME obs=128k of=$NONZFS_TESTDIR/dd$$.dd"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "dd if=$NONZFS_TESTDIR/dd$$.dd obs=128k of=$BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from UFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from UFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_010_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_010_pos.ksh
|
||||
index a11ab72df..e80dd67cd 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_010_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_010_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "cp $BNAME $TESTDIR/cp$$.cp"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "cp $TESTDIR/cp$$.cp $BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to ZFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_011_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_011_pos.ksh
|
||||
index 17e1c78f9..2d7ecb45e 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_011_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_011_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "cp $BNAME $TESTDIR/cp$$.cp"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $NONZFS_TESTDIR $SUMA $SUMB "cp $TESTDIR/cp$$.cp $BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"ZFS fs to UFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from ZFS fs to UFS fs".
|
||||
+log_pass "Successfully migrated test file from ZFS fs to UFS fs".
|
||||
diff --git a/tests/zfs-tests/tests/functional/migration/migration_012_pos.ksh b/tests/zfs-tests/tests/functional/migration/migration_012_pos.ksh
|
||||
index 823dabeae..fd9c45491 100755
|
||||
--- a/tests/zfs-tests/tests/functional/migration/migration_012_pos.ksh
|
||||
+++ b/tests/zfs-tests/tests/functional/migration/migration_012_pos.ksh
|
||||
@@ -60,7 +60,7 @@ prepare $DNAME "cp $BNAME $NONZFS_TESTDIR/cp$$.cp"
|
||||
(( $? != 0 )) && log_fail "Unable to create src archive"
|
||||
|
||||
migrate $TESTDIR $SUMA $SUMB "cp $NONZFS_TESTDIR/cp$$.cp $BNAME"
|
||||
-(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \
|
||||
+(( $? != 0 )) && log_fail "Unable to successfully migrate test file from" \
|
||||
"UFS fs to ZFS fs"
|
||||
|
||||
-log_pass "Successully migrated test file from UFS fs to ZFS fs".
|
||||
+log_pass "Successfully migrated test file from UFS fs to ZFS fs".
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: chrisrd <chris@onthe.net.au>
|
||||
Date: Sat, 3 Mar 2018 05:01:53 +1100
|
||||
Subject: [PATCH] Increment zil_itx_needcopy_bytes properly
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In zil_lwb_commit() with TX_WRITE, we copy the log write record (lrw)
|
||||
into the log write block (lwb) and send it off using zil_lwb_add_txg().
|
||||
If we also have WR_NEED_COPY, we additionally copy the lwr's data into
|
||||
the lwb to be sent off. If the lwr + data doesn't fit into the lwb, we
|
||||
send the lrw and as much data as will fit (dnow bytes), then go back
|
||||
and do the same with the remaining data.
|
||||
|
||||
Each time through this loop we're sending dnow data bytes. I.e.
|
||||
zil_itx_needcopy_bytes should be incremented by dnow.
|
||||
|
||||
Reviewed-by: Richard Elling <Richard.Elling@RichardElling.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Signed-off-by: Chris Dunlop <chris@onthe.net.au>
|
||||
Closes #6988
|
||||
Closes #7176
|
||||
(cherry picked from commit 792f88131c647a70440c709c78d43210db6c6534)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
module/zfs/zil.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/module/zfs/zil.c b/module/zfs/zil.c
|
||||
index 4d714cefc..645b1d4d8 100644
|
||||
--- a/module/zfs/zil.c
|
||||
+++ b/module/zfs/zil.c
|
||||
@@ -1167,8 +1167,7 @@ cont:
|
||||
lrw->lr_offset += dnow;
|
||||
lrw->lr_length -= dnow;
|
||||
ZIL_STAT_BUMP(zil_itx_needcopy_count);
|
||||
- ZIL_STAT_INCR(zil_itx_needcopy_bytes,
|
||||
- lrw->lr_length);
|
||||
+ ZIL_STAT_INCR(zil_itx_needcopy_bytes, dnow);
|
||||
} else {
|
||||
ASSERT(itx->itx_wr_state == WR_INDIRECT);
|
||||
dbuf = NULL;
|
||||
--
|
||||
2.14.2
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Hutter <hutter2@llnl.gov>
|
||||
Date: Sun, 4 Mar 2018 17:34:51 -0800
|
||||
Subject: [PATCH] Change checksum & IO delay ratelimit values
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Change checksum & IO delay ratelimit thresholds from 5/sec to 20/sec.
|
||||
This allows zed to actually trigger if a bunch of these events arrive in
|
||||
a short period of time (zed has a threshold of 10 events in 10 sec).
|
||||
Previously, if you had, say, 100 checksum errors in 1 sec, it would get
|
||||
ratelimited to 5/sec which wouldn't trigger zed to fault the drive.
|
||||
|
||||
Also, convert the checksum and IO delay thresholds to module params for
|
||||
easy testing.
|
||||
|
||||
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
|
||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||||
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Closes #7252
|
||||
(cherry picked from commit 6dc40e2ada2d0d008bd314ff3525f2b0acc2bb01)
|
||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||
---
|
||||
include/sys/vdev_impl.h | 2 --
|
||||
include/sys/zfs_ratelimit.h | 12 +++++++++---
|
||||
module/zcommon/zfs_comutil.c | 4 ++--
|
||||
module/zfs/vdev.c | 23 +++++++++++++++++++++--
|
||||
man/man5/zfs-module-parameters.5 | 39 +++++++++++++++++++++++++++++++++++++++
|
||||
5 files changed, 71 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h
|
||||
index 13c495822..4f9f1a903 100644
|
||||
--- a/include/sys/vdev_impl.h
|
||||
+++ b/include/sys/vdev_impl.h
|
||||
@@ -255,8 +255,6 @@ struct vdev {
|
||||
* We rate limit ZIO delay and ZIO checksum events, since they
|
||||
* can flood ZED with tons of events when a drive is acting up.
|
||||
*/
|
||||
-#define DELAYS_PER_SECOND 5
|
||||
-#define CHECKSUMS_PER_SECOND 5
|
||||
zfs_ratelimit_t vdev_delay_rl;
|
||||
zfs_ratelimit_t vdev_checksum_rl;
|
||||
};
|
||||
diff --git a/include/sys/zfs_ratelimit.h b/include/sys/zfs_ratelimit.h
|
||||
index f36e07841..012825fad 100644
|
||||
--- a/include/sys/zfs_ratelimit.h
|
||||
+++ b/include/sys/zfs_ratelimit.h
|
||||
@@ -25,13 +25,19 @@
|
||||
typedef struct {
|
||||
hrtime_t start;
|
||||
unsigned int count;
|
||||
- unsigned int burst; /* Number to allow per interval */
|
||||
- unsigned int interval; /* Interval length in seconds */
|
||||
+
|
||||
+ /*
|
||||
+ * Pointer to number of events per interval. We do this to
|
||||
+ * allow the burst to be a (changeable) module parameter.
|
||||
+ */
|
||||
+ unsigned int *burst;
|
||||
+
|
||||
+ unsigned int interval; /* Interval length in seconds */
|
||||
kmutex_t lock;
|
||||
} zfs_ratelimit_t;
|
||||
|
||||
int zfs_ratelimit(zfs_ratelimit_t *rl);
|
||||
-void zfs_ratelimit_init(zfs_ratelimit_t *rl, unsigned int burst,
|
||||
+void zfs_ratelimit_init(zfs_ratelimit_t *rl, unsigned int *burst,
|
||||
unsigned int interval);
|
||||
void zfs_ratelimit_fini(zfs_ratelimit_t *rl);
|
||||
|
||||
diff --git a/module/zcommon/zfs_comutil.c b/module/zcommon/zfs_comutil.c
|
||||
index 52cb7e365..44cdc8523 100644
|
||||
--- a/module/zcommon/zfs_comutil.c
|
||||
+++ b/module/zcommon/zfs_comutil.c
|
||||
@@ -215,7 +215,7 @@ const char *zfs_history_event_names[ZFS_NUM_LEGACY_HISTORY_EVENTS] = {
|
||||
* interval: Interval time in seconds
|
||||
*/
|
||||
void
|
||||
-zfs_ratelimit_init(zfs_ratelimit_t *rl, unsigned int burst,
|
||||
+zfs_ratelimit_init(zfs_ratelimit_t *rl, unsigned int *burst,
|
||||
unsigned int interval)
|
||||
{
|
||||
rl->count = 0;
|
||||
@@ -270,7 +270,7 @@ zfs_ratelimit(zfs_ratelimit_t *rl)
|
||||
rl->start = now;
|
||||
rl->count = 0;
|
||||
} else {
|
||||
- if (rl->count >= rl->burst) {
|
||||
+ if (rl->count >= *rl->burst) {
|
||||
rc = 0; /* We're ratelimiting */
|
||||
}
|
||||
}
|
||||
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
|
||||
index df07d893d..0786fbb83 100644
|
||||
--- a/module/zfs/vdev.c
|
||||
+++ b/module/zfs/vdev.c
|
||||
@@ -56,6 +56,16 @@
|
||||
*/
|
||||
int metaslabs_per_vdev = 200;
|
||||
|
||||
+/*
|
||||
+ * Rate limit delay events to this many IO delays per second.
|
||||
+ */
|
||||
+unsigned int zfs_delays_per_second = 20;
|
||||
+
|
||||
+/*
|
||||
+ * Rate limit checksum events after this many checksum errors per second.
|
||||
+ */
|
||||
+unsigned int zfs_checksums_per_second = 20;
|
||||
+
|
||||
/*
|
||||
* Virtual device management.
|
||||
*/
|
||||
@@ -357,8 +367,8 @@ vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
|
||||
* and checksum events so that we don't overwhelm ZED with thousands
|
||||
* of events when a disk is acting up.
|
||||
*/
|
||||
- zfs_ratelimit_init(&vd->vdev_delay_rl, DELAYS_PER_SECOND, 1);
|
||||
- zfs_ratelimit_init(&vd->vdev_checksum_rl, CHECKSUMS_PER_SECOND, 1);
|
||||
+ zfs_ratelimit_init(&vd->vdev_delay_rl, &zfs_delays_per_second, 1);
|
||||
+ zfs_ratelimit_init(&vd->vdev_checksum_rl, &zfs_checksums_per_second, 1);
|
||||
|
||||
list_link_init(&vd->vdev_config_dirty_node);
|
||||
list_link_init(&vd->vdev_state_dirty_node);
|
||||
@@ -3776,5 +3786,14 @@ module_param(metaslabs_per_vdev, int, 0644);
|
||||
MODULE_PARM_DESC(metaslabs_per_vdev,
|
||||
"Divide added vdev into approximately (but no more than) this number "
|
||||
"of metaslabs");
|
||||
+
|
||||
+module_param(zfs_delays_per_second, uint, 0644);
|
||||
+MODULE_PARM_DESC(zfs_delays_per_second, "Rate limit delay events to this many "
|
||||
+ "IO delays per second");
|
||||
+
|
||||
+module_param(zfs_checksums_per_second, uint, 0644);
|
||||
+ MODULE_PARM_DESC(zfs_checksums_per_second, "Rate limit checksum events "
|
||||
+ "to this many checksum errors per second (do not set below zed"
|
||||
+ "threshold).");
|
||||
/* END CSTYLED */
|
||||
#endif
|
||||
diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5
|
||||
index d4daffde6..8d5ac2576 100644
|
||||
--- a/man/man5/zfs-module-parameters.5
|
||||
+++ b/man/man5/zfs-module-parameters.5
|
||||
@@ -739,6 +739,34 @@ Disable pool import at module load by ignoring the cache file (typically \fB/etc
|
||||
Use \fB1\fR for yes (default) and \fB0\fR for no.
|
||||
.RE
|
||||
|
||||
+.sp
|
||||
+.ne 2
|
||||
+.na
|
||||
+\fBzfs_checksums_per_second\fR (int)
|
||||
+.ad
|
||||
+.RS 12n
|
||||
+Rate limit checksum events to this many per second. Note that this should
|
||||
+not be set below the zed thresholds (currently 10 checksums over 10 sec)
|
||||
+or else zed may not trigger any action.
|
||||
+.sp
|
||||
+Default value: 20
|
||||
+.RE
|
||||
+
|
||||
+.sp
|
||||
+.ne 2
|
||||
+.na
|
||||
+\fBzfs_commit_timeout_pct\fR (int)
|
||||
+.ad
|
||||
+.RS 12n
|
||||
+This controls the amount of time that a ZIL block (lwb) will remain "open"
|
||||
+when it isn't "full", and it has a thread waiting for it to be committed to
|
||||
+stable storage. The timeout is scaled based on a percentage of the last lwb
|
||||
+latency to avoid significantly impacting the latency of each individual
|
||||
+transaction record (itx).
|
||||
+.sp
|
||||
+Default value: \fB5\fR%.
|
||||
+.RE
|
||||
+
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
@@ -866,6 +894,17 @@ Note: \fBzfs_delay_scale\fR * \fBzfs_dirty_data_max\fR must be < 2^64.
|
||||
Default value: \fB500,000\fR.
|
||||
.RE
|
||||
|
||||
+.sp
|
||||
+.ne 2
|
||||
+.na
|
||||
+\fBzfs_delays_per_second\fR (int)
|
||||
+.ad
|
||||
+.RS 12n
|
||||
+Rate limit IO delay events to this many per second.
|
||||
+.sp
|
||||
+Default value: 20
|
||||
+.RE
|
||||
+
|
||||
.sp
|
||||
.ne 2
|
||||
.na
|
||||
--
|
||||
2.14.2
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user