mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 18:11:00 +03:00
Merge branch 'linux-3.10'
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #257
This commit is contained in:
commit
5bc941f3cd
@ -33,6 +33,8 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_TASK_CURR
|
||||
SPL_AC_CTL_UNNUMBERED
|
||||
SPL_AC_CTL_NAME
|
||||
SPL_AC_VMALLOC_INFO
|
||||
SPL_AC_PDE_DATA
|
||||
SPL_AC_FLS64
|
||||
SPL_AC_DEVICE_CREATE
|
||||
SPL_AC_5ARGS_DEVICE_CREATE
|
||||
@ -1357,6 +1359,43 @@ AC_DEFUN([SPL_AC_GET_VMALLOC_INFO],
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 3.10 API change,
|
||||
dnl # struct vmalloc_info is now declared in linux/vmalloc.h
|
||||
dnl #
|
||||
AC_DEFUN([SPL_AC_VMALLOC_INFO], [
|
||||
AC_MSG_CHECKING([whether struct vmalloc_info is declared])
|
||||
SPL_LINUX_TRY_COMPILE([
|
||||
#include <linux/vmalloc.h>
|
||||
struct vmalloc_info { void *a; };
|
||||
],[
|
||||
return 0;
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_VMALLOC_INFO, 1, [yes])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 3.10 API change,
|
||||
dnl # PDE is replaced by PDE_DATA
|
||||
dnl #
|
||||
AC_DEFUN([SPL_AC_PDE_DATA], [
|
||||
AC_MSG_CHECKING([whether PDE_DATA() is available])
|
||||
SPL_LINUX_TRY_COMPILE_SYMBOL([
|
||||
#include <linux/proc_fs.h>
|
||||
], [
|
||||
PDE_DATA(NULL);
|
||||
], [PDE_DATA], [], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_PDE_DATA, 1, [yes])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 2.6.17 API change
|
||||
dnl # The helper functions first_online_pgdat(), next_online_pgdat(), and
|
||||
|
@ -43,9 +43,6 @@
|
||||
#endif
|
||||
|
||||
extern struct proc_dir_entry *proc_spl_kstat;
|
||||
struct proc_dir_entry *proc_dir_entry_find(struct proc_dir_entry *root,
|
||||
const char *str);
|
||||
int proc_dir_entries(struct proc_dir_entry *root);
|
||||
|
||||
int spl_proc_init(void);
|
||||
void spl_proc_fini(void);
|
||||
|
@ -83,6 +83,13 @@ struct kstat_s;
|
||||
typedef int kid_t; /* unique kstat id */
|
||||
typedef int kstat_update_t(struct kstat_s *, int); /* dynamic update cb */
|
||||
|
||||
typedef struct kstat_module {
|
||||
char ksm_name[KSTAT_STRLEN+1]; /* module name */
|
||||
struct list_head ksm_module_list; /* module linkage */
|
||||
struct list_head ksm_kstat_list; /* list of kstat entries */
|
||||
struct proc_dir_entry *ksm_proc; /* proc entry */
|
||||
} kstat_module_t;
|
||||
|
||||
typedef struct kstat_s {
|
||||
int ks_magic; /* magic value */
|
||||
kid_t ks_kid; /* unique kstat ID */
|
||||
@ -102,6 +109,7 @@ typedef struct kstat_s {
|
||||
void *ks_private; /* private data */
|
||||
kmutex_t ks_lock; /* kstat data lock */
|
||||
struct list_head ks_list; /* kstat linkage */
|
||||
kstat_module_t *ks_owner; /* kstat module linkage */
|
||||
} kstat_t;
|
||||
|
||||
typedef struct kstat_named_s {
|
||||
|
@ -74,10 +74,12 @@ extern size_t vmem_size(vmem_t *vmp, int typemask);
|
||||
#ifndef HAVE_GET_VMALLOC_INFO
|
||||
#ifdef CONFIG_MMU
|
||||
|
||||
#ifndef HAVE_VMALLOC_INFO
|
||||
struct vmalloc_info {
|
||||
unsigned long used;
|
||||
unsigned long largest_chunk;
|
||||
};
|
||||
#endif
|
||||
|
||||
typedef void (*get_vmalloc_info_t)(struct vmalloc_info *);
|
||||
extern get_vmalloc_info_t get_vmalloc_info_fn;
|
||||
|
@ -33,9 +33,12 @@
|
||||
#endif
|
||||
|
||||
#define SS_DEBUG_SUBSYS SS_KSTAT
|
||||
#ifndef HAVE_PDE_DATA
|
||||
#define PDE_DATA(x) (PDE(x)->data)
|
||||
#endif
|
||||
|
||||
static spinlock_t kstat_lock;
|
||||
static struct list_head kstat_list;
|
||||
static kmutex_t kstat_module_lock;
|
||||
static struct list_head kstat_module_list;
|
||||
static kid_t kstat_id;
|
||||
|
||||
static void
|
||||
@ -348,6 +351,47 @@ static struct seq_operations kstat_seq_ops = {
|
||||
.stop = kstat_seq_stop,
|
||||
};
|
||||
|
||||
static kstat_module_t *
|
||||
kstat_find_module(char *name)
|
||||
{
|
||||
kstat_module_t *module;
|
||||
|
||||
list_for_each_entry(module, &kstat_module_list, ksm_module_list)
|
||||
if (strncmp(name, module->ksm_name, KSTAT_STRLEN) == 0)
|
||||
return (module);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static kstat_module_t *
|
||||
kstat_create_module(char *name)
|
||||
{
|
||||
kstat_module_t *module;
|
||||
struct proc_dir_entry *pde;
|
||||
|
||||
pde = proc_mkdir(name, proc_spl_kstat);
|
||||
if (pde == NULL)
|
||||
return (NULL);
|
||||
|
||||
module = kmem_alloc(sizeof (kstat_module_t), KM_SLEEP);
|
||||
module->ksm_proc = pde;
|
||||
strlcpy(module->ksm_name, name, KSTAT_STRLEN+1);
|
||||
INIT_LIST_HEAD(&module->ksm_kstat_list);
|
||||
list_add_tail(&module->ksm_module_list, &kstat_module_list);
|
||||
|
||||
return (module);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
kstat_delete_module(kstat_module_t *module)
|
||||
{
|
||||
ASSERT(list_empty(&module->ksm_kstat_list));
|
||||
remove_proc_entry(module->ksm_name, proc_spl_kstat);
|
||||
list_del(&module->ksm_module_list);
|
||||
kmem_free(module, sizeof(kstat_module_t));
|
||||
}
|
||||
|
||||
static int
|
||||
proc_kstat_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
@ -359,7 +403,7 @@ proc_kstat_open(struct inode *inode, struct file *filp)
|
||||
return rc;
|
||||
|
||||
f = filp->private_data;
|
||||
f->private = PDE(inode)->data;
|
||||
f->private = PDE_DATA(inode);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -390,10 +434,10 @@ __kstat_create(const char *ks_module, int ks_instance, const char *ks_name,
|
||||
if (ksp == NULL)
|
||||
return ksp;
|
||||
|
||||
spin_lock(&kstat_lock);
|
||||
mutex_enter(&kstat_module_lock);
|
||||
ksp->ks_kid = kstat_id;
|
||||
kstat_id++;
|
||||
spin_unlock(&kstat_lock);
|
||||
mutex_exit(&kstat_module_lock);
|
||||
|
||||
ksp->ks_magic = KS_MAGIC;
|
||||
mutex_init(&ksp->ks_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
@ -456,71 +500,64 @@ EXPORT_SYMBOL(__kstat_create);
|
||||
void
|
||||
__kstat_install(kstat_t *ksp)
|
||||
{
|
||||
struct proc_dir_entry *de_module, *de_name;
|
||||
kstat_module_t *module;
|
||||
kstat_t *tmp;
|
||||
int rc = 0;
|
||||
SENTRY;
|
||||
|
||||
spin_lock(&kstat_lock);
|
||||
ASSERT(ksp);
|
||||
|
||||
/* Item may only be added to the list once */
|
||||
list_for_each_entry(tmp, &kstat_list, ks_list) {
|
||||
if (tmp == ksp) {
|
||||
spin_unlock(&kstat_lock);
|
||||
SGOTO(out, rc = -EEXIST);
|
||||
}
|
||||
mutex_enter(&kstat_module_lock);
|
||||
|
||||
module = kstat_find_module(ksp->ks_module);
|
||||
if (module == NULL) {
|
||||
module = kstat_create_module(ksp->ks_module);
|
||||
if (module == NULL)
|
||||
goto out;
|
||||
}
|
||||
|
||||
list_add_tail(&ksp->ks_list, &kstat_list);
|
||||
spin_unlock(&kstat_lock);
|
||||
/*
|
||||
* 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)
|
||||
if (strncmp(tmp->ks_name, ksp->ks_name, KSTAT_STRLEN) == 0)
|
||||
goto out;
|
||||
|
||||
de_module = proc_dir_entry_find(proc_spl_kstat, ksp->ks_module);
|
||||
if (de_module == NULL) {
|
||||
de_module = proc_mkdir(ksp->ks_module, proc_spl_kstat);
|
||||
if (de_module == NULL)
|
||||
SGOTO(out, rc = -EUNATCH);
|
||||
}
|
||||
|
||||
de_name = create_proc_entry(ksp->ks_name, 0444, de_module);
|
||||
if (de_name == NULL)
|
||||
SGOTO(out, rc = -EUNATCH);
|
||||
list_add_tail(&ksp->ks_list, &module->ksm_kstat_list);
|
||||
|
||||
mutex_enter(&ksp->ks_lock);
|
||||
ksp->ks_proc = de_name;
|
||||
de_name->proc_fops = &proc_kstat_operations;
|
||||
de_name->data = (void *)ksp;
|
||||
ksp->ks_owner = module;
|
||||
ksp->ks_proc = proc_create_data(ksp->ks_name, 0444,
|
||||
module->ksm_proc, &proc_kstat_operations, (void *)ksp);
|
||||
if (ksp->ks_proc == NULL) {
|
||||
list_del_init(&ksp->ks_list);
|
||||
if (list_empty(&module->ksm_kstat_list))
|
||||
kstat_delete_module(module);
|
||||
}
|
||||
mutex_exit(&ksp->ks_lock);
|
||||
out:
|
||||
if (rc) {
|
||||
spin_lock(&kstat_lock);
|
||||
list_del_init(&ksp->ks_list);
|
||||
spin_unlock(&kstat_lock);
|
||||
}
|
||||
|
||||
SEXIT;
|
||||
mutex_exit(&kstat_module_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(__kstat_install);
|
||||
|
||||
void
|
||||
__kstat_delete(kstat_t *ksp)
|
||||
{
|
||||
struct proc_dir_entry *de_module;
|
||||
kstat_module_t *module = ksp->ks_owner;
|
||||
|
||||
spin_lock(&kstat_lock);
|
||||
list_del_init(&ksp->ks_list);
|
||||
spin_unlock(&kstat_lock);
|
||||
mutex_enter(&kstat_module_lock);
|
||||
list_del_init(&ksp->ks_list);
|
||||
mutex_exit(&kstat_module_lock);
|
||||
|
||||
if (ksp->ks_proc) {
|
||||
de_module = ksp->ks_proc->parent;
|
||||
remove_proc_entry(ksp->ks_name, de_module);
|
||||
if (ksp->ks_proc) {
|
||||
remove_proc_entry(ksp->ks_name, module->ksm_proc);
|
||||
|
||||
/* Remove top level module directory if it's empty */
|
||||
if (proc_dir_entries(de_module) == 0)
|
||||
remove_proc_entry(de_module->name, de_module->parent);
|
||||
/* Remove top level module directory if it's empty */
|
||||
if (list_empty(&module->ksm_kstat_list))
|
||||
kstat_delete_module(module);
|
||||
}
|
||||
|
||||
if (!(ksp->ks_flags & KSTAT_FLAG_VIRTUAL))
|
||||
kmem_free(ksp->ks_data, ksp->ks_data_size);
|
||||
kmem_free(ksp->ks_data, ksp->ks_data_size);
|
||||
|
||||
mutex_destroy(&ksp->ks_lock);
|
||||
kmem_free(ksp, sizeof(*ksp));
|
||||
@ -533,8 +570,8 @@ int
|
||||
spl_kstat_init(void)
|
||||
{
|
||||
SENTRY;
|
||||
spin_lock_init(&kstat_lock);
|
||||
INIT_LIST_HEAD(&kstat_list);
|
||||
mutex_init(&kstat_module_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
INIT_LIST_HEAD(&kstat_module_list);
|
||||
kstat_id = 0;
|
||||
SRETURN(0);
|
||||
}
|
||||
@ -543,7 +580,8 @@ void
|
||||
spl_kstat_fini(void)
|
||||
{
|
||||
SENTRY;
|
||||
ASSERT(list_empty(&kstat_list));
|
||||
ASSERT(list_empty(&kstat_module_list));
|
||||
mutex_destroy(&kstat_module_lock);
|
||||
SEXIT;
|
||||
}
|
||||
|
||||
|
@ -1120,39 +1120,6 @@ static struct ctl_table spl_root[] = {
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static int
|
||||
proc_dir_entry_match(int len, const char *name, struct proc_dir_entry *de)
|
||||
{
|
||||
if (de->namelen != len)
|
||||
return 0;
|
||||
|
||||
return !memcmp(name, de->name, len);
|
||||
}
|
||||
|
||||
struct proc_dir_entry *
|
||||
proc_dir_entry_find(struct proc_dir_entry *root, const char *str)
|
||||
{
|
||||
struct proc_dir_entry *de;
|
||||
|
||||
for (de = root->subdir; de; de = de->next)
|
||||
if (proc_dir_entry_match(strlen(str), str, de))
|
||||
return de;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
proc_dir_entries(struct proc_dir_entry *root)
|
||||
{
|
||||
struct proc_dir_entry *de;
|
||||
int i = 0;
|
||||
|
||||
for (de = root->subdir; de; de = de->next)
|
||||
i++;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
int
|
||||
spl_proc_init(void)
|
||||
{
|
||||
@ -1174,11 +1141,11 @@ spl_proc_init(void)
|
||||
if (proc_spl_kmem == NULL)
|
||||
SGOTO(out, rc = -EUNATCH);
|
||||
|
||||
proc_spl_kmem_slab = create_proc_entry("slab", 0444, proc_spl_kmem);
|
||||
proc_spl_kmem_slab = proc_create_data("slab", 0444,
|
||||
proc_spl_kmem, &proc_slab_operations, NULL);
|
||||
if (proc_spl_kmem_slab == NULL)
|
||||
SGOTO(out, rc = -EUNATCH);
|
||||
|
||||
proc_spl_kmem_slab->proc_fops = &proc_slab_operations;
|
||||
#endif /* DEBUG_KMEM */
|
||||
|
||||
proc_spl_kstat = proc_mkdir("kstat", proc_spl);
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include <sys/atomic.h>
|
||||
#include <sys/thread.h>
|
||||
#include <linux/slab.h>
|
||||
#include "splat-internal.h"
|
||||
|
||||
#define SPLAT_ATOMIC_NAME "atomic"
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include <sys/thread.h>
|
||||
#include <sys/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include "splat-internal.h"
|
||||
|
||||
#define SPLAT_THREAD_NAME "thread"
|
||||
|
@ -25,6 +25,7 @@
|
||||
\*****************************************************************************/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <linux/slab.h>
|
||||
#include "splat-internal.h"
|
||||
|
||||
#define SPLAT_TIME_NAME "time"
|
||||
|
Loading…
Reference in New Issue
Block a user