* isn't necessary anymore for lprocfs_generic_fops(e.g. lprocfs_fops_read).
* see bug19706 for detailed information.
*/
-#ifndef HAVE_PROCFS_USERS
-
-#define LPROCFS_ENTRY() do { \
- down_read(&_lprocfs_lock); \
-} while(0)
-#define LPROCFS_EXIT() do { \
- up_read(&_lprocfs_lock); \
-} while(0)
-
-#else
-
+#ifdef HAVE_PROCFS_USERS /* added in 2.6.23 */
#define LPROCFS_ENTRY()
#define LPROCFS_EXIT()
+#else
+#define LPROCFS_ENTRY() down_read(&_lprocfs_lock)
+#define LPROCFS_EXIT() up_read(&_lprocfs_lock)
#endif
-#ifdef HAVE_PROCFS_DELETED
-
-#define LPROCFS_ENTRY_AND_CHECK(dp) do { \
- typecheck(struct proc_dir_entry *, dp); \
- LPROCFS_ENTRY(); \
- if ((dp)->deleted) { \
- LPROCFS_EXIT(); \
- return -ENODEV; \
- } \
-} while(0)
-#define LPROCFS_CHECK_DELETED(dp) ((dp)->deleted)
-
-#elif defined HAVE_PROCFS_USERS
-
-#define LPROCFS_CHECK_DELETED(dp) ({ \
- int deleted = 0; \
- spin_lock(&(dp)->pde_unload_lock); \
- if (dp->proc_fops == NULL) \
- deleted = 1; \
- spin_unlock(&(dp)->pde_unload_lock); \
- deleted; \
-})
-
-#define LPROCFS_ENTRY_AND_CHECK(dp) do { \
- if (LPROCFS_CHECK_DELETED(dp)) \
- return -ENODEV; \
-} while(0)
+static inline int LPROCFS_ENTRY_AND_CHECK(struct proc_dir_entry *dp)
+{
+ int deleted = 0;
-#else
+#if (defined(HAVE_PROCFS_USERS) && !defined(HAVE_PROCFS_DELETED))
+ spin_lock(&dp->pde_unload_lock);
+#endif
+ if (unlikely(dp->proc_fops == NULL))
+ deleted = 1;
+#if (defined(HAVE_PROCFS_USERS) && !defined(HAVE_PROCFS_DELETED))
+ spin_unlock(&dp->pde_unload_lock);
+#endif
+ if (unlikely(deleted == 1))
+ return deleted;
-#define LPROCFS_ENTRY_AND_CHECK(dp) \
LPROCFS_ENTRY();
-#define LPROCFS_CHECK_DELETED(dp) (0)
+#if defined(HAVE_PROCFS_DELETED)
+ if (unlikely(dp->deleted)) {
+ LPROCFS_EXIT();
+ deleted = 1;
+ }
#endif
+ return deleted;
+}
#define LPROCFS_SRCH_ENTRY() do { \
down_read(&_lprocfs_lock); \
if (page == NULL)
return -ENOMEM;
- LPROCFS_ENTRY();
- OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
- if (!LPROCFS_CHECK_DELETED(dp) && dp->read_proc)
+ if (LPROCFS_ENTRY_AND_CHECK(dp) == 0 && dp->read_proc != NULL) {
+ OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
rc = dp->read_proc(page, &start, *ppos, PAGE_SIZE,
&eof, dp->data);
- LPROCFS_EXIT();
+ LPROCFS_EXIT();
+ }
if (rc <= 0)
goto out;
struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
int rc = -EIO;
- LPROCFS_ENTRY();
- if (!LPROCFS_CHECK_DELETED(dp) && dp->write_proc)
+ if (LPROCFS_ENTRY_AND_CHECK(dp) == 0 && dp->write_proc != NULL) {
rc = dp->write_proc(f, buf, size, dp->data);
- LPROCFS_EXIT();
+ LPROCFS_EXIT();
+ }
return rc;
}