+++ /dev/null
-/*
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * This program 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
- * General Public License version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
- * Use is subject to license terms.
- *
- * Copyright (c) 2012, Intel Corporation.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- *
- * API and structure definitions for params_tree.
- *
- * Author: LiuYing <emoly.liu@oracle.com>
- */
-#ifndef __PARAMS_TREE_H__
-#define __PARAMS_TREE_H__
-
-#include <linux/fs.h>
-#include <linux/proc_fs.h>
-#include <linux/rwsem.h>
-#include <linux/spinlock.h>
-
-#ifdef CONFIG_PROC_FS
-# ifndef HAVE_ONLY_PROCFS_SEQ
-/* in lprocfs_stat.c, to protect the private data for proc entries */
-extern struct rw_semaphore _lprocfs_lock;
-
-static inline int LPROCFS_ENTRY_CHECK(struct inode *inode)
-{
- struct proc_dir_entry *dp = PDE(inode);
- int deleted = 0;
-
- spin_lock(&(dp)->pde_unload_lock);
- if (dp->proc_fops == NULL)
- deleted = 1;
- spin_unlock(&(dp)->pde_unload_lock);
- if (deleted)
- return -ENODEV;
- return 0;
-}
-
-# define LPROCFS_SRCH_ENTRY() \
- do { \
- down_read(&_lprocfs_lock); \
- } while (0)
-
-# define LPROCFS_SRCH_EXIT() \
- do { \
- up_read(&_lprocfs_lock); \
- } while (0)
-
-# define LPROCFS_WRITE_ENTRY() \
- do { \
- down_write(&_lprocfs_lock); \
- } while (0)
-
-# define LPROCFS_WRITE_EXIT() \
- do { \
- up_write(&_lprocfs_lock); \
- } while (0)
-
-# define PDE_DATA(inode) (PDE(inode)->data)
-
-# else /* HAVE_ONLY_PROCFS_SEQ */
-
-static inline int LPROCFS_ENTRY_CHECK(struct inode *inode)
-{
- return 0;
-}
-
-#define LPROCFS_WRITE_ENTRY() do {} while(0)
-#define LPROCFS_WRITE_EXIT() do {} while(0)
-
-# endif /* !HAVE_ONLY_PROCFS_SEQ */
-#endif /* CONFIG_PROC_FS */
-#endif /* __PARAMS_TREE_H__ */
#ifndef _LPROCFS_SNMP_H
#define _LPROCFS_SNMP_H
+#include <linux/fs.h>
+#include <linux/proc_fs.h>
+#include <linux/rwsem.h>
+#include <linux/spinlock.h>
+
#include <lustre/lustre_idl.h>
-#include <libcfs/params_tree.h>
#ifndef HAVE_ONLY_PROCFS_SEQ
struct lprocfs_vars {
extern struct proc_dir_entry *lprocfs_srch(struct proc_dir_entry *root,
const char *name);
+
+#define PDE_DATA(inode) (PDE(inode)->data)
+
+static inline int LPROCFS_ENTRY_CHECK(struct inode *inode)
+{
+ struct proc_dir_entry *dp = PDE(inode);
+ int deleted = 0;
+
+ spin_lock(&(dp)->pde_unload_lock);
+ if (dp->proc_fops == NULL)
+ deleted = 1;
+ spin_unlock(&(dp)->pde_unload_lock);
+ if (deleted)
+ return -ENODEV;
+ return 0;
+}
+#else
+static inline int LPROCFS_ENTRY_CHECK(struct inode *inode)
+{ return 0; }
#endif
extern int lprocfs_obd_setup(struct obd_device *dev);
extern int lprocfs_obd_cleanup(struct obd_device *obd);
{
struct proc_dir_entry *temp;
- LPROCFS_SRCH_ENTRY();
+ down_read(&_lprocfs_lock);
temp = __lprocfs_srch(head, name);
- LPROCFS_SRCH_EXIT();
+ up_read(&_lprocfs_lock);
return temp;
}
EXPORT_SYMBOL(lprocfs_srch);
{
int rc = 0;
- LPROCFS_WRITE_ENTRY();
+ down_write(&_lprocfs_lock);
rc = __lprocfs_add_vars(root, list, data);
- LPROCFS_WRITE_EXIT();
+ up_write(&_lprocfs_lock);
return rc;
}
void lprocfs_remove(struct proc_dir_entry **rooth)
{
#ifndef HAVE_ONLY_PROCFS_SEQ
- LPROCFS_WRITE_ENTRY(); /* search vs remove race */
+ down_write(&_lprocfs_lock); /* search vs remove race */
lprocfs_remove_nolock(rooth);
- LPROCFS_WRITE_EXIT();
+ up_write(&_lprocfs_lock);
#else
proc_remove(*rooth);
*rooth = NULL;
LASSERT(parent != NULL);
len = strlen(name);
- LPROCFS_WRITE_ENTRY();
-
+ down_write(&_lprocfs_lock);
/* lookup target name */
for (p = &parent->subdir; *p; p = &(*p)->next) {
if ((*p)->namelen != len)
if (busy == 0)
lprocfs_remove_nolock(&t);
- LPROCFS_WRITE_EXIT();
-
+ up_write(&_lprocfs_lock);
return;
}
EXPORT_SYMBOL(lprocfs_try_remove_proc_entry);
struct proc_dir_entry *entry;
int rc;
- LPROCFS_WRITE_ENTRY();
+ down_write(&_lprocfs_lock);
entry = __lprocfs_srch(parent, name);
if (entry != NULL) {
CERROR("entry '%s' already registered\n", name);
}
}
out:
- LPROCFS_WRITE_EXIT();
+ up_write(&_lprocfs_lock);
return entry;
}
EXPORT_SYMBOL(lprocfs_register);