summaryrefslogtreecommitdiffstats
path: root/module/spl
diff options
context:
space:
mode:
Diffstat (limited to 'module/spl')
-rw-r--r--module/spl/Makefile.in28
-rw-r--r--module/spl/README.md16
-rw-r--r--module/spl/spl-condvar.c7
-rw-r--r--module/spl/spl-err.c13
-rw-r--r--module/spl/spl-generic.c17
-rw-r--r--module/spl/spl-kmem.c20
-rw-r--r--module/spl/spl-rwlock.c1
-rw-r--r--module/spl/spl-taskq.c3
-rw-r--r--module/spl/spl-vnode.c4
-rw-r--r--module/spl/spl-xdr.c2
10 files changed, 65 insertions, 46 deletions
diff --git a/module/spl/Makefile.in b/module/spl/Makefile.in
new file mode 100644
index 000000000..97a431f22
--- /dev/null
+++ b/module/spl/Makefile.in
@@ -0,0 +1,28 @@
+src = @abs_top_srcdir@/module/spl
+obj = @abs_builddir@
+
+MODULE := spl
+
+obj-$(CONFIG_ZFS) := $(MODULE).o
+
+ccflags-y := $(ZFS_MODULE_CFLAGS) $(ZFS_MODULE_CPPFLAGS)
+
+$(MODULE)-objs += spl-atomic.o
+$(MODULE)-objs += spl-condvar.o
+$(MODULE)-objs += spl-cred.o
+$(MODULE)-objs += spl-err.o
+$(MODULE)-objs += spl-generic.o
+$(MODULE)-objs += spl-kmem.o
+$(MODULE)-objs += spl-kmem-cache.o
+$(MODULE)-objs += spl-kobj.o
+$(MODULE)-objs += spl-kstat.o
+$(MODULE)-objs += spl-mutex.o
+$(MODULE)-objs += spl-proc.o
+$(MODULE)-objs += spl-rwlock.o
+$(MODULE)-objs += spl-taskq.o
+$(MODULE)-objs += spl-thread.o
+$(MODULE)-objs += spl-tsd.o
+$(MODULE)-objs += spl-vmem.o
+$(MODULE)-objs += spl-vnode.o
+$(MODULE)-objs += spl-xdr.o
+$(MODULE)-objs += spl-zlib.o
diff --git a/module/spl/README.md b/module/spl/README.md
new file mode 100644
index 000000000..57f635aed
--- /dev/null
+++ b/module/spl/README.md
@@ -0,0 +1,16 @@
+The Solaris Porting Layer, SPL, is a Linux kernel module which provides a
+compatibility layer used by the [ZFS on Linux](http://zfsonlinux.org) project.
+
+# Installation
+
+The latest version of the SPL is maintained as part of this repository.
+Only when building ZFS version 0.7.x or earlier must an external SPL release
+be used. These releases can be found at:
+
+ * Version 0.7.x: https://github.com/zfsonlinux/spl/tree/spl-0.7-release
+ * Version 0.6.5.x: https://github.com/zfsonlinux/spl/tree/spl-0.6.5-release
+
+# Release
+
+The SPL is released under a GPLv2 license.
+For more details see the NOTICE and THIRDPARTYLICENSE files; `UCRL-CODE-235197`
diff --git a/module/spl/spl-condvar.c b/module/spl/spl-condvar.c
index f0060bbdc..1e6e38b78 100644
--- a/module/spl/spl-condvar.c
+++ b/module/spl/spl-condvar.c
@@ -27,6 +27,7 @@
#include <sys/condvar.h>
#include <sys/time.h>
#include <linux/hrtimer.h>
+#include <linux/compiler_compat.h>
void
__cv_init(kcondvar_t *cvp, char *name, kcv_type_t type, void *arg)
@@ -89,7 +90,7 @@ cv_wait_common(kcondvar_t *cvp, kmutex_t *mp, int state, int io)
ASSERT(mutex_owned(mp));
atomic_inc(&cvp->cv_refs);
- m = ACCESS_ONCE(cvp->cv_mutex);
+ m = READ_ONCE(cvp->cv_mutex);
if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */
@@ -202,7 +203,7 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
return (-1);
atomic_inc(&cvp->cv_refs);
- m = ACCESS_ONCE(cvp->cv_mutex);
+ m = READ_ONCE(cvp->cv_mutex);
if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */
@@ -290,7 +291,7 @@ __cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t expire_time,
return (-1);
atomic_inc(&cvp->cv_refs);
- m = ACCESS_ONCE(cvp->cv_mutex);
+ m = READ_ONCE(cvp->cv_mutex);
if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */
diff --git a/module/spl/spl-err.c b/module/spl/spl-err.c
index 6b71296e8..4c8f818a9 100644
--- a/module/spl/spl-err.c
+++ b/module/spl/spl-err.c
@@ -26,7 +26,6 @@
#include <sys/sysmacros.h>
#include <sys/cmn_err.h>
-#include <linux/ratelimit.h>
/*
* It is often useful to actually have the panic crash the node so you
@@ -40,19 +39,11 @@ 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
- * 60 seconds to prevent denial-of-service attacks from debug code.
- */
-DEFINE_RATELIMIT_STATE(dumpstack_ratelimit_state, 60 * HZ, 5);
-
void
spl_dumpstack(void)
{
- if (__ratelimit(&dumpstack_ratelimit_state)) {
- printk("Showing stack for process %d\n", current->pid);
- dump_stack();
- }
+ printk("Showing stack for process %d\n", current->pid);
+ dump_stack();
}
EXPORT_SYMBOL(spl_dumpstack);
diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c
index b38fe254c..7c1ad390b 100644
--- a/module/spl/spl-generic.c
+++ b/module/spl/spl-generic.c
@@ -46,12 +46,13 @@
#include <sys/strings.h>
#include <linux/kmod.h>
-char spl_version[32] = "SPL v" SPL_META_VERSION "-" SPL_META_RELEASE;
+char spl_version[32] = "SPL v" ZFS_META_VERSION "-" ZFS_META_RELEASE;
EXPORT_SYMBOL(spl_version);
/* BEGIN CSTYLED */
unsigned long spl_hostid = 0;
EXPORT_SYMBOL(spl_hostid);
+/* BEGIN CSTYLED */
module_param(spl_hostid, ulong, 0644);
MODULE_PARM_DESC(spl_hostid, "The system hostid.");
/* END CSTYLED */
@@ -719,8 +720,6 @@ spl_init(void)
if ((rc = spl_zlib_init()))
goto out10;
- printk(KERN_NOTICE "SPL: Loaded module v%s-%s%s\n", SPL_META_VERSION,
- SPL_META_RELEASE, SPL_DEBUG_STR);
return (rc);
out10:
@@ -742,18 +741,12 @@ out3:
out2:
spl_kvmem_fini();
out1:
- printk(KERN_NOTICE "SPL: Failed to Load Solaris Porting Layer "
- "v%s-%s%s, rc = %d\n", SPL_META_VERSION, SPL_META_RELEASE,
- SPL_DEBUG_STR, rc);
-
return (rc);
}
static void __exit
spl_fini(void)
{
- printk(KERN_NOTICE "SPL: Unloaded module v%s-%s%s\n",
- SPL_META_VERSION, SPL_META_RELEASE, SPL_DEBUG_STR);
spl_zlib_fini();
spl_kstat_fini();
spl_proc_fini();
@@ -770,6 +763,6 @@ module_init(spl_init);
module_exit(spl_fini);
MODULE_DESCRIPTION("Solaris Porting Layer");
-MODULE_AUTHOR(SPL_META_AUTHOR);
-MODULE_LICENSE(SPL_META_LICENSE);
-MODULE_VERSION(SPL_META_VERSION "-" SPL_META_RELEASE);
+MODULE_AUTHOR(ZFS_META_AUTHOR);
+MODULE_LICENSE("GPL");
+MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
index e0d551041..1fdb61e6f 100644
--- a/module/spl/spl-kmem.c
+++ b/module/spl/spl-kmem.c
@@ -27,7 +27,6 @@
#include <sys/kmem.h>
#include <sys/vmem.h>
#include <linux/mm.h>
-#include <linux/ratelimit.h>
/*
* As a general rule kmem_alloc() allocations should be small, preferably
@@ -135,12 +134,6 @@ strfree(char *str)
EXPORT_SYMBOL(strfree);
/*
- * Limit the number of large allocation stack traces dumped to not more than
- * 5 every 60 seconds to prevent denial-of-service attacks from debug code.
- */
-DEFINE_RATELIMIT_STATE(kmem_alloc_ratelimit_state, 60 * HZ, 5);
-
-/*
* General purpose unified implementation of kmem_alloc(). It is an
* amalgamation of Linux and Illumos allocator design. It should never be
* exported to ensure that code using kmem_alloc()/kmem_zalloc() remains
@@ -160,7 +153,7 @@ spl_kmem_alloc_impl(size_t size, int flags, int node)
* through the vmem_alloc()/vmem_zalloc() interfaces.
*/
if ((spl_kmem_alloc_warn > 0) && (size > spl_kmem_alloc_warn) &&
- !(flags & KM_VMEM) && __ratelimit(&kmem_alloc_ratelimit_state)) {
+ !(flags & KM_VMEM)) {
printk(KERN_WARNING
"Large kmem_alloc(%lu, 0x%x), please file an issue at:\n"
"https://github.com/zfsonlinux/zfs/issues/new\n",
@@ -207,14 +200,6 @@ spl_kmem_alloc_impl(size_t size, int flags, int node)
continue;
}
- if (unlikely(__ratelimit(&kmem_alloc_ratelimit_state))) {
- printk(KERN_WARNING
- "Possible memory allocation deadlock: "
- "size=%lu lflags=0x%x",
- (unsigned long)size, lflags);
- dump_stack();
- }
-
/*
* Use cond_resched() instead of congestion_wait() to avoid
* deadlocking systems where there are no block devices.
@@ -535,9 +520,12 @@ spl_kmem_fini_tracking(struct list_head *list, spinlock_t *lock)
int
spl_kmem_init(void)
{
+
#ifdef DEBUG_KMEM
kmem_alloc_used_set(0);
+
+
#ifdef DEBUG_KMEM_TRACKING
spl_kmem_init_tracking(&kmem_list, &kmem_lock, KMEM_TABLE_SIZE);
#endif /* DEBUG_KMEM_TRACKING */
diff --git a/module/spl/spl-rwlock.c b/module/spl/spl-rwlock.c
index 9a992cc3a..cf03bc593 100644
--- a/module/spl/spl-rwlock.c
+++ b/module/spl/spl-rwlock.c
@@ -25,6 +25,7 @@
*/
#include <sys/rwlock.h>
+#include <linux/module.h>
#if defined(CONFIG_PREEMPT_RT_FULL)
diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c
index 2919a942a..7684257be 100644
--- a/module/spl/spl-taskq.c
+++ b/module/spl/spl-taskq.c
@@ -60,7 +60,7 @@ static taskq_thread_t *taskq_thread_create(taskq_t *);
/* List of all taskqs */
LIST_HEAD(tq_list);
-DECLARE_RWSEM(tq_list_sem);
+struct rw_semaphore tq_list_sem;
static uint_t taskq_tsd;
static int
@@ -1257,6 +1257,7 @@ MODULE_PARM_DESC(spl_taskq_kick,
int
spl_taskq_init(void)
{
+ init_rwsem(&tq_list_sem);
tsd_create(&taskq_tsd, NULL);
system_taskq = taskq_create("spl_system_taskq", MAX(boot_ncpus, 64),
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
index 28ce21276..aebee0a82 100644
--- a/module/spl/spl-vnode.c
+++ b/module/spl/spl-vnode.c
@@ -40,7 +40,7 @@ EXPORT_SYMBOL(rootdir);
static spl_kmem_cache_t *vn_cache;
static spl_kmem_cache_t *vn_file_cache;
-static DEFINE_SPINLOCK(vn_file_lock);
+static spinlock_t vn_file_lock;
static LIST_HEAD(vn_file_list);
static int
@@ -744,6 +744,8 @@ vn_file_cache_destructor(void *buf, void *cdrarg)
int
spl_vn_init(void)
{
+ vn_file_lock = __SPIN_LOCK_UNLOCKED(vn_file_lock);
+
vn_cache = kmem_cache_create("spl_vn_cache",
sizeof (struct vnode), 64, vn_cache_constructor,
vn_cache_destructor, NULL, NULL, NULL, 0);
diff --git a/module/spl/spl-xdr.c b/module/spl/spl-xdr.c
index 2cc3e2a03..1dd31ffc1 100644
--- a/module/spl/spl-xdr.c
+++ b/module/spl/spl-xdr.c
@@ -131,8 +131,6 @@
static struct xdr_ops xdrmem_encode_ops;
static struct xdr_ops xdrmem_decode_ops;
-typedef int bool_t;
-
void
xdrmem_create(XDR *xdrs, const caddr_t addr, const uint_t size,
const enum xdr_op op)