Skip to contentSkip to conversation

ocfs2 1.4: A new beginning

Ocfs2-devel New Sunil Mushran 2 participants 60 messages Dec 20, 2007 – Dec 24, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

These patches allow ocfs2 pulled from mainline commit e7b34019606ab1dd06196635e931b0c302799228 to build on 2.6.18. I am not emailing the first set of patches that essentially copy the source from the mainline and copy the build infrastructure files from ocfs2-1.2.

The rationale behind this series of patches is not only to allow it to build with el5 (2.6.18) but to do so with minimal code changes. The latter will help us later when we have to backport new patches from mainline.

Please review the patches concentrating on the tricks played to allow one to build the same tree against both 2.6.18 and mainline.

Sunil

#1 lore raw

PATCH 3/30 ocfs2: Handle workqueue changes

Commit 52bad64d95bd89e08c49ec5a071fa6dcbe5a1a9c in mainline makes changes to workqueue.h. This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Config.make.in                  |    2 +
 Makefile                        |    3 +-
 configure.in                    |    6 ++++
 fs/Makefile                     |   64 +++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/Makefile               |    4 ++
 fs/ocfs2/alloc.c                |    8 ++--
 fs/ocfs2/cluster/Makefile       |    4 ++
 fs/ocfs2/cluster/heartbeat.c    |    6 ++--
 fs/ocfs2/cluster/quorum.c       |    4 +-
 fs/ocfs2/cluster/tcp.c          |   56 +++++++++++++++++-----------------
 fs/ocfs2/dlm/Makefile           |    4 ++
 fs/ocfs2/dlm/dlmcommon.h        |    2 +-
 fs/ocfs2/dlm/dlmdomain.c        |    2 +-
 fs/ocfs2/dlm/dlmrecovery.c      |    2 +-
 fs/ocfs2/dlm/userdlm.c          |    8 ++--
 fs/ocfs2/journal.c              |    4 +-
 fs/ocfs2/journal.h              |    2 +-
 fs/ocfs2/super.c                |    2 +-
 kapi-compat/include/workqueue.h |   17 ++++++++++
 19 files changed, 151 insertions(+), 49 deletions(-)
 create mode 100644 fs/Makefile
 create mode 100644 kapi-compat/include/workqueue.h
Config.make.in +2 -0
index c9e0132..befeb79 100644
@@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@
 
 EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
+DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
Makefile +2 -1
index 227ab23..4752593 100644
@@ -8,7 +8,8 @@ SUBDIRS = fs vendor
 
 LINUX_INCLUDE_FILES =
 
-KAPI_COMPAT_FILES =
+KAPI_COMPAT_FILES = \
+	kapi-compat/include/workqueue.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 1af47fc..72567b5 100644
@@ -156,6 +156,12 @@ case "$kversion" in
     ;;
 esac
 
+DELAYED_WORK_DEFINED=
+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h,
+  DELAYED_WORK_DEFINED=yes, , [^struct delayed_work])
+AC_SUBST(DELAYED_WORK_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/Makefile new file +64 -0

64 lines not on this page · raw message

fs/ocfs2/Makefile +4 -0
index dce2a62..0edfed7 100644
@@ -25,6 +25,10 @@ EXTRA_CFLAGS += -DOCFS2_CDSL
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +4 -4
index 4ba7f0b..5a8a4f2 100644
@@ -4752,11 +4752,11 @@ int ocfs2_flush_truncate_log(struct ocfs2_super *osb)
 	return status;
 }
 
-static void ocfs2_truncate_log_worker(struct work_struct *work)
+static void ocfs2_truncate_log_worker(kapi_work_struct_t *work)
 {
 	int status;
 	struct ocfs2_super *osb =
-		container_of(work, struct ocfs2_super,
+		kapi_container_of(work, struct ocfs2_super,
 			     osb_truncate_log_wq.work);
 
 	mlog_entry_void();
@@ -4989,8 +4989,8 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb)
 	/* ocfs2_truncate_log_shutdown keys on the existence of
 	 * osb->osb_tl_inode so we don't set any of the osb variables
 	 * until we're sure all is well. */
-	INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
-			  ocfs2_truncate_log_worker);
+	KAPI_INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
+			  ocfs2_truncate_log_worker, osb);
 	osb->osb_tl_bh    = tl_bh;
 	osb->osb_tl_inode = tl_inode;
 
fs/ocfs2/cluster/Makefile +4 -0
index c9c2e9b..a4251f5 100644
@@ -13,6 +13,10 @@ endif
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/heartbeat.c +3 -3
index f14b541..e610665 100644
@@ -156,10 +156,10 @@ struct o2hb_bio_wait_ctxt {
 	int               wc_error;
 };
 
-static void o2hb_write_timeout(struct work_struct *work)
+static void o2hb_write_timeout(kapi_work_struct_t *work)
 {
 	struct o2hb_region *reg =
-		container_of(work, struct o2hb_region,
+		kapi_container_of(work, struct o2hb_region,
 			     hr_write_timeout_work.work);
 
 	mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u "
@@ -1306,7 +1306,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg,
 		goto out;
 	}
 
-	INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout);
+	KAPI_INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout, reg);
 
 	/*
 	 * A node is considered live after it has beat LIVE_THRESHOLD
fs/ocfs2/cluster/quorum.c +2 -2
index bbacf7d..df9b74a 100644
@@ -91,7 +91,7 @@ void o2quo_disk_timeout(void)
 	o2quo_fence_self();
 }
 
-static void o2quo_make_decision(struct work_struct *work)
+static void o2quo_make_decision(kapi_work_struct_t *work)
 {
 	int quorum;
 	int lowest_hb, lowest_reachable = 0, fence = 0;
@@ -309,7 +309,7 @@ void o2quo_init(void)
 	struct o2quo_state *qs = &o2quo_state;
 
 	spin_lock_init(&qs->qs_lock);
-	INIT_WORK(&qs->qs_work, o2quo_make_decision);
+	KAPI_INIT_WORK(&qs->qs_work, o2quo_make_decision, NULL);
 }
 
 void o2quo_exit(void)
fs/ocfs2/cluster/tcp.c +28 -28

143 lines not on this page · raw message

fs/ocfs2/dlm/Makefile +4 -0
index 7e1031e..b4fb8e3 100644
@@ -16,6 +16,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmcommon.h +1 -1
index e90b92f..cddf85a 100644
@@ -153,7 +153,7 @@ static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned
  * called functions that cannot be directly called from the
  * net message handlers for some reason, usually because
  * they need to send net messages of their own. */
-void dlm_dispatch_work(struct work_struct *work);
+void dlm_dispatch_work(kapi_work_struct_t *work);
 
 struct dlm_lock_resource;
 struct dlm_work_item;
fs/ocfs2/dlm/dlmdomain.c +1 -1
index 6954565..10b3e60 100644
@@ -1435,7 +1435,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
 
 	spin_lock_init(&dlm->work_lock);
 	INIT_LIST_HEAD(&dlm->work_list);
-	INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work);
+	KAPI_INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work, dlm);
 
 	kref_init(&dlm->dlm_refs);
 	dlm->dlm_state = DLM_CTXT_NEW;
fs/ocfs2/dlm/dlmrecovery.c +1 -1
index a2c3316..3cf4f49 100644
@@ -153,7 +153,7 @@ static inline void dlm_reset_recovery(struct dlm_ctxt *dlm)
 }
 
 /* Worker function used during recovery. */
-void dlm_dispatch_work(struct work_struct *work)
+void dlm_dispatch_work(kapi_work_struct_t *work)
 {
 	struct dlm_ctxt *dlm =
 		container_of(work, struct dlm_ctxt, dispatched_work);
fs/ocfs2/dlm/userdlm.c +4 -4
index 7d2f578..2f6deb1 100644
@@ -171,14 +171,14 @@ static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres)
 		BUG();
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work);
+static void user_dlm_unblock_lock(kapi_work_struct_t *work);
 
 static void __user_dlm_queue_lockres(struct user_lock_res *lockres)
 {
 	if (!(lockres->l_flags & USER_LOCK_QUEUED)) {
 		user_dlm_grab_inode_ref(lockres);
 
-		INIT_WORK(&lockres->l_work, user_dlm_unblock_lock);
+		KAPI_INIT_WORK(&lockres->l_work, user_dlm_unblock_lock, lockres);
 
 		queue_work(user_dlm_worker, &lockres->l_work);
 		lockres->l_flags |= USER_LOCK_QUEUED;
@@ -278,11 +278,11 @@ static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres)
 	iput(inode);
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work)
+static void user_dlm_unblock_lock(kapi_work_struct_t *work)
 {
 	int new_level, status;
 	struct user_lock_res *lockres =
-		container_of(work, struct user_lock_res, l_work);
+		kapi_container_of(work, struct user_lock_res, l_work);
 	struct dlm_ctxt *dlm = dlm_ctxt_from_user_lockres(lockres);
 
 	mlog(0, "processing lockres %.*s\n", lockres->l_namelen,
fs/ocfs2/journal.c +2 -2
index f9d01e2..b94208f 100644
@@ -715,11 +715,11 @@ struct ocfs2_la_recovery_item {
  * NOTE: This function can and will sleep on recovery of other nodes
  * during cluster locking, just like any other ocfs2 process.
  */
-void ocfs2_complete_recovery(struct work_struct *work)
+void ocfs2_complete_recovery(kapi_work_struct_t *work)
 {
 	int ret;
 	struct ocfs2_journal *journal =
-		container_of(work, struct ocfs2_journal, j_recovery_work);
+		kapi_container_of(work, struct ocfs2_journal, j_recovery_work);
 	struct ocfs2_super *osb = journal->j_osb;
 	struct ocfs2_dinode *la_dinode, *tl_dinode;
 	struct ocfs2_la_recovery_item *item, *n;
fs/ocfs2/journal.h +1 -1
index 4b32e09..548d6af 100644
@@ -133,7 +133,7 @@ static inline void ocfs2_inode_set_new(struct ocfs2_super *osb,
 }
 
 /* Exported only for the journal struct init code in super.c. Do not call. */
-void ocfs2_complete_recovery(struct work_struct *work);
+void ocfs2_complete_recovery(kapi_work_struct_t *work);
 
 /*
  *  Journal Control:
fs/ocfs2/super.c +1 -1
index 0e2a1b4..a8f90a2 100644
@@ -1465,7 +1465,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
 	spin_lock_init(&journal->j_lock);
 	journal->j_trans_id = (unsigned long) 1;
 	INIT_LIST_HEAD(&journal->j_la_cleanups);
-	INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery);
+	KAPI_INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery, journal);
 	journal->j_state = OCFS2_JOURNAL_FREE;
 
 	/* get some pseudo constants for clustersize bits */
kapi-compat/include/workqueue.h new file +17 -0
new file mode 100644
index 0000000..26dfbdf
@@ -0,0 +1,17 @@
+#ifndef KAPI_WORKQUEUE_H
+#define KAPI_WORKQUEUE_H
+
+#ifndef DELAYED_WORK_DEFINED
+# define delayed_work				work_struct
+typedef void kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		(a)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b, c)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_WORK(a, b, c)
+#else
+typedef struct work_struct kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		container_of(a, b, c)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_DELAYED_WORK(a, b)
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#2 lore raw

PATCH 3/30 ocfs2: Handle workqueue changes

Quoted 4 lines · Sunil Mushran

Commit 52bad64d95bd89e08c49ec5a071fa6dcbe5a1a9c in mainline makes changes to workqueue.h. This patch allows one to build ocfs2 with kernels having/not having that change.

Here the check is reversed. Without running configure, the tree expects an old kernel (it will behave as if delayed_work does not exist).

Quoted 569 lines
---
 Config.make.in                  |    2 +
 Makefile                        |    3 +-
 configure.in                    |    6 ++++
 fs/Makefile                     |   64 +++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/Makefile               |    4 ++
 fs/ocfs2/alloc.c                |    8 ++--
 fs/ocfs2/cluster/Makefile       |    4 ++
 fs/ocfs2/cluster/heartbeat.c    |    6 ++--
 fs/ocfs2/cluster/quorum.c       |    4 +-
 fs/ocfs2/cluster/tcp.c          |   56 +++++++++++++++++-----------------
 fs/ocfs2/dlm/Makefile           |    4 ++
 fs/ocfs2/dlm/dlmcommon.h        |    2 +-
 fs/ocfs2/dlm/dlmdomain.c        |    2 +-
 fs/ocfs2/dlm/dlmrecovery.c      |    2 +-
 fs/ocfs2/dlm/userdlm.c          |    8 ++--
 fs/ocfs2/journal.c              |    4 +-
 fs/ocfs2/journal.h              |    2 +-
 fs/ocfs2/super.c                |    2 +-
 kapi-compat/include/workqueue.h |   17 ++++++++++
 19 files changed, 151 insertions(+), 49 deletions(-)
 create mode 100644 fs/Makefile
 create mode 100644 kapi-compat/include/workqueue.h
Config.make.in +2 -0
index c9e0132..befeb79 100644
@@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@
 
 EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
+DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
Makefile +2 -1
index 227ab23..4752593 100644
@@ -8,7 +8,8 @@ SUBDIRS = fs vendor
 
 LINUX_INCLUDE_FILES =
 
-KAPI_COMPAT_FILES =
+KAPI_COMPAT_FILES = \
+	kapi-compat/include/workqueue.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 1af47fc..72567b5 100644
@@ -156,6 +156,12 @@ case "$kversion" in
     ;;
 esac
 
+DELAYED_WORK_DEFINED=
+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h,
+  DELAYED_WORK_DEFINED=yes, , [^struct delayed_work])
+AC_SUBST(DELAYED_WORK_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/Makefile new file +64 -0
new file mode 100644
index 0000000..d7f3aec
@@ -0,0 +1,64 @@
+
+ifeq ($(KERNELRELEASE),)
+TOPDIR = ..
+
+include $(TOPDIR)/Preamble.make
+else
+# We are included by kbuild.
+
+OUR_TOPDIR	:= $(M)/..
+
+include $(OUR_TOPDIR)/Config.make
+
+endif
+
+#
+# As 2.6 kbuild is unhappy seeing SUBDIRS, this is a safe one to
+# set globally.  Do not include trailing slashes.
+#
+SAFE_SUBDIRS :=
+
+SAFE_SUBDIRS += ocfs2
+
+ifneq ($(KERNELRELEASE),)
+#
+# Called under kbuild 2.6
+#
+
+obj-m	+= $(addsuffix /,$(SAFE_SUBDIRS))
+INSTALL_MOD_DIR := fs/ocfs2
+
+else
+#
+# Called from a regular "make". Just forward to kbuild.
+#
+
+ALL_RULES = build-modules
+
+CLEAN_RULES = clean-modules
+
+INSTALL_RULES = install-modules
+
+# Traverse subdirs via Makebo for "make dist"
+ifeq ($(MAKECMDGOALS),dist-all)
+SUBDIRS = $(SAFE_SUBDIRS)
+endif
+
+build-modules:
+	$(MAKE) -C ocfs2 stamp-md5
+	$(MAKE) -C ocfs2/cluster stamp-md5
+	$(MAKE) -C ocfs2/dlm stamp-md5
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) modules
+
+install-modules:
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) modules_install
+
+clean-modules:
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) clean
+	-rm ocfs2/stamp-md5
+	-rm ocfs2/cluster/stamp-md5
+	-rm ocfs2/dlm/stamp-md5
+
+include $(TOPDIR)/Postamble.make
+
+endif
fs/ocfs2/Makefile +4 -0
index dce2a62..0edfed7 100644
@@ -25,6 +25,10 @@ EXTRA_CFLAGS += -DOCFS2_CDSL
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +4 -4
index 4ba7f0b..5a8a4f2 100644
@@ -4752,11 +4752,11 @@ int ocfs2_flush_truncate_log(struct ocfs2_super *osb)
 	return status;
 }
 
-static void ocfs2_truncate_log_worker(struct work_struct *work)
+static void ocfs2_truncate_log_worker(kapi_work_struct_t *work)
 {
 	int status;
 	struct ocfs2_super *osb =
-		container_of(work, struct ocfs2_super,
+		kapi_container_of(work, struct ocfs2_super,
 			     osb_truncate_log_wq.work);
 
 	mlog_entry_void();
@@ -4989,8 +4989,8 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb)
 	/* ocfs2_truncate_log_shutdown keys on the existence of
 	 * osb->osb_tl_inode so we don't set any of the osb variables
 	 * until we're sure all is well. */
-	INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
-			  ocfs2_truncate_log_worker);
+	KAPI_INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
+			  ocfs2_truncate_log_worker, osb);
 	osb->osb_tl_bh    = tl_bh;
 	osb->osb_tl_inode = tl_inode;
 
fs/ocfs2/cluster/Makefile +4 -0
index c9c2e9b..a4251f5 100644
@@ -13,6 +13,10 @@ endif
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/heartbeat.c +3 -3
index f14b541..e610665 100644
@@ -156,10 +156,10 @@ struct o2hb_bio_wait_ctxt {
 	int               wc_error;
 };
 
-static void o2hb_write_timeout(struct work_struct *work)
+static void o2hb_write_timeout(kapi_work_struct_t *work)
 {
 	struct o2hb_region *reg =
-		container_of(work, struct o2hb_region,
+		kapi_container_of(work, struct o2hb_region,
 			     hr_write_timeout_work.work);
 
 	mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u "
@@ -1306,7 +1306,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg,
 		goto out;
 	}
 
-	INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout);
+	KAPI_INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout, reg);
 
 	/*
 	 * A node is considered live after it has beat LIVE_THRESHOLD
fs/ocfs2/cluster/quorum.c +2 -2
index bbacf7d..df9b74a 100644
@@ -91,7 +91,7 @@ void o2quo_disk_timeout(void)
 	o2quo_fence_self();
 }
 
-static void o2quo_make_decision(struct work_struct *work)
+static void o2quo_make_decision(kapi_work_struct_t *work)
 {
 	int quorum;
 	int lowest_hb, lowest_reachable = 0, fence = 0;
@@ -309,7 +309,7 @@ void o2quo_init(void)
 	struct o2quo_state *qs = &o2quo_state;
 
 	spin_lock_init(&qs->qs_lock);
-	INIT_WORK(&qs->qs_work, o2quo_make_decision);
+	KAPI_INIT_WORK(&qs->qs_work, o2quo_make_decision, NULL);
 }
 
 void o2quo_exit(void)
fs/ocfs2/cluster/tcp.c +28 -28
index 685c180..c4a0c73 100644
@@ -140,11 +140,11 @@ static int o2net_sys_err_translations[O2NET_ERR_MAX] =
 		 [O2NET_ERR_DIED]	= -EHOSTDOWN,};
 
 /* can't quite avoid *all* internal declarations :/ */
-static void o2net_sc_connect_completed(struct work_struct *work);
-static void o2net_rx_until_empty(struct work_struct *work);
-static void o2net_shutdown_sc(struct work_struct *work);
+static void o2net_sc_connect_completed(kapi_work_struct_t *work);
+static void o2net_rx_until_empty(kapi_work_struct_t *work);
+static void o2net_shutdown_sc(kapi_work_struct_t *work);
 static void o2net_listen_data_ready(struct sock *sk, int bytes);
-static void o2net_sc_send_keep_req(struct work_struct *work);
+static void o2net_sc_send_keep_req(kapi_work_struct_t *work);
 static void o2net_idle_timer(unsigned long data);
 static void o2net_sc_postpone_idle(struct o2net_sock_container *sc);
 static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc);
@@ -330,10 +330,10 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node)
 	o2nm_node_get(node);
 	sc->sc_node = node;
 
-	INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed);
-	INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty);
-	INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc);
-	INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req);
+	KAPI_INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed, sc);
+	KAPI_INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty, sc);
+	KAPI_INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc, sc);
+	KAPI_INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req, sc);
 
 	init_timer(&sc->sc_idle_timeout);
 	sc->sc_idle_timeout.function = o2net_idle_timer;
@@ -600,10 +600,10 @@ static void o2net_ensure_shutdown(struct o2net_node *nn,
  * ourselves as state_change couldn't get the nn_lock and call set_nn_state
  * itself.
  */
-static void o2net_shutdown_sc(struct work_struct *work)
+static void o2net_shutdown_sc(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_shutdown_work);
 	struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num);
 
@@ -1306,10 +1306,10 @@ out:
 /* this work func is triggerd by data ready.  it reads until it can read no
  * more.  it interprets 0, eof, as fatal.  if data_ready hits while we're doing
  * our work the work struct will be marked and we'll be called again. */
-static void o2net_rx_until_empty(struct work_struct *work)
+static void o2net_rx_until_empty(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container, sc_rx_work);
+		kapi_container_of(work, struct o2net_sock_container, sc_rx_work);
 	int ret;
 
 	do {
@@ -1367,10 +1367,10 @@ static void o2net_initialize_handshake(void)
 
 /* called when a connect completes and after a sock is accepted.  the
  * rx path will see the response and mark the sc valid */
-static void o2net_sc_connect_completed(struct work_struct *work)
+static void o2net_sc_connect_completed(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_connect_work);
 
 	mlog(ML_MSG, "sc sending handshake with ver %llu id %llx\n",
@@ -1383,10 +1383,10 @@ static void o2net_sc_connect_completed(struct work_struct *work)
 }
 
 /* this is called as a work_struct func. */
-static void o2net_sc_send_keep_req(struct work_struct *work)
+static void o2net_sc_send_keep_req(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_keepalive_work.work);
 
 	o2net_sendpage(sc, o2net_keep_req, sizeof(*o2net_keep_req));
@@ -1446,10 +1446,10 @@ static void o2net_sc_postpone_idle(struct o2net_sock_container *sc)
  * having a connect attempt fail, etc. This centralizes the logic which decides
  * if a connect attempt should be made or if we should give up and all future
  * transmit attempts should fail */
-static void o2net_start_connect(struct work_struct *work)
+static void o2net_start_connect(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_connect_work.work);
+		kapi_container_of(work, struct o2net_node, nn_connect_work.work);
 	struct o2net_sock_container *sc = NULL;
 	struct o2nm_node *node = NULL, *mynode = NULL;
 	struct socket *sock = NULL;
@@ -1553,10 +1553,10 @@ out:
 	return;
 }
 
-static void o2net_connect_expired(struct work_struct *work)
+static void o2net_connect_expired(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_connect_expired.work);
+		kapi_container_of(work, struct o2net_node, nn_connect_expired.work);
 
 	spin_lock(&nn->nn_lock);
 	if (!nn->nn_sc_valid) {
@@ -1572,10 +1572,10 @@ static void o2net_connect_expired(struct work_struct *work)
 	spin_unlock(&nn->nn_lock);
 }
 
-static void o2net_still_up(struct work_struct *work)
+static void o2net_still_up(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_still_up.work);
+		kapi_container_of(work, struct o2net_node, nn_still_up.work);
 
 	o2quo_hb_still_up(o2net_num_from_nn(nn));
 }
@@ -1775,7 +1775,7 @@ out:
 	return ret;
 }
 
-static void o2net_accept_many(struct work_struct *work)
+static void o2net_accept_many(kapi_work_struct_t *work)
 {
 	struct socket *sock = o2net_listen_sock;
 	while (o2net_accept_one(sock) == 0)
@@ -1831,7 +1831,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
 	write_unlock_bh(&sock->sk->sk_callback_lock);
 
 	o2net_listen_sock = sock;
-	INIT_WORK(&o2net_listen_work, o2net_accept_many);
+	KAPI_INIT_WORK(&o2net_listen_work, o2net_accept_many, sock);
 
 	sock->sk->sk_reuse = 1;
 	ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
@@ -1951,10 +1951,10 @@ int o2net_init(void)
 		struct o2net_node *nn = o2net_nn_from_num(i);
 
 		spin_lock_init(&nn->nn_lock);
-		INIT_DELAYED_WORK(&nn->nn_connect_work, o2net_start_connect);
-		INIT_DELAYED_WORK(&nn->nn_connect_expired,
-				  o2net_connect_expired);
-		INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_connect_work, o2net_start_connect, nn);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_connect_expired,
+				  o2net_connect_expired, nn);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up, nn);
 		/* until we see hb from a node we'll return einval */
 		nn->nn_persistent_error = -ENOTCONN;
 		init_waitqueue_head(&nn->nn_sc_wq);
fs/ocfs2/dlm/Makefile +4 -0
index 7e1031e..b4fb8e3 100644
@@ -16,6 +16,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmcommon.h +1 -1
index e90b92f..cddf85a 100644
@@ -153,7 +153,7 @@ static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned
  * called functions that cannot be directly called from the
  * net message handlers for some reason, usually because
  * they need to send net messages of their own. */
-void dlm_dispatch_work(struct work_struct *work);
+void dlm_dispatch_work(kapi_work_struct_t *work);
 
 struct dlm_lock_resource;
 struct dlm_work_item;
fs/ocfs2/dlm/dlmdomain.c +1 -1
index 6954565..10b3e60 100644
@@ -1435,7 +1435,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
 
 	spin_lock_init(&dlm->work_lock);
 	INIT_LIST_HEAD(&dlm->work_list);
-	INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work);
+	KAPI_INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work, dlm);
 
 	kref_init(&dlm->dlm_refs);
 	dlm->dlm_state = DLM_CTXT_NEW;
fs/ocfs2/dlm/dlmrecovery.c +1 -1
index a2c3316..3cf4f49 100644
@@ -153,7 +153,7 @@ static inline void dlm_reset_recovery(struct dlm_ctxt *dlm)
 }
 
 /* Worker function used during recovery. */
-void dlm_dispatch_work(struct work_struct *work)
+void dlm_dispatch_work(kapi_work_struct_t *work)
 {
 	struct dlm_ctxt *dlm =
 		container_of(work, struct dlm_ctxt, dispatched_work);
fs/ocfs2/dlm/userdlm.c +4 -4
index 7d2f578..2f6deb1 100644
@@ -171,14 +171,14 @@ static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres)
 		BUG();
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work);
+static void user_dlm_unblock_lock(kapi_work_struct_t *work);
 
 static void __user_dlm_queue_lockres(struct user_lock_res *lockres)
 {
 	if (!(lockres->l_flags & USER_LOCK_QUEUED)) {
 		user_dlm_grab_inode_ref(lockres);
 
-		INIT_WORK(&lockres->l_work, user_dlm_unblock_lock);
+		KAPI_INIT_WORK(&lockres->l_work, user_dlm_unblock_lock, lockres);
 
 		queue_work(user_dlm_worker, &lockres->l_work);
 		lockres->l_flags |= USER_LOCK_QUEUED;
@@ -278,11 +278,11 @@ static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres)
 	iput(inode);
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work)
+static void user_dlm_unblock_lock(kapi_work_struct_t *work)
 {
 	int new_level, status;
 	struct user_lock_res *lockres =
-		container_of(work, struct user_lock_res, l_work);
+		kapi_container_of(work, struct user_lock_res, l_work);
 	struct dlm_ctxt *dlm = dlm_ctxt_from_user_lockres(lockres);
 
 	mlog(0, "processing lockres %.*s\n", lockres->l_namelen,
fs/ocfs2/journal.c +2 -2
index f9d01e2..b94208f 100644
@@ -715,11 +715,11 @@ struct ocfs2_la_recovery_item {
  * NOTE: This function can and will sleep on recovery of other nodes
  * during cluster locking, just like any other ocfs2 process.
  */
-void ocfs2_complete_recovery(struct work_struct *work)
+void ocfs2_complete_recovery(kapi_work_struct_t *work)
 {
 	int ret;
 	struct ocfs2_journal *journal =
-		container_of(work, struct ocfs2_journal, j_recovery_work);
+		kapi_container_of(work, struct ocfs2_journal, j_recovery_work);
 	struct ocfs2_super *osb = journal->j_osb;
 	struct ocfs2_dinode *la_dinode, *tl_dinode;
 	struct ocfs2_la_recovery_item *item, *n;
fs/ocfs2/journal.h +1 -1
index 4b32e09..548d6af 100644
@@ -133,7 +133,7 @@ static inline void ocfs2_inode_set_new(struct ocfs2_super *osb,
 }
 
 /* Exported only for the journal struct init code in super.c. Do not call. */
-void ocfs2_complete_recovery(struct work_struct *work);
+void ocfs2_complete_recovery(kapi_work_struct_t *work);
 
 /*
  *  Journal Control:
fs/ocfs2/super.c +1 -1
index 0e2a1b4..a8f90a2 100644
@@ -1465,7 +1465,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
 	spin_lock_init(&journal->j_lock);
 	journal->j_trans_id = (unsigned long) 1;
 	INIT_LIST_HEAD(&journal->j_la_cleanups);
-	INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery);
+	KAPI_INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery, journal);
 	journal->j_state = OCFS2_JOURNAL_FREE;
 
 	/* get some pseudo constants for clustersize bits */
kapi-compat/include/workqueue.h new file +17 -0
new file mode 100644
index 0000000..26dfbdf
@@ -0,0 +1,17 @@
+#ifndef KAPI_WORKQUEUE_H
+#define KAPI_WORKQUEUE_H
+
+#ifndef DELAYED_WORK_DEFINED
+# define delayed_work				work_struct
+typedef void kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		(a)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b, c)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_WORK(a, b, c)
+#else
+typedef struct work_struct kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		container_of(a, b, c)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_DELAYED_WORK(a, b)
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 8 lines
"Only a life lived for others is a life worth while."
							-Albert Einstein  

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#3 lore raw

PATCH 3/30 ocfs2: Handle workqueue changes

Quoted 9 lines · Joel Becker
Quoted 4 lines · Sunil Mushran

Commit 52bad64d95bd89e08c49ec5a071fa6dcbe5a1a9c in mainline makes changes to workqueue.h. This patch allows one to build ocfs2 with kernels having/not having that change.

Here the check is reversed. Without running configure, the tree expects an old kernel (it will behave as if delayed_work does not exist).

Looking at it, rather than spoil the meaning of container_of()
(the second usage isn't a container_of() at all), what about calling it "work_to_object()"?

+#ifndef KAPI_WORKQUEUE_H
+#define KAPI_WORKQUEUE_H
+
+#ifdef NO_DELAYED_WORK
+# define delayed_work work_struct
+typedef void kapi_work_struct_t;
+# define work_to_object(a, b, c) (a)
+# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b, c)
+# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_WORK(a, b, c)
+#else
+typedef struct work_struct kapi_work_struct_t;
+# define work_to_object(a, b, c) container_of(a, b, c)
+# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b)
+# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_DELAYED_WORK(a, b)
+#endif
+
+#endif

I don't have any way to make KAPI_INIT_WORK(), etc, any better,
though.

Joel

Quoted 585 lines
Quoted 569 lines
---
 Config.make.in                  |    2 +
 Makefile                        |    3 +-
 configure.in                    |    6 ++++
 fs/Makefile                     |   64 +++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/Makefile               |    4 ++
 fs/ocfs2/alloc.c                |    8 ++--
 fs/ocfs2/cluster/Makefile       |    4 ++
 fs/ocfs2/cluster/heartbeat.c    |    6 ++--
 fs/ocfs2/cluster/quorum.c       |    4 +-
 fs/ocfs2/cluster/tcp.c          |   56 +++++++++++++++++-----------------
 fs/ocfs2/dlm/Makefile           |    4 ++
 fs/ocfs2/dlm/dlmcommon.h        |    2 +-
 fs/ocfs2/dlm/dlmdomain.c        |    2 +-
 fs/ocfs2/dlm/dlmrecovery.c      |    2 +-
 fs/ocfs2/dlm/userdlm.c          |    8 ++--
 fs/ocfs2/journal.c              |    4 +-
 fs/ocfs2/journal.h              |    2 +-
 fs/ocfs2/super.c                |    2 +-
 kapi-compat/include/workqueue.h |   17 ++++++++++
 19 files changed, 151 insertions(+), 49 deletions(-)
 create mode 100644 fs/Makefile
 create mode 100644 kapi-compat/include/workqueue.h
Config.make.in +2 -0
index c9e0132..befeb79 100644
@@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@
 
 EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
+DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
Makefile +2 -1
index 227ab23..4752593 100644
@@ -8,7 +8,8 @@ SUBDIRS = fs vendor
 
 LINUX_INCLUDE_FILES =
 
-KAPI_COMPAT_FILES =
+KAPI_COMPAT_FILES = \
+	kapi-compat/include/workqueue.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 1af47fc..72567b5 100644
@@ -156,6 +156,12 @@ case "$kversion" in
     ;;
 esac
 
+DELAYED_WORK_DEFINED=
+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h,
+  DELAYED_WORK_DEFINED=yes, , [^struct delayed_work])
+AC_SUBST(DELAYED_WORK_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/Makefile new file +64 -0
new file mode 100644
index 0000000..d7f3aec
@@ -0,0 +1,64 @@
+
+ifeq ($(KERNELRELEASE),)
+TOPDIR = ..
+
+include $(TOPDIR)/Preamble.make
+else
+# We are included by kbuild.
+
+OUR_TOPDIR	:= $(M)/..
+
+include $(OUR_TOPDIR)/Config.make
+
+endif
+
+#
+# As 2.6 kbuild is unhappy seeing SUBDIRS, this is a safe one to
+# set globally.  Do not include trailing slashes.
+#
+SAFE_SUBDIRS :=
+
+SAFE_SUBDIRS += ocfs2
+
+ifneq ($(KERNELRELEASE),)
+#
+# Called under kbuild 2.6
+#
+
+obj-m	+= $(addsuffix /,$(SAFE_SUBDIRS))
+INSTALL_MOD_DIR := fs/ocfs2
+
+else
+#
+# Called from a regular "make". Just forward to kbuild.
+#
+
+ALL_RULES = build-modules
+
+CLEAN_RULES = clean-modules
+
+INSTALL_RULES = install-modules
+
+# Traverse subdirs via Makebo for "make dist"
+ifeq ($(MAKECMDGOALS),dist-all)
+SUBDIRS = $(SAFE_SUBDIRS)
+endif
+
+build-modules:
+	$(MAKE) -C ocfs2 stamp-md5
+	$(MAKE) -C ocfs2/cluster stamp-md5
+	$(MAKE) -C ocfs2/dlm stamp-md5
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) modules
+
+install-modules:
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) modules_install
+
+clean-modules:
+	$(MAKE) -C $(KERNELDIR) M=$(CURDIR) clean
+	-rm ocfs2/stamp-md5
+	-rm ocfs2/cluster/stamp-md5
+	-rm ocfs2/dlm/stamp-md5
+
+include $(TOPDIR)/Postamble.make
+
+endif
fs/ocfs2/Makefile +4 -0
index dce2a62..0edfed7 100644
@@ -25,6 +25,10 @@ EXTRA_CFLAGS += -DOCFS2_CDSL
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +4 -4
index 4ba7f0b..5a8a4f2 100644
@@ -4752,11 +4752,11 @@ int ocfs2_flush_truncate_log(struct ocfs2_super *osb)
 	return status;
 }
 
-static void ocfs2_truncate_log_worker(struct work_struct *work)
+static void ocfs2_truncate_log_worker(kapi_work_struct_t *work)
 {
 	int status;
 	struct ocfs2_super *osb =
-		container_of(work, struct ocfs2_super,
+		kapi_container_of(work, struct ocfs2_super,
 			     osb_truncate_log_wq.work);
 
 	mlog_entry_void();
@@ -4989,8 +4989,8 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb)
 	/* ocfs2_truncate_log_shutdown keys on the existence of
 	 * osb->osb_tl_inode so we don't set any of the osb variables
 	 * until we're sure all is well. */
-	INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
-			  ocfs2_truncate_log_worker);
+	KAPI_INIT_DELAYED_WORK(&osb->osb_truncate_log_wq,
+			  ocfs2_truncate_log_worker, osb);
 	osb->osb_tl_bh    = tl_bh;
 	osb->osb_tl_inode = tl_inode;
 
fs/ocfs2/cluster/Makefile +4 -0
index c9c2e9b..a4251f5 100644
@@ -13,6 +13,10 @@ endif
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/heartbeat.c +3 -3
index f14b541..e610665 100644
@@ -156,10 +156,10 @@ struct o2hb_bio_wait_ctxt {
 	int               wc_error;
 };
 
-static void o2hb_write_timeout(struct work_struct *work)
+static void o2hb_write_timeout(kapi_work_struct_t *work)
 {
 	struct o2hb_region *reg =
-		container_of(work, struct o2hb_region,
+		kapi_container_of(work, struct o2hb_region,
 			     hr_write_timeout_work.work);
 
 	mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u "
@@ -1306,7 +1306,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg,
 		goto out;
 	}
 
-	INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout);
+	KAPI_INIT_DELAYED_WORK(&reg->hr_write_timeout_work, o2hb_write_timeout, reg);
 
 	/*
 	 * A node is considered live after it has beat LIVE_THRESHOLD
fs/ocfs2/cluster/quorum.c +2 -2
index bbacf7d..df9b74a 100644
@@ -91,7 +91,7 @@ void o2quo_disk_timeout(void)
 	o2quo_fence_self();
 }
 
-static void o2quo_make_decision(struct work_struct *work)
+static void o2quo_make_decision(kapi_work_struct_t *work)
 {
 	int quorum;
 	int lowest_hb, lowest_reachable = 0, fence = 0;
@@ -309,7 +309,7 @@ void o2quo_init(void)
 	struct o2quo_state *qs = &o2quo_state;
 
 	spin_lock_init(&qs->qs_lock);
-	INIT_WORK(&qs->qs_work, o2quo_make_decision);
+	KAPI_INIT_WORK(&qs->qs_work, o2quo_make_decision, NULL);
 }
 
 void o2quo_exit(void)
fs/ocfs2/cluster/tcp.c +28 -28
index 685c180..c4a0c73 100644
@@ -140,11 +140,11 @@ static int o2net_sys_err_translations[O2NET_ERR_MAX] =
 		 [O2NET_ERR_DIED]	= -EHOSTDOWN,};
 
 /* can't quite avoid *all* internal declarations :/ */
-static void o2net_sc_connect_completed(struct work_struct *work);
-static void o2net_rx_until_empty(struct work_struct *work);
-static void o2net_shutdown_sc(struct work_struct *work);
+static void o2net_sc_connect_completed(kapi_work_struct_t *work);
+static void o2net_rx_until_empty(kapi_work_struct_t *work);
+static void o2net_shutdown_sc(kapi_work_struct_t *work);
 static void o2net_listen_data_ready(struct sock *sk, int bytes);
-static void o2net_sc_send_keep_req(struct work_struct *work);
+static void o2net_sc_send_keep_req(kapi_work_struct_t *work);
 static void o2net_idle_timer(unsigned long data);
 static void o2net_sc_postpone_idle(struct o2net_sock_container *sc);
 static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc);
@@ -330,10 +330,10 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node)
 	o2nm_node_get(node);
 	sc->sc_node = node;
 
-	INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed);
-	INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty);
-	INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc);
-	INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req);
+	KAPI_INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed, sc);
+	KAPI_INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty, sc);
+	KAPI_INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc, sc);
+	KAPI_INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req, sc);
 
 	init_timer(&sc->sc_idle_timeout);
 	sc->sc_idle_timeout.function = o2net_idle_timer;
@@ -600,10 +600,10 @@ static void o2net_ensure_shutdown(struct o2net_node *nn,
  * ourselves as state_change couldn't get the nn_lock and call set_nn_state
  * itself.
  */
-static void o2net_shutdown_sc(struct work_struct *work)
+static void o2net_shutdown_sc(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_shutdown_work);
 	struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num);
 
@@ -1306,10 +1306,10 @@ out:
 /* this work func is triggerd by data ready.  it reads until it can read no
  * more.  it interprets 0, eof, as fatal.  if data_ready hits while we're doing
  * our work the work struct will be marked and we'll be called again. */
-static void o2net_rx_until_empty(struct work_struct *work)
+static void o2net_rx_until_empty(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container, sc_rx_work);
+		kapi_container_of(work, struct o2net_sock_container, sc_rx_work);
 	int ret;
 
 	do {
@@ -1367,10 +1367,10 @@ static void o2net_initialize_handshake(void)
 
 /* called when a connect completes and after a sock is accepted.  the
  * rx path will see the response and mark the sc valid */
-static void o2net_sc_connect_completed(struct work_struct *work)
+static void o2net_sc_connect_completed(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_connect_work);
 
 	mlog(ML_MSG, "sc sending handshake with ver %llu id %llx\n",
@@ -1383,10 +1383,10 @@ static void o2net_sc_connect_completed(struct work_struct *work)
 }
 
 /* this is called as a work_struct func. */
-static void o2net_sc_send_keep_req(struct work_struct *work)
+static void o2net_sc_send_keep_req(kapi_work_struct_t *work)
 {
 	struct o2net_sock_container *sc =
-		container_of(work, struct o2net_sock_container,
+		kapi_container_of(work, struct o2net_sock_container,
 			     sc_keepalive_work.work);
 
 	o2net_sendpage(sc, o2net_keep_req, sizeof(*o2net_keep_req));
@@ -1446,10 +1446,10 @@ static void o2net_sc_postpone_idle(struct o2net_sock_container *sc)
  * having a connect attempt fail, etc. This centralizes the logic which decides
  * if a connect attempt should be made or if we should give up and all future
  * transmit attempts should fail */
-static void o2net_start_connect(struct work_struct *work)
+static void o2net_start_connect(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_connect_work.work);
+		kapi_container_of(work, struct o2net_node, nn_connect_work.work);
 	struct o2net_sock_container *sc = NULL;
 	struct o2nm_node *node = NULL, *mynode = NULL;
 	struct socket *sock = NULL;
@@ -1553,10 +1553,10 @@ out:
 	return;
 }
 
-static void o2net_connect_expired(struct work_struct *work)
+static void o2net_connect_expired(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_connect_expired.work);
+		kapi_container_of(work, struct o2net_node, nn_connect_expired.work);
 
 	spin_lock(&nn->nn_lock);
 	if (!nn->nn_sc_valid) {
@@ -1572,10 +1572,10 @@ static void o2net_connect_expired(struct work_struct *work)
 	spin_unlock(&nn->nn_lock);
 }
 
-static void o2net_still_up(struct work_struct *work)
+static void o2net_still_up(kapi_work_struct_t *work)
 {
 	struct o2net_node *nn =
-		container_of(work, struct o2net_node, nn_still_up.work);
+		kapi_container_of(work, struct o2net_node, nn_still_up.work);
 
 	o2quo_hb_still_up(o2net_num_from_nn(nn));
 }
@@ -1775,7 +1775,7 @@ out:
 	return ret;
 }
 
-static void o2net_accept_many(struct work_struct *work)
+static void o2net_accept_many(kapi_work_struct_t *work)
 {
 	struct socket *sock = o2net_listen_sock;
 	while (o2net_accept_one(sock) == 0)
@@ -1831,7 +1831,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
 	write_unlock_bh(&sock->sk->sk_callback_lock);
 
 	o2net_listen_sock = sock;
-	INIT_WORK(&o2net_listen_work, o2net_accept_many);
+	KAPI_INIT_WORK(&o2net_listen_work, o2net_accept_many, sock);
 
 	sock->sk->sk_reuse = 1;
 	ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin));
@@ -1951,10 +1951,10 @@ int o2net_init(void)
 		struct o2net_node *nn = o2net_nn_from_num(i);
 
 		spin_lock_init(&nn->nn_lock);
-		INIT_DELAYED_WORK(&nn->nn_connect_work, o2net_start_connect);
-		INIT_DELAYED_WORK(&nn->nn_connect_expired,
-				  o2net_connect_expired);
-		INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_connect_work, o2net_start_connect, nn);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_connect_expired,
+				  o2net_connect_expired, nn);
+		KAPI_INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up, nn);
 		/* until we see hb from a node we'll return einval */
 		nn->nn_persistent_error = -ENOTCONN;
 		init_waitqueue_head(&nn->nn_sc_wq);
fs/ocfs2/dlm/Makefile +4 -0
index 7e1031e..b4fb8e3 100644
@@ -16,6 +16,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2
 
 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG
 
+ifdef DELAYED_WORK_DEFINED
+EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmcommon.h +1 -1
index e90b92f..cddf85a 100644
@@ -153,7 +153,7 @@ static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned
  * called functions that cannot be directly called from the
  * net message handlers for some reason, usually because
  * they need to send net messages of their own. */
-void dlm_dispatch_work(struct work_struct *work);
+void dlm_dispatch_work(kapi_work_struct_t *work);
 
 struct dlm_lock_resource;
 struct dlm_work_item;
fs/ocfs2/dlm/dlmdomain.c +1 -1
index 6954565..10b3e60 100644
@@ -1435,7 +1435,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
 
 	spin_lock_init(&dlm->work_lock);
 	INIT_LIST_HEAD(&dlm->work_list);
-	INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work);
+	KAPI_INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work, dlm);
 
 	kref_init(&dlm->dlm_refs);
 	dlm->dlm_state = DLM_CTXT_NEW;
fs/ocfs2/dlm/dlmrecovery.c +1 -1
index a2c3316..3cf4f49 100644
@@ -153,7 +153,7 @@ static inline void dlm_reset_recovery(struct dlm_ctxt *dlm)
 }
 
 /* Worker function used during recovery. */
-void dlm_dispatch_work(struct work_struct *work)
+void dlm_dispatch_work(kapi_work_struct_t *work)
 {
 	struct dlm_ctxt *dlm =
 		container_of(work, struct dlm_ctxt, dispatched_work);
fs/ocfs2/dlm/userdlm.c +4 -4
index 7d2f578..2f6deb1 100644
@@ -171,14 +171,14 @@ static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres)
 		BUG();
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work);
+static void user_dlm_unblock_lock(kapi_work_struct_t *work);
 
 static void __user_dlm_queue_lockres(struct user_lock_res *lockres)
 {
 	if (!(lockres->l_flags & USER_LOCK_QUEUED)) {
 		user_dlm_grab_inode_ref(lockres);
 
-		INIT_WORK(&lockres->l_work, user_dlm_unblock_lock);
+		KAPI_INIT_WORK(&lockres->l_work, user_dlm_unblock_lock, lockres);
 
 		queue_work(user_dlm_worker, &lockres->l_work);
 		lockres->l_flags |= USER_LOCK_QUEUED;
@@ -278,11 +278,11 @@ static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres)
 	iput(inode);
 }
 
-static void user_dlm_unblock_lock(struct work_struct *work)
+static void user_dlm_unblock_lock(kapi_work_struct_t *work)
 {
 	int new_level, status;
 	struct user_lock_res *lockres =
-		container_of(work, struct user_lock_res, l_work);
+		kapi_container_of(work, struct user_lock_res, l_work);
 	struct dlm_ctxt *dlm = dlm_ctxt_from_user_lockres(lockres);
 
 	mlog(0, "processing lockres %.*s\n", lockres->l_namelen,
fs/ocfs2/journal.c +2 -2
index f9d01e2..b94208f 100644
@@ -715,11 +715,11 @@ struct ocfs2_la_recovery_item {
  * NOTE: This function can and will sleep on recovery of other nodes
  * during cluster locking, just like any other ocfs2 process.
  */
-void ocfs2_complete_recovery(struct work_struct *work)
+void ocfs2_complete_recovery(kapi_work_struct_t *work)
 {
 	int ret;
 	struct ocfs2_journal *journal =
-		container_of(work, struct ocfs2_journal, j_recovery_work);
+		kapi_container_of(work, struct ocfs2_journal, j_recovery_work);
 	struct ocfs2_super *osb = journal->j_osb;
 	struct ocfs2_dinode *la_dinode, *tl_dinode;
 	struct ocfs2_la_recovery_item *item, *n;
fs/ocfs2/journal.h +1 -1
index 4b32e09..548d6af 100644
@@ -133,7 +133,7 @@ static inline void ocfs2_inode_set_new(struct ocfs2_super *osb,
 }
 
 /* Exported only for the journal struct init code in super.c. Do not call. */
-void ocfs2_complete_recovery(struct work_struct *work);
+void ocfs2_complete_recovery(kapi_work_struct_t *work);
 
 /*
  *  Journal Control:
fs/ocfs2/super.c +1 -1
index 0e2a1b4..a8f90a2 100644
@@ -1465,7 +1465,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
 	spin_lock_init(&journal->j_lock);
 	journal->j_trans_id = (unsigned long) 1;
 	INIT_LIST_HEAD(&journal->j_la_cleanups);
-	INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery);
+	KAPI_INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery, journal);
 	journal->j_state = OCFS2_JOURNAL_FREE;
 
 	/* get some pseudo constants for clustersize bits */
kapi-compat/include/workqueue.h new file +17 -0
new file mode 100644
index 0000000..26dfbdf
@@ -0,0 +1,17 @@
+#ifndef KAPI_WORKQUEUE_H
+#define KAPI_WORKQUEUE_H
+
+#ifndef DELAYED_WORK_DEFINED
+# define delayed_work				work_struct
+typedef void kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		(a)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b, c)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_WORK(a, b, c)
+#else
+typedef struct work_struct kapi_work_struct_t;
+# define kapi_container_of(a, b, c)		container_of(a, b, c)
+# define KAPI_INIT_WORK(a, b, c)		INIT_WORK(a, b)
+# define KAPI_INIT_DELAYED_WORK(a, b, c)	INIT_DELAYED_WORK(a, b)
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 13 lines
"Only a life lived for others is a life worth while."
							-Albert Einstein  

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
"When I am working on a problem I never think about beauty. I
 only think about how to solve the problem. But when I have finished, if
 the solution is not beautiful, I know it is wrong."
         - Buckminster Fuller

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#4 lore raw

PATCH 4/30 ocfs2: Handle macro uninitialized_var

In reply to Sunil Mushran

Commit 9490991482a2091a828d997adbc088e24c310a4d in mainline introduced macro uninitialized_var(). This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Makefile                       |    3 ++-
 configure.in                   |    5 +++++
 kapi-compat/include/compiler.h |   10 ++++++++++
 3 files changed, 17 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/compiler.h
Makefile +2 -1
index 4752593..21ff590 100644
@@ -9,7 +9,8 @@ SUBDIRS = fs vendor
 LINUX_INCLUDE_FILES =
 
 KAPI_COMPAT_FILES = \
-	kapi-compat/include/workqueue.h
+	kapi-compat/include/workqueue.h \
+	kapi-compat/include/compiler.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 72567b5..7faf363 100644
@@ -162,6 +162,11 @@ OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h,
 AC_SUBST(DELAYED_WORK_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h"
 
+compiler_compat_header=""
+OCFS2_CHECK_KERNEL([uninitialized_var() in compiler-gcc4.h], compiler-gcc4.h,
+  , compiler_compat_header="compiler.h", [uninitialized_var])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $compiler_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/compiler.h new file +10 -0
new file mode 100644
index 0000000..c104ed1
@@ -0,0 +1,10 @@
+#ifndef KAPI_COMPILER_H
+#define KAPI_COMPILER_H
+
+/*
+ * A trick to suppress uninitialized variable warning without generating any
+ * code
+ */
+#define uninitialized_var(x) x = x
+
+#endif
Signature · 1 line
1.5.2.5
#5 lore raw

PATCH 4/30 ocfs2: Handle macro uninitialized_var

Quoted 5 lines · Sunil Mushran

Commit 9490991482a2091a828d997adbc088e24c310a4d in mainline introduced macro uninitialized_var(). This patch allows one to build ocfs2 with kernels having/not having that change.

Quoted 61 lines
---
 Makefile                       |    3 ++-
 configure.in                   |    5 +++++
 kapi-compat/include/compiler.h |   10 ++++++++++
 3 files changed, 17 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/compiler.h
Makefile +2 -1
index 4752593..21ff590 100644
@@ -9,7 +9,8 @@ SUBDIRS = fs vendor
 LINUX_INCLUDE_FILES =
 
 KAPI_COMPAT_FILES = \
-	kapi-compat/include/workqueue.h
+	kapi-compat/include/workqueue.h \
+	kapi-compat/include/compiler.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 72567b5..7faf363 100644
@@ -162,6 +162,11 @@ OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h,
 AC_SUBST(DELAYED_WORK_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h"
 
+compiler_compat_header=""
+OCFS2_CHECK_KERNEL([uninitialized_var() in compiler-gcc4.h], compiler-gcc4.h,
+  , compiler_compat_header="compiler.h", [uninitialized_var])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $compiler_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/compiler.h new file +10 -0
new file mode 100644
index 0000000..c104ed1
@@ -0,0 +1,10 @@
+#ifndef KAPI_COMPILER_H
+#define KAPI_COMPILER_H
+
+/*
+ * A trick to suppress uninitialized variable warning without generating any
+ * code
+ */
+#define uninitialized_var(x) x = x
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"The opposite of a correct statement is a false statement. The
 opposite of a profound truth may well be another profound truth."
         - Niels Bohr 

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#6 lore raw

PATCH 5/30 ocfs2: Handle macro zero_user_page()

In reply to Sunil Mushran

Commit 01f2705daf5a36208e69d7cf95db9c330f843af6 in mainline introduced macro zero_user_page(). This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Makefile                      |    3 ++-
 configure.in                  |    5 +++++
 kapi-compat/include/highmem.h |   22 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/highmem.h
Makefile +2 -1
index 21ff590..b7b86db 100644
@@ -10,7 +10,8 @@ LINUX_INCLUDE_FILES =
 
 KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
-	kapi-compat/include/compiler.h
+	kapi-compat/include/compiler.h \
+	kapi-compat/include/highmem.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 7faf363..47b0da0 100644
@@ -167,6 +167,11 @@ OCFS2_CHECK_KERNEL([uninitialized_var() in compiler-gcc4.h], compiler-gcc4.h,
   , compiler_compat_header="compiler.h", [uninitialized_var])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $compiler_compat_header"
 
+highmem_compat_header=""
+OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], highmem.h,
+  , highmem_compat_header="highmem.h", [zero_user_page])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/highmem.h new file +22 -0
new file mode 100644
index 0000000..a8c7e11
@@ -0,0 +1,22 @@
+#ifndef KAPI_HIGHMEM_H
+#define KAPI_HIGHMEM_H
+
+/*
+ * Same but also flushes aliased cache contents to RAM.
+ *
+ * This must be a macro because KM_USER0 and friends aren't defined if
+ * !CONFIG_HIGHMEM
+ */
+#define zero_user_page(page, offset, size, km_type)		\
+	do {							\
+		void *kaddr;					\
+								\
+		BUG_ON((offset) + (size) > PAGE_SIZE);		\
+								\
+		kaddr = kmap_atomic(page, km_type);		\
+		memset((char *)kaddr + (offset), 0, (size));	\
+		flush_dcache_page(page);			\
+		kunmap_atomic(kaddr, (km_type));		\
+	} while (0)
+
+#endif
Signature · 1 line
1.5.2.5
#7 lore raw

PATCH 5/30 ocfs2: Handle macro zero_user_page()

Quoted 5 lines · Sunil Mushran

Commit 01f2705daf5a36208e69d7cf95db9c330f843af6 in mainline introduced macro zero_user_page(). This patch allows one to build ocfs2 with kernels having/not having that change.

Quoted 73 lines
---
 Makefile                      |    3 ++-
 configure.in                  |    5 +++++
 kapi-compat/include/highmem.h |   22 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/highmem.h
Makefile +2 -1
index 21ff590..b7b86db 100644
@@ -10,7 +10,8 @@ LINUX_INCLUDE_FILES =
 
 KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
-	kapi-compat/include/compiler.h
+	kapi-compat/include/compiler.h \
+	kapi-compat/include/highmem.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 7faf363..47b0da0 100644
@@ -167,6 +167,11 @@ OCFS2_CHECK_KERNEL([uninitialized_var() in compiler-gcc4.h], compiler-gcc4.h,
   , compiler_compat_header="compiler.h", [uninitialized_var])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $compiler_compat_header"
 
+highmem_compat_header=""
+OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], highmem.h,
+  , highmem_compat_header="highmem.h", [zero_user_page])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/highmem.h new file +22 -0
new file mode 100644
index 0000000..a8c7e11
@@ -0,0 +1,22 @@
+#ifndef KAPI_HIGHMEM_H
+#define KAPI_HIGHMEM_H
+
+/*
+ * Same but also flushes aliased cache contents to RAM.
+ *
+ * This must be a macro because KM_USER0 and friends aren't defined if
+ * !CONFIG_HIGHMEM
+ */
+#define zero_user_page(page, offset, size, km_type)		\
+	do {							\
+		void *kaddr;					\
+								\
+		BUG_ON((offset) + (size) > PAGE_SIZE);		\
+								\
+		kaddr = kmap_atomic(page, km_type);		\
+		memset((char *)kaddr + (offset), 0, (size));	\
+		flush_dcache_page(page);			\
+		kunmap_atomic(kaddr, (km_type));		\
+	} while (0)
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 8 lines
"Friends may come and go, but enemies accumulate." 
        - Thomas Jones

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#8 lore raw

PATCH 6/30 ocfs2: Include do_sync_mapping_range() from mainline

In reply to Sunil Mushran

Commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 introduced export symbol do_sync_mapping_range(). This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Config.make.in    |    2 +
 configure.in      |    5 +++
 fs/ocfs2/Makefile |    4 ++
 fs/ocfs2/alloc.c  |   93 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 104 insertions(+), 0 deletions(-)
Config.make.in +2 -0
index befeb79..1fe7ddc 100644
@@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
+HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
configure.in +5 -0
index 47b0da0..603dc94 100644
@@ -172,6 +172,11 @@ OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], highmem.h,
   , highmem_compat_header="highmem.h", [zero_user_page])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header"
 
+HAS_SYNC_MAPPING_RANGE=
+OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
+  HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
+AC_SUBST(HAS_SYNC_MAPPING_RANGE)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 0edfed7..3dc33a5 100644
@@ -29,6 +29,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef HAS_SYNC_MAPPING_RANGE
+EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +93 -0

105 lines not on this page · raw message

Signature · 1 line
1.5.2.5
#9 lore raw

PATCH 6/30 ocfs2: Include do_sync_mapping_range() from mainline

Quoted 3 lines · Sunil Mushran

Commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 introduced export symbol do_sync_mapping_range(). This patch allows one to build ocfs2 with kernels having/not having that change.

Rather than putting this in alloc.c, I'd put it in
kapi-include/sync_mapping_range.h, wrapped in the !HAVE_SYNC_MAPPING_RANGE check:

    #ifndef KAPI_SYNC_MAPPING_RANGE_H
    #define KAPI_SYNC_MAPPING_RANGE_H

    #ifndef HAVE_SYNC_MAPPING_RANGE
    int do_writepages...
    {
    }
    int sync_mapping..
    {
    }
    #endif
    #endif

then, in fs/ocfs2/Makefile, I'd do:

ifdef HAS_SYNC_MAPPING_RANGE
CPPFLAGS_alloc.o += -DHAS_SYNC_MAPPING_RANGE
endif

This applys the define to alloc.c only. Thus, while all files would get -include kapi-compat/sync_mapping_range.h, every file except alloc.c would see it as empty.
The other thing I would do would be to reverse the check. Right
now, you set HAS_SYNC_MAPPING_RANGE for new kernels. If I ran "make -C /usr/src/linux M=pwd/fs/ocfs2" without running configure, it would fail against a recent kernel.

Joel

Quoted 172 lines
---
 Config.make.in    |    2 +
 configure.in      |    5 +++
 fs/ocfs2/Makefile |    4 ++
 fs/ocfs2/alloc.c  |   93 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 104 insertions(+), 0 deletions(-)
Config.make.in +2 -0
index befeb79..1fe7ddc 100644
@@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
+HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
configure.in +5 -0
index 47b0da0..603dc94 100644
@@ -172,6 +172,11 @@ OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], highmem.h,
   , highmem_compat_header="highmem.h", [zero_user_page])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header"
 
+HAS_SYNC_MAPPING_RANGE=
+OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
+  HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
+AC_SUBST(HAS_SYNC_MAPPING_RANGE)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 0edfed7..3dc33a5 100644
@@ -29,6 +29,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef HAS_SYNC_MAPPING_RANGE
+EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +93 -0
index 5a8a4f2..0cc4729 100644
@@ -29,6 +29,11 @@
 #include <linux/highmem.h>
 #include <linux/swap.h>
 
+#ifndef HAS_SYNC_MAPPING_RANGE
+#include <linux/writeback.h>
+#include <linux/mpage.h>
+#endif
+
 #define MLOG_MASK_PREFIX ML_DISK_ALLOC
 #include <cluster/masklog.h>
 
@@ -5750,6 +5755,94 @@ out:
 	return ret;
 }
 
+#ifndef HAS_SYNC_MAPPING_RANGE
+int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
+{
+	int ret;
+
+	if (wbc->nr_to_write <= 0)
+		return 0;
+	wbc->for_writepages = 1;
+	if (mapping->a_ops->writepages)
+		ret = mapping->a_ops->writepages(mapping, wbc);
+	else
+		ret = generic_writepages(mapping, wbc);
+	wbc->for_writepages = 0;
+	return ret;
+}
+
+/**
+ * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
+ * @mapping:	address space structure to write
+ * @start:	offset in bytes where the range starts
+ * @end:	offset in bytes where the range ends (inclusive)
+ * @sync_mode:	enable synchronous operation
+ *
+ * Start writeback against all of a mapping's dirty pages that lie
+ * within the byte offsets <start, end> inclusive.
+ *
+ * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as
+ * opposed to a regular memory cleansing writeback.  The difference between
+ * these two operations is that if a dirty page/buffer is encountered, it must
+ * be waited upon, and not just skipped over.
+ */
+int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
+				loff_t end, int sync_mode)
+{
+	int ret;
+	struct writeback_control wbc = {
+		.sync_mode = sync_mode,
+		.nr_to_write = mapping->nrpages * 2,
+		.range_start = start,
+		.range_end = end,
+	};
+
+	if (!mapping_cap_writeback_dirty(mapping))
+		return 0;
+
+	ret = do_writepages(mapping, &wbc);
+	return ret;
+}
+
+/*
+ * `endbyte' is inclusive
+ */
+static int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
+				 loff_t endbyte, unsigned int flags)
+{
+	int ret;
+
+	if (!mapping) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	ret = 0;
+	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
+		ret = wait_on_page_writeback_range(mapping,
+					offset >> PAGE_CACHE_SHIFT,
+					endbyte >> PAGE_CACHE_SHIFT);
+		if (ret < 0)
+			goto out;
+	}
+
+	if (flags & SYNC_FILE_RANGE_WRITE) {
+		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
+						WB_SYNC_NONE);
+		if (ret < 0)
+			goto out;
+	}
+
+	if (flags & SYNC_FILE_RANGE_WAIT_AFTER) {
+		ret = wait_on_page_writeback_range(mapping,
+					offset >> PAGE_CACHE_SHIFT,
+					endbyte >> PAGE_CACHE_SHIFT);
+	}
+out:
+	return ret;
+}
+#endif
+
 /*
  * Zero the area past i_size but still within an allocated
  * cluster. This avoids exposing nonzero data on subsequent file
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
"And yet I fight,
 And yet I fight this battle all alone.
 No one to cry to;
 No place to call home."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#10 lore raw

PATCH 6/30 ocfs2: Include do_sync_mapping_range() from mainline

Yes, this is better.

Quoted 215 lines · Joel Becker
Quoted 4 lines · Sunil Mushran

Commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 introduced export symbol do_sync_mapping_range(). This patch allows one to build ocfs2 with kernels having/not having that change.

Rather than putting this in alloc.c, I'd put it in
kapi-include/sync_mapping_range.h, wrapped in the !HAVE_SYNC_MAPPING_RANGE check:

    #ifndef KAPI_SYNC_MAPPING_RANGE_H
    #define KAPI_SYNC_MAPPING_RANGE_H

    #ifndef HAVE_SYNC_MAPPING_RANGE
    int do_writepages...
    {
    }
    int sync_mapping..
    {
    }
    #endif
    #endif

then, in fs/ocfs2/Makefile, I'd do:

ifdef HAS_SYNC_MAPPING_RANGE
CPPFLAGS_alloc.o += -DHAS_SYNC_MAPPING_RANGE
endif

This applys the define to alloc.c only. Thus, while all files would get -include kapi-compat/sync_mapping_range.h, every file except alloc.c would see it as empty.
The other thing I would do would be to reverse the check. Right
now, you set HAS_SYNC_MAPPING_RANGE for new kernels. If I ran "make -C /usr/src/linux M=pwd/fs/ocfs2" without running configure, it would fail against a recent kernel.

Joel

Quoted 172 lines
---
 Config.make.in    |    2 +
 configure.in      |    5 +++
 fs/ocfs2/Makefile |    4 ++
 fs/ocfs2/alloc.c  |   93 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 104 insertions(+), 0 deletions(-)
Config.make.in +2 -0
index befeb79..1fe7ddc 100644
@@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
+HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+
 OCFS_DEBUG = @OCFS_DEBUG@
 
 ifneq ($(OCFS_DEBUG),)
configure.in +5 -0
index 47b0da0..603dc94 100644
@@ -172,6 +172,11 @@ OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], highmem.h,
   , highmem_compat_header="highmem.h", [zero_user_page])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header"
 
+HAS_SYNC_MAPPING_RANGE=
+OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
+  HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
+AC_SUBST(HAS_SYNC_MAPPING_RANGE)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 0edfed7..3dc33a5 100644
@@ -29,6 +29,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef HAS_SYNC_MAPPING_RANGE
+EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/alloc.c +93 -0
index 5a8a4f2..0cc4729 100644
@@ -29,6 +29,11 @@
 #include <linux/highmem.h>
 #include <linux/swap.h>
 
+#ifndef HAS_SYNC_MAPPING_RANGE
+#include <linux/writeback.h>
+#include <linux/mpage.h>
+#endif
+
 #define MLOG_MASK_PREFIX ML_DISK_ALLOC
 #include <cluster/masklog.h>
 
@@ -5750,6 +5755,94 @@ out:
 	return ret;
 }
 
+#ifndef HAS_SYNC_MAPPING_RANGE
+int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
+{
+	int ret;
+
+	if (wbc->nr_to_write <= 0)
+		return 0;
+	wbc->for_writepages = 1;
+	if (mapping->a_ops->writepages)
+		ret = mapping->a_ops->writepages(mapping, wbc);
+	else
+		ret = generic_writepages(mapping, wbc);
+	wbc->for_writepages = 0;
+	return ret;
+}
+
+/**
+ * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
+ * @mapping:	address space structure to write
+ * @start:	offset in bytes where the range starts
+ * @end:	offset in bytes where the range ends (inclusive)
+ * @sync_mode:	enable synchronous operation
+ *
+ * Start writeback against all of a mapping's dirty pages that lie
+ * within the byte offsets <start, end> inclusive.
+ *
+ * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as
+ * opposed to a regular memory cleansing writeback.  The difference between
+ * these two operations is that if a dirty page/buffer is encountered, it must
+ * be waited upon, and not just skipped over.
+ */
+int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
+				loff_t end, int sync_mode)
+{
+	int ret;
+	struct writeback_control wbc = {
+		.sync_mode = sync_mode,
+		.nr_to_write = mapping->nrpages * 2,
+		.range_start = start,
+		.range_end = end,
+	};
+
+	if (!mapping_cap_writeback_dirty(mapping))
+		return 0;
+
+	ret = do_writepages(mapping, &wbc);
+	return ret;
+}
+
+/*
+ * `endbyte' is inclusive
+ */
+static int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
+				 loff_t endbyte, unsigned int flags)
+{
+	int ret;
+
+	if (!mapping) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	ret = 0;
+	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
+		ret = wait_on_page_writeback_range(mapping,
+					offset >> PAGE_CACHE_SHIFT,
+					endbyte >> PAGE_CACHE_SHIFT);
+		if (ret < 0)
+			goto out;
+	}
+
+	if (flags & SYNC_FILE_RANGE_WRITE) {
+		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
+						WB_SYNC_NONE);
+		if (ret < 0)
+			goto out;
+	}
+
+	if (flags & SYNC_FILE_RANGE_WAIT_AFTER) {
+		ret = wait_on_page_writeback_range(mapping,
+					offset >> PAGE_CACHE_SHIFT,
+					endbyte >> PAGE_CACHE_SHIFT);
+	}
+out:
+	return ret;
+}
+#endif
+
 /*
  * Zero the area past i_size but still within an allocated
  * cluster. This avoids exposing nonzero data on subsequent file
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
#11 lore raw

PATCH 7/30 ocfs2: Handle struct f_path in struct file

In reply to Sunil Mushran

Commit 0f7fc9e4d03987fe29f6dd4aa67e4c56eb7ecb05 in mainline added struct path in struct file. This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Config.make.in              |    1 +
 Makefile                    |    3 ++-
 configure.in                |    6 ++++++
 fs/ocfs2/Makefile           |    4 ++++
 fs/ocfs2/aops.c             |    4 ++--
 fs/ocfs2/dir.c              |    2 +-
 fs/ocfs2/dlm/dlmfs.c        |    4 ++--
 fs/ocfs2/file.c             |   38 +++++++++++++++++++-------------------
 fs/ocfs2/ioctl.c            |    2 +-
 fs/ocfs2/mmap.c             |    2 +-
 kapi-compat/include/fpath.h |   10 ++++++++++
 11 files changed, 49 insertions(+), 27 deletions(-)
 create mode 100644 kapi-compat/include/fpath.h
Config.make.in +1 -0
index 1fe7ddc..4f42cca 100644
@@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index b7b86db..b00a6c4 100644
@@ -11,7 +11,8 @@ LINUX_INCLUDE_FILES =
 KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
 	kapi-compat/include/compiler.h \
-	kapi-compat/include/highmem.h
+	kapi-compat/include/highmem.h \
+	kapi-compat/include/fpath.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 603dc94..907c90f 100644
@@ -177,6 +177,12 @@ OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
   HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
 AC_SUBST(HAS_SYNC_MAPPING_RANGE)
 
+HAS_F_PATH_DEFINED=
+OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h,
+  HAS_F_PATH_DEFINED=yes, , [f_path])
+AC_SUBST(HAS_F_PATH_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 3dc33a5..b6c8d03 100644
@@ -33,6 +33,10 @@ ifdef HAS_SYNC_MAPPING_RANGE
 EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
 endif
 
+ifdef HAS_F_PATH_DEFINED
+EXTRA_CFLAGS += -DHAS_F_PATH_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/aops.c +2 -2
index 34d1045..96cb31b 100644
@@ -584,7 +584,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,
 			     ssize_t bytes,
 			     void *private)
 {
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
+	struct inode *inode = iocb->ki_filp->f_path_dentry->d_inode;
 	int level;
 
 	/* this io's submitter should not have unlocked this before we could */
@@ -626,7 +626,7 @@ static ssize_t ocfs2_direct_IO(int rw,
 			       unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_path_dentry->d_inode->i_mapping->host;
 	int ret;
 
 	mlog_entry_void();
fs/ocfs2/dir.c +1 -1
index 7453b70..0764a66 100644
@@ -840,7 +840,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv,
 int ocfs2_readdir(struct file * filp, void * dirent, filldir_t filldir)
 {
 	int error = 0;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 	int lock_level = 0;
 
 	mlog_entry("dirino=%llu\n",
fs/ocfs2/dlm/dlmfs.c +2 -2
index 7418dc8..4ce2dea 100644
@@ -175,7 +175,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
 	int bytes_left;
 	ssize_t readlen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
@@ -219,7 +219,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
 	int bytes_left;
 	ssize_t writelen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
fs/ocfs2/file.c +19 -19
index a62b14e..adb10b9 100644
@@ -70,7 +70,7 @@ static int ocfs2_file_open(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		   file->f_path.dentry->d_name.len, file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len, file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 
@@ -100,8 +100,8 @@ static int ocfs2_file_release(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		       file->f_path.dentry->d_name.len,
-		       file->f_path.dentry->d_name.name);
+		       file->f_path_dentry->d_name.len,
+		       file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 	if (!--oi->ip_open_count)
@@ -1663,7 +1663,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		}
 	}
 
-	if (file && should_remove_suid(file->f_path.dentry)) {
+	if (file && should_remove_suid(file->f_path_dentry)) {
 		ret = __ocfs2_write_remove_suid(inode, di_bh);
 		if (ret) {
 			mlog_errno(ret);
@@ -1730,7 +1730,7 @@ out:
 int ocfs2_change_file_space(struct file *file, unsigned int cmd,
 			    struct ocfs2_space_resv *sr)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);;
 
 	if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&
@@ -2023,12 +2023,12 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 	size_t count;		/* after file limit checks */
 	loff_t *ppos = &iocb->ki_pos;
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", file,
 		   (unsigned int)nr_segs,
-		   file->f_path.dentry->d_name.len,
-		   file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len,
+		   file->f_path_dentry->d_name.name);
 
 	if (iocb->ki_left == 0)
 		return 0;
@@ -2062,7 +2062,7 @@ relock:
 	}
 
 	can_do_direct = direct_io;
-	ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos,
+	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
 					    iocb->ki_left, appending,
 					    &can_do_direct);
 	if (ret < 0) {
@@ -2251,12 +2251,12 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 				       unsigned int flags)
 {
 	int ret;
-	struct inode *inode = out->f_path.dentry->d_inode;
+	struct inode *inode = out->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe,
 		   (unsigned int)len,
-		   out->f_path.dentry->d_name.len,
-		   out->f_path.dentry->d_name.name);
+		   out->f_path_dentry->d_name.len,
+		   out->f_path_dentry->d_name.name);
 
 	inode_double_lock(inode, pipe->inode);
 
@@ -2266,7 +2266,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 		goto out;
 	}
 
-	ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, ppos, len, 0,
+	ret = ocfs2_prepare_inode_for_write(out->f_path_dentry, ppos, len, 0,
 					    NULL);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -2292,12 +2292,12 @@ static ssize_t ocfs2_file_splice_read(struct file *in,
 				      unsigned int flags)
 {
 	int ret = 0;
-	struct inode *inode = in->f_path.dentry->d_inode;
+	struct inode *inode = in->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", in, pipe,
 		   (unsigned int)len,
-		   in->f_path.dentry->d_name.len,
-		   in->f_path.dentry->d_name.name);
+		   in->f_path_dentry->d_name.len,
+		   in->f_path_dentry->d_name.name);
 
 	/*
 	 * See the comment in ocfs2_file_aio_read()
@@ -2323,12 +2323,12 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 {
 	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
 	struct file *filp = iocb->ki_filp;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
 		   (unsigned int)nr_segs,
-		   filp->f_path.dentry->d_name.len,
-		   filp->f_path.dentry->d_name.name);
+		   filp->f_path_dentry->d_name.len,
+		   filp->f_path_dentry->d_name.name);
 
 	if (!inode) {
 		ret = -EINVAL;
fs/ocfs2/ioctl.c +1 -1
index 87dcece..929aeac 100644
@@ -148,7 +148,7 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
 #ifdef CONFIG_COMPAT
 long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	int ret;
 
 	switch (cmd) {
fs/ocfs2/mmap.c +1 -1
index 9875615..c0483c9 100644
@@ -152,7 +152,7 @@ out:
 
 static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
 {
-	struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+	struct inode *inode = vma->vm_file->f_path_dentry->d_inode;
 	struct buffer_head *di_bh = NULL;
 	sigset_t blocked, oldset;
 	int ret, ret2;
kapi-compat/include/fpath.h new file +10 -0
new file mode 100644
index 0000000..178d8e3
@@ -0,0 +1,10 @@
+#ifndef KAPI_FPATH_H
+#define KAPI_FPATH_H
+
+#ifdef HAS_F_PATH_DEFINED
+# define f_path_dentry	f_path.dentry
+#else
+# define f_path_dentry	f_dentry
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#12 lore raw

PATCH 7/30 ocfs2: Handle struct f_path in struct file

Quoted 4 lines · Sunil Mushran

Commit 0f7fc9e4d03987fe29f6dd4aa67e4c56eb7ecb05 in mainline added struct path in struct file. This patch allows one to build ocfs2 with kernels having/not having that change.

Here again the define is reversed.

Thinking about the compat trick you did, I'm wondering if something like this isn't a better idea:

#ifdef NO_F_PATH

# define filp_dentry(i) (i)->f_dentry
#else
# define filp_dentry(i) (i)->f_path.dentry
#endif
...
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
+	struct inode *inode = filp_dentry(iocb->ki_filp)->d_inode;

Thoughs? I'm not sold on it, just throwing it out there.

Joel

Quoted 305 lines
---
 Config.make.in              |    1 +
 Makefile                    |    3 ++-
 configure.in                |    6 ++++++
 fs/ocfs2/Makefile           |    4 ++++
 fs/ocfs2/aops.c             |    4 ++--
 fs/ocfs2/dir.c              |    2 +-
 fs/ocfs2/dlm/dlmfs.c        |    4 ++--
 fs/ocfs2/file.c             |   38 +++++++++++++++++++-------------------
 fs/ocfs2/ioctl.c            |    2 +-
 fs/ocfs2/mmap.c             |    2 +-
 kapi-compat/include/fpath.h |   10 ++++++++++
 11 files changed, 49 insertions(+), 27 deletions(-)
 create mode 100644 kapi-compat/include/fpath.h
Config.make.in +1 -0
index 1fe7ddc..4f42cca 100644
@@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index b7b86db..b00a6c4 100644
@@ -11,7 +11,8 @@ LINUX_INCLUDE_FILES =
 KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
 	kapi-compat/include/compiler.h \
-	kapi-compat/include/highmem.h
+	kapi-compat/include/highmem.h \
+	kapi-compat/include/fpath.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 603dc94..907c90f 100644
@@ -177,6 +177,12 @@ OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
   HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
 AC_SUBST(HAS_SYNC_MAPPING_RANGE)
 
+HAS_F_PATH_DEFINED=
+OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h,
+  HAS_F_PATH_DEFINED=yes, , [f_path])
+AC_SUBST(HAS_F_PATH_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 3dc33a5..b6c8d03 100644
@@ -33,6 +33,10 @@ ifdef HAS_SYNC_MAPPING_RANGE
 EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
 endif
 
+ifdef HAS_F_PATH_DEFINED
+EXTRA_CFLAGS += -DHAS_F_PATH_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/aops.c +2 -2
index 34d1045..96cb31b 100644
@@ -584,7 +584,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,
 			     ssize_t bytes,
 			     void *private)
 {
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
+	struct inode *inode = iocb->ki_filp->f_path_dentry->d_inode;
 	int level;
 
 	/* this io's submitter should not have unlocked this before we could */
@@ -626,7 +626,7 @@ static ssize_t ocfs2_direct_IO(int rw,
 			       unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_path_dentry->d_inode->i_mapping->host;
 	int ret;
 
 	mlog_entry_void();
fs/ocfs2/dir.c +1 -1
index 7453b70..0764a66 100644
@@ -840,7 +840,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv,
 int ocfs2_readdir(struct file * filp, void * dirent, filldir_t filldir)
 {
 	int error = 0;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 	int lock_level = 0;
 
 	mlog_entry("dirino=%llu\n",
fs/ocfs2/dlm/dlmfs.c +2 -2
index 7418dc8..4ce2dea 100644
@@ -175,7 +175,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
 	int bytes_left;
 	ssize_t readlen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
@@ -219,7 +219,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
 	int bytes_left;
 	ssize_t writelen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
fs/ocfs2/file.c +19 -19
index a62b14e..adb10b9 100644
@@ -70,7 +70,7 @@ static int ocfs2_file_open(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		   file->f_path.dentry->d_name.len, file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len, file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 
@@ -100,8 +100,8 @@ static int ocfs2_file_release(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		       file->f_path.dentry->d_name.len,
-		       file->f_path.dentry->d_name.name);
+		       file->f_path_dentry->d_name.len,
+		       file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 	if (!--oi->ip_open_count)
@@ -1663,7 +1663,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		}
 	}
 
-	if (file && should_remove_suid(file->f_path.dentry)) {
+	if (file && should_remove_suid(file->f_path_dentry)) {
 		ret = __ocfs2_write_remove_suid(inode, di_bh);
 		if (ret) {
 			mlog_errno(ret);
@@ -1730,7 +1730,7 @@ out:
 int ocfs2_change_file_space(struct file *file, unsigned int cmd,
 			    struct ocfs2_space_resv *sr)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);;
 
 	if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&
@@ -2023,12 +2023,12 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 	size_t count;		/* after file limit checks */
 	loff_t *ppos = &iocb->ki_pos;
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", file,
 		   (unsigned int)nr_segs,
-		   file->f_path.dentry->d_name.len,
-		   file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len,
+		   file->f_path_dentry->d_name.name);
 
 	if (iocb->ki_left == 0)
 		return 0;
@@ -2062,7 +2062,7 @@ relock:
 	}
 
 	can_do_direct = direct_io;
-	ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos,
+	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
 					    iocb->ki_left, appending,
 					    &can_do_direct);
 	if (ret < 0) {
@@ -2251,12 +2251,12 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 				       unsigned int flags)
 {
 	int ret;
-	struct inode *inode = out->f_path.dentry->d_inode;
+	struct inode *inode = out->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe,
 		   (unsigned int)len,
-		   out->f_path.dentry->d_name.len,
-		   out->f_path.dentry->d_name.name);
+		   out->f_path_dentry->d_name.len,
+		   out->f_path_dentry->d_name.name);
 
 	inode_double_lock(inode, pipe->inode);
 
@@ -2266,7 +2266,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 		goto out;
 	}
 
-	ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, ppos, len, 0,
+	ret = ocfs2_prepare_inode_for_write(out->f_path_dentry, ppos, len, 0,
 					    NULL);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -2292,12 +2292,12 @@ static ssize_t ocfs2_file_splice_read(struct file *in,
 				      unsigned int flags)
 {
 	int ret = 0;
-	struct inode *inode = in->f_path.dentry->d_inode;
+	struct inode *inode = in->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", in, pipe,
 		   (unsigned int)len,
-		   in->f_path.dentry->d_name.len,
-		   in->f_path.dentry->d_name.name);
+		   in->f_path_dentry->d_name.len,
+		   in->f_path_dentry->d_name.name);
 
 	/*
 	 * See the comment in ocfs2_file_aio_read()
@@ -2323,12 +2323,12 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 {
 	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
 	struct file *filp = iocb->ki_filp;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
 		   (unsigned int)nr_segs,
-		   filp->f_path.dentry->d_name.len,
-		   filp->f_path.dentry->d_name.name);
+		   filp->f_path_dentry->d_name.len,
+		   filp->f_path_dentry->d_name.name);
 
 	if (!inode) {
 		ret = -EINVAL;
fs/ocfs2/ioctl.c +1 -1
index 87dcece..929aeac 100644
@@ -148,7 +148,7 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
 #ifdef CONFIG_COMPAT
 long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	int ret;
 
 	switch (cmd) {
fs/ocfs2/mmap.c +1 -1
index 9875615..c0483c9 100644
@@ -152,7 +152,7 @@ out:
 
 static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
 {
-	struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+	struct inode *inode = vma->vm_file->f_path_dentry->d_inode;
 	struct buffer_head *di_bh = NULL;
 	sigset_t blocked, oldset;
 	int ret, ret2;
kapi-compat/include/fpath.h new file +10 -0
new file mode 100644
index 0000000..178d8e3
@@ -0,0 +1,10 @@
+#ifndef KAPI_FPATH_H
+#define KAPI_FPATH_H
+
+#ifdef HAS_F_PATH_DEFINED
+# define f_path_dentry	f_path.dentry
+#else
+# define f_path_dentry	f_dentry
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #3

	"Watch a sunrise at least once a year."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#13 lore raw

PATCH 7/30 ocfs2: Handle struct f_path in struct file

I think this is better. Will do.

Quoted 335 lines · Joel Becker
Quoted 5 lines · Sunil Mushran

Commit 0f7fc9e4d03987fe29f6dd4aa67e4c56eb7ecb05 in mainline added struct path in struct file. This patch allows one to build ocfs2 with kernels having/not having that change.

Here again the define is reversed.

Thinking about the compat trick you did, I'm wondering if something like this isn't a better idea:

#ifdef NO_F_PATH

# define filp_dentry(i) (i)->f_dentry
#else
# define filp_dentry(i) (i)->f_path.dentry
#endif
...
(quoted diff) +1 -1
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
+	struct inode *inode = filp_dentry(iocb->ki_filp)->d_inode;

Thoughs? I'm not sold on it, just throwing it out there.

Joel

Quoted 306 lines
---
 Config.make.in              |    1 +
 Makefile                    |    3 ++-
 configure.in                |    6 ++++++
 fs/ocfs2/Makefile           |    4 ++++
 fs/ocfs2/aops.c             |    4 ++--
 fs/ocfs2/dir.c              |    2 +-
 fs/ocfs2/dlm/dlmfs.c        |    4 ++--
 fs/ocfs2/file.c             |   38 +++++++++++++++++++-------------------
 fs/ocfs2/ioctl.c            |    2 +-
 fs/ocfs2/mmap.c             |    2 +-
 kapi-compat/include/fpath.h |   10 ++++++++++
 11 files changed, 49 insertions(+), 27 deletions(-)
 create mode 100644 kapi-compat/include/fpath.h
Config.make.in +1 -0
index 1fe7ddc..4f42cca 100644
@@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@
 DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
+HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index b7b86db..b00a6c4 100644
@@ -11,7 +11,8 @@ LINUX_INCLUDE_FILES =
 KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
 	kapi-compat/include/compiler.h \
-	kapi-compat/include/highmem.h
+	kapi-compat/include/highmem.h \
+	kapi-compat/include/fpath.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 603dc94..907c90f 100644
@@ -177,6 +177,12 @@ OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h,
   HAS_SYNC_MAPPING_RANGE=yes, , [do_sync_mapping_range(])
 AC_SUBST(HAS_SYNC_MAPPING_RANGE)
 
+HAS_F_PATH_DEFINED=
+OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h,
+  HAS_F_PATH_DEFINED=yes, , [f_path])
+AC_SUBST(HAS_F_PATH_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 3dc33a5..b6c8d03 100644
@@ -33,6 +33,10 @@ ifdef HAS_SYNC_MAPPING_RANGE
 EXTRA_CFLAGS += -DHAS_SYNC_MAPPING_RANGE
 endif
 
+ifdef HAS_F_PATH_DEFINED
+EXTRA_CFLAGS += -DHAS_F_PATH_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/aops.c +2 -2
index 34d1045..96cb31b 100644
@@ -584,7 +584,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,
 			     ssize_t bytes,
 			     void *private)
 {
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
+	struct inode *inode = iocb->ki_filp->f_path_dentry->d_inode;
 	int level;
 
 	/* this io's submitter should not have unlocked this before we could */
@@ -626,7 +626,7 @@ static ssize_t ocfs2_direct_IO(int rw,
 			       unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;
+	struct inode *inode = file->f_path_dentry->d_inode->i_mapping->host;
 	int ret;
 
 	mlog_entry_void();
fs/ocfs2/dir.c +1 -1
index 7453b70..0764a66 100644
@@ -840,7 +840,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv,
 int ocfs2_readdir(struct file * filp, void * dirent, filldir_t filldir)
 {
 	int error = 0;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 	int lock_level = 0;
 
 	mlog_entry("dirino=%llu\n",
fs/ocfs2/dlm/dlmfs.c +2 -2
index 7418dc8..4ce2dea 100644
@@ -175,7 +175,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
 	int bytes_left;
 	ssize_t readlen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
@@ -219,7 +219,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
 	int bytes_left;
 	ssize_t writelen;
 	char *lvb_buf;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
 		inode->i_ino, count, *ppos);
fs/ocfs2/file.c +19 -19
index a62b14e..adb10b9 100644
@@ -70,7 +70,7 @@ static int ocfs2_file_open(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		   file->f_path.dentry->d_name.len, file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len, file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 
@@ -100,8 +100,8 @@ static int ocfs2_file_release(struct inode *inode, struct file *file)
 	struct ocfs2_inode_info *oi = OCFS2_I(inode);
 
 	mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file,
-		       file->f_path.dentry->d_name.len,
-		       file->f_path.dentry->d_name.name);
+		       file->f_path_dentry->d_name.len,
+		       file->f_path_dentry->d_name.name);
 
 	spin_lock(&oi->ip_lock);
 	if (!--oi->ip_open_count)
@@ -1663,7 +1663,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		}
 	}
 
-	if (file && should_remove_suid(file->f_path.dentry)) {
+	if (file && should_remove_suid(file->f_path_dentry)) {
 		ret = __ocfs2_write_remove_suid(inode, di_bh);
 		if (ret) {
 			mlog_errno(ret);
@@ -1730,7 +1730,7 @@ out:
 int ocfs2_change_file_space(struct file *file, unsigned int cmd,
 			    struct ocfs2_space_resv *sr)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);;
 
 	if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&
@@ -2023,12 +2023,12 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 	size_t count;		/* after file limit checks */
 	loff_t *ppos = &iocb->ki_pos;
 	struct file *file = iocb->ki_filp;
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", file,
 		   (unsigned int)nr_segs,
-		   file->f_path.dentry->d_name.len,
-		   file->f_path.dentry->d_name.name);
+		   file->f_path_dentry->d_name.len,
+		   file->f_path_dentry->d_name.name);
 
 	if (iocb->ki_left == 0)
 		return 0;
@@ -2062,7 +2062,7 @@ relock:
 	}
 
 	can_do_direct = direct_io;
-	ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos,
+	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
 					    iocb->ki_left, appending,
 					    &can_do_direct);
 	if (ret < 0) {
@@ -2251,12 +2251,12 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 				       unsigned int flags)
 {
 	int ret;
-	struct inode *inode = out->f_path.dentry->d_inode;
+	struct inode *inode = out->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe,
 		   (unsigned int)len,
-		   out->f_path.dentry->d_name.len,
-		   out->f_path.dentry->d_name.name);
+		   out->f_path_dentry->d_name.len,
+		   out->f_path_dentry->d_name.name);
 
 	inode_double_lock(inode, pipe->inode);
 
@@ -2266,7 +2266,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
 		goto out;
 	}
 
-	ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, ppos, len, 0,
+	ret = ocfs2_prepare_inode_for_write(out->f_path_dentry, ppos, len, 0,
 					    NULL);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -2292,12 +2292,12 @@ static ssize_t ocfs2_file_splice_read(struct file *in,
 				      unsigned int flags)
 {
 	int ret = 0;
-	struct inode *inode = in->f_path.dentry->d_inode;
+	struct inode *inode = in->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", in, pipe,
 		   (unsigned int)len,
-		   in->f_path.dentry->d_name.len,
-		   in->f_path.dentry->d_name.name);
+		   in->f_path_dentry->d_name.len,
+		   in->f_path_dentry->d_name.name);
 
 	/*
 	 * See the comment in ocfs2_file_aio_read()
@@ -2323,12 +2323,12 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 {
 	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
 	struct file *filp = iocb->ki_filp;
-	struct inode *inode = filp->f_path.dentry->d_inode;
+	struct inode *inode = filp->f_path_dentry->d_inode;
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
 		   (unsigned int)nr_segs,
-		   filp->f_path.dentry->d_name.len,
-		   filp->f_path.dentry->d_name.name);
+		   filp->f_path_dentry->d_name.len,
+		   filp->f_path_dentry->d_name.name);
 
 	if (!inode) {
 		ret = -EINVAL;
fs/ocfs2/ioctl.c +1 -1
index 87dcece..929aeac 100644
@@ -148,7 +148,7 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
 #ifdef CONFIG_COMPAT
 long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
-	struct inode *inode = file->f_path.dentry->d_inode;
+	struct inode *inode = file->f_path_dentry->d_inode;
 	int ret;
 
 	switch (cmd) {
fs/ocfs2/mmap.c +1 -1
index 9875615..c0483c9 100644
@@ -152,7 +152,7 @@ out:
 
 static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
 {
-	struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+	struct inode *inode = vma->vm_file->f_path_dentry->d_inode;
 	struct buffer_head *di_bh = NULL;
 	sigset_t blocked, oldset;
 	int ret, ret2;
kapi-compat/include/fpath.h new file +10 -0
new file mode 100644
index 0000000..178d8e3
@@ -0,0 +1,10 @@
+#ifndef KAPI_FPATH_H
+#define KAPI_FPATH_H
+
+#ifdef HAS_F_PATH_DEFINED
+# define f_path_dentry	f_path.dentry
+#else
+# define f_path_dentry	f_dentry
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
#14 lore raw

PATCH 8/30 ocfs2: Define enum umh_wait

In reply to Sunil Mushran

Commit 86313c488a6848b7ec2ba04e74f25f79dd32a0b7 in mainline introduced enum umh_wait. This patch allows one to build ocfs2 with kernels having/ not having that change.

---
 Makefile                   |    3 ++-
 configure.in               |    5 +++++
 kapi-compat/include/kmod.h |   10 ++++++++++
 3 files changed, 17 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/kmod.h
Makefile +2 -1
index b00a6c4..088d0e1 100644
@@ -12,7 +12,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
 	kapi-compat/include/compiler.h \
 	kapi-compat/include/highmem.h \
-	kapi-compat/include/fpath.h
+	kapi-compat/include/fpath.h \
+	kapi-compat/include/kmod.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 907c90f..94937cd 100644
@@ -183,6 +183,11 @@ OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h,
 AC_SUBST(HAS_F_PATH_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h"
 
+kmod_compat_header=""
+OCFS2_CHECK_KERNEL([enum umh_wait in kmod.h], kmod.h,
+  , kmod_compat_header="kmod.h", [umh_wait])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/kmod.h new file +10 -0
new file mode 100644
index 0000000..42a082b
@@ -0,0 +1,10 @@
+#ifndef KAPI_KMOD_H
+#define KAPI_KMOD_H
+
+enum umh_wait {
+	UMH_NO_WAIT = -1,	/* don't wait at all */
+	UMH_WAIT_EXEC = 0,	/* wait for the exec, but not the process */
+	UMH_WAIT_PROC = 1,	/* wait for the process to complete */
+};
+
+#endif
Signature · 1 line
1.5.2.5
#15 lore raw

PATCH 8/30 ocfs2: Define enum umh_wait

Quoted 5 lines · Sunil Mushran

Commit 86313c488a6848b7ec2ba04e74f25f79dd32a0b7 in mainline introduced enum umh_wait. This patch allows one to build ocfs2 with kernels having/ not having that change.

Quoted 61 lines
---
 Makefile                   |    3 ++-
 configure.in               |    5 +++++
 kapi-compat/include/kmod.h |   10 ++++++++++
 3 files changed, 17 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/kmod.h
Makefile +2 -1
index b00a6c4..088d0e1 100644
@@ -12,7 +12,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/workqueue.h \
 	kapi-compat/include/compiler.h \
 	kapi-compat/include/highmem.h \
-	kapi-compat/include/fpath.h
+	kapi-compat/include/fpath.h \
+	kapi-compat/include/kmod.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 907c90f..94937cd 100644
@@ -183,6 +183,11 @@ OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h,
 AC_SUBST(HAS_F_PATH_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h"
 
+kmod_compat_header=""
+OCFS2_CHECK_KERNEL([enum umh_wait in kmod.h], kmod.h,
+  , kmod_compat_header="kmod.h", [umh_wait])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/kmod.h new file +10 -0
new file mode 100644
index 0000000..42a082b
@@ -0,0 +1,10 @@
+#ifndef KAPI_KMOD_H
+#define KAPI_KMOD_H
+
+enum umh_wait {
+	UMH_NO_WAIT = -1,	/* don't wait at all */
+	UMH_WAIT_EXEC = 0,	/* wait for the exec, but not the process */
+	UMH_WAIT_PROC = 1,	/* wait for the process to complete */
+};
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #232

	"Keep your promises."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#16 lore raw

PATCH 9/30 ocfs2: Add helper inc_nlink

In reply to Sunil Mushran

Commit d8c76e6f45c111c32a4b3e50a2adc9210737b0d8 in mainline introduced helper inc_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Makefile                        |    3 ++-
 configure.in                    |    5 +++++
 kapi-compat/include/inc_nlink.h |   19 +++++++++++++++++++
 3 files changed, 26 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/inc_nlink.h
Makefile +2 -1
index 088d0e1..1595b90 100644
@@ -13,7 +13,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/compiler.h \
 	kapi-compat/include/highmem.h \
 	kapi-compat/include/fpath.h \
-	kapi-compat/include/kmod.h
+	kapi-compat/include/kmod.h \
+	kapi-compat/include/inc_nlink.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 94937cd..554a0a4 100644
@@ -188,6 +188,11 @@ OCFS2_CHECK_KERNEL([enum umh_wait in kmod.h], kmod.h,
   , kmod_compat_header="kmod.h", [umh_wait])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header"
 
+inc_nlink_compat_header=""
+OCFS2_CHECK_KERNEL([inc_nlink() in fs.h], fs.h,
+  , inc_nlink_compat_header="inc_nlink.h", [^static inline void inc_nlink(])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $inc_nlink_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/inc_nlink.h new file +19 -0
new file mode 100644
index 0000000..26ddaac
@@ -0,0 +1,19 @@
+#ifndef KAPI_INC_NLINK_H
+#define KAPI_INC_NLINK_H
+
+#include <linux/fs.h>
+
+/*
+ * inc_nlink - directly increment an inode's link count
+ * @inode: inode
+ *
+ * This is a low-level filesystem helper to replace any
+ * direct filesystem manipulation of i_nlink.  Currently,
+ * it is only here for parity with dec_nlink().
+ */
+static inline void inc_nlink(struct inode *inode)
+{
+	inode->i_nlink++;
+}
+
+#endif
Signature · 1 line
1.5.2.5
#17 lore raw

PATCH 9/30 ocfs2: Add helper inc_nlink

Quoted 5 lines · Sunil Mushran

Commit d8c76e6f45c111c32a4b3e50a2adc9210737b0d8 in mainline introduced helper inc_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change.

Quoted 70 lines
---
 Makefile                        |    3 ++-
 configure.in                    |    5 +++++
 kapi-compat/include/inc_nlink.h |   19 +++++++++++++++++++
 3 files changed, 26 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/inc_nlink.h
Makefile +2 -1
index 088d0e1..1595b90 100644
@@ -13,7 +13,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/compiler.h \
 	kapi-compat/include/highmem.h \
 	kapi-compat/include/fpath.h \
-	kapi-compat/include/kmod.h
+	kapi-compat/include/kmod.h \
+	kapi-compat/include/inc_nlink.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 94937cd..554a0a4 100644
@@ -188,6 +188,11 @@ OCFS2_CHECK_KERNEL([enum umh_wait in kmod.h], kmod.h,
   , kmod_compat_header="kmod.h", [umh_wait])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header"
 
+inc_nlink_compat_header=""
+OCFS2_CHECK_KERNEL([inc_nlink() in fs.h], fs.h,
+  , inc_nlink_compat_header="inc_nlink.h", [^static inline void inc_nlink(])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $inc_nlink_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/inc_nlink.h new file +19 -0
new file mode 100644
index 0000000..26ddaac
@@ -0,0 +1,19 @@
+#ifndef KAPI_INC_NLINK_H
+#define KAPI_INC_NLINK_H
+
+#include <linux/fs.h>
+
+/*
+ * inc_nlink - directly increment an inode's link count
+ * @inode: inode
+ *
+ * This is a low-level filesystem helper to replace any
+ * direct filesystem manipulation of i_nlink.  Currently,
+ * it is only here for parity with dec_nlink().
+ */
+static inline void inc_nlink(struct inode *inode)
+{
+	inode->i_nlink++;
+}
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #407

	"Every once in a while, take the scenic route."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#18 lore raw

PATCH 10/30 ocfs2: Add helper drop_nlink

In reply to Sunil Mushran

Commit 9a53c3a783c2fa9b969628e65695c11c3e51e673 in mainline added helper drop_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change.

---
 Makefile                         |    3 ++-
 configure.in                     |    5 +++++
 kapi-compat/include/drop_nlink.h |   22 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/drop_nlink.h
Makefile +2 -1
index 1595b90..2a97e00 100644
@@ -14,7 +14,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/highmem.h \
 	kapi-compat/include/fpath.h \
 	kapi-compat/include/kmod.h \
-	kapi-compat/include/inc_nlink.h
+	kapi-compat/include/inc_nlink.h \
+	kapi-compat/include/drop_nlink.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 554a0a4..81041fb 100644
@@ -193,6 +193,11 @@ OCFS2_CHECK_KERNEL([inc_nlink() in fs.h], fs.h,
   , inc_nlink_compat_header="inc_nlink.h", [^static inline void inc_nlink(])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $inc_nlink_compat_header"
 
+drop_nlink_compat_header=""
+OCFS2_CHECK_KERNEL([drop_nlink() in fs.h], fs.h,
+  , drop_nlink_compat_header="drop_nlink.h", [^static inline void drop_nlink(])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $drop_nlink_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/drop_nlink.h new file +22 -0
new file mode 100644
index 0000000..d54973b
@@ -0,0 +1,22 @@
+#ifndef KAPI_DROP_NLINK_H
+#define KAPI_DROP_NLINK_H
+
+#include <linux/fs.h>
+
+/*
+ * drop_nlink - directly drop an inode's link count
+ * @inode: inode
+ *
+ * This is a low-level filesystem helper to replace any
+ * direct filesystem manipulation of i_nlink.  In cases
+ * where we are attempting to track writes to the
+ * filesystem, a decrement to zero means an imminent
+ * write when the file is truncated and actually unlinked
+ * on the filesystem.
+ */
+static inline void drop_nlink(struct inode *inode)
+{
+	inode->i_nlink--;
+}
+
+#endif
Signature · 1 line
1.5.2.5
#19 lore raw

PATCH 10/30 ocfs2: Add helper drop_nlink

Quoted 5 lines · Sunil Mushran

Commit 9a53c3a783c2fa9b969628e65695c11c3e51e673 in mainline added helper drop_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change.

Quoted 73 lines
---
 Makefile                         |    3 ++-
 configure.in                     |    5 +++++
 kapi-compat/include/drop_nlink.h |   22 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/drop_nlink.h
Makefile +2 -1
index 1595b90..2a97e00 100644
@@ -14,7 +14,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/highmem.h \
 	kapi-compat/include/fpath.h \
 	kapi-compat/include/kmod.h \
-	kapi-compat/include/inc_nlink.h
+	kapi-compat/include/inc_nlink.h \
+	kapi-compat/include/drop_nlink.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 554a0a4..81041fb 100644
@@ -193,6 +193,11 @@ OCFS2_CHECK_KERNEL([inc_nlink() in fs.h], fs.h,
   , inc_nlink_compat_header="inc_nlink.h", [^static inline void inc_nlink(])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $inc_nlink_compat_header"
 
+drop_nlink_compat_header=""
+OCFS2_CHECK_KERNEL([drop_nlink() in fs.h], fs.h,
+  , drop_nlink_compat_header="drop_nlink.h", [^static inline void drop_nlink(])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $drop_nlink_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/drop_nlink.h new file +22 -0
new file mode 100644
index 0000000..d54973b
@@ -0,0 +1,22 @@
+#ifndef KAPI_DROP_NLINK_H
+#define KAPI_DROP_NLINK_H
+
+#include <linux/fs.h>
+
+/*
+ * drop_nlink - directly drop an inode's link count
+ * @inode: inode
+ *
+ * This is a low-level filesystem helper to replace any
+ * direct filesystem manipulation of i_nlink.  In cases
+ * where we are attempting to track writes to the
+ * filesystem, a decrement to zero means an imminent
+ * write when the file is truncated and actually unlinked
+ * on the filesystem.
+ */
+static inline void drop_nlink(struct inode *inode)
+{
+	inode->i_nlink--;
+}
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
 print STDOUT q
 Just another Perl hacker,
 unless $spring
	- Larry Wall

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#20 lore raw

PATCH 11/30 ocfs2: Handle missing dtors in kmem_cache_create()

In reply to Sunil Mushran

Commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac removed the dtor arg from kmem_cache_create(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in             |    1 +
 Makefile                   |    3 ++-
 configure.in               |    6 ++++++
 fs/ocfs2/Makefile          |    4 ++++
 fs/ocfs2/dlm/Makefile      |    4 ++++
 fs/ocfs2/dlm/dlmfs.c       |    2 +-
 fs/ocfs2/dlm/dlmmaster.c   |    2 +-
 fs/ocfs2/super.c           |    2 +-
 fs/ocfs2/uptodate.c        |    2 +-
 kapi-compat/include/slab.h |   10 ++++++++++
 10 files changed, 31 insertions(+), 5 deletions(-)
 create mode 100644 kapi-compat/include/slab.h
Config.make.in +1 -0
index 4f42cca..07c5a86 100644
@@ -61,6 +61,7 @@ DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
+KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index 2a97e00..ae5947b 100644
@@ -15,7 +15,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/fpath.h \
 	kapi-compat/include/kmod.h \
 	kapi-compat/include/inc_nlink.h \
-	kapi-compat/include/drop_nlink.h
+	kapi-compat/include/drop_nlink.h \
+	kapi-compat/include/slab.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 81041fb..cb91de1 100644
@@ -198,6 +198,12 @@ OCFS2_CHECK_KERNEL([drop_nlink() in fs.h], fs.h,
   , drop_nlink_compat_header="drop_nlink.h", [^static inline void drop_nlink(])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $drop_nlink_compat_header"
 
+KMEM_CACHE_CREATE_DTOR=
+OCFS2_CHECK_KERNEL([kmem_cache_create() with dtor arg in slab.h], slab.h,
+  KMEM_CACHE_CREATE_DTOR=yes, , [^.*void (\*)(void \*, kmem_cache_t \*, unsigned long),])
+AC_SUBST(KMEM_CACHE_CREATE_DTOR)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS slab.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index b6c8d03..403c1c6 100644
@@ -37,6 +37,10 @@ ifdef HAS_F_PATH_DEFINED
 EXTRA_CFLAGS += -DHAS_F_PATH_DEFINED
 endif
 
+ifdef KMEM_CACHE_CREATE_DTOR
+EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index b4fb8e3..628ab3d 100644
@@ -20,6 +20,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef KMEM_CACHE_CREATE_DTOR
+EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +1 -1
index 4ce2dea..dc43923 100644
@@ -588,7 +588,7 @@ static int __init init_dlmfs_fs(void)
 
 	dlmfs_print_version();
 
-	dlmfs_inode_cache = kmem_cache_create("dlmfs_inode_cache",
+	dlmfs_inode_cache = kapi_kmem_cache_create("dlmfs_inode_cache",
 				sizeof(struct dlmfs_inode_private),
 				0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
 					SLAB_MEM_SPREAD),
fs/ocfs2/dlm/dlmmaster.c +1 -1
index 62e4a7d..a668840 100644
@@ -507,7 +507,7 @@ static void dlm_mle_node_up(struct dlm_ctxt *dlm,
 
 int dlm_init_mle_cache(void)
 {
-	dlm_mle_cache = kmem_cache_create("dlm_mle_cache",
+	dlm_mle_cache = kapi_kmem_cache_create("dlm_mle_cache",
 					  sizeof(struct dlm_master_list_entry),
 					  0, SLAB_HWCACHE_ALIGN,
 					  NULL);
fs/ocfs2/super.c +1 -1
index a8f90a2..f5c424d 100644
@@ -1033,7 +1033,7 @@ static void ocfs2_inode_init_once(void *data,
 
 static int ocfs2_initialize_mem_caches(void)
 {
-	ocfs2_inode_cachep = kmem_cache_create("ocfs2_inode_cache",
+	ocfs2_inode_cachep = kapi_kmem_cache_create("ocfs2_inode_cache",
 				       sizeof(struct ocfs2_inode_info),
 				       0,
 				       (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
fs/ocfs2/uptodate.c +1 -1
index 4da8851..6248308 100644
@@ -546,7 +546,7 @@ void ocfs2_remove_from_cache(struct inode *inode,
 
 int __init init_ocfs2_uptodate_cache(void)
 {
-	ocfs2_uptodate_cachep = kmem_cache_create("ocfs2_uptodate",
+	ocfs2_uptodate_cachep = kapi_kmem_cache_create("ocfs2_uptodate",
 				  sizeof(struct ocfs2_meta_cache_item),
 				  0, SLAB_HWCACHE_ALIGN, NULL);
 	if (!ocfs2_uptodate_cachep)
kapi-compat/include/slab.h new file +10 -0
new file mode 100644
index 0000000..239763f
@@ -0,0 +1,10 @@
+#ifndef KAPI_SLAB_H
+#define KAPI_SLAB_H
+
+#ifdef KMEM_CACHE_CREATE_DTOR
+#define kapi_kmem_cache_create(a, b, c, d, e)	kmem_cache_create(a, b, c, d, e, NULL)
+#else
+#define kapi_kmem_cache_create(a, b, c, d, e)	kmem_cache_create(a, b, c, d, e)
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#21 lore raw

PATCH 11/30 ocfs2: Handle missing dtors in kmem_cache_create()

Quoted 3 lines · Sunil Mushran

Commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac removed the dtor arg from kmem_cache_create(). This patch allows one to build ocfs2 with kernels having/not having this change.

I desperately want to come up with a trick here that will leave
"kmem_cache_create()" in the source, but I can't think of one. This is probably as good as we're going to get.

Joel

Quoted 164 lines
---
 Config.make.in             |    1 +
 Makefile                   |    3 ++-
 configure.in               |    6 ++++++
 fs/ocfs2/Makefile          |    4 ++++
 fs/ocfs2/dlm/Makefile      |    4 ++++
 fs/ocfs2/dlm/dlmfs.c       |    2 +-
 fs/ocfs2/dlm/dlmmaster.c   |    2 +-
 fs/ocfs2/super.c           |    2 +-
 fs/ocfs2/uptodate.c        |    2 +-
 kapi-compat/include/slab.h |   10 ++++++++++
 10 files changed, 31 insertions(+), 5 deletions(-)
 create mode 100644 kapi-compat/include/slab.h
Config.make.in +1 -0
index 4f42cca..07c5a86 100644
@@ -61,6 +61,7 @@ DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
+KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index 2a97e00..ae5947b 100644
@@ -15,7 +15,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/fpath.h \
 	kapi-compat/include/kmod.h \
 	kapi-compat/include/inc_nlink.h \
-	kapi-compat/include/drop_nlink.h
+	kapi-compat/include/drop_nlink.h \
+	kapi-compat/include/slab.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 81041fb..cb91de1 100644
@@ -198,6 +198,12 @@ OCFS2_CHECK_KERNEL([drop_nlink() in fs.h], fs.h,
   , drop_nlink_compat_header="drop_nlink.h", [^static inline void drop_nlink(])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $drop_nlink_compat_header"
 
+KMEM_CACHE_CREATE_DTOR=
+OCFS2_CHECK_KERNEL([kmem_cache_create() with dtor arg in slab.h], slab.h,
+  KMEM_CACHE_CREATE_DTOR=yes, , [^.*void (\*)(void \*, kmem_cache_t \*, unsigned long),])
+AC_SUBST(KMEM_CACHE_CREATE_DTOR)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS slab.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index b6c8d03..403c1c6 100644
@@ -37,6 +37,10 @@ ifdef HAS_F_PATH_DEFINED
 EXTRA_CFLAGS += -DHAS_F_PATH_DEFINED
 endif
 
+ifdef KMEM_CACHE_CREATE_DTOR
+EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index b4fb8e3..628ab3d 100644
@@ -20,6 +20,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef KMEM_CACHE_CREATE_DTOR
+EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +1 -1
index 4ce2dea..dc43923 100644
@@ -588,7 +588,7 @@ static int __init init_dlmfs_fs(void)
 
 	dlmfs_print_version();
 
-	dlmfs_inode_cache = kmem_cache_create("dlmfs_inode_cache",
+	dlmfs_inode_cache = kapi_kmem_cache_create("dlmfs_inode_cache",
 				sizeof(struct dlmfs_inode_private),
 				0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
 					SLAB_MEM_SPREAD),
fs/ocfs2/dlm/dlmmaster.c +1 -1
index 62e4a7d..a668840 100644
@@ -507,7 +507,7 @@ static void dlm_mle_node_up(struct dlm_ctxt *dlm,
 
 int dlm_init_mle_cache(void)
 {
-	dlm_mle_cache = kmem_cache_create("dlm_mle_cache",
+	dlm_mle_cache = kapi_kmem_cache_create("dlm_mle_cache",
 					  sizeof(struct dlm_master_list_entry),
 					  0, SLAB_HWCACHE_ALIGN,
 					  NULL);
fs/ocfs2/super.c +1 -1
index a8f90a2..f5c424d 100644
@@ -1033,7 +1033,7 @@ static void ocfs2_inode_init_once(void *data,
 
 static int ocfs2_initialize_mem_caches(void)
 {
-	ocfs2_inode_cachep = kmem_cache_create("ocfs2_inode_cache",
+	ocfs2_inode_cachep = kapi_kmem_cache_create("ocfs2_inode_cache",
 				       sizeof(struct ocfs2_inode_info),
 				       0,
 				       (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
fs/ocfs2/uptodate.c +1 -1
index 4da8851..6248308 100644
@@ -546,7 +546,7 @@ void ocfs2_remove_from_cache(struct inode *inode,
 
 int __init init_ocfs2_uptodate_cache(void)
 {
-	ocfs2_uptodate_cachep = kmem_cache_create("ocfs2_uptodate",
+	ocfs2_uptodate_cachep = kapi_kmem_cache_create("ocfs2_uptodate",
 				  sizeof(struct ocfs2_meta_cache_item),
 				  0, SLAB_HWCACHE_ALIGN, NULL);
 	if (!ocfs2_uptodate_cachep)
kapi-compat/include/slab.h new file +10 -0
new file mode 100644
index 0000000..239763f
@@ -0,0 +1,10 @@
+#ifndef KAPI_SLAB_H
+#define KAPI_SLAB_H
+
+#ifdef KMEM_CACHE_CREATE_DTOR
+#define kapi_kmem_cache_create(a, b, c, d, e)	kmem_cache_create(a, b, c, d, e, NULL)
+#else
+#define kapi_kmem_cache_create(a, b, c, d, e)	kmem_cache_create(a, b, c, d, e)
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"Any man who is under 30, and is not a liberal, has not heart;
 and any man who is over 30, and is not a conservative, has no brains."
         - Sir Winston Churchill 

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#22 lore raw

PATCH 12/30 ocfs2: Define FS_RENAME_DOES_D_MOVE

In reply to Sunil Mushran

Commit 349457ccf2592c14bdf13b6706170ae2e94931b1 in mainline defines macro FS_RENAME_DOES_D_MOVE to allow fs to call d_move() during rename(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Makefile                     |    3 ++-
 configure.in                 |    5 +++++
 kapi-compat/include/fstype.h |    6 ++++++
 3 files changed, 13 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/fstype.h
Makefile +2 -1
index ae5947b..5c22979 100644
@@ -16,7 +16,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/kmod.h \
 	kapi-compat/include/inc_nlink.h \
 	kapi-compat/include/drop_nlink.h \
-	kapi-compat/include/slab.h
+	kapi-compat/include/slab.h \
+	kapi-compat/include/fstype.h
 
 PATCH_FILES =
 
configure.in +5 -0
index cb91de1..f1ca3e3 100644
@@ -204,6 +204,11 @@ OCFS2_CHECK_KERNEL([kmem_cache_create() with dtor arg in slab.h], slab.h,
 AC_SUBST(KMEM_CACHE_CREATE_DTOR)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS slab.h"
 
+fstype_compat_header=""
+OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h,
+  , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/fstype.h new file +6 -0
new file mode 100644
index 0000000..895ea86
@@ -0,0 +1,6 @@
+#ifndef KAPI_FSTYPE_H
+#define KAPI_FSTYPE_H
+
+#define FS_RENAME_DOES_D_MOVE	FS_ODD_RENAME
+
+#endif
Signature · 1 line
1.5.2.5
#23 lore raw

PATCH 12/30 ocfs2: Define FS_RENAME_DOES_D_MOVE

Quoted 6 lines · Sunil Mushran

Commit 349457ccf2592c14bdf13b6706170ae2e94931b1 in mainline defines macro FS_RENAME_DOES_D_MOVE to allow fs to call d_move() during rename(). This patch allows one to build ocfs2 with kernels having/not having this change.

Quoted 57 lines
---
 Makefile                     |    3 ++-
 configure.in                 |    5 +++++
 kapi-compat/include/fstype.h |    6 ++++++
 3 files changed, 13 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/fstype.h
Makefile +2 -1
index ae5947b..5c22979 100644
@@ -16,7 +16,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/kmod.h \
 	kapi-compat/include/inc_nlink.h \
 	kapi-compat/include/drop_nlink.h \
-	kapi-compat/include/slab.h
+	kapi-compat/include/slab.h \
+	kapi-compat/include/fstype.h
 
 PATCH_FILES =
 
configure.in +5 -0
index cb91de1..f1ca3e3 100644
@@ -204,6 +204,11 @@ OCFS2_CHECK_KERNEL([kmem_cache_create() with dtor arg in slab.h], slab.h,
 AC_SUBST(KMEM_CACHE_CREATE_DTOR)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS slab.h"
 
+fstype_compat_header=""
+OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h,
+  , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/fstype.h new file +6 -0
new file mode 100644
index 0000000..895ea86
@@ -0,0 +1,6 @@
+#ifndef KAPI_FSTYPE_H
+#define KAPI_FSTYPE_H
+
+#define FS_RENAME_DOES_D_MOVE	FS_ODD_RENAME
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #407

	"Every once in a while, take the scenic route."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#24 lore raw

PATCH 13/30 ocfs2: Handle enum value FS_OCFS2

In reply to Sunil Mushran

Commit 0e03036c97b70b2602f7dedaa3a223ed7563c2c9 in mainline registers ocfs2 sysctl (FS_OCFS2) number under CTL_FS. This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Makefile                     |    3 ++-
 configure.in                 |    5 +++++
 kapi-compat/include/sysctl.h |    9 +++++++++
 3 files changed, 16 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/sysctl.h
Makefile +2 -1
index 5c22979..6377ff9 100644
@@ -17,7 +17,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/inc_nlink.h \
 	kapi-compat/include/drop_nlink.h \
 	kapi-compat/include/slab.h \
-	kapi-compat/include/fstype.h
+	kapi-compat/include/fstype.h \
+	kapi-compat/include/sysctl.h
 
 PATCH_FILES =
 
configure.in +5 -0
index f1ca3e3..fdb188c 100644
@@ -209,6 +209,11 @@ OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h,
   , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header"
 
+sysctl_compat_header=""
+OCFS2_CHECK_KERNEL([enum FS_OCFS2 in sysctl.h], sysctl.h,
+  , sysctl_compat_header="sysctl.h", [FS_OCFS2])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $sysctl_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/sysctl.h new file +9 -0
new file mode 100644
index 0000000..73ed0a7
@@ -0,0 +1,9 @@
+#ifndef KAPI_SYSCTL_H
+#define KAPI_SYSCTL_H
+
+/* CTL_FS names: */
+enum {
+	FS_OCFS2=988,   /* ocfs2 */
+};
+
+#endif
Signature · 1 line
1.5.2.5
#25 lore raw

PATCH 13/30 ocfs2: Handle enum value FS_OCFS2

Quoted 5 lines · Sunil Mushran

Commit 0e03036c97b70b2602f7dedaa3a223ed7563c2c9 in mainline registers ocfs2 sysctl (FS_OCFS2) number under CTL_FS. This patch allows one to build ocfs2 with kernels having/not having this change.

Quoted 60 lines
---
 Makefile                     |    3 ++-
 configure.in                 |    5 +++++
 kapi-compat/include/sysctl.h |    9 +++++++++
 3 files changed, 16 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/sysctl.h
Makefile +2 -1
index 5c22979..6377ff9 100644
@@ -17,7 +17,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/inc_nlink.h \
 	kapi-compat/include/drop_nlink.h \
 	kapi-compat/include/slab.h \
-	kapi-compat/include/fstype.h
+	kapi-compat/include/fstype.h \
+	kapi-compat/include/sysctl.h
 
 PATCH_FILES =
 
configure.in +5 -0
index f1ca3e3..fdb188c 100644
@@ -209,6 +209,11 @@ OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h,
   , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header"
 
+sysctl_compat_header=""
+OCFS2_CHECK_KERNEL([enum FS_OCFS2 in sysctl.h], sysctl.h,
+  , sysctl_compat_header="sysctl.h", [FS_OCFS2])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $sysctl_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/sysctl.h new file +9 -0
new file mode 100644
index 0000000..73ed0a7
@@ -0,0 +1,9 @@
+#ifndef KAPI_SYSCTL_H
+#define KAPI_SYSCTL_H
+
+/* CTL_FS names: */
+enum {
+	FS_OCFS2=988,   /* ocfs2 */
+};
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
 Joel's Second Law:

	If a code change requires additional user setup, it is wrong.

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#26 lore raw

PATCH 14/30 ocfs2: Handles configfs_depend_item() and configfs_undepend_item()

In reply to Sunil Mushran

Commit 631d1febab8e546e3bb800bdfe2c212b8adf87de in mainline introduces two new calls in configfs, configfs_depend_item() and configfs_undepend_item(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Makefile                       |    3 ++-
 configure.in                   |    5 +++++
 kapi-compat/include/configfs.h |    7 +++++++
 3 files changed, 14 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/configfs.h
Makefile +2 -1
index 6377ff9..71cd3c7 100644
@@ -18,7 +18,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/drop_nlink.h \
 	kapi-compat/include/slab.h \
 	kapi-compat/include/fstype.h \
-	kapi-compat/include/sysctl.h
+	kapi-compat/include/sysctl.h \
+	kapi-compat/include/configfs.h
 
 PATCH_FILES =
 
configure.in +5 -0
index fdb188c..513585f 100644
@@ -214,6 +214,11 @@ OCFS2_CHECK_KERNEL([enum FS_OCFS2 in sysctl.h], sysctl.h,
   , sysctl_compat_header="sysctl.h", [FS_OCFS2])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $sysctl_compat_header"
 
+configfs_compat_header=""
+OCFS2_CHECK_KERNEL([configfs_depend_item() in configfs.h], configfs.h,
+  , configfs_compat_header="configfs.h", [configfs_depend_item()])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $configfs_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/configfs.h new file +7 -0
new file mode 100644
index 0000000..ff68e58
@@ -0,0 +1,7 @@
+#ifndef KAPI_CONFIGFS_H
+#define KAPI_CONFIGFS_H
+
+#define configfs_depend_item(a, b)	0
+#define configfs_undepend_item(a, b)
+
+#endif
Signature · 1 line
1.5.2.5
#27 lore raw

PATCH 14/30 ocfs2: Handles configfs_depend_item() and configfs_undepend_item()

Quoted 49 lines · Sunil Mushran

Commit 631d1febab8e546e3bb800bdfe2c212b8adf87de in mainline introduces two new calls in configfs, configfs_depend_item() and configfs_undepend_item(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Makefile                       |    3 ++-
 configure.in                   |    5 +++++
 kapi-compat/include/configfs.h |    7 +++++++
 3 files changed, 14 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/configfs.h
Makefile +2 -1
index 6377ff9..71cd3c7 100644
@@ -18,7 +18,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/drop_nlink.h \
 	kapi-compat/include/slab.h \
 	kapi-compat/include/fstype.h \
-	kapi-compat/include/sysctl.h
+	kapi-compat/include/sysctl.h \
+	kapi-compat/include/configfs.h
 
 PATCH_FILES =
 
configure.in +5 -0
index fdb188c..513585f 100644
@@ -214,6 +214,11 @@ OCFS2_CHECK_KERNEL([enum FS_OCFS2 in sysctl.h], sysctl.h,
   , sysctl_compat_header="sysctl.h", [FS_OCFS2])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $sysctl_compat_header"
 
+configfs_compat_header=""
+OCFS2_CHECK_KERNEL([configfs_depend_item() in configfs.h], configfs.h,
+  , configfs_compat_header="configfs.h", [configfs_depend_item()])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $configfs_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/configfs.h new file +0 -0
new file mode 100644
index 0000000..ff68e58

kapi-compat/include/configfs.h line 4

Quoted 4 lines
kapi-compat/include/configfs.h new file +4 -0
@@ -0,0 +1,7 @@
+#ifndef KAPI_CONFIGFS_H
+#define KAPI_CONFIGFS_H
+
+#define configfs_depend_item(a, b)	0

It's trivial, I know, but can we wrap that '0' in ()?

Joel

Quoted 11 lines
kapi-compat/include/configfs.h new file +3 -0
+#define configfs_undepend_item(a, b)
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"I think it would be a good idea."  
        - Mahatma Ghandi, when asked what he thought of Western
          civilization

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#28 lore raw

PATCH 15/30 ocfs2: Handle different prototypes of register_sysctl_table()

In reply to Sunil Mushran

Commit 0b4d414714f0d2f922d39424b0c5c82ad900a381 in mainline removes the insert_at_head argument from register_sysctl_table(). This patch allows building ocfs2 with kernels having/not having this change.

---
 Config.make.in                        |    1 +
 Makefile                              |    3 ++-
 configure.in                          |    6 ++++++
 fs/ocfs2/cluster/Makefile             |    4 ++++
 fs/ocfs2/cluster/nodemanager.c        |    2 +-
 kapi-compat/include/register_sysctl.h |   10 ++++++++++
 6 files changed, 24 insertions(+), 2 deletions(-)
 create mode 100644 kapi-compat/include/register_sysctl.h
Config.make.in +1 -0
index 07c5a86..eb8671d 100644
@@ -62,6 +62,7 @@ DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
+REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index 71cd3c7..a9bfccb 100644
@@ -19,7 +19,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/slab.h \
 	kapi-compat/include/fstype.h \
 	kapi-compat/include/sysctl.h \
-	kapi-compat/include/configfs.h
+	kapi-compat/include/configfs.h \
+	kapi-compat/include/register_sysctl.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 513585f..04db94f 100644
@@ -219,6 +219,12 @@ OCFS2_CHECK_KERNEL([configfs_depend_item() in configfs.h], configfs.h,
   , configfs_compat_header="configfs.h", [configfs_depend_item()])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $configfs_compat_header"
 
+REGISTER_SYSCTL_TWO_ARGS=
+OCFS2_CHECK_KERNEL([register_sysctl() with two args in sysctl.h], sysctl.h,
+  REGISTER_SYSCTL_TWO_ARGS=yes, , [^.*int insert_at_head);])
+AC_SUBST(REGISTER_SYSCTL_TWO_ARGS)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS register_sysctl.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index a4251f5..6c2f11b 100644
@@ -17,6 +17,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef REGISTER_SYSCTL_TWO_ARGS
+EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/nodemanager.c +1 -1
index af2070d..9fff881 100644
@@ -962,7 +962,7 @@ static int __init init_o2nm(void)
 	o2hb_init();
 	o2net_init();
 
-	ocfs2_table_header = register_sysctl_table(ocfs2_root_table);
+	ocfs2_table_header = kapi_register_sysctl_table(ocfs2_root_table);
 	if (!ocfs2_table_header) {
 		printk(KERN_ERR "nodemanager: unable to register sysctl\n");
 		ret = -ENOMEM; /* or something. */
kapi-compat/include/register_sysctl.h new file +10 -0
new file mode 100644
index 0000000..94e8071
@@ -0,0 +1,10 @@
+#ifndef KAPI_REGISTER_SYSCTL_H
+#define KAPI_REGISTER_SYSCTL_H
+
+#ifdef REGISTER_SYSCTL_TWO_ARGS
+#define kapi_register_sysctl_table(a)	register_sysctl_table(a, 0)
+#else
+#define kapi_register_sysctl_table(a)	register_sysctl_table(a)
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#29 lore raw

PATCH 15/30 ocfs2: Handle different prototypes of register_sysctl_table()

Quoted 5 lines · Sunil Mushran

Commit 0b4d414714f0d2f922d39424b0c5c82ad900a381 in mainline removes the insert_at_head argument from register_sysctl_table(). This patch allows building ocfs2 with kernels having/not having this change.

Quoted 105 lines
---
 Config.make.in                        |    1 +
 Makefile                              |    3 ++-
 configure.in                          |    6 ++++++
 fs/ocfs2/cluster/Makefile             |    4 ++++
 fs/ocfs2/cluster/nodemanager.c        |    2 +-
 kapi-compat/include/register_sysctl.h |   10 ++++++++++
 6 files changed, 24 insertions(+), 2 deletions(-)
 create mode 100644 kapi-compat/include/register_sysctl.h
Config.make.in +1 -0
index 07c5a86..eb8671d 100644
@@ -62,6 +62,7 @@ DELAYED_WORK_DEFINED = @DELAYED_WORK_DEFINED@
 HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
+REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index 71cd3c7..a9bfccb 100644
@@ -19,7 +19,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/slab.h \
 	kapi-compat/include/fstype.h \
 	kapi-compat/include/sysctl.h \
-	kapi-compat/include/configfs.h
+	kapi-compat/include/configfs.h \
+	kapi-compat/include/register_sysctl.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 513585f..04db94f 100644
@@ -219,6 +219,12 @@ OCFS2_CHECK_KERNEL([configfs_depend_item() in configfs.h], configfs.h,
   , configfs_compat_header="configfs.h", [configfs_depend_item()])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $configfs_compat_header"
 
+REGISTER_SYSCTL_TWO_ARGS=
+OCFS2_CHECK_KERNEL([register_sysctl() with two args in sysctl.h], sysctl.h,
+  REGISTER_SYSCTL_TWO_ARGS=yes, , [^.*int insert_at_head);])
+AC_SUBST(REGISTER_SYSCTL_TWO_ARGS)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS register_sysctl.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index a4251f5..6c2f11b 100644
@@ -17,6 +17,10 @@ ifdef DELAYED_WORK_DEFINED
 EXTRA_CFLAGS += -DDELAYED_WORK_DEFINED
 endif
 
+ifdef REGISTER_SYSCTL_TWO_ARGS
+EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/nodemanager.c +1 -1
index af2070d..9fff881 100644
@@ -962,7 +962,7 @@ static int __init init_o2nm(void)
 	o2hb_init();
 	o2net_init();
 
-	ocfs2_table_header = register_sysctl_table(ocfs2_root_table);
+	ocfs2_table_header = kapi_register_sysctl_table(ocfs2_root_table);
 	if (!ocfs2_table_header) {
 		printk(KERN_ERR "nodemanager: unable to register sysctl\n");
 		ret = -ENOMEM; /* or something. */
kapi-compat/include/register_sysctl.h new file +10 -0
new file mode 100644
index 0000000..94e8071
@@ -0,0 +1,10 @@
+#ifndef KAPI_REGISTER_SYSCTL_H
+#define KAPI_REGISTER_SYSCTL_H
+
+#ifdef REGISTER_SYSCTL_TWO_ARGS
+#define kapi_register_sysctl_table(a)	register_sysctl_table(a, 0)
+#else
+#define kapi_register_sysctl_table(a)	register_sysctl_table(a)
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
"I'm drifting and drifting
 Just like a ship out on the sea.
 Cause I ain't got nobody, baby,
 In this world to care for me."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#30 lore raw

PATCH 16/30 ocfs2: Handle su_mutex in struct configfs_subsystem

In reply to Sunil Mushran

Commit e6bd07aee739566803425acdbf5cdb29919164e1 in mainline changed a semaphore into a mutex in struct configfs_subsystem. This patch allows building ocfs2 with kernels having/not having this change.

---
 Config.make.in                 |    1 +
 Makefile                       |    3 ++-
 configure.in                   |    6 ++++++
 fs/ocfs2/cluster/Makefile      |    4 ++++
 fs/ocfs2/cluster/nodemanager.c |    2 +-
 kapi-compat/include/su_mutex.h |   13 +++++++++++++
 6 files changed, 27 insertions(+), 2 deletions(-)
 create mode 100644 kapi-compat/include/su_mutex.h
Config.make.in +1 -0
index eb8671d..b7bd06b 100644
@@ -63,6 +63,7 @@ HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
+SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index a9bfccb..9848c47 100644
@@ -20,7 +20,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/fstype.h \
 	kapi-compat/include/sysctl.h \
 	kapi-compat/include/configfs.h \
-	kapi-compat/include/register_sysctl.h
+	kapi-compat/include/register_sysctl.h \
+	kapi-compat/include/su_mutex.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 04db94f..3d3c5da 100644
@@ -225,6 +225,12 @@ OCFS2_CHECK_KERNEL([register_sysctl() with two args in sysctl.h], sysctl.h,
 AC_SUBST(REGISTER_SYSCTL_TWO_ARGS)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS register_sysctl.h"
 
+SU_MUTEX_DEFINED=
+OCFS2_CHECK_KERNEL([su_mutex in struct configfs_subsystem in configfs.h], configfs.h,
+  SU_MUTEX_DEFINED=yes, , [su_mutex])
+AC_SUBST(SU_MUTEX_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS su_mutex.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index 6c2f11b..1e69fef 100644
@@ -21,6 +21,10 @@ ifdef REGISTER_SYSCTL_TWO_ARGS
 EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS
 endif
 
+ifdef SU_MUTEX_DEFINED
+EXTRA_CFLAGS += -DSU_MUTEX_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/nodemanager.c +1 -1
index 9fff881..ca142d0 100644
@@ -974,7 +974,7 @@ static int __init init_o2nm(void)
 		goto out_sysctl;
 
 	config_group_init(&o2nm_cluster_group.cs_subsys.su_group);
-	mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
+	kapi_mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
 	ret = configfs_register_subsystem(&o2nm_cluster_group.cs_subsys);
 	if (ret) {
 		printk(KERN_ERR "nodemanager: Registration returned %d\n", ret);
kapi-compat/include/su_mutex.h new file +13 -0
new file mode 100644
index 0000000..1e633ed
@@ -0,0 +1,13 @@
+#ifndef KAPI_SUMUTEX_H
+#define KAPI_SUMUTEX_H
+
+#ifdef SU_MUTEX_DEFINED
+# define kapi_mutex_init	mutex_init
+# define su_mutex		su_mutex
+#else
+# include "asm/semaphore.h"
+# define kapi_mutex_init	init_MUTEX
+# define su_mutex		su_sem
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#31 lore raw

PATCH 16/30 ocfs2: Handle su_mutex in struct configfs_subsystem

Quoted 3 lines · Sunil Mushran

Commit e6bd07aee739566803425acdbf5cdb29919164e1 in mainline changed a semaphore into a mutex in struct configfs_subsystem. This patch allows building ocfs2 with kernels having/not having this change.

The define is reversed. Also, since this is specific to this
particular place, maybe we call it "init_su_mutex()" instead of "kapi_init_mutex()"?

Joel

Quoted 110 lines
---
 Config.make.in                 |    1 +
 Makefile                       |    3 ++-
 configure.in                   |    6 ++++++
 fs/ocfs2/cluster/Makefile      |    4 ++++
 fs/ocfs2/cluster/nodemanager.c |    2 +-
 kapi-compat/include/su_mutex.h |   13 +++++++++++++
 6 files changed, 27 insertions(+), 2 deletions(-)
 create mode 100644 kapi-compat/include/su_mutex.h
Config.make.in +1 -0
index eb8671d..b7bd06b 100644
@@ -63,6 +63,7 @@ HAS_SYNC_MAPPING_RANGE  = @HAS_SYNC_MAPPING_RANGE@
 HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
+SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index a9bfccb..9848c47 100644
@@ -20,7 +20,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/fstype.h \
 	kapi-compat/include/sysctl.h \
 	kapi-compat/include/configfs.h \
-	kapi-compat/include/register_sysctl.h
+	kapi-compat/include/register_sysctl.h \
+	kapi-compat/include/su_mutex.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 04db94f..3d3c5da 100644
@@ -225,6 +225,12 @@ OCFS2_CHECK_KERNEL([register_sysctl() with two args in sysctl.h], sysctl.h,
 AC_SUBST(REGISTER_SYSCTL_TWO_ARGS)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS register_sysctl.h"
 
+SU_MUTEX_DEFINED=
+OCFS2_CHECK_KERNEL([su_mutex in struct configfs_subsystem in configfs.h], configfs.h,
+  SU_MUTEX_DEFINED=yes, , [su_mutex])
+AC_SUBST(SU_MUTEX_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS su_mutex.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index 6c2f11b..1e69fef 100644
@@ -21,6 +21,10 @@ ifdef REGISTER_SYSCTL_TWO_ARGS
 EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS
 endif
 
+ifdef SU_MUTEX_DEFINED
+EXTRA_CFLAGS += -DSU_MUTEX_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/nodemanager.c +1 -1
index 9fff881..ca142d0 100644
@@ -974,7 +974,7 @@ static int __init init_o2nm(void)
 		goto out_sysctl;
 
 	config_group_init(&o2nm_cluster_group.cs_subsys.su_group);
-	mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
+	kapi_mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
 	ret = configfs_register_subsystem(&o2nm_cluster_group.cs_subsys);
 	if (ret) {
 		printk(KERN_ERR "nodemanager: Registration returned %d\n", ret);
kapi-compat/include/su_mutex.h new file +13 -0
new file mode 100644
index 0000000..1e633ed
@@ -0,0 +1,13 @@
+#ifndef KAPI_SUMUTEX_H
+#define KAPI_SUMUTEX_H
+
+#ifdef SU_MUTEX_DEFINED
+# define kapi_mutex_init	mutex_init
+# define su_mutex		su_mutex
+#else
+# include "asm/semaphore.h"
+# define kapi_mutex_init	init_MUTEX
+# define su_mutex		su_sem
+#endif
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 8 lines
"Well-timed silence hath more eloquence than speech."  
         - Martin Fraquhar Tupper

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#32 lore raw

PATCH 17/30 ocfs2: Handle the removal of struct subsystem

In reply to Sunil Mushran

Commit 823bccfc4002296ba88c3ad0f049e1abd8108d30 in mainline removes struct subsystem from kobject.h. This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in                |    1 +
 Makefile                      |    3 ++-
 configure.in                  |    6 ++++++
 fs/ocfs2/Makefile             |    4 ++++
 fs/ocfs2/cluster/Makefile     |    4 ++++
 fs/ocfs2/cluster/masklog.c    |    2 +-
 fs/ocfs2/cluster/masklog.h    |    2 +-
 fs/ocfs2/cluster/sys.c        |    6 +++---
 fs/ocfs2/dlm/Makefile         |    4 ++++
 kapi-compat/include/kobject.h |   14 ++++++++++++++
 10 files changed, 40 insertions(+), 6 deletions(-)
 create mode 100644 kapi-compat/include/kobject.h
Config.make.in +1 -0
index b7bd06b..a27e274 100644
@@ -64,6 +64,7 @@ HAS_F_PATH_DEFINED = @HAS_F_PATH_DEFINED@
 KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
+STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
Makefile +2 -1
index 9848c47..a26e24f 100644
@@ -21,7 +21,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/sysctl.h \
 	kapi-compat/include/configfs.h \
 	kapi-compat/include/register_sysctl.h \
-	kapi-compat/include/su_mutex.h
+	kapi-compat/include/su_mutex.h \
+	kapi-compat/include/kobject.h
 
 PATCH_FILES =
 
configure.in +6 -0
index 3d3c5da..83dcd37 100644
@@ -231,6 +231,12 @@ OCFS2_CHECK_KERNEL([su_mutex in struct configfs_subsystem in configfs.h], config
 AC_SUBST(SU_MUTEX_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS su_mutex.h"
 
+STRUCT_SUBSYSTEM_DEFINED=
+OCFS2_CHECK_KERNEL([struct subsystem in kobject.h], kobject.h,
+  STRUCT_SUBSYSTEM_DEFINED=yes, , [^struct subsystem {])
+AC_SUBST(STRUCT_SUBSYSTEM_DEFINED)
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS kobject.h"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 403c1c6..5c290b7 100644
@@ -41,6 +41,10 @@ ifdef KMEM_CACHE_CREATE_DTOR
 EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
 endif
 
+ifdef STRUCT_SUBSYSTEM_DEFINED
+EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/cluster/Makefile +4 -0
index 1e69fef..ff57486 100644
@@ -25,6 +25,10 @@ ifdef SU_MUTEX_DEFINED
 EXTRA_CFLAGS += -DSU_MUTEX_DEFINED
 endif
 
+ifdef STRUCT_SUBSYSTEM_DEFINED
+EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/masklog.c +1 -1
index e9e042b..a1449df 100644
@@ -146,7 +146,7 @@ static struct kset mlog_kset = {
 	.kobj   = {.name = "logmask", .ktype = &mlog_ktype},
 };
 
-int mlog_sys_init(struct kset *o2cb_subsys)
+int mlog_sys_init(struct kapi_kset *o2cb_subsys)
 {
 	int i = 0;
 
fs/ocfs2/cluster/masklog.h +1 -1
index 75cd877..2b78a1b 100644
@@ -278,7 +278,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits;
 
 #include <linux/kobject.h>
 #include <linux/sysfs.h>
-int mlog_sys_init(struct kset *o2cb_subsys);
+int mlog_sys_init(struct kapi_kset *o2cb_subsys);
 void mlog_sys_shutdown(void);
 
 #endif /* O2CLUSTER_MASKLOG_H */
fs/ocfs2/cluster/sys.c +3 -3
index 64f6f37..c22c158 100644
@@ -78,7 +78,7 @@ static ssize_t
 o2cb_show(struct kobject * kobj, struct attribute * attr, char * buffer)
 {
 	struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr);
-	struct kset *sbs = to_kset(kobj);
+	struct kapi_kset *sbs = to_kapi_kset(kobj);
 
 	BUG_ON(sbs != &o2cb_subsys);
 
@@ -92,7 +92,7 @@ o2cb_store(struct kobject * kobj, struct attribute * attr,
 	     const char * buffer, size_t count)
 {
 	struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr);
-	struct kset *sbs = to_kset(kobj);
+	struct kapi_kset *sbs = to_kapi_kset(kobj);
 
 	BUG_ON(sbs != &o2cb_subsys);
 
@@ -111,7 +111,7 @@ int o2cb_sys_init(void)
 {
 	int ret;
 
-	o2cb_subsys.kobj.ktype = &o2cb_subsys_type;
+	o2cb_subsys.kapi_kobj.ktype = &o2cb_subsys_type;
 	ret = subsystem_register(&o2cb_subsys);
 	if (ret)
 		return ret;
fs/ocfs2/dlm/Makefile +4 -0
index 628ab3d..5101f9c 100644
@@ -24,6 +24,10 @@ ifdef KMEM_CACHE_CREATE_DTOR
 EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR
 endif
 
+ifdef STRUCT_SUBSYSTEM_DEFINED
+EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
kapi-compat/include/kobject.h new file +14 -0
new file mode 100644
index 0000000..4061901
@@ -0,0 +1,14 @@
+#ifndef KAPI_KOBJECT_H
+#define KAPI_KOBJECT_H
+
+#ifdef STRUCT_SUBSYSTEM_DEFINED
+# define kapi_kset		subsystem
+# define to_kapi_kset(k)	container_of(to_kset(k), struct subsystem, kset)
+# define kapi_kobj		kset.kobj
+#else
+# define kapi_kset		kset
+# define to_kapi_kset(k)	to_kset(k)
+# define kapi_kobj		kobj
+#endif
+
+#endif
Signature · 1 line
1.5.2.5
#33 lore raw

PATCH 17/30 ocfs2: Handle the removal of struct subsystem

Quoted 3 lines · Sunil Mushran

Commit 823bccfc4002296ba88c3ad0f049e1abd8108d30 in mainline removes struct subsystem from kobject.h. This patch allows one to build ocfs2 with kernels having/not having this change.

A subsystem is just a {kset, ...}, so the pointers are actually
still equal. I wouldn't introduce "struct kapi_kset". We don't need it. You can just pass the kset on to mlog_sys_init(). See below.

Quoted 2 lines

-int mlog_sys_init(struct kset *o2cb_subsys)

Just keep this as struct kset...

fs/ocfs2/cluster/masklog.h extern struct mlog_bits mlog_and_bits, mlog_not_bits; · line 281

Quoted 13 lines
fs/ocfs2/cluster/masklog.c +1 -0
+int mlog_sys_init(struct kapi_kset *o2cb_subsys)
 {
 	int i = 0;
fs/ocfs2/cluster/masklog.h +0 -1
index 75cd877..2b78a1b 100644
@@ -278,7 +278,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits;
 
 #include <linux/kobject.h>
 #include <linux/sysfs.h>
-int mlog_sys_init(struct kset *o2cb_subsys);

Same here. The better way is to introduce "kapi_subsystem_kset()":

+#ifdef STRUCT_SUBSYSTEM_DEFINED
+# define kapi_subsystem_kset(_sub) &((_sub)->kset) +#else
+# define kapi_subsystem_kset(_sub) (_sub) +#endif

Then you can call "int mlog_sys_init(struct kset *kset)" like so:

  mlog_sys_init(kapi_subsystem_kset(&o2cb_subsys));

fs/ocfs2/cluster/masklog.h int o2cb_sys_init(void) · line 115

Quoted 7 lines
fs/ocfs2/cluster/masklog.h +1 -1
@@ -111,7 +111,7 @@ int o2cb_sys_init(void)
 {
 	int ret;
 
-	o2cb_subsys.kobj.ktype = &o2cb_subsys_type;
+	o2cb_subsys.kapi_kobj.ktype = &o2cb_subsys_type;
 	ret = subsystem_register(&o2cb_subsys);

becomes:

  kapi_subsystem_kset(&o2cb_subsys)->kobj.ktype = &o2cb_subsys_type;
  ret = subsystem_register(&o2cb_subsys);

and this:

fs/ocfs2/cluster/masklog.h

Quoted 7 lines
fs/ocfs2/cluster/masklog.h +0 -0
 o2cb_show(struct kobject * kobj, struct attribute * attr, char * buffer)
 {
fs/ocfs2/cluster/masklog.h +1 -1
 	struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr);
-	struct kset *sbs = to_kset(kobj);
+	struct kapi_kset *sbs = to_kapi_kset(kobj);
 
 	BUG_ON(sbs != &o2cb_subsys);

becomes this:

o2cb_show(struct kobject * kobj, struct attribute * attr, char * buffer) {

  	struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr);
	struct kset *sbs = to_kset(kobj);

        BUG_ON(sbs != &o2cb_subsys);

because the kset and subsystem pointers are identical. If gcc warns about the types, you can say:

        BUG_ON(sbs != kapi_subsystem_kset(&o2cb_subsys));

instead. Thoughts?

Joel

Signature · 10 lines
"And yet I fight,
 And yet I fight this battle all alone.
 No one to cry to;
 No place to call home."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#34 lore raw

PATCH 18/30 ocfs2: Handle missing macro is_owner_or_cap()

In reply to Sunil Mushran

Commit 3bd858ab1c451725c07a805dcb315215dc85b86e in mainline introduces helper macro is_owner_or_cap(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Makefile                  |    3 ++-
 configure.in              |    5 +++++
 kapi-compat/include/cap.h |    7 +++++++
 3 files changed, 14 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/cap.h
Makefile +2 -1
index a26e24f..eafeb2f 100644
@@ -22,7 +22,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/configfs.h \
 	kapi-compat/include/register_sysctl.h \
 	kapi-compat/include/su_mutex.h \
-	kapi-compat/include/kobject.h
+	kapi-compat/include/kobject.h \
+	kapi-compat/include/cap.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 83dcd37..f8b5f20 100644
@@ -237,6 +237,11 @@ OCFS2_CHECK_KERNEL([struct subsystem in kobject.h], kobject.h,
 AC_SUBST(STRUCT_SUBSYSTEM_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS kobject.h"
 
+cap_compat_header=""
+OCFS2_CHECK_KERNEL([is_owner_or_cap() in fs.h], fs.h,
+  , cap_compat_header="cap.h", [^#define is_owner_or_cap])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $cap_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/cap.h new file +7 -0
new file mode 100644
index 0000000..a10a12f
@@ -0,0 +1,7 @@
+#ifndef KAPI_CAP_H
+#define KAPI_CAP_H
+
+#define is_owner_or_cap(inode)  \
+	        ((current->fsuid == (inode)->i_uid) || capable(CAP_FOWNER))
+
+#endif
Signature · 1 line
1.5.2.5
#35 lore raw

PATCH 18/30 ocfs2: Handle missing macro is_owner_or_cap()

Quoted 5 lines · Sunil Mushran

Commit 3bd858ab1c451725c07a805dcb315215dc85b86e in mainline introduces helper macro is_owner_or_cap(). This patch allows one to build ocfs2 with kernels having/not having this change.

Quoted 58 lines
---
 Makefile                  |    3 ++-
 configure.in              |    5 +++++
 kapi-compat/include/cap.h |    7 +++++++
 3 files changed, 14 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/cap.h
Makefile +2 -1
index a26e24f..eafeb2f 100644
@@ -22,7 +22,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/configfs.h \
 	kapi-compat/include/register_sysctl.h \
 	kapi-compat/include/su_mutex.h \
-	kapi-compat/include/kobject.h
+	kapi-compat/include/kobject.h \
+	kapi-compat/include/cap.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 83dcd37..f8b5f20 100644
@@ -237,6 +237,11 @@ OCFS2_CHECK_KERNEL([struct subsystem in kobject.h], kobject.h,
 AC_SUBST(STRUCT_SUBSYSTEM_DEFINED)
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS kobject.h"
 
+cap_compat_header=""
+OCFS2_CHECK_KERNEL([is_owner_or_cap() in fs.h], fs.h,
+  , cap_compat_header="cap.h", [^#define is_owner_or_cap])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $cap_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/cap.h new file +7 -0
new file mode 100644
index 0000000..a10a12f
@@ -0,0 +1,7 @@
+#ifndef KAPI_CAP_H
+#define KAPI_CAP_H
+
+#define is_owner_or_cap(inode)  \
+	        ((current->fsuid == (inode)->i_uid) || capable(CAP_FOWNER))
+
+#endif
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"The suffering man ought really to consume his own smoke; there is no 
 good in emitting smoke till you have made it into fire."
			- thomas carlyle

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#36 lore raw

PATCH 19/30 ocfs2: Handle missing iop->fallocate()

In reply to Sunil Mushran

Commit 97ac73506c0ba93f30239bb57b4cfc5d73e68a62 in mainline introduces a new iop, fallocate(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    6 ++++++
 4 files changed, 16 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index a27e274..3818cd5 100644
@@ -65,6 +65,7 @@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
+FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index f8b5f20..74337ee 100644
@@ -242,6 +242,11 @@ OCFS2_CHECK_KERNEL([is_owner_or_cap() in fs.h], fs.h,
   , cap_compat_header="cap.h", [^#define is_owner_or_cap])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $cap_compat_header"
 
+FALLOCATE_DEFINED=
+OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h,
+  FALLOCATE_DEFINED=yes, , [^.*long (\*fallocate)])
+AC_SUBST(FALLOCATE_DEFINED)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 5c290b7..6f21960 100644
@@ -45,6 +45,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef FALLOCATE_DEFINED
+EXTRA_CFLAGS += -DFALLOCATE_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +6 -0
index adb10b9..ce18447 100644
@@ -34,7 +34,9 @@
 #include <linux/splice.h>
 #include <linux/mount.h>
 #include <linux/writeback.h>
+#ifdef FALLOCATE_DEFINED
 #include <linux/falloc.h>
+#endif
 
 #define MLOG_MASK_PREFIX ML_INODE
 #include <cluster/masklog.h>
@@ -1749,6 +1751,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
 	return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0);
 }
 
+#ifdef FALLOCATE_DEFINED
 static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 			    loff_t len)
 {
@@ -1772,6 +1775,7 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 	return __ocfs2_change_file_space(NULL, inode, offset,
 					 OCFS2_IOC_RESVSP64, &sr, change_size);
 }
+#endif
 
 static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
 					 loff_t *ppos,
@@ -2397,7 +2401,9 @@ const struct inode_operations ocfs2_file_iops = {
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
+#ifdef FALLOCATE_DEFINED
 	.fallocate	= ocfs2_fallocate,
+#endif
 };
 
 const struct inode_operations ocfs2_special_file_iops = {
Signature · 1 line
1.5.2.5
#37 lore raw

PATCH 19/30 ocfs2: Handle missing iop->fallocate()

Quoted 3 lines · Sunil Mushran

Commit 97ac73506c0ba93f30239bb57b4cfc5d73e68a62 in mainline introduces a new iop, fallocate(). This patch allows one to build ocfs2 with kernels having/not having this change.

Test is reversed (should be #ifndef NO_FALLOCATE). I'm trying to think how we could move the #ifdef to a kapi-compat file, but I'm not coming up with anything.

Joel

Quoted 99 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    6 ++++++
 4 files changed, 16 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index a27e274..3818cd5 100644
@@ -65,6 +65,7 @@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@
 REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
+FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index f8b5f20..74337ee 100644
@@ -242,6 +242,11 @@ OCFS2_CHECK_KERNEL([is_owner_or_cap() in fs.h], fs.h,
   , cap_compat_header="cap.h", [^#define is_owner_or_cap])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $cap_compat_header"
 
+FALLOCATE_DEFINED=
+OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h,
+  FALLOCATE_DEFINED=yes, , [^.*long (\*fallocate)])
+AC_SUBST(FALLOCATE_DEFINED)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 5c290b7..6f21960 100644
@@ -45,6 +45,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef FALLOCATE_DEFINED
+EXTRA_CFLAGS += -DFALLOCATE_DEFINED
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +6 -0
index adb10b9..ce18447 100644
@@ -34,7 +34,9 @@
 #include <linux/splice.h>
 #include <linux/mount.h>
 #include <linux/writeback.h>
+#ifdef FALLOCATE_DEFINED
 #include <linux/falloc.h>
+#endif
 
 #define MLOG_MASK_PREFIX ML_INODE
 #include <cluster/masklog.h>
@@ -1749,6 +1751,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
 	return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0);
 }
 
+#ifdef FALLOCATE_DEFINED
 static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 			    loff_t len)
 {
@@ -1772,6 +1775,7 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 	return __ocfs2_change_file_space(NULL, inode, offset,
 					 OCFS2_IOC_RESVSP64, &sr, change_size);
 }
+#endif
 
 static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
 					 loff_t *ppos,
@@ -2397,7 +2401,9 @@ const struct inode_operations ocfs2_file_iops = {
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
+#ifdef FALLOCATE_DEFINED
 	.fallocate	= ocfs2_fallocate,
+#endif
 };
 
 const struct inode_operations ocfs2_special_file_iops = {
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #80

	"Slow dance"

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#38 lore raw

PATCH 20/30 ocfs2: Handle splice.h

In reply to Sunil Mushran

Commit d6b29d7cee064f28ca097e906de7453541351095 in mainline moves the splice structures from pipe_fs_i.h to splice.h. This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    2 ++
 4 files changed, 12 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 3818cd5..788c156 100644
@@ -66,6 +66,7 @@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
+SPLICE_HEADER = @SPLICE_HEADER@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 74337ee..931cf2c 100644
@@ -247,6 +247,11 @@ OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h,
   FALLOCATE_DEFINED=yes, , [^.*long (\*fallocate)])
 AC_SUBST(FALLOCATE_DEFINED)
 
+SPLICE_HEADER=
+OCFS2_CHECK_KERNEL([struct splice_desc in splice.h], splice.h,
+  SPLICE_HEADER=yes, , [^struct splice_desc ])
+AC_SUBST(SPLICE_HEADER)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 6f21960..3cc7c74 100644
@@ -49,6 +49,10 @@ ifdef FALLOCATE_DEFINED
 EXTRA_CFLAGS += -DFALLOCATE_DEFINED
 endif
 
+ifdef SPLICE_HEADER
+EXTRA_CFLAGS += -DSPLICE_HEADER
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +2 -0
index ce18447..1c179fc 100644
@@ -31,7 +31,9 @@
 #include <linux/pagemap.h>
 #include <linux/uio.h>
 #include <linux/sched.h>
+#ifdef SPLICE_HEADER
 #include <linux/splice.h>
+#endif
 #include <linux/mount.h>
 #include <linux/writeback.h>
 #ifdef FALLOCATE_DEFINED
Signature · 1 line
1.5.2.5
#39 lore raw

PATCH 20/30 ocfs2: Handle splice.h

Quoted 3 lines · Sunil Mushran

Commit d6b29d7cee064f28ca097e906de7453541351095 in mainline moves the splice structures from pipe_fs_i.h to splice.h. This patch allows one to build ocfs2 with kernels having/not having this change.

Test is reversed.

Joel

Quoted 74 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    2 ++
 4 files changed, 12 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 3818cd5..788c156 100644
@@ -66,6 +66,7 @@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@
 SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
+SPLICE_HEADER = @SPLICE_HEADER@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 74337ee..931cf2c 100644
@@ -247,6 +247,11 @@ OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h,
   FALLOCATE_DEFINED=yes, , [^.*long (\*fallocate)])
 AC_SUBST(FALLOCATE_DEFINED)
 
+SPLICE_HEADER=
+OCFS2_CHECK_KERNEL([struct splice_desc in splice.h], splice.h,
+  SPLICE_HEADER=yes, , [^struct splice_desc ])
+AC_SUBST(SPLICE_HEADER)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 6f21960..3cc7c74 100644
@@ -49,6 +49,10 @@ ifdef FALLOCATE_DEFINED
 EXTRA_CFLAGS += -DFALLOCATE_DEFINED
 endif
 
+ifdef SPLICE_HEADER
+EXTRA_CFLAGS += -DSPLICE_HEADER
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +2 -0
index ce18447..1c179fc 100644
@@ -31,7 +31,9 @@
 #include <linux/pagemap.h>
 #include <linux/uio.h>
 #include <linux/sched.h>
+#ifdef SPLICE_HEADER
 #include <linux/splice.h>
+#endif
 #include <linux/mount.h>
 #include <linux/writeback.h>
 #ifdef FALLOCATE_DEFINED
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"Here's something to think about:  How come you never see a headline
 like ``Psychic Wins Lottery''?"
	- Jay Leno

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#40 lore raw

PATCH 21/30 ocfs2: Handle missing macro MNT_RELATIME

In reply to Sunil Mushran

Commit 47ae32d6a54955a041cdc30b06d0bb16e75f68d5 in mainline introduced macro MNT_RELATIME to limit atime updates to frequency specified in the mount option. This patch allows one to build ocfs2 with kernels having/not having this change.

It should be noted that the functionality will not be available on kernels not having the macro as the vfs support will be missing.

---
 Makefile                    |    3 ++-
 configure.in                |    5 +++++
 kapi-compat/include/mount.h |    6 ++++++
 3 files changed, 13 insertions(+), 1 deletions(-)
 create mode 100644 kapi-compat/include/mount.h
Makefile +2 -1
index eafeb2f..3b2acf2 100644
@@ -23,7 +23,8 @@ KAPI_COMPAT_FILES = \
 	kapi-compat/include/register_sysctl.h \
 	kapi-compat/include/su_mutex.h \
 	kapi-compat/include/kobject.h \
-	kapi-compat/include/cap.h
+	kapi-compat/include/cap.h \
+	kapi-compat/include/mount.h
 
 PATCH_FILES =
 
configure.in +5 -0
index 931cf2c..39fb02b 100644
@@ -252,6 +252,11 @@ OCFS2_CHECK_KERNEL([struct splice_desc in splice.h], splice.h,
   SPLICE_HEADER=yes, , [^struct splice_desc ])
 AC_SUBST(SPLICE_HEADER)
 
+relatime_compat_header=""
+OCFS2_CHECK_KERNEL([MNT_RELATIME in mount.h], mount.h,
+  , relatime_compat_header="mount.h", [^#define MNT_RELATIME])
+KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $relatime_compat_header"
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
kapi-compat/include/mount.h new file +6 -0
new file mode 100644
index 0000000..f515b64
@@ -0,0 +1,6 @@
+#ifndef KAPI_MOUNT_H
+#define KAPI_MOUNT_H
+
+#define MNT_RELATIME    0x20
+
+#endif
Signature · 1 line
1.5.2.5
#41 lore raw

PATCH 21/30 ocfs2: Handle missing macro MNT_RELATIME

Quoted 5 lines · Sunil Mushran

Commit 47ae32d6a54955a041cdc30b06d0bb16e75f68d5 in mainline introduced macro MNT_RELATIME to limit atime updates to frequency specified in the mount option. This patch allows one to build ocfs2 with kernels having/not having this change.

Quoted 7 lines

It should be noted that the functionality will not be available on kernels not having the macro as the vfs support will be missing.

---
 Makefile                    |    3 ++-
 configure.in                |    5 +++++
 kapi-compat/include/mount.h |    6 ++++++

Why not relatime.h?

Joel

Signature · 8 lines
"Up and down that road in our worn out shoes,
 Talking bout good things and singing the blues."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#42 lore raw

PATCH 22/30 ocfs2: Handles missing export should_remove_suid()

In reply to Sunil Mushran

Commits 01de85e057328ecbef36e108673b1e81059d54c1 and d23a147bb6e8d467e8df73b6589888717da3b9ce in mainline added and exported symbol should_remove_suid(). This patch allows one to build ocfs2 with kernels having/not having these changes.

---
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   30 ++++++++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 0 deletions(-)
configure.in +5 -0
index 39fb02b..472e01a 100644
@@ -257,6 +257,11 @@ OCFS2_CHECK_KERNEL([MNT_RELATIME in mount.h], mount.h,
   , relatime_compat_header="mount.h", [^#define MNT_RELATIME])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $relatime_compat_header"
 
+SHOULD_REMOVE_SUID=
+OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h,
+  SHOULD_REMOVE_SUID=yes, , [should_remove_suid()])
+AC_SUBST(SHOULD_REMOVE_SUID)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 3cc7c74..a80a9fc 100644
@@ -53,6 +53,10 @@ ifdef SPLICE_HEADER
 EXTRA_CFLAGS += -DSPLICE_HEADER
 endif
 
+ifdef SHOULD_REMOVE_SUID
+EXTRA_CFLAGS += -DSHOULD_REMOVE_SUID
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +30 -0
index 1c179fc..cee10ae 100644
@@ -1593,6 +1593,36 @@ out:
 	return ret;
 }
 
+#ifndef SHOULD_REMOVE_SUID
+/*
+ * The logic we want is
+ *
+ *	if suid or (sgid and xgrp)
+ *		remove privs
+ */
+int should_remove_suid(struct dentry *dentry)
+{
+	mode_t mode = dentry->d_inode->i_mode;
+	int kill = 0;
+
+	/* suid always must be killed */
+	if (unlikely(mode & S_ISUID))
+		kill = ATTR_KILL_SUID;
+
+	/*
+	 * sgid without any exec bits is just a mandatory locking mark; leave
+	 * it alone.  If some exec bits are set, it's a real sgid; kill it.
+	 */
+	if (unlikely((mode & S_ISGID) && (mode & S_IXGRP)))
+		kill |= ATTR_KILL_SGID;
+
+	if (unlikely(kill && !capable(CAP_FSETID)))
+		return kill;
+
+	return 0;
+}
+#endif
+
 /*
  * Parts of this function taken from xfs_change_file_space()
  */
Signature · 1 line
1.5.2.5
#43 lore raw

PATCH 22/30 ocfs2: Handles missing export should_remove_suid()

Quoted 5 lines · Sunil Mushran

Commits 01de85e057328ecbef36e108673b1e81059d54c1 and d23a147bb6e8d467e8df73b6589888717da3b9ce in mainline added and exported symbol should_remove_suid(). This patch allows one to build ocfs2 with kernels having/not having these changes.

This should go in kapi-compat/include/should-remove-suid.h and play the same tricks as we did above.

[should-remove-suid.h]
#ifdef NO_SHOULD_REMOVE_SUID
int should_remove_suid()
{
...
}
#endif

[Makefile]
ifdef NO_SHOULD_REMOVE_SUID
CPPFLAGS_file.o += -DNO_SHOULD_REMOVE_SUID
endif

Quoted 87 lines
---
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   30 ++++++++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 0 deletions(-)
configure.in +5 -0
index 39fb02b..472e01a 100644
@@ -257,6 +257,11 @@ OCFS2_CHECK_KERNEL([MNT_RELATIME in mount.h], mount.h,
   , relatime_compat_header="mount.h", [^#define MNT_RELATIME])
 KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $relatime_compat_header"
 
+SHOULD_REMOVE_SUID=
+OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h,
+  SHOULD_REMOVE_SUID=yes, , [should_remove_suid()])
+AC_SUBST(SHOULD_REMOVE_SUID)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 3cc7c74..a80a9fc 100644
@@ -53,6 +53,10 @@ ifdef SPLICE_HEADER
 EXTRA_CFLAGS += -DSPLICE_HEADER
 endif
 
+ifdef SHOULD_REMOVE_SUID
+EXTRA_CFLAGS += -DSHOULD_REMOVE_SUID
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +30 -0
index 1c179fc..cee10ae 100644
@@ -1593,6 +1593,36 @@ out:
 	return ret;
 }
 
+#ifndef SHOULD_REMOVE_SUID
+/*
+ * The logic we want is
+ *
+ *	if suid or (sgid and xgrp)
+ *		remove privs
+ */
+int should_remove_suid(struct dentry *dentry)
+{
+	mode_t mode = dentry->d_inode->i_mode;
+	int kill = 0;
+
+	/* suid always must be killed */
+	if (unlikely(mode & S_ISUID))
+		kill = ATTR_KILL_SUID;
+
+	/*
+	 * sgid without any exec bits is just a mandatory locking mark; leave
+	 * it alone.  If some exec bits are set, it's a real sgid; kill it.
+	 */
+	if (unlikely((mode & S_ISGID) && (mode & S_IXGRP)))
+		kill |= ATTR_KILL_SGID;
+
+	if (unlikely(kill && !capable(CAP_FSETID)))
+		return kill;
+
+	return 0;
+}
+#endif
+
 /*
  * Parts of this function taken from xfs_change_file_space()
  */
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
"In the beginning, the universe was created. This has made a lot 
 of people very angry, and is generally considered to have been a 
 bad move."
        - Douglas Adams

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#44 lore raw

PATCH 23/30 ocfs2: Handle missing export generic_segment_checks()

In reply to Sunil Mushran

Commit 0ceb331433e8aad9c5f441a965d7c681f8b9046f in mainline wraps common segment checks in generic_segment_checks(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   40 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 788c156..c1ca1d9 100644
@@ -67,6 +67,7 @@ SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
+GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 472e01a..a311d3f 100644
@@ -262,6 +262,11 @@ OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h,
   SHOULD_REMOVE_SUID=yes, , [should_remove_suid()])
 AC_SUBST(SHOULD_REMOVE_SUID)
 
+GENERIC_SEGMENT_CHECKS=
+OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h,
+  GENERIC_SEGMENT_CHECKS=yes, , [generic_segment_checks()])
+AC_SUBST(GENERIC_SEGMENT_CHECKS)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index a80a9fc..7434d6d 100644
@@ -57,6 +57,10 @@ ifdef SHOULD_REMOVE_SUID
 EXTRA_CFLAGS += -DSHOULD_REMOVE_SUID
 endif
 
+ifdef GENERIC_SEGMENT_CHECKS
+EXTRA_CFLAGS += -DGENERIC_SEGMENT_CHECKS
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +40 -0
index cee10ae..dd074af 100644
@@ -1809,6 +1809,46 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 }
 #endif
 
+#ifndef GENERIC_SEGMENT_CHECKS
+/*
+ * Performs necessary checks before doing a write
+ * @iov:	io vector request
+ * @nr_segs:	number of segments in the iovec
+ * @count:	number of bytes to write
+ * @access_flags: type of access: %VERIFY_READ or %VERIFY_WRITE
+ *
+ * Adjust number of segments and amount of bytes to write (nr_segs should be
+ * properly initialized first). Returns appropriate error code that caller
+ * should return or zero in case that write should be allowed.
+ */
+int generic_segment_checks(const struct iovec *iov,
+			unsigned long *nr_segs, size_t *count, int access_flags)
+{
+	unsigned long   seg;
+	size_t cnt = 0;
+	for (seg = 0; seg < *nr_segs; seg++) {
+		const struct iovec *iv = &iov[seg];
+
+		/*
+		 * If any segment has a negative length, or the cumulative
+		 * length ever wraps negative then return -EINVAL.
+		 */
+		cnt += iv->iov_len;
+		if (unlikely((ssize_t)(cnt|iv->iov_len) < 0))
+			return -EINVAL;
+		if (access_ok(access_flags, iv->iov_base, iv->iov_len))
+			continue;
+		if (seg == 0)
+			return -EFAULT;
+		*nr_segs = seg;
+		cnt -= iv->iov_len;	/* This segment is no good */
+		break;
+	}
+	*count = cnt;
+	return 0;
+}
+#endif
+
 static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
 					 loff_t *ppos,
 					 size_t count,
Signature · 1 line
1.5.2.5
#45 lore raw

PATCH 23/30 ocfs2: Handle missing export generic_segment_checks()

Quoted 3 lines · Sunil Mushran

Commit 0ceb331433e8aad9c5f441a965d7c681f8b9046f in mainline wraps common segment checks in generic_segment_checks(). This patch allows one to build ocfs2 with kernels having/not having this change.

Let's move this to kapi-compat/include/generic-segment-checks.h and do

ifdef NO_GENERIC_SEGMENT_CHECKS
CPPFLAGS_file.o += -DNO_GENERIC_SEGMENT_CHECKS
endif

like the previous patch.

Joel

Quoted 110 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   40 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 50 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 788c156..c1ca1d9 100644
@@ -67,6 +67,7 @@ SU_MUTEX_DEFINED = @SU_MUTEX_DEFINED@
 STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
+GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 472e01a..a311d3f 100644
@@ -262,6 +262,11 @@ OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h,
   SHOULD_REMOVE_SUID=yes, , [should_remove_suid()])
 AC_SUBST(SHOULD_REMOVE_SUID)
 
+GENERIC_SEGMENT_CHECKS=
+OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h,
+  GENERIC_SEGMENT_CHECKS=yes, , [generic_segment_checks()])
+AC_SUBST(GENERIC_SEGMENT_CHECKS)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index a80a9fc..7434d6d 100644
@@ -57,6 +57,10 @@ ifdef SHOULD_REMOVE_SUID
 EXTRA_CFLAGS += -DSHOULD_REMOVE_SUID
 endif
 
+ifdef GENERIC_SEGMENT_CHECKS
+EXTRA_CFLAGS += -DGENERIC_SEGMENT_CHECKS
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +40 -0
index cee10ae..dd074af 100644
@@ -1809,6 +1809,46 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
 }
 #endif
 
+#ifndef GENERIC_SEGMENT_CHECKS
+/*
+ * Performs necessary checks before doing a write
+ * @iov:	io vector request
+ * @nr_segs:	number of segments in the iovec
+ * @count:	number of bytes to write
+ * @access_flags: type of access: %VERIFY_READ or %VERIFY_WRITE
+ *
+ * Adjust number of segments and amount of bytes to write (nr_segs should be
+ * properly initialized first). Returns appropriate error code that caller
+ * should return or zero in case that write should be allowed.
+ */
+int generic_segment_checks(const struct iovec *iov,
+			unsigned long *nr_segs, size_t *count, int access_flags)
+{
+	unsigned long   seg;
+	size_t cnt = 0;
+	for (seg = 0; seg < *nr_segs; seg++) {
+		const struct iovec *iv = &iov[seg];
+
+		/*
+		 * If any segment has a negative length, or the cumulative
+		 * length ever wraps negative then return -EINVAL.
+		 */
+		cnt += iv->iov_len;
+		if (unlikely((ssize_t)(cnt|iv->iov_len) < 0))
+			return -EINVAL;
+		if (access_ok(access_flags, iv->iov_base, iv->iov_len))
+			continue;
+		if (seg == 0)
+			return -EFAULT;
+		*nr_segs = seg;
+		cnt -= iv->iov_len;	/* This segment is no good */
+		break;
+	}
+	*count = cnt;
+	return 0;
+}
+#endif
+
 static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
 					 loff_t *ppos,
 					 size_t count,
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #20

	"Be forgiving of yourself and others."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#46 lore raw

PATCH 24/30 ocfs2: Handle missing vmops->fault()

In reply to Sunil Mushran

Commit 54cb8821de07f2ffcd28c380ce9b93d5784b40d7 in mainline introduces vmops->fault() which is used to replace vmops->populate() and vmops->nopage(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/mmap.c   |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 59 insertions(+), 2 deletions(-)
Config.make.in +1 -0
index c1ca1d9..96dbb7a 100644
@@ -68,6 +68,7 @@ STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
+FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index a311d3f..b8b8001 100644
@@ -267,6 +267,11 @@ OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h,
   GENERIC_SEGMENT_CHECKS=yes, , [generic_segment_checks()])
 AC_SUBST(GENERIC_SEGMENT_CHECKS)
 
+FAULT_IN_VMOPS=
+OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h,
+  FAULT_IN_VMOPS=yes, , [^.*int (\*fault)])
+AC_SUBST(FAULT_IN_VMOPS)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 7434d6d..521888b 100644
@@ -61,6 +61,10 @@ ifdef GENERIC_SEGMENT_CHECKS
 EXTRA_CFLAGS += -DGENERIC_SEGMENT_CHECKS
 endif
 
+ifdef FAULT_IN_VMOPS
+EXTRA_CFLAGS += -DFAULT_IN_VMOPS
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/mmap.c +49 -2

103 lines not on this page · raw message

Signature · 1 line
1.5.2.5
#47 lore raw

PATCH 24/30 ocfs2: Handle missing vmops->fault()

Quoted 4 lines · Sunil Mushran

Commit 54cb8821de07f2ffcd28c380ce9b93d5784b40d7 in mainline introduces vmops->fault() which is used to replace vmops->populate() and vmops->nopage(). This patch allows one to build ocfs2 with kernels having/not having this change.

While I hate the naked ifdef'd code, I'm not sure what else to
do. In asmlib, I solve this with a function "init_asmfs_dir_operations()", called from the __init func. We could do that, placing the _populate() and _nopage() functions in kapi-compat, then providing the init_fault_ops() function...but frankly, I'm not sure that's a big win.
I would, however, reverse the test so that it's

+#ifndef NO_FAULT_IN_VMOPS
.fault = ocfs2_fault,
+#else
+ .nopage = ocfs2_nopage,
+#endif

Joel

Quoted 175 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/mmap.c   |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 59 insertions(+), 2 deletions(-)
Config.make.in +1 -0
index c1ca1d9..96dbb7a 100644
@@ -68,6 +68,7 @@ STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@
 FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
+FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index a311d3f..b8b8001 100644
@@ -267,6 +267,11 @@ OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h,
   GENERIC_SEGMENT_CHECKS=yes, , [generic_segment_checks()])
 AC_SUBST(GENERIC_SEGMENT_CHECKS)
 
+FAULT_IN_VMOPS=
+OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h,
+  FAULT_IN_VMOPS=yes, , [^.*int (\*fault)])
+AC_SUBST(FAULT_IN_VMOPS)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 7434d6d..521888b 100644
@@ -61,6 +61,10 @@ ifdef GENERIC_SEGMENT_CHECKS
 EXTRA_CFLAGS += -DGENERIC_SEGMENT_CHECKS
 endif
 
+ifdef FAULT_IN_VMOPS
+EXTRA_CFLAGS += -DFAULT_IN_VMOPS
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/mmap.c +49 -2
index c0483c9..58c67ea 100644
@@ -60,6 +60,7 @@ static inline int ocfs2_vm_op_unblock_sigs(sigset_t *oldset)
 	return sigprocmask(SIG_SETMASK, oldset, NULL);
 }
 
+#ifdef FAULT_IN_VMOPS
 static int ocfs2_fault(struct vm_area_struct *area, struct vm_fault *vmf)
 {
 	sigset_t blocked, oldset;
@@ -83,6 +84,35 @@ out:
 	mlog_exit_ptr(vmf->page);
 	return ret;
 }
+#else
+static struct page *ocfs2_nopage(struct vm_area_struct * area,
+				 unsigned long address,
+				 int *type)
+{
+	struct page *page = NOPAGE_SIGBUS;
+	sigset_t blocked, oldset;
+	int error, ret;
+
+	mlog_entry("(area=%p, address=%lu, type=%p)\n", area, address,
+		   type);
+
+	error = ocfs2_vm_op_block_sigs(&blocked, &oldset);
+	if (error < 0) {
+		mlog_errno(error);
+		ret = VM_FAULT_SIGBUS;
+		goto out;
+	}
+
+	page = filemap_nopage(area, address, type);
+
+	error = ocfs2_vm_op_unblock_sigs(&oldset);
+	if (error < 0)
+		mlog_errno(error);
+out:
+	mlog_exit_ptr(page);
+	return page;
+}
+#endif
 
 static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
 				struct page *page)
@@ -96,6 +126,9 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
 	void *fsdata;
 	loff_t size = i_size_read(inode);
 
+	mlog_entry("(inode=0x%p, i_ino=%lu, page=0x%p)\n", inode, inode->i_ino,
+		   page);
+
 	/*
 	 * Another node might have truncated while we were waiting on
 	 * cluster locks.
@@ -147,6 +180,7 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
 	BUG_ON(ret != len);
 	ret = 0;
 out:
+	mlog_exit(ret);
 	return ret;
 }
 
@@ -157,6 +191,8 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
 	sigset_t blocked, oldset;
 	int ret, ret2;
 
+	mlog_entry("(vma=0x%p, page=0x%p)\n", vma, page);
+
 	ret = ocfs2_vm_op_block_sigs(&blocked, &oldset);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -202,11 +238,16 @@ out:
 	if (ret2 < 0)
 		mlog_errno(ret2);
 
+	mlog_exit(ret);
 	return ret;
 }
 
 static struct vm_operations_struct ocfs2_file_vm_ops = {
+#ifdef FAULT_IN_VMOPS
 	.fault		= ocfs2_fault,
+#else
+	.nopage		= ocfs2_nopage,
+#endif
 	.page_mkwrite	= ocfs2_page_mkwrite,
 };
 
@@ -214,6 +255,10 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma)
 {
 	int ret = 0, lock_level = 0;
 
+	mlog_entry("(file=0x%p, vma=%p, '%.*s')\n", file, vma,
+		   file->f_path_dentry->d_name.len,
+		   file->f_path_dentry->d_name.name);
+
 	ret = ocfs2_meta_lock_atime(file->f_dentry->d_inode,
 				    file->f_vfsmnt, &lock_level);
 	if (ret < 0) {
@@ -223,7 +268,9 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma)
 	ocfs2_meta_unlock(file->f_dentry->d_inode, lock_level);
 out:
 	vma->vm_ops = &ocfs2_file_vm_ops;
+#ifdef FAULT_IN_VMOPS
 	vma->vm_flags |= VM_CAN_NONLINEAR;
-	return 0;
+#endif
+	mlog_exit(ret);
+	return ret;
 }
-
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #20

	"Be forgiving of yourself and others."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#48 lore raw

PATCH 25/30 ocfs2: Handle missing const s_op in struct super_block

In reply to Sunil Mushran

Commit ee9b6d61a2a43c5952eb43283f8db284a4e70b8a in mainline marks struct super_operations as a const in struct super_block. This patch allows one to build with kernels having/not having this change.

---
 Config.make.in        |    1 +
 configure.in          |    5 +++++
 fs/ocfs2/Makefile     |    4 ++++
 fs/ocfs2/dlm/Makefile |    4 ++++
 fs/ocfs2/dlm/dlmfs.c  |    8 ++++++++
 fs/ocfs2/super.c      |    4 ++++
 6 files changed, 26 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 96dbb7a..938ac53 100644
@@ -69,6 +69,7 @@ FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
+SOP_IS_CONST = @SOP_IS_CONST@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index b8b8001..3093542 100644
@@ -272,6 +272,11 @@ OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h,
   FAULT_IN_VMOPS=yes, , [^.*int (\*fault)])
 AC_SUBST(FAULT_IN_VMOPS)
 
+SOP_IS_CONST=
+OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h,
+  SOP_IS_CONST=yes, , [^.*const struct super_operations.*\*s_op;])
+AC_SUBST(SOP_IS_CONST)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 521888b..4ce2431 100644
@@ -65,6 +65,10 @@ ifdef FAULT_IN_VMOPS
 EXTRA_CFLAGS += -DFAULT_IN_VMOPS
 endif
 
+ifdef SOPS_IS_CONST
+EXTRA_CFLAGS += -DSOPS_IS_CONST
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index 5101f9c..2df255e 100644
@@ -28,6 +28,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef SOP_IS_CONST
+EXTRA_CFLAGS += -DSOP_IS_CONST
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +8 -0
index dc43923..dc5b5a5 100644
@@ -60,7 +60,11 @@
 #define MLOG_MASK_PREFIX ML_DLMFS
 #include "cluster/masklog.h"
 
+#ifdef SOP_IS_CONST
 static const struct super_operations dlmfs_ops;
+#else
+static struct super_operations dlmfs_ops;
+#endif
 static const struct file_operations dlmfs_file_operations;
 static const struct inode_operations dlmfs_dir_inode_operations;
 static const struct inode_operations dlmfs_root_inode_operations;
@@ -556,7 +560,11 @@ static const struct inode_operations dlmfs_root_inode_operations = {
 	.rmdir		= simple_rmdir,
 };
 
+#ifdef SOP_IS_CONST
 static const struct super_operations dlmfs_ops = {
+#else
+static struct super_operations dlmfs_ops = {
+#endif
 	.statfs		= simple_statfs,
 	.alloc_inode	= dlmfs_alloc_inode,
 	.destroy_inode	= dlmfs_destroy_inode,
fs/ocfs2/super.c +4 -0
index f5c424d..176ae35 100644
@@ -124,7 +124,11 @@ static void ocfs2_write_super(struct super_block *sb);
 static struct inode *ocfs2_alloc_inode(struct super_block *sb);
 static void ocfs2_destroy_inode(struct inode *inode);
 
+#ifdef SOP_IS_CONST
 static const struct super_operations ocfs2_sops = {
+#else
+static struct super_operations ocfs2_sops = {
+#endif
 	.statfs		= ocfs2_statfs,
 	.alloc_inode	= ocfs2_alloc_inode,
 	.destroy_inode	= ocfs2_destroy_inode,
Signature · 1 line
1.5.2.5
#49 lore raw

PATCH 25/30 ocfs2: Handle missing const s_op in struct super_block

Quoted 3 lines · Sunil Mushran

Commit ee9b6d61a2a43c5952eb43283f8db284a4e70b8a in mainline marks struct super_operations as a const in struct super_block. This patch allows one to build with kernels having/not having this change.

Can we reverse this test as well?

Joel

Quoted 120 lines
---
 Config.make.in        |    1 +
 configure.in          |    5 +++++
 fs/ocfs2/Makefile     |    4 ++++
 fs/ocfs2/dlm/Makefile |    4 ++++
 fs/ocfs2/dlm/dlmfs.c  |    8 ++++++++
 fs/ocfs2/super.c      |    4 ++++
 6 files changed, 26 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 96dbb7a..938ac53 100644
@@ -69,6 +69,7 @@ FALLOCATE_DEFINED = @FALLOCATE_DEFINED@
 SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
+SOP_IS_CONST = @SOP_IS_CONST@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index b8b8001..3093542 100644
@@ -272,6 +272,11 @@ OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h,
   FAULT_IN_VMOPS=yes, , [^.*int (\*fault)])
 AC_SUBST(FAULT_IN_VMOPS)
 
+SOP_IS_CONST=
+OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h,
+  SOP_IS_CONST=yes, , [^.*const struct super_operations.*\*s_op;])
+AC_SUBST(SOP_IS_CONST)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 521888b..4ce2431 100644
@@ -65,6 +65,10 @@ ifdef FAULT_IN_VMOPS
 EXTRA_CFLAGS += -DFAULT_IN_VMOPS
 endif
 
+ifdef SOPS_IS_CONST
+EXTRA_CFLAGS += -DSOPS_IS_CONST
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index 5101f9c..2df255e 100644
@@ -28,6 +28,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef SOP_IS_CONST
+EXTRA_CFLAGS += -DSOP_IS_CONST
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +8 -0
index dc43923..dc5b5a5 100644
@@ -60,7 +60,11 @@
 #define MLOG_MASK_PREFIX ML_DLMFS
 #include "cluster/masklog.h"
 
+#ifdef SOP_IS_CONST
 static const struct super_operations dlmfs_ops;
+#else
+static struct super_operations dlmfs_ops;
+#endif
 static const struct file_operations dlmfs_file_operations;
 static const struct inode_operations dlmfs_dir_inode_operations;
 static const struct inode_operations dlmfs_root_inode_operations;
@@ -556,7 +560,11 @@ static const struct inode_operations dlmfs_root_inode_operations = {
 	.rmdir		= simple_rmdir,
 };
 
+#ifdef SOP_IS_CONST
 static const struct super_operations dlmfs_ops = {
+#else
+static struct super_operations dlmfs_ops = {
+#endif
 	.statfs		= simple_statfs,
 	.alloc_inode	= dlmfs_alloc_inode,
 	.destroy_inode	= dlmfs_destroy_inode,
fs/ocfs2/super.c +4 -0
index f5c424d..176ae35 100644
@@ -124,7 +124,11 @@ static void ocfs2_write_super(struct super_block *sb);
 static struct inode *ocfs2_alloc_inode(struct super_block *sb);
 static void ocfs2_destroy_inode(struct inode *inode);
 
+#ifdef SOP_IS_CONST
 static const struct super_operations ocfs2_sops = {
+#else
+static struct super_operations ocfs2_sops = {
+#endif
 	.statfs		= ocfs2_statfs,
 	.alloc_inode	= ocfs2_alloc_inode,
 	.destroy_inode	= ocfs2_destroy_inode,
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"The question of whether computers can think is just like the question
 of whether submarines can swim."
	- Edsger W. Dijkstra

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#50 lore raw

PATCH 26/30 ocfs2: Handle missing const struct inode_operations in struct inode

In reply to Sunil Mushran

Commit c5ef1c42c51b1b5b4a401a6517bdda30933ddbaf in mainline marks struct inode_operations in struct inode as a const. This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in        |    1 +
 configure.in          |    5 +++++
 fs/ocfs2/Makefile     |    4 ++++
 fs/ocfs2/dlm/Makefile |    4 ++++
 fs/ocfs2/dlm/dlmfs.c  |   18 ++++++++++++++++++
 fs/ocfs2/file.c       |    8 ++++++++
 fs/ocfs2/file.h       |    5 +++++
 fs/ocfs2/namei.c      |    4 ++++
 fs/ocfs2/namei.h      |    4 ++++
 fs/ocfs2/symlink.c    |    8 ++++++++
 fs/ocfs2/symlink.h    |    5 +++++
 11 files changed, 66 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 938ac53..d4cd518 100644
@@ -70,6 +70,7 @@ SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
+IOP_IS_CONST = @IOP_IS_CONST@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 3093542..8a23983 100644
@@ -277,6 +277,11 @@ OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h,
   SOP_IS_CONST=yes, , [^.*const struct super_operations.*\*s_op;])
 AC_SUBST(SOP_IS_CONST)
 
+IOP_IS_CONST=
+OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h,
+  IOP_IS_CONST=yes, , [^.*const struct inode_operations.*\*i_op;])
+AC_SUBST(IOP_IS_CONST)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 4ce2431..97912fd 100644
@@ -69,6 +69,10 @@ ifdef SOPS_IS_CONST
 EXTRA_CFLAGS += -DSOPS_IS_CONST
 endif
 
+ifdef IOP_IS_CONST
+EXTRA_CFLAGS += -DIOP_IS_CONST
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index 2df255e..c7edb07 100644
@@ -32,6 +32,10 @@ ifdef SOP_IS_CONST
 EXTRA_CFLAGS += -DSOP_IS_CONST
 endif
 
+ifdef IOP_IS_CONST
+EXTRA_CFLAGS += -DIOP_IS_CONST
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +18 -0
index dc5b5a5..9ff18be 100644
@@ -66,9 +66,15 @@ static const struct super_operations dlmfs_ops;
 static struct super_operations dlmfs_ops;
 #endif
 static const struct file_operations dlmfs_file_operations;
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_dir_inode_operations;
 static const struct inode_operations dlmfs_root_inode_operations;
 static const struct inode_operations dlmfs_file_inode_operations;
+#else
+static struct inode_operations dlmfs_dir_inode_operations;
+static struct inode_operations dlmfs_root_inode_operations;
+static struct inode_operations dlmfs_file_inode_operations;
+#endif
 static struct kmem_cache *dlmfs_inode_cache;
 
 struct workqueue_struct *user_dlm_worker;
@@ -547,14 +553,22 @@ static const struct file_operations dlmfs_file_operations = {
 	.write		= dlmfs_file_write,
 };
 
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_dir_inode_operations = {
+#else
+static struct inode_operations dlmfs_dir_inode_operations = {
+#endif
 	.create		= dlmfs_create,
 	.lookup		= simple_lookup,
 	.unlink		= dlmfs_unlink,
 };
 
 /* this way we can restrict mkdir to only the toplevel of the fs. */
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_root_inode_operations = {
+#else
+static struct inode_operations dlmfs_root_inode_operations = {
+#endif
 	.lookup		= simple_lookup,
 	.mkdir		= dlmfs_mkdir,
 	.rmdir		= simple_rmdir,
@@ -572,7 +586,11 @@ static struct super_operations dlmfs_ops = {
 	.drop_inode	= generic_delete_inode,
 };
 
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_file_inode_operations = {
+#else
+static struct inode_operations dlmfs_file_inode_operations = {
+#endif
 	.getattr	= simple_getattr,
 };
 
fs/ocfs2/file.c +8 -0
index dd074af..e74730d 100644
@@ -2469,7 +2469,11 @@ bail:
 	return ret;
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_file_iops = {
+#else
+struct inode_operations ocfs2_file_iops = {
+#endif
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
@@ -2478,7 +2482,11 @@ const struct inode_operations ocfs2_file_iops = {
 #endif
 };
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_special_file_iops = {
+#else
+struct inode_operations ocfs2_special_file_iops = {
+#endif
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
fs/ocfs2/file.h +5 -0
index 066f14a..7bf6f9d 100644
@@ -28,8 +28,13 @@
 
 extern const struct file_operations ocfs2_fops;
 extern const struct file_operations ocfs2_dops;
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_file_iops;
 extern const struct inode_operations ocfs2_special_file_iops;
+#else
+extern struct inode_operations ocfs2_file_iops;
+extern struct inode_operations ocfs2_special_file_iops;
+#endif
 struct ocfs2_alloc_context;
 
 enum ocfs2_alloc_restarted {
fs/ocfs2/namei.c +4 -0
index 7292590..5ddcc23 100644
@@ -1898,7 +1898,11 @@ leave:
 	return status;
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_dir_iops = {
+#else
+struct inode_operations ocfs2_dir_iops = {
+#endif
 	.create		= ocfs2_create,
 	.lookup		= ocfs2_lookup,
 	.link		= ocfs2_link,
fs/ocfs2/namei.h +4 -0
index 688aef6..66e1dee 100644
@@ -26,7 +26,11 @@
 #ifndef OCFS2_NAMEI_H
 #define OCFS2_NAMEI_H
 
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_dir_iops;
+#else
+extern struct inode_operations ocfs2_dir_iops;
+#endif
 
 struct dentry *ocfs2_get_parent(struct dentry *child);
 
fs/ocfs2/symlink.c +8 -0
index 7134007..d77c1d4 100644
@@ -163,12 +163,20 @@ bail:
 	return ERR_PTR(status);
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_symlink_inode_operations = {
+#else
+struct inode_operations ocfs2_symlink_inode_operations = {
+#endif
 	.readlink	= page_readlink,
 	.follow_link	= ocfs2_follow_link,
 	.getattr	= ocfs2_getattr,
 };
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_fast_symlink_inode_operations = {
+#else
+struct inode_operations ocfs2_fast_symlink_inode_operations = {
+#endif
 	.readlink	= ocfs2_readlink,
 	.follow_link	= ocfs2_follow_link,
 	.getattr	= ocfs2_getattr,
fs/ocfs2/symlink.h +5 -0
index 65a6c9c..fd0ed70 100644
@@ -26,8 +26,13 @@
 #ifndef OCFS2_SYMLINK_H
 #define OCFS2_SYMLINK_H
 
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_symlink_inode_operations;
 extern const struct inode_operations ocfs2_fast_symlink_inode_operations;
+#else
+extern struct inode_operations ocfs2_symlink_inode_operations;
+extern struct inode_operations ocfs2_fast_symlink_inode_operations;
+#endif
 
 /*
  * Test whether an inode is a fast symlink.
Signature · 1 line
1.5.2.5
#51 lore raw

PATCH 26/30 ocfs2: Handle missing const struct inode_operations in struct inode

Quoted 3 lines · Sunil Mushran

Commit c5ef1c42c51b1b5b4a401a6517bdda30933ddbaf in mainline marks struct inode_operations in struct inode as a const. This patch allows one to build ocfs2 with kernels having/not having this change.

Please reverse the test.

Joel

Quoted 257 lines
---
 Config.make.in        |    1 +
 configure.in          |    5 +++++
 fs/ocfs2/Makefile     |    4 ++++
 fs/ocfs2/dlm/Makefile |    4 ++++
 fs/ocfs2/dlm/dlmfs.c  |   18 ++++++++++++++++++
 fs/ocfs2/file.c       |    8 ++++++++
 fs/ocfs2/file.h       |    5 +++++
 fs/ocfs2/namei.c      |    4 ++++
 fs/ocfs2/namei.h      |    4 ++++
 fs/ocfs2/symlink.c    |    8 ++++++++
 fs/ocfs2/symlink.h    |    5 +++++
 11 files changed, 66 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 938ac53..d4cd518 100644
@@ -70,6 +70,7 @@ SPLICE_HEADER = @SPLICE_HEADER@
 GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
+IOP_IS_CONST = @IOP_IS_CONST@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 3093542..8a23983 100644
@@ -277,6 +277,11 @@ OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h,
   SOP_IS_CONST=yes, , [^.*const struct super_operations.*\*s_op;])
 AC_SUBST(SOP_IS_CONST)
 
+IOP_IS_CONST=
+OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h,
+  IOP_IS_CONST=yes, , [^.*const struct inode_operations.*\*i_op;])
+AC_SUBST(IOP_IS_CONST)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 4ce2431..97912fd 100644
@@ -69,6 +69,10 @@ ifdef SOPS_IS_CONST
 EXTRA_CFLAGS += -DSOPS_IS_CONST
 endif
 
+ifdef IOP_IS_CONST
+EXTRA_CFLAGS += -DIOP_IS_CONST
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/dlm/Makefile +4 -0
index 2df255e..c7edb07 100644
@@ -32,6 +32,10 @@ ifdef SOP_IS_CONST
 EXTRA_CFLAGS += -DSOP_IS_CONST
 endif
 
+ifdef IOP_IS_CONST
+EXTRA_CFLAGS += -DIOP_IS_CONST
+endif
+
 DLM_SOURCES =			\
 	dlmast.c		\
 	dlmconvert.c		\
fs/ocfs2/dlm/dlmfs.c +18 -0
index dc5b5a5..9ff18be 100644
@@ -66,9 +66,15 @@ static const struct super_operations dlmfs_ops;
 static struct super_operations dlmfs_ops;
 #endif
 static const struct file_operations dlmfs_file_operations;
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_dir_inode_operations;
 static const struct inode_operations dlmfs_root_inode_operations;
 static const struct inode_operations dlmfs_file_inode_operations;
+#else
+static struct inode_operations dlmfs_dir_inode_operations;
+static struct inode_operations dlmfs_root_inode_operations;
+static struct inode_operations dlmfs_file_inode_operations;
+#endif
 static struct kmem_cache *dlmfs_inode_cache;
 
 struct workqueue_struct *user_dlm_worker;
@@ -547,14 +553,22 @@ static const struct file_operations dlmfs_file_operations = {
 	.write		= dlmfs_file_write,
 };
 
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_dir_inode_operations = {
+#else
+static struct inode_operations dlmfs_dir_inode_operations = {
+#endif
 	.create		= dlmfs_create,
 	.lookup		= simple_lookup,
 	.unlink		= dlmfs_unlink,
 };
 
 /* this way we can restrict mkdir to only the toplevel of the fs. */
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_root_inode_operations = {
+#else
+static struct inode_operations dlmfs_root_inode_operations = {
+#endif
 	.lookup		= simple_lookup,
 	.mkdir		= dlmfs_mkdir,
 	.rmdir		= simple_rmdir,
@@ -572,7 +586,11 @@ static struct super_operations dlmfs_ops = {
 	.drop_inode	= generic_delete_inode,
 };
 
+#ifdef IOP_IS_CONST
 static const struct inode_operations dlmfs_file_inode_operations = {
+#else
+static struct inode_operations dlmfs_file_inode_operations = {
+#endif
 	.getattr	= simple_getattr,
 };
 
fs/ocfs2/file.c +8 -0
index dd074af..e74730d 100644
@@ -2469,7 +2469,11 @@ bail:
 	return ret;
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_file_iops = {
+#else
+struct inode_operations ocfs2_file_iops = {
+#endif
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
@@ -2478,7 +2482,11 @@ const struct inode_operations ocfs2_file_iops = {
 #endif
 };
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_special_file_iops = {
+#else
+struct inode_operations ocfs2_special_file_iops = {
+#endif
 	.setattr	= ocfs2_setattr,
 	.getattr	= ocfs2_getattr,
 	.permission	= ocfs2_permission,
fs/ocfs2/file.h +5 -0
index 066f14a..7bf6f9d 100644
@@ -28,8 +28,13 @@
 
 extern const struct file_operations ocfs2_fops;
 extern const struct file_operations ocfs2_dops;
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_file_iops;
 extern const struct inode_operations ocfs2_special_file_iops;
+#else
+extern struct inode_operations ocfs2_file_iops;
+extern struct inode_operations ocfs2_special_file_iops;
+#endif
 struct ocfs2_alloc_context;
 
 enum ocfs2_alloc_restarted {
fs/ocfs2/namei.c +4 -0
index 7292590..5ddcc23 100644
@@ -1898,7 +1898,11 @@ leave:
 	return status;
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_dir_iops = {
+#else
+struct inode_operations ocfs2_dir_iops = {
+#endif
 	.create		= ocfs2_create,
 	.lookup		= ocfs2_lookup,
 	.link		= ocfs2_link,
fs/ocfs2/namei.h +4 -0
index 688aef6..66e1dee 100644
@@ -26,7 +26,11 @@
 #ifndef OCFS2_NAMEI_H
 #define OCFS2_NAMEI_H
 
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_dir_iops;
+#else
+extern struct inode_operations ocfs2_dir_iops;
+#endif
 
 struct dentry *ocfs2_get_parent(struct dentry *child);
 
fs/ocfs2/symlink.c +8 -0
index 7134007..d77c1d4 100644
@@ -163,12 +163,20 @@ bail:
 	return ERR_PTR(status);
 }
 
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_symlink_inode_operations = {
+#else
+struct inode_operations ocfs2_symlink_inode_operations = {
+#endif
 	.readlink	= page_readlink,
 	.follow_link	= ocfs2_follow_link,
 	.getattr	= ocfs2_getattr,
 };
+#ifdef IOP_IS_CONST
 const struct inode_operations ocfs2_fast_symlink_inode_operations = {
+#else
+struct inode_operations ocfs2_fast_symlink_inode_operations = {
+#endif
 	.readlink	= ocfs2_readlink,
 	.follow_link	= ocfs2_follow_link,
 	.getattr	= ocfs2_getattr,
fs/ocfs2/symlink.h +5 -0
index 65a6c9c..fd0ed70 100644
@@ -26,8 +26,13 @@
 #ifndef OCFS2_SYMLINK_H
 #define OCFS2_SYMLINK_H
 
+#ifdef IOP_IS_CONST
 extern const struct inode_operations ocfs2_symlink_inode_operations;
 extern const struct inode_operations ocfs2_fast_symlink_inode_operations;
+#else
+extern struct inode_operations ocfs2_symlink_inode_operations;
+extern struct inode_operations ocfs2_fast_symlink_inode_operations;
+#endif
 
 /*
  * Test whether an inode is a fast symlink.
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Life's Little Instruction Book #226

	"When someone hugs you, let them be the first to let go."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#52 lore raw

PATCH 27/30 ocfs2: Handle missing vectorized fileops aio_read() and aio_write()

In reply to Sunil Mushran

Commit 027445c37282bc1ed26add45e573ad2d3e4860a5 in mainline vectorized fileops aio_read() and aio_write(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   33 +++++++++++++++++++++++++++++----
 4 files changed, 39 insertions(+), 4 deletions(-)
Config.make.in +1 -0
index d4cd518..f99b9f4 100644
@@ -71,6 +71,7 @@ GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
+VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 8a23983..741dfdb 100644
@@ -282,6 +282,11 @@ OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h,
   IOP_IS_CONST=yes, , [^.*const struct inode_operations.*\*i_op;])
 AC_SUBST(IOP_IS_CONST)
 
+VECTORED_FILE_AIO=
+OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], fs.h,
+  VECTORED_FILE_AIO=yes, , [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);])
+AC_SUBST(VECTORED_FILE_AIO)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 97912fd..80fd6c6 100644
@@ -73,6 +73,10 @@ ifdef IOP_IS_CONST
 EXTRA_CFLAGS += -DIOP_IS_CONST
 endif
 
+ifdef VECTORED_FILE_AIO
+EXTRA_CFLAGS += -DVECTORED_FILE_AIO
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +29 -4
index e74730d..1ee2a79 100644
@@ -2087,10 +2087,19 @@ out:
 	return total ? total : ret;
 }
 
+#ifdef VECTORED_FILE_AIO
+#define iocb_ki_left	iocb->ki_left
 static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 				    const struct iovec *iov,
 				    unsigned long nr_segs,
 				    loff_t pos)
+#else
+#define iocb_ki_left	buflen
+static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
+				    const char __user *buf,
+				    size_t buflen,
+				    loff_t pos)
+#endif
 {
 	int ret, direct_io, appending, rw_level, have_alloc_sem  = 0;
 	int can_do_direct, sync = 0;
@@ -2100,13 +2109,19 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 	loff_t *ppos = &iocb->ki_pos;
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_path_dentry->d_inode;
+#ifndef VECTORED_FILE_AIO
+	struct iovec iov_local = { .iov_base = (void __user *)buf,
+				   .iov_len  = buflen };
+	const struct iovec *iov = &iov_local;
+	unsigned long nr_segs = 1;
+#endif
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", file,
 		   (unsigned int)nr_segs,
 		   file->f_path_dentry->d_name.len,
 		   file->f_path_dentry->d_name.name);
 
-	if (iocb->ki_left == 0)
+	if (iocb_ki_left == 0)
 		return 0;
 
 	ret = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
@@ -2139,7 +2154,7 @@ relock:
 
 	can_do_direct = direct_io;
 	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
-					    iocb->ki_left, appending,
+					    iocb_ki_left, appending,
 					    &can_do_direct);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -2392,17 +2407,23 @@ bail:
 	return ret;
 }
 
+#ifdef VECTORED_FILE_AIO
 static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 				   const struct iovec *iov,
 				   unsigned long nr_segs,
 				   loff_t pos)
+#else
+static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
+				   char __user *buf,
+				   size_t buflen,
+				   loff_t pos)
+#endif
 {
 	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
 	struct file *filp = iocb->ki_filp;
 	struct inode *inode = filp->f_path_dentry->d_inode;
 
-	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
-		   (unsigned int)nr_segs,
+	mlog_entry("(0x%p, '%.*s')\n", filp,
 		   filp->f_path_dentry->d_name.len,
 		   filp->f_path_dentry->d_name.name);
 
@@ -2446,7 +2467,11 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 	}
 	ocfs2_meta_unlock(inode, lock_level);
 
+#ifdef VECTORED_FILE_AIO
 	ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos);
+#else
+	ret = generic_file_aio_read(iocb, buf, buflen, iocb->ki_pos);
+#endif
 	if (ret == -EINVAL)
 		mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n");
 
Signature · 1 line
1.5.2.5
#53 lore raw

PATCH 27/30 ocfs2: Handle missing vectorized fileops aio_read() and aio_write()

Quoted 3 lines · Sunil Mushran

Commit 027445c37282bc1ed26add45e573ad2d3e4860a5 in mainline vectorized fileops aio_read() and aio_write(). This patch allows one to build ocfs2 with kernels having/not having this change.

I can't help but wonder if we couldn't write this as a wrapper
over the vectorized version. That is, rather than defining two different ocfs2_aio_read() prototypes, just do

#ifdef NO_VECTORIZED_AIO
static ocfs2_aio_read_novec(...)

{
    struct iovec { ... };
    return ocfs2_aio_read(..., &iovec, ...);
}

#endif

Something like that.
Also, please reverse the test.

Joel

Quoted 152 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |   33 +++++++++++++++++++++++++++++----
 4 files changed, 39 insertions(+), 4 deletions(-)
Config.make.in +1 -0
index d4cd518..f99b9f4 100644
@@ -71,6 +71,7 @@ GENERIC_SEGMENT_CHECKS = @GENERIC_SEGMENT_CHECKS@
 FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
+VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 8a23983..741dfdb 100644
@@ -282,6 +282,11 @@ OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h,
   IOP_IS_CONST=yes, , [^.*const struct inode_operations.*\*i_op;])
 AC_SUBST(IOP_IS_CONST)
 
+VECTORED_FILE_AIO=
+OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], fs.h,
+  VECTORED_FILE_AIO=yes, , [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);])
+AC_SUBST(VECTORED_FILE_AIO)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 97912fd..80fd6c6 100644
@@ -73,6 +73,10 @@ ifdef IOP_IS_CONST
 EXTRA_CFLAGS += -DIOP_IS_CONST
 endif
 
+ifdef VECTORED_FILE_AIO
+EXTRA_CFLAGS += -DVECTORED_FILE_AIO
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +29 -4
index e74730d..1ee2a79 100644
@@ -2087,10 +2087,19 @@ out:
 	return total ? total : ret;
 }
 
+#ifdef VECTORED_FILE_AIO
+#define iocb_ki_left	iocb->ki_left
 static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 				    const struct iovec *iov,
 				    unsigned long nr_segs,
 				    loff_t pos)
+#else
+#define iocb_ki_left	buflen
+static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
+				    const char __user *buf,
+				    size_t buflen,
+				    loff_t pos)
+#endif
 {
 	int ret, direct_io, appending, rw_level, have_alloc_sem  = 0;
 	int can_do_direct, sync = 0;
@@ -2100,13 +2109,19 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
 	loff_t *ppos = &iocb->ki_pos;
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_path_dentry->d_inode;
+#ifndef VECTORED_FILE_AIO
+	struct iovec iov_local = { .iov_base = (void __user *)buf,
+				   .iov_len  = buflen };
+	const struct iovec *iov = &iov_local;
+	unsigned long nr_segs = 1;
+#endif
 
 	mlog_entry("(0x%p, %u, '%.*s')\n", file,
 		   (unsigned int)nr_segs,
 		   file->f_path_dentry->d_name.len,
 		   file->f_path_dentry->d_name.name);
 
-	if (iocb->ki_left == 0)
+	if (iocb_ki_left == 0)
 		return 0;
 
 	ret = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
@@ -2139,7 +2154,7 @@ relock:
 
 	can_do_direct = direct_io;
 	ret = ocfs2_prepare_inode_for_write(file->f_path_dentry, ppos,
-					    iocb->ki_left, appending,
+					    iocb_ki_left, appending,
 					    &can_do_direct);
 	if (ret < 0) {
 		mlog_errno(ret);
@@ -2392,17 +2407,23 @@ bail:
 	return ret;
 }
 
+#ifdef VECTORED_FILE_AIO
 static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 				   const struct iovec *iov,
 				   unsigned long nr_segs,
 				   loff_t pos)
+#else
+static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
+				   char __user *buf,
+				   size_t buflen,
+				   loff_t pos)
+#endif
 {
 	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;
 	struct file *filp = iocb->ki_filp;
 	struct inode *inode = filp->f_path_dentry->d_inode;
 
-	mlog_entry("(0x%p, %u, '%.*s')\n", filp,
-		   (unsigned int)nr_segs,
+	mlog_entry("(0x%p, '%.*s')\n", filp,
 		   filp->f_path_dentry->d_name.len,
 		   filp->f_path_dentry->d_name.name);
 
@@ -2446,7 +2467,11 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
 	}
 	ocfs2_meta_unlock(inode, lock_level);
 
+#ifdef VECTORED_FILE_AIO
 	ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos);
+#else
+	ret = generic_file_aio_read(iocb, buf, buflen, iocb->ki_pos);
+#endif
 	if (ret == -EINVAL)
 		mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n");
 
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 8 lines
"There is no sincerer love than the love of food."  
         - George Bernard Shaw 

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#54 lore raw

PATCH 28/30 ocfs2: Handle missing __splice_from_pipe()

In reply to Sunil Mushran

Commit c66ab6fa705e1b2887a6d9246b798bdc526839e2 in mainline introduced __splice_from_pipe(). This patch allows one to build ocfs2 with kernels having/not having this change.

Note: This patch disables splice io for kernels not providing __splice_from_pipe(). We will later add a patch to enable splice io with such kernels too.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    4 ++++
 4 files changed, 14 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index f99b9f4..89c1e94 100644
@@ -72,6 +72,7 @@ FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
+SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 741dfdb..021b925 100644
@@ -287,6 +287,11 @@ OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], f
   VECTORED_FILE_AIO=yes, , [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);])
 AC_SUBST(VECTORED_FILE_AIO)
 
+SPLICE_FROM_PIPE=
+OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h,
+  SPLICE_FROM_PIPE=yes, , [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*])
+AC_SUBST(SPLICE_FROM_PIPE)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 80fd6c6..e4296d3 100644
@@ -77,6 +77,10 @@ ifdef VECTORED_FILE_AIO
 EXTRA_CFLAGS += -DVECTORED_FILE_AIO
 endif
 
+ifdef SPLICE_FROM_PIPE
+EXTRA_CFLAGS += -DSPLICE_FROM_PIPE
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +4 -0
index 1ee2a79..e022c97 100644
@@ -2258,6 +2258,7 @@ out_sems:
 	return written ? written : ret;
 }
 
+#ifdef SPLICE_FROM_PIPE
 static int ocfs2_splice_write_actor(struct pipe_inode_info *pipe,
 				    struct pipe_buffer *buf,
 				    struct splice_desc *sd)
@@ -2406,6 +2407,7 @@ bail:
 	mlog_exit(ret);
 	return ret;
 }
+#endif
 
 #ifdef VECTORED_FILE_AIO
 static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
@@ -2530,8 +2532,10 @@ const struct file_operations ocfs2_fops = {
 #ifdef CONFIG_COMPAT
 	.compat_ioctl   = ocfs2_compat_ioctl,
 #endif
+#ifdef SPLICE_FROM_PIPE
 	.splice_read	= ocfs2_file_splice_read,
 	.splice_write	= ocfs2_file_splice_write,
+#endif
 };
 
 const struct file_operations ocfs2_dops = {
Signature · 1 line
1.5.2.5
#55 lore raw

PATCH 28/30 ocfs2: Handle missing __splice_from_pipe()

Quoted 3 lines · Sunil Mushran

Commit c66ab6fa705e1b2887a6d9246b798bdc526839e2 in mainline introduced __splice_from_pipe(). This patch allows one to build ocfs2 with kernels having/not having this change.

Can we reverse the test?

Joel

Quoted 94 lines

Note: This patch disables splice io for kernels not providing __splice_from_pipe(). We will later add a patch to enable splice io with such kernels too.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/file.c   |    4 ++++
 4 files changed, 14 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index f99b9f4..89c1e94 100644
@@ -72,6 +72,7 @@ FAULT_IN_VMOPS = @FAULT_IN_VMOPS@
 SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
+SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 741dfdb..021b925 100644
@@ -287,6 +287,11 @@ OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], f
   VECTORED_FILE_AIO=yes, , [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);])
 AC_SUBST(VECTORED_FILE_AIO)
 
+SPLICE_FROM_PIPE=
+OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h,
+  SPLICE_FROM_PIPE=yes, , [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*])
+AC_SUBST(SPLICE_FROM_PIPE)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index 80fd6c6..e4296d3 100644
@@ -77,6 +77,10 @@ ifdef VECTORED_FILE_AIO
 EXTRA_CFLAGS += -DVECTORED_FILE_AIO
 endif
 
+ifdef SPLICE_FROM_PIPE
+EXTRA_CFLAGS += -DSPLICE_FROM_PIPE
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/file.c +4 -0
index 1ee2a79..e022c97 100644
@@ -2258,6 +2258,7 @@ out_sems:
 	return written ? written : ret;
 }
 
+#ifdef SPLICE_FROM_PIPE
 static int ocfs2_splice_write_actor(struct pipe_inode_info *pipe,
 				    struct pipe_buffer *buf,
 				    struct splice_desc *sd)
@@ -2406,6 +2407,7 @@ bail:
 	mlog_exit(ret);
 	return ret;
 }
+#endif
 
 #ifdef VECTORED_FILE_AIO
 static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
@@ -2530,8 +2532,10 @@ const struct file_operations ocfs2_fops = {
 #ifdef CONFIG_COMPAT
 	.compat_ioctl   = ocfs2_compat_ioctl,
 #endif
+#ifdef SPLICE_FROM_PIPE
 	.splice_read	= ocfs2_file_splice_read,
 	.splice_write	= ocfs2_file_splice_write,
+#endif
 };
 
 const struct file_operations ocfs2_dops = {
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
"Maybe the time has drawn the faces I recall.
 But things in this life change very slowly,
 If they ever change at all."

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#56 lore raw

PATCH 29/30 ocfs2: Handle older prototype of bi_end_io_t

In reply to Sunil Mushran

Commit 6712ecf8f648118c3363c142196418f89a510b90 in mainline dropped 'size' argument from bi_end_io(). This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in               |    1 +
 configure.in                 |    5 +++++
 fs/ocfs2/cluster/Makefile    |    4 ++++
 fs/ocfs2/cluster/heartbeat.c |    9 +++++++++
 4 files changed, 19 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 89c1e94..f22473c 100644
@@ -73,6 +73,7 @@ SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
+OLD_BIO_END_IO = @OLD_BIO_END_IO@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 021b925..60fd68f 100644
@@ -292,6 +292,11 @@ OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h,
   SPLICE_FROM_PIPE=yes, , [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*])
 AC_SUBST(SPLICE_FROM_PIPE)
 
+OLD_BIO_END_IO=
+OCFS2_CHECK_KERNEL([old bio_end_io_t in bio.h], bio.h,
+  OLD_BIO_END_IO=yes, , [^typedef int (bio_end_io_t) (struct bio \*, unsigned int, int);])
+AC_SUBST(OLD_BIO_END_IO)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index ff57486..ccbddd0 100644
@@ -29,6 +29,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef OLD_BIO_END_IO
+EXTRA_CFLAGS += -DOLD_BIO_END_IO
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/heartbeat.c +9 -0
index e610665..b41a7fb 100644
@@ -216,8 +216,14 @@ static void o2hb_wait_on_io(struct o2hb_region *reg,
 	wait_for_completion(&wc->wc_io_complete);
 }
 
+#ifdef OLD_BIO_END_IO
+static int o2hb_bio_end_io(struct bio *bio,
+			   unsigned int bytes_done,
+			   int error)
+#else
 static void o2hb_bio_end_io(struct bio *bio,
 			   int error)
+#endif
 {
 	struct o2hb_bio_wait_ctxt *wc = bio->bi_private;
 
@@ -228,6 +234,9 @@ static void o2hb_bio_end_io(struct bio *bio,
 
 	o2hb_bio_wait_dec(wc, 1);
 	bio_put(bio);
+#ifdef OLD_BIO_END_IO
+	return 0;
+#endif
 }
 
 /* Setup a Bio to cover I/O against num_slots slots starting at
Signature · 1 line
1.5.2.5
#57 lore raw

PATCH 29/30 ocfs2: Handle older prototype of bi_end_io_t

Quoted 5 lines · Sunil Mushran

Commit 6712ecf8f648118c3363c142196418f89a510b90 in mainline dropped 'size' argument from bi_end_io(). This patch allows one to build ocfs2 with kernels having/not having this change.

Quoted 87 lines
---
 Config.make.in               |    1 +
 configure.in                 |    5 +++++
 fs/ocfs2/cluster/Makefile    |    4 ++++
 fs/ocfs2/cluster/heartbeat.c |    9 +++++++++
 4 files changed, 19 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index 89c1e94..f22473c 100644
@@ -73,6 +73,7 @@ SOP_IS_CONST = @SOP_IS_CONST@
 IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
+OLD_BIO_END_IO = @OLD_BIO_END_IO@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 021b925..60fd68f 100644
@@ -292,6 +292,11 @@ OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h,
   SPLICE_FROM_PIPE=yes, , [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*])
 AC_SUBST(SPLICE_FROM_PIPE)
 
+OLD_BIO_END_IO=
+OCFS2_CHECK_KERNEL([old bio_end_io_t in bio.h], bio.h,
+  OLD_BIO_END_IO=yes, , [^typedef int (bio_end_io_t) (struct bio \*, unsigned int, int);])
+AC_SUBST(OLD_BIO_END_IO)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/cluster/Makefile +4 -0
index ff57486..ccbddd0 100644
@@ -29,6 +29,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED
 EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED
 endif
 
+ifdef OLD_BIO_END_IO
+EXTRA_CFLAGS += -DOLD_BIO_END_IO
+endif
+
 SOURCES =			\
 	heartbeat.c		\
 	masklog.c		\
fs/ocfs2/cluster/heartbeat.c +9 -0
index e610665..b41a7fb 100644
@@ -216,8 +216,14 @@ static void o2hb_wait_on_io(struct o2hb_region *reg,
 	wait_for_completion(&wc->wc_io_complete);
 }
 
+#ifdef OLD_BIO_END_IO
+static int o2hb_bio_end_io(struct bio *bio,
+			   unsigned int bytes_done,
+			   int error)
+#else
 static void o2hb_bio_end_io(struct bio *bio,
 			   int error)
+#endif
 {
 	struct o2hb_bio_wait_ctxt *wc = bio->bi_private;
 
@@ -228,6 +234,9 @@ static void o2hb_bio_end_io(struct bio *bio,
 
 	o2hb_bio_wait_dec(wc, 1);
 	bio_put(bio);
+#ifdef OLD_BIO_END_IO
+	return 0;
+#endif
 }
 
 /* Setup a Bio to cover I/O against num_slots slots starting at
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 9 lines
Viro's Razor:
	Any race condition, no matter how unlikely, will occur just
	often enough to bite you.

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127
#58 lore raw

PATCH 30/30 ocfs2: Handle missing exportfs.h

In reply to Sunil Mushran

Commit a569425512253992cc64ebf8b6d00a62f986db3e in mainline moved struct export_operation from fs.h to exportfs.h. This patch allows one to build ocfs2 with kernels having/not having this change.

---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/export.h |    2 ++
 4 files changed, 12 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index f22473c..90e4472 100644
@@ -74,6 +74,7 @@ IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
 OLD_BIO_END_IO = @OLD_BIO_END_IO@
+EXPORTFS_HEADER = @EXPORTFS_HEADER@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 60fd68f..d4f3c97 100644
@@ -297,6 +297,11 @@ OCFS2_CHECK_KERNEL([old bio_end_io_t in bio.h], bio.h,
   OLD_BIO_END_IO=yes, , [^typedef int (bio_end_io_t) (struct bio \*, unsigned int, int);])
 AC_SUBST(OLD_BIO_END_IO)
 
+EXPORTFS_HEADER=
+OCFS2_CHECK_KERNEL([exportfs.h], exportfs.h,
+  EXPORTFS_HEADER=yes, , [^struct export_operations {])
+AC_SUBST(EXPORTFS_HEADER)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index e4296d3..8f8458e 100644
@@ -81,6 +81,10 @@ ifdef SPLICE_FROM_PIPE
 EXTRA_CFLAGS += -DSPLICE_FROM_PIPE
 endif
 
+ifdef EXPORTFS_HEADER
+EXTRA_CFLAGS += -DEXPORTFS_HEADER
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/export.h +2 -0
index e08bed9..f81edb5 100644
@@ -26,7 +26,9 @@
 #ifndef OCFS2_EXPORT_H
 #define OCFS2_EXPORT_H
 
+#ifdef EXPORTFS_HEADER
 #include <linux/exportfs.h>
+#endif
 
 extern struct export_operations ocfs2_export_ops;
 
Signature · 1 line
1.5.2.5
#59 lore raw

PATCH 30/30 ocfs2: Handle missing exportfs.h

Quoted 4 lines · Sunil Mushran

Commit a569425512253992cc64ebf8b6d00a62f986db3e in mainline moved struct export_operation from fs.h to exportfs.h. This patch allows one to build ocfs2 with kernels having/not having this change.

Please reverse the test.

Joel

Quoted 73 lines
---
 Config.make.in    |    1 +
 configure.in      |    5 +++++
 fs/ocfs2/Makefile |    4 ++++
 fs/ocfs2/export.h |    2 ++
 4 files changed, 12 insertions(+), 0 deletions(-)
Config.make.in +1 -0
index f22473c..90e4472 100644
@@ -74,6 +74,7 @@ IOP_IS_CONST = @IOP_IS_CONST@
 VECTORED_FILE_AIO = @VECTORED_FILE_AIO@
 SPLICE_FROM_PIPE = @SPLICE_FROM_PIPE@
 OLD_BIO_END_IO = @OLD_BIO_END_IO@
+EXPORTFS_HEADER = @EXPORTFS_HEADER@
 
 OCFS_DEBUG = @OCFS_DEBUG@
 
configure.in +5 -0
index 60fd68f..d4f3c97 100644
@@ -297,6 +297,11 @@ OCFS2_CHECK_KERNEL([old bio_end_io_t in bio.h], bio.h,
   OLD_BIO_END_IO=yes, , [^typedef int (bio_end_io_t) (struct bio \*, unsigned int, int);])
 AC_SUBST(OLD_BIO_END_IO)
 
+EXPORTFS_HEADER=
+OCFS2_CHECK_KERNEL([exportfs.h], exportfs.h,
+  EXPORTFS_HEADER=yes, , [^struct export_operations {])
+AC_SUBST(EXPORTFS_HEADER)
+
 # using -include has two advantages:
 #  the source doesn't need to know to include compat headers
 #  the compat header file names don't go through the search path
fs/ocfs2/Makefile +4 -0
index e4296d3..8f8458e 100644
@@ -81,6 +81,10 @@ ifdef SPLICE_FROM_PIPE
 EXTRA_CFLAGS += -DSPLICE_FROM_PIPE
 endif
 
+ifdef EXPORTFS_HEADER
+EXTRA_CFLAGS += -DEXPORTFS_HEADER
+endif
+
 #
 # Since SUBDIRS means something to kbuild, define them safely.  Do not
 # include trailing slashes.
fs/ocfs2/export.h +2 -0
index e08bed9..f81edb5 100644
@@ -26,7 +26,9 @@
 #ifndef OCFS2_EXPORT_H
 #define OCFS2_EXPORT_H
 
+#ifdef EXPORTFS_HEADER
 #include <linux/exportfs.h>
+#endif
 
 extern struct export_operations ocfs2_export_ops;
 
Signature · 7 lines
1.5.2.5


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 10 lines
 print STDOUT q
 Just another Perl hacker,
 unless $spring
	- Larry Wall

Joel Becker
Principal Software Developer
Oracle
E-mail: [email protected]
Phone: (650) 506-8127