Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 15/30] ocfs2: Handles configfs_depend_item() and configfs_undepend_item()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index 1d27943..1553e54 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/drop_nlink.h \ kapi-compat/include/slab.h \ kapi-compat/include/fs_rename_does_d_move.h \ - kapi-compat/include/sysctl.h + kapi-compat/include/sysctl.h \ + kapi-compat/include/configfs.h PATCH_FILES diff --git a/configure.in b/configure.in index 7874829..25452d9 100644 --- a/configure.in +++ b/configure.in @@ -231,6 +231,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 diff --git a/kapi-compat/include/configfs.h b/kapi-compat/include/configfs.h new file mode 100644 index 0000000..cbc11e6 --- /dev/null +++ b/kapi-compat/include/configfs.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 25/30] ocfs2: Handle missing const s_op in struct super_block
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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(-) diff --git a/Config.make.in b/Config.make.in index e49c8d5..d725fbd 100644 --- a/Config.make.in +++ b/Config.make.in @@ -70,6 +70,7 @@ NO_FALLOCATE = @NO_FALLOCATE@ NO_SPLICE_HEADER = @NO_SPLICE_HEADER@ NO_SHOULD_REMOVE_SUID = @NO_SHOULD_REMOVE_SUID@ NO_GENERIC_SEGMENT_CHECKS = @NO_GENERIC_SEGMENT_CHECKS@ +SOP_IS_NOT_CONST = @SOP_IS_NOT_CONST@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index 1ecdba6..dc6346b 100644 --- a/configure.in +++ b/configure.in @@ -286,6 +286,11 @@ OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h, AC_SUBST(NO_GENERIC_SEGMENT_CHECKS) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS generic_segment_checks.h" +SOP_IS_NOT_CONST+OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h, + , SOP_IS_NOT_CONST=yes, [^.*const struct super_operations.*\*s_op;]) +AC_SUBST(SOP_IS_NOT_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 3228a44..c6e09a3 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -76,6 +76,10 @@ SOURCES += compat_generic_segment_checks.c EXTRA_CFLAGS += -DNO_GENERIC_SEGMENT_CHECKS endif +ifdef SOP_IS_NOT_CONST +EXTRA_CFLAGS += -DSOP_IS_NOT_CONST +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 7e84646..1eb0bbe 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -38,6 +38,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED endif +ifdef SOP_IS_NOT_CONST +EXTRA_CFLAGS += -DSOP_IS_NOT_CONST +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 78704a1..6d57554 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -60,7 +60,11 @@ #define MLOG_MASK_PREFIX ML_DLMFS #include "cluster/masklog.h" +#ifdef SOP_IS_NOT_CONST +static struct super_operations dlmfs_ops; +#else static const 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_NOT_CONST +static struct super_operations dlmfs_ops = { +#else static const struct super_operations dlmfs_ops = { +#endif .statfs = simple_statfs, .alloc_inode = dlmfs_alloc_inode, .destroy_inode = dlmfs_destroy_inode, diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index f5c424d..43147c0 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -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_NOT_CONST +static struct super_operations ocfs2_sops = { +#else static const struct super_operations ocfs2_sops = { +#endif .statfs = ocfs2_statfs, .alloc_inode = ocfs2_alloc_inode, .destroy_inode = ocfs2_destroy_inode, -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 05/30] ocfs2: Handle macro zero_user_page()
Commit 01f2705daf5a36208e69d7cf95db9c330f843af6 in mainline introduced macro zero_user_page(). This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index 21ff590..b7b86db 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/configure.in b/configure.in index 26c4575..3d5ee8e 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/kapi-compat/include/highmem.h b/kapi-compat/include/highmem.h new file mode 100644 index 0000000..a8c7e11 --- /dev/null +++ b/kapi-compat/include/highmem.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 24/30] ocfs2: Handle missing export generic_segment_checks()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + Makefile | 3 +- configure.in | 6 +++ fs/ocfs2/Makefile | 6 +++ fs/ocfs2/compat_generic_segment_checks.c | 51 ++++++++++++++++++++++++++ kapi-compat/include/generic_segment_checks.h | 15 ++++++++ 6 files changed, 81 insertions(+), 1 deletions(-) create mode 100644 fs/ocfs2/compat_generic_segment_checks.c create mode 100644 kapi-compat/include/generic_segment_checks.h diff --git a/Config.make.in b/Config.make.in index 6afaef6..e49c8d5 100644 --- a/Config.make.in +++ b/Config.make.in @@ -69,6 +69,7 @@ STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@ NO_FALLOCATE = @NO_FALLOCATE@ NO_SPLICE_HEADER = @NO_SPLICE_HEADER@ NO_SHOULD_REMOVE_SUID = @NO_SHOULD_REMOVE_SUID@ +NO_GENERIC_SEGMENT_CHECKS = @NO_GENERIC_SEGMENT_CHECKS@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 0c17fec..9427ce6 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/kobject.h \ kapi-compat/include/cap.h \ kapi-compat/include/relatime.h \ - kapi-compat/include/should_remove_suid.h + kapi-compat/include/should_remove_suid.h \ + kapi-compat/include/generic_segment_checks.h PATCH_FILES diff --git a/configure.in b/configure.in index 6d20acc..1ecdba6 100644 --- a/configure.in +++ b/configure.in @@ -280,6 +280,12 @@ OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h, AC_SUBST(NO_SHOULD_REMOVE_SUID) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS should_remove_suid.h" +NO_GENERIC_SEGMENT_CHECKS+OCFS2_CHECK_KERNEL([generic_segment_checks() in fs.h], fs.h, + , NO_GENERIC_SEGMENT_CHECKS=yes, [generic_segment_checks()]) +AC_SUBST(NO_GENERIC_SEGMENT_CHECKS) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS generic_segment_checks.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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 8360fe3..3228a44 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -70,6 +70,12 @@ SOURCES += compat_should_remove_suid.c EXTRA_CFLAGS += -DNO_SHOULD_REMOVE_SUID endif +COMPAT_SOURCES += compat_generic_segment_checks.c +ifdef NO_GENERIC_SEGMENT_CHECKS +SOURCES += compat_generic_segment_checks.c +EXTRA_CFLAGS += -DNO_GENERIC_SEGMENT_CHECKS +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/compat_generic_segment_checks.c b/fs/ocfs2/compat_generic_segment_checks.c new file mode 100644 index 0000000..10b04d5 --- /dev/null +++ b/fs/ocfs2/compat_generic_segment_checks.c @@ -0,0 +1,51 @@ +/* + * compat_generic_segment_checks.c + * + * This code has been copied from mainline linux kernel git commit + * e7b34019606ab1dd06196635e931b0c302799228 to allow ocfs2 to build + * against older kernels. For license, refer to mm/filemap.c in mainline + * linux kernel. + * + */ + +#include <linux/fs.h> +#include <linux/uaccess.h> +#include <linux/uio.h> + +/* + * 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; +} diff --git a/kapi-compat/include/generic_segment_checks.h b/kapi-compat/include/generic_segment_checks.h new file mode 100644 index 0000000..76e0ecf --- /dev/null +++ b/kapi-compat/include/generic_segment_checks.h @@ -0,0 +1,15 @@ +#ifndef KAPI_GENERIC_SEGMENT_CHECKS_H +#define KAPI_GENERIC_SEGMENT_CHECKS_H + +#ifdef NO_GENERIC_SEGMENT_CHECKS + +#include <linux/fs.h> +#include <linux/uaccess.h> +#include <linux/uio.h> + +int generic_segment_checks(const struct iovec *iov, unsigned long *nr_segs, + size_t *count, int access_flags); + +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 18/30] ocfs2: Handle the removal of struct subsystem
Commit 823bccfc4002296ba88c3ad0f049e1abd8108d30 in mainline removes struct subsystem from kobject.h. This patch allows one to build ocfs2 with kernels having/not having this change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> --- 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/sys.c | 8 ++++---- fs/ocfs2/dlm/Makefile | 4 ++++ kapi-compat/include/kobject.h | 12 ++++++++++++ 9 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 kapi-compat/include/kobject.h diff --git a/Config.make.in b/Config.make.in index 3dd84e2..05833bd 100644 --- a/Config.make.in +++ b/Config.make.in @@ -65,6 +65,7 @@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@ NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM = @NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM@ +STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 1ecedd2..b035e29 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,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 diff --git a/configure.in b/configure.in index f04af3d..0f165c9 100644 --- a/configure.in +++ b/configure.in @@ -248,6 +248,12 @@ OCFS2_CHECK_KERNEL([su_mutex in struct configfs_subsystem in configfs.h], config AC_SUBST(NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM) 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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 456b24b..0eac626 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -52,6 +52,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. diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index 4c3f6e5..7ef2934 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -30,6 +30,10 @@ ifdef NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM EXTRA_CFLAGS += -DNO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM endif +ifdef STRUCT_SUBSYSTEM_DEFINED +EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED +endif + SOURCES += \ heartbeat.c \ masklog.c \ diff --git a/fs/ocfs2/cluster/masklog.c b/fs/ocfs2/cluster/masklog.c index e9e042b..ced6c35 100644 --- a/fs/ocfs2/cluster/masklog.c +++ b/fs/ocfs2/cluster/masklog.c @@ -156,7 +156,7 @@ int mlog_sys_init(struct kset *o2cb_subsys) } mlog_attr_ptrs[i] = NULL; - kobj_set_kset_s(&mlog_kset, *o2cb_subsys); + kobj_set_kset_s(&mlog_kset, kapi_subsystem(o2cb_subsys)); return kset_register(&mlog_kset); } diff --git a/fs/ocfs2/cluster/sys.c b/fs/ocfs2/cluster/sys.c index 64f6f37..c3e4131 100644 --- a/fs/ocfs2/cluster/sys.c +++ b/fs/ocfs2/cluster/sys.c @@ -80,7 +80,7 @@ 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); + BUG_ON(sbs != kapi_subsystem_kset(&o2cb_subsys)); if (o2cb_attr->show) return o2cb_attr->show(buffer); @@ -94,7 +94,7 @@ o2cb_store(struct kobject * kobj, struct attribute * attr, struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr); struct kset *sbs = to_kset(kobj); - BUG_ON(sbs != &o2cb_subsys); + BUG_ON(sbs != kapi_subsystem_kset(&o2cb_subsys)); if (o2cb_attr->store) return o2cb_attr->store(buffer, count); @@ -111,12 +111,12 @@ int o2cb_sys_init(void) { int ret; - o2cb_subsys.kobj.ktype = &o2cb_subsys_type; + kapi_subsystem_kset(&o2cb_subsys)->kobj.ktype = &o2cb_subsys_type; ret = subsystem_register(&o2cb_subsys); if (ret) return ret; - ret = mlog_sys_init(&o2cb_subsys); + ret = mlog_sys_init(kapi_subsystem_kset(&o2cb_subsys)); if (ret) subsystem_unregister(&o2cb_subsys); return ret; diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 31f312e..7e84646 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -34,6 +34,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 \ diff --git a/kapi-compat/include/kobject.h b/kapi-compat/include/kobject.h new file mode 100644 index 0000000..c613868 --- /dev/null +++ b/kapi-compat/include/kobject.h @@ -0,0 +1,12 @@ +#ifndef KAPI_KOBJECT_H +#define KAPI_KOBJECT_H + +#ifdef STRUCT_SUBSYSTEM_DEFINED +# define kapi_subsystem_kset(_sub) (&((_sub)->kset)) +# define kapi_subsystem(_sub) *((struct subsystem *)(_sub)) +#else +# define kapi_subsystem_kset(_sub) (_sub) +# define kapi_subsystem(_sub) (_sub) +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 11/30] ocfs2: Add helper drop_nlink
Commit 9a53c3a783c2fa9b969628e65695c11c3e51e673 in mainline added helper drop_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index 2995450..d201b85 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/sync_mapping_range.h \ kapi-compat/include/fpath.h \ kapi-compat/include/umh_wait.h \ - kapi-compat/include/inc_nlink.h + kapi-compat/include/inc_nlink.h \ + kapi-compat/include/drop_nlink.h PATCH_FILES diff --git a/configure.in b/configure.in index 1cdd243..f9b0a70 100644 --- a/configure.in +++ b/configure.in @@ -199,6 +199,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 diff --git a/kapi-compat/include/drop_nlink.h b/kapi-compat/include/drop_nlink.h new file mode 100644 index 0000000..d54973b --- /dev/null +++ b/kapi-compat/include/drop_nlink.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 16/30] ocfs2: Handle different prototypes of register_sysctl_table()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Config.make.in b/Config.make.in index c5631b6..9e2b466 100644 --- a/Config.make.in +++ b/Config.make.in @@ -63,6 +63,7 @@ NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ NO_FAULT_IN_VMOPS = @NO_FAULT_IN_VMOPS@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@ +REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 1553e54..4256eb7 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/slab.h \ kapi-compat/include/fs_rename_does_d_move.h \ kapi-compat/include/sysctl.h \ - kapi-compat/include/configfs.h + kapi-compat/include/configfs.h \ + kapi-compat/include/register_sysctl.h PATCH_FILES diff --git a/configure.in b/configure.in index 25452d9..795437c 100644 --- a/configure.in +++ b/configure.in @@ -236,6 +236,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 diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index 16bddd9..28fe533 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -22,6 +22,10 @@ ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif +ifdef REGISTER_SYSCTL_TWO_ARGS +EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS +endif + SOURCES += \ heartbeat.c \ masklog.c \ diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c index af2070d..9fff881 100644 --- a/fs/ocfs2/cluster/nodemanager.c +++ b/fs/ocfs2/cluster/nodemanager.c @@ -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. */ diff --git a/kapi-compat/include/register_sysctl.h b/kapi-compat/include/register_sysctl.h new file mode 100644 index 0000000..94e8071 --- /dev/null +++ b/kapi-compat/include/register_sysctl.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 22/30] ocfs2: Handle missing macro MNT_RELATIME
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. TODO: This feature needs to be enabled later by parsing the realtime mount option in ocfs2 itself. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/relatime.h | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/relatime.h diff --git a/Makefile b/Makefile index 5539d48..ea4b979 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,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/relatime.h PATCH_FILES diff --git a/configure.in b/configure.in index 19c38d4..2f2a263 100644 --- a/configure.in +++ b/configure.in @@ -269,6 +269,11 @@ OCFS2_CHECK_KERNEL([struct splice_desc in splice.h], splice.h, , NO_SPLICE_HEADER=yes, [^struct splice_desc ]) AC_SUBST(NO_SPLICE_HEADER) +relatime_compat_header="" +OCFS2_CHECK_KERNEL([MNT_RELATIME in mount.h], mount.h, + , relatime_compat_header="relatime.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 diff --git a/kapi-compat/include/relatime.h b/kapi-compat/include/relatime.h new file mode 100644 index 0000000..34c5d38 --- /dev/null +++ b/kapi-compat/include/relatime.h @@ -0,0 +1,6 @@ +#ifndef KAPI_RELATIME_H +#define KAPI_RELATIME_H + +#define MNT_RELATIME 0x20 + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 26/30] ocfs2: Handle missing const struct inode_operations in struct inode
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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(-) diff --git a/Config.make.in b/Config.make.in index d725fbd..b9b65e6 100644 --- a/Config.make.in +++ b/Config.make.in @@ -71,6 +71,7 @@ NO_SPLICE_HEADER = @NO_SPLICE_HEADER@ NO_SHOULD_REMOVE_SUID = @NO_SHOULD_REMOVE_SUID@ NO_GENERIC_SEGMENT_CHECKS = @NO_GENERIC_SEGMENT_CHECKS@ SOP_IS_NOT_CONST = @SOP_IS_NOT_CONST@ +IOP_IS_NOT_CONST = @IOP_IS_NOT_CONST@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index dc6346b..8503153 100644 --- a/configure.in +++ b/configure.in @@ -291,6 +291,11 @@ OCFS2_CHECK_KERNEL([s_op declared as const in struct super_block in fs.h], fs.h, , SOP_IS_NOT_CONST=yes, [^.*const struct super_operations.*\*s_op;]) AC_SUBST(SOP_IS_NOT_CONST) +IOP_IS_NOT_CONST+OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h, + , IOP_IS_NOT_CONST=yes, [^.*const struct inode_operations.*\*i_op;]) +AC_SUBST(IOP_IS_NOT_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index c6e09a3..d25eea0 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -80,6 +80,10 @@ ifdef SOP_IS_NOT_CONST EXTRA_CFLAGS += -DSOP_IS_NOT_CONST endif +ifdef IOP_IS_NOT_CONST +EXTRA_CFLAGS += -DIOP_IS_NOT_CONST +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 1eb0bbe..0ecea70 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -42,6 +42,10 @@ ifdef SOP_IS_NOT_CONST EXTRA_CFLAGS += -DSOP_IS_NOT_CONST endif +ifdef IOP_IS_NOT_CONST +EXTRA_CFLAGS += -DIOP_IS_NOT_CONST +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 6d57554..db6d582 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -66,9 +66,15 @@ static struct super_operations dlmfs_ops; static const struct super_operations dlmfs_ops; #endif static const struct file_operations dlmfs_file_operations; +#ifdef IOP_IS_NOT_CONST +static struct inode_operations dlmfs_dir_inode_operations; +static struct inode_operations dlmfs_root_inode_operations; +static struct inode_operations dlmfs_file_inode_operations; +#else 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; +#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_NOT_CONST +static struct inode_operations dlmfs_dir_inode_operations = { +#else static const 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_NOT_CONST +static struct inode_operations dlmfs_root_inode_operations = { +#else static const struct inode_operations dlmfs_root_inode_operations = { +#endif .lookup = simple_lookup, .mkdir = dlmfs_mkdir, .rmdir = simple_rmdir, @@ -572,7 +586,11 @@ static const struct super_operations dlmfs_ops = { .drop_inode = generic_delete_inode, }; +#ifdef IOP_IS_NOT_CONST +static struct inode_operations dlmfs_file_inode_operations = { +#else static const struct inode_operations dlmfs_file_inode_operations = { +#endif .getattr = simple_getattr, }; diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index ad38a21..a19322e 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2399,7 +2399,11 @@ bail: return ret; } +#ifdef IOP_IS_NOT_CONST +struct inode_operations ocfs2_file_iops = { +#else const struct inode_operations ocfs2_file_iops = { +#endif .setattr = ocfs2_setattr, .getattr = ocfs2_getattr, .permission = ocfs2_permission, @@ -2408,7 +2412,11 @@ const struct inode_operations ocfs2_file_iops = { #endif }; +#ifdef IOP_IS_NOT_CONST +struct inode_operations ocfs2_special_file_iops = { +#else const struct inode_operations ocfs2_special_file_iops = { +#endif .setattr = ocfs2_setattr, .getattr = ocfs2_getattr, .permission = ocfs2_permission, diff --git a/fs/ocfs2/file.h b/fs/ocfs2/file.h index 066f14a..807795a 100644 --- a/fs/ocfs2/file.h +++ b/fs/ocfs2/file.h @@ -28,8 +28,13 @@ extern const struct file_operations ocfs2_fops; extern const struct file_operations ocfs2_dops; +#ifdef IOP_IS_NOT_CONST +extern struct inode_operations ocfs2_file_iops; +extern struct inode_operations ocfs2_special_file_iops; +#else extern const struct inode_operations ocfs2_file_iops; extern const struct inode_operations ocfs2_special_file_iops; +#endif struct ocfs2_alloc_context; enum ocfs2_alloc_restarted { diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 7292590..6d822b7 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c @@ -1898,7 +1898,11 @@ leave: return status; } +#ifdef IOP_IS_NOT_CONST +struct inode_operations ocfs2_dir_iops = { +#else const struct inode_operations ocfs2_dir_iops = { +#endif .create = ocfs2_create, .lookup = ocfs2_lookup, .link = ocfs2_link, diff --git a/fs/ocfs2/namei.h b/fs/ocfs2/namei.h index 688aef6..8022f3c 100644 --- a/fs/ocfs2/namei.h +++ b/fs/ocfs2/namei.h @@ -26,7 +26,11 @@ #ifndef OCFS2_NAMEI_H #define OCFS2_NAMEI_H +#ifdef IOP_IS_NOT_CONST +extern struct inode_operations ocfs2_dir_iops; +#else extern const struct inode_operations ocfs2_dir_iops; +#endif struct dentry *ocfs2_get_parent(struct dentry *child); diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c index 7134007..9794649 100644 --- a/fs/ocfs2/symlink.c +++ b/fs/ocfs2/symlink.c @@ -163,12 +163,20 @@ bail: return ERR_PTR(status); } +#ifdef IOP_IS_NOT_CONST +struct inode_operations ocfs2_symlink_inode_operations = { +#else const struct inode_operations ocfs2_symlink_inode_operations = { +#endif .readlink = page_readlink, .follow_link = ocfs2_follow_link, .getattr = ocfs2_getattr, }; +#ifdef IOP_IS_NOT_CONST +struct inode_operations ocfs2_fast_symlink_inode_operations = { +#else const struct inode_operations ocfs2_fast_symlink_inode_operations = { +#endif .readlink = ocfs2_readlink, .follow_link = ocfs2_follow_link, .getattr = ocfs2_getattr, diff --git a/fs/ocfs2/symlink.h b/fs/ocfs2/symlink.h index 65a6c9c..f53d1e0 100644 --- a/fs/ocfs2/symlink.h +++ b/fs/ocfs2/symlink.h @@ -26,8 +26,13 @@ #ifndef OCFS2_SYMLINK_H #define OCFS2_SYMLINK_H +#ifdef IOP_IS_NOT_CONST +extern struct inode_operations ocfs2_symlink_inode_operations; +extern struct inode_operations ocfs2_fast_symlink_inode_operations; +#else extern const struct inode_operations ocfs2_symlink_inode_operations; extern const struct inode_operations ocfs2_fast_symlink_inode_operations; +#endif /* * Test whether an inode is a fast symlink. -- 1.5.2.5
Sunil Mushran
2008-Jan-09 17:59 UTC
[Ocfs2-devel] [PATCH 13/30] ocfs2: Define FS_RENAME_DOES_D_MOVE
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> --- Makefile | 3 ++- configure.in | 16 ++++++++++++++++ kapi-compat/include/fs_rename_does_d_move.h | 6 ++++++ 3 files changed, 24 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/fs_rename_does_d_move.h diff --git a/Makefile b/Makefile index 23af453..43cd04c 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/umh_wait.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/fs_rename_does_d_move.h PATCH_FILES diff --git a/configure.in b/configure.in index 2ce14ed..f1d3732 100644 --- a/configure.in +++ b/configure.in @@ -210,6 +210,22 @@ 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="fs_rename_does_d_move.h", [FS_RENAME_DOES_D_MOVE]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header" + +if test "x$fstype_compat_header" = "xfs_rename_does_d_move.h" ; then + AC_MSG_CHECKING(whether to ignore the missing vfs rename kernel patch) + AC_ARG_ENABLE(vfs_rename_patch_override, [ --enable-vfs-rename-patch-override=[yes/no] Enable FS_RENAME_DOES_D_MOVE patch override [default=no]],,enable_vfs_rename_patch_override=no) + AC_MSG_RESULT($enable_vfs_rename_patch_override) + if test "x$enable_vfs_rename_patch_override" = "xno" ; then + AC_MSG_ERROR(Kernel source is missing mainline patch commit 349457ccf2592c14bdf13b6706170ae2e94931b1) + else + AC_MSG_WARN(Building eventhough kernel source is missing mainline patch commit 349457ccf2592c14bdf13b6706170ae2e94931b1) + fi +fi + # 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 diff --git a/kapi-compat/include/fs_rename_does_d_move.h b/kapi-compat/include/fs_rename_does_d_move.h new file mode 100644 index 0000000..895ea86 --- /dev/null +++ b/kapi-compat/include/fs_rename_does_d_move.h @@ -0,0 +1,6 @@ +#ifndef KAPI_FSTYPE_H +#define KAPI_FSTYPE_H + +#define FS_RENAME_DOES_D_MOVE FS_ODD_RENAME + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 09/30] ocfs2: Define enum umh_wait
Commit 86313c488a6848b7ec2ba04e74f25f79dd32a0b7 in mainline introduced enum umh_wait. This patch allows one to build ocfs2 with kernels having/ not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/umh_wait.h | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/umh_wait.h diff --git a/Makefile b/Makefile index c1ebc15..b937c2b 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/compiler.h \ kapi-compat/include/highmem.h \ kapi-compat/include/sync_mapping_range.h \ - kapi-compat/include/fpath.h + kapi-compat/include/fpath.h \ + kapi-compat/include/umh_wait.h PATCH_FILES diff --git a/configure.in b/configure.in index 21aa749..803ded1 100644 --- a/configure.in +++ b/configure.in @@ -189,6 +189,11 @@ OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h, AC_SUBST(NO_F_PATH_IN_STRUCT_FILE) 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="umh_wait.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 diff --git a/kapi-compat/include/umh_wait.h b/kapi-compat/include/umh_wait.h new file mode 100644 index 0000000..42a082b --- /dev/null +++ b/kapi-compat/include/umh_wait.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 08/30] ocfs2: Handle struct f_path in struct file
Commit 0f7fc9e4d03987fe29f6dd4aa67e4c56eb7ecb05 in mainline added struct path in struct file. This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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/Makefile | 4 ++++ fs/ocfs2/dlm/dlmfs.c | 4 ++-- fs/ocfs2/file.c | 38 +++++++++++++++++++------------------- fs/ocfs2/ioctl.c | 2 +- fs/ocfs2/mmap.c | 10 +++++----- kapi-compat/include/fpath.h | 10 ++++++++++ 12 files changed, 57 insertions(+), 31 deletions(-) create mode 100644 kapi-compat/include/fpath.h diff --git a/Config.make.in b/Config.make.in index af9d11e..0fdbad0 100644 --- a/Config.make.in +++ b/Config.make.in @@ -61,6 +61,7 @@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ NO_FAULT_IN_VMOPS = @NO_FAULT_IN_VMOPS@ +NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 3ddb1aa..c1ebc15 100644 --- a/Makefile +++ b/Makefile @@ -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/sync_mapping_range.h + kapi-compat/include/sync_mapping_range.h \ + kapi-compat/include/fpath.h PATCH_FILES diff --git a/configure.in b/configure.in index a90a3a6..21aa749 100644 --- a/configure.in +++ b/configure.in @@ -183,6 +183,12 @@ OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h, , NO_FAULT_IN_VMOPS=yes, [^.*int (\*fault)]) AC_SUBST(NO_FAULT_IN_VMOPS) +NO_F_PATH_IN_STRUCT_FILE+OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h, + , NO_F_PATH_IN_STRUCT_FILE=yes, [f_path]) +AC_SUBST(NO_F_PATH_IN_STRUCT_FILE) +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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 5b67f93..8733e21 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -44,6 +44,10 @@ ifdef NO_FAULT_IN_VMOPS EXTRA_CFLAGS += -DNO_FAULT_IN_VMOPS endif +ifdef NO_F_PATH_IN_STRUCT_FILE +EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 34d1045..93c01b7 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -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 = filp_dentry(iocb->ki_filp)->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 = filp_dentry(file)->d_inode->i_mapping->host; int ret; mlog_entry_void(); diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 7453b70..892001d 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -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_dentry(filp)->d_inode; int lock_level = 0; mlog_entry("dirino=%llu\n", diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index b6992e5..cd8b237 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -26,6 +26,10 @@ ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif +ifdef NO_F_PATH_IN_STRUCT_FILE +EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 7418dc8..0284cdb 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -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_dentry(filp)->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_dentry(filp)->d_inode; mlog(0, "inode %lu, count = %zu, *ppos = %llu\n", inode->i_ino, count, *ppos); diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index a62b14e..1ccf8ea 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -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); + filp_dentry(file)->d_name.len, filp_dentry(file)->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); + filp_dentry(file)->d_name.len, + filp_dentry(file)->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(filp_dentry(file))) { 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 = filp_dentry(file)->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 = filp_dentry(file)->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); + filp_dentry(file)->d_name.len, + filp_dentry(file)->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(filp_dentry(file), 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 = filp_dentry(out)->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); + filp_dentry(out)->d_name.len, + filp_dentry(out)->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(filp_dentry(out), 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 = filp_dentry(in)->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); + filp_dentry(in)->d_name.len, + filp_dentry(in)->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_dentry(filp)->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_dentry(filp)->d_name.len, + filp_dentry(filp)->d_name.name); if (!inode) { ret = -EINVAL; diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c index 87dcece..135dd2f 100644 --- a/fs/ocfs2/ioctl.c +++ b/fs/ocfs2/ioctl.c @@ -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 = filp_dentry(file)->d_inode; int ret; switch (cmd) { diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index a827b0b..3a09454 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -186,7 +186,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 = filp_dentry(vma->vm_file)->d_inode; struct buffer_head *di_bh = NULL; sigset_t blocked, oldset; int ret, ret2; @@ -256,16 +256,16 @@ 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); + filp_dentry(file)->d_name.len, + filp_dentry(file)->d_name.name); - ret = ocfs2_meta_lock_atime(file->f_path.dentry->d_inode, + ret = ocfs2_meta_lock_atime(filp_dentry(file)->d_inode, file->f_vfsmnt, &lock_level); if (ret < 0) { mlog_errno(ret); goto out; } - ocfs2_meta_unlock(file->f_path.dentry->d_inode, lock_level); + ocfs2_meta_unlock(filp_dentry(file)->d_inode, lock_level); out: vma->vm_ops = &ocfs2_file_vm_ops; #ifndef NO_FAULT_IN_VMOPS diff --git a/kapi-compat/include/fpath.h b/kapi-compat/include/fpath.h new file mode 100644 index 0000000..a2f89e2 --- /dev/null +++ b/kapi-compat/include/fpath.h @@ -0,0 +1,10 @@ +#ifndef KAPI_FPATH_H +#define KAPI_FPATH_H + +#ifdef NO_F_PATH_IN_STRUCT_FILE +# define filp_dentry(i) (i)->f_dentry +#else +# define filp_dentry(i) (i)->f_path.dentry +#endif + +#endif -- 1.5.2.5
Hopefully this is the last drop before we create the repos. The big change in this drop is moving the kernel code to from kapi-include headers to compat-file.c Sunil
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 14/30] ocfs2: Handle enum value FS_OCFS2
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index 43cd04c..1d27943 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/inc_nlink.h \ kapi-compat/include/drop_nlink.h \ kapi-compat/include/slab.h \ - kapi-compat/include/fs_rename_does_d_move.h + kapi-compat/include/fs_rename_does_d_move.h \ + kapi-compat/include/sysctl.h PATCH_FILES diff --git a/configure.in b/configure.in index f1d3732..7874829 100644 --- a/configure.in +++ b/configure.in @@ -226,6 +226,11 @@ if test "x$fstype_compat_header" = "xfs_rename_does_d_move.h" ; then fi fi +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 diff --git a/kapi-compat/include/sysctl.h b/kapi-compat/include/sysctl.h new file mode 100644 index 0000000..73ed0a7 --- /dev/null +++ b/kapi-compat/include/sysctl.h @@ -0,0 +1,9 @@ +#ifndef KAPI_SYSCTL_H +#define KAPI_SYSCTL_H + +/* CTL_FS names: */ +enum { + FS_OCFS2=988, /* ocfs2 */ +}; + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 12/30] ocfs2: Handle missing dtors in kmem_cache_create()
Commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac removed the dtor arg from kmem_cache_create(). This patch allows one to build ocfs2 with kernels having/not having this change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Config.make.in b/Config.make.in index 0fdbad0..c5631b6 100644 --- a/Config.make.in +++ b/Config.make.in @@ -62,6 +62,7 @@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ NO_FAULT_IN_VMOPS = @NO_FAULT_IN_VMOPS@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ +KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index d201b85..23af453 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/fpath.h \ kapi-compat/include/umh_wait.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 diff --git a/configure.in b/configure.in index f9b0a70..2ce14ed 100644 --- a/configure.in +++ b/configure.in @@ -204,6 +204,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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 8733e21..456b24b 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -48,6 +48,10 @@ ifdef NO_F_PATH_IN_STRUCT_FILE EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE 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. diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index cd8b237..31f312e 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -30,6 +30,10 @@ ifdef NO_F_PATH_IN_STRUCT_FILE EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE endif +ifdef KMEM_CACHE_CREATE_DTOR +EXTRA_CFLAGS += -DKMEM_CACHE_CREATE_DTOR +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 0284cdb..78704a1 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -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), diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 62e4a7d..a668840 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c @@ -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); diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index a8f90a2..f5c424d 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -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| diff --git a/fs/ocfs2/uptodate.c b/fs/ocfs2/uptodate.c index 4da8851..6248308 100644 --- a/fs/ocfs2/uptodate.c +++ b/fs/ocfs2/uptodate.c @@ -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) diff --git a/kapi-compat/include/slab.h b/kapi-compat/include/slab.h new file mode 100644 index 0000000..239763f --- /dev/null +++ b/kapi-compat/include/slab.h @@ -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 -- 1.5.2.5
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + configure.in | 5 +++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/file.c | 2 ++ 4 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Config.make.in b/Config.make.in index a33fba9..ad1c8e9 100644 --- a/Config.make.in +++ b/Config.make.in @@ -67,6 +67,7 @@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@ NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM = @NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM@ STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@ NO_FALLOCATE = @NO_FALLOCATE@ +NO_SPLICE_HEADER = @NO_SPLICE_HEADER@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index d93a896..19c38d4 100644 --- a/configure.in +++ b/configure.in @@ -264,6 +264,11 @@ OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h, , NO_FALLOCATE=yes, [^.*long (\*fallocate)]) AC_SUBST(NO_FALLOCATE) +NO_SPLICE_HEADER+OCFS2_CHECK_KERNEL([struct splice_desc in splice.h], splice.h, + , NO_SPLICE_HEADER=yes, [^struct splice_desc ]) +AC_SUBST(NO_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 7b40064..f4c9428 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -60,6 +60,10 @@ ifdef NO_FALLOCATE EXTRA_CFLAGS += -DNO_FALLOCATE endif +ifdef NO_SPLICE_HEADER +EXTRA_CFLAGS += -DNO_SPLICE_HEADER +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 45b1c05..ad38a21 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -31,7 +31,9 @@ #include <linux/pagemap.h> #include <linux/uio.h> #include <linux/sched.h> +#ifndef NO_SPLICE_HEADER #include <linux/splice.h> +#endif #include <linux/mount.h> #include <linux/writeback.h> #ifndef NO_FALLOCATE -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 03/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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 2 + Makefile | 3 +- configure.in | 6 +++ fs/ocfs2/Makefile | 4 ++ fs/ocfs2/alloc.c | 11 +++--- fs/ocfs2/cluster/Makefile | 4 ++ fs/ocfs2/cluster/heartbeat.c | 9 ++--- fs/ocfs2/cluster/quorum.c | 4 +- fs/ocfs2/cluster/tcp.c | 66 +++++++++++++++++++------------------- 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 ++++++++++ 18 files changed, 94 insertions(+), 58 deletions(-) create mode 100644 kapi-compat/include/workqueue.h diff --git a/Config.make.in b/Config.make.in index c9e0132..37412ba 100644 --- a/Config.make.in +++ b/Config.make.in @@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ +NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ + OCFS_DEBUG = @OCFS_DEBUG@ ifneq ($(OCFS_DEBUG),) diff --git a/Makefile b/Makefile index 227ab23..4752593 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,8 @@ SUBDIRS = fs vendor LINUX_INCLUDE_FILES -KAPI_COMPAT_FILES +KAPI_COMPAT_FILES = \ + kapi-compat/include/workqueue.h PATCH_FILES diff --git a/configure.in b/configure.in index 1af47fc..46a4bc2 100644 --- a/configure.in +++ b/configure.in @@ -156,6 +156,12 @@ case "$kversion" in ;; esac +NO_DELAYED_WORK_STRUCT+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h, + , NO_DELAYED_WORK_STRUCT=yes, [^struct delayed_work]) +AC_SUBST(NO_DELAYED_WORK_STRUCT) +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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 19a8dfb..1dc6847 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -30,6 +30,10 @@ EXTRA_CFLAGS += -DOCFS2_CDSL EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 4ba7f0b..4791433 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c @@ -4752,12 +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, - osb_truncate_log_wq.work); + struct ocfs2_super *osb = work_to_object(work, struct ocfs2_super, + osb_truncate_log_wq.work); mlog_entry_void(); @@ -4989,8 +4988,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; diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index f09a6c3..16bddd9 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -18,6 +18,10 @@ HEADERS EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + SOURCES += \ heartbeat.c \ masklog.c \ diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index f14b541..65ff7f3 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -156,11 +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, - hr_write_timeout_work.work); + struct o2hb_region *reg = work_to_object(work, struct o2hb_region, + hr_write_timeout_work.work); mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u " "milliseconds\n", reg->hr_dev_name, @@ -1306,7 +1305,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, goto out; } - INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout); + KAPI_INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout, reg); /* * A node is considered live after it has beat LIVE_THRESHOLD diff --git a/fs/ocfs2/cluster/quorum.c b/fs/ocfs2/cluster/quorum.c index bbacf7d..df9b74a 100644 --- a/fs/ocfs2/cluster/quorum.c +++ b/fs/ocfs2/cluster/quorum.c @@ -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) diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 685c180..5fb8400 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -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,11 +600,11 @@ 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, - sc_shutdown_work); + work_to_object(work, struct o2net_sock_container, + sc_shutdown_work); struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); sclog(sc, "shutting down\n"); @@ -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); + work_to_object(work, struct o2net_sock_container, sc_rx_work); int ret; do { @@ -1367,11 +1367,11 @@ 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, - sc_connect_work); + work_to_object(work, struct o2net_sock_container, + sc_connect_work); mlog(ML_MSG, "sc sending handshake with ver %llu id %llx\n", (unsigned long long)O2NET_PROTOCOL_VERSION, @@ -1383,11 +1383,11 @@ 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, - sc_keepalive_work.work); + work_to_object(work, struct o2net_sock_container, + sc_keepalive_work.work); o2net_sendpage(sc, o2net_keep_req, sizeof(*o2net_keep_req)); sc_put(sc); @@ -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); + work_to_object(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); + struct o2net_node *nn = work_to_object(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); + struct o2net_node *nn = work_to_object(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); diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 9308533..b6992e5 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -22,6 +22,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index e90b92f..cddf85a 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h @@ -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; diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 6954565..10b3e60 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c @@ -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; diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index a2c3316..3cf4f49 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c @@ -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); diff --git a/fs/ocfs2/dlm/userdlm.c b/fs/ocfs2/dlm/userdlm.c index 7d2f578..6340da3 100644 --- a/fs/ocfs2/dlm/userdlm.c +++ b/fs/ocfs2/dlm/userdlm.c @@ -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); + work_to_object(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, diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index f9d01e2..aafd0a3 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -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); + work_to_object(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; diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 4b32e09..548d6af 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h @@ -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: diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 0e2a1b4..a8f90a2 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -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 */ diff --git a/kapi-compat/include/workqueue.h b/kapi-compat/include/workqueue.h new file mode 100644 index 0000000..24dfe2d --- /dev/null +++ b/kapi-compat/include/workqueue.h @@ -0,0 +1,17 @@ +#ifndef KAPI_WORKQUEUE_H +#define KAPI_WORKQUEUE_H + +#ifdef NO_DELAYED_WORK_STRUCT +# 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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 20/30] ocfs2: Handle missing iop->fallocate()
Commit 97ac73506c0ba93f30239bb57b4cfc5d73e68a62 in mainline introduces a new iop, fallocate(). This patch allows one to build ocfs2 with kernels having/not having this change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + configure.in | 5 +++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/file.c | 6 ++++++ 4 files changed, 16 insertions(+), 0 deletions(-) diff --git a/Config.make.in b/Config.make.in index 05833bd..a33fba9 100644 --- a/Config.make.in +++ b/Config.make.in @@ -66,6 +66,7 @@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@ NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM = @NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM@ STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@ +NO_FALLOCATE = @NO_FALLOCATE@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index 8dfcad6..d93a896 100644 --- a/configure.in +++ b/configure.in @@ -259,6 +259,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" +NO_FALLOCATE+OCFS2_CHECK_KERNEL([fallocate() in fs.h], fs.h, + , NO_FALLOCATE=yes, [^.*long (\*fallocate)]) +AC_SUBST(NO_FALLOCATE) + # 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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 0eac626..7b40064 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -56,6 +56,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED endif +ifdef NO_FALLOCATE +EXTRA_CFLAGS += -DNO_FALLOCATE +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 1ccf8ea..45b1c05 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -34,7 +34,9 @@ #include <linux/splice.h> #include <linux/mount.h> #include <linux/writeback.h> +#ifndef NO_FALLOCATE #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); } +#ifndef NO_FALLOCATE 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, +#ifndef NO_FALLOCATE .fallocate = ocfs2_fallocate, +#endif }; const struct inode_operations ocfs2_special_file_iops = { -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 29/30] ocfs2: Handle older prototype of bi_end_io_t
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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(-) diff --git a/Config.make.in b/Config.make.in index 6fae3a8..6329e83 100644 --- a/Config.make.in +++ b/Config.make.in @@ -74,6 +74,7 @@ SOP_IS_NOT_CONST = @SOP_IS_NOT_CONST@ IOP_IS_NOT_CONST = @IOP_IS_NOT_CONST@ NO_VECTORIZED_AIO = @NO_VECTORIZED_AIO@ NO_SPLICE_FROM_PIPE = @NO_SPLICE_FROM_PIPE@ +OLD_BIO_END_IO = @OLD_BIO_END_IO@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index f01fea8..5799760 100644 --- a/configure.in +++ b/configure.in @@ -307,6 +307,11 @@ OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h, , NO_SPLICE_FROM_PIPE=yes, [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*]) AC_SUBST(NO_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 diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index 7ef2934..08cf6cb 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -34,6 +34,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 \ diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 65ff7f3..6a91607 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -215,8 +215,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; @@ -227,6 +233,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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 07/30] ocfs2: Handle missing vmops->fault()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + configure.in | 5 ++++ fs/ocfs2/Makefile | 4 +++ fs/ocfs2/mmap.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/Config.make.in b/Config.make.in index 09f02e1..af9d11e 100644 --- a/Config.make.in +++ b/Config.make.in @@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ +NO_FAULT_IN_VMOPS = @NO_FAULT_IN_VMOPS@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index abe848c..a90a3a6 100644 --- a/configure.in +++ b/configure.in @@ -178,6 +178,11 @@ OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h, KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS sync_mapping_range.h" AC_SUBST(NO_SYNC_MAPPING_RANGE) +NO_FAULT_IN_VMOPS+OCFS2_CHECK_KERNEL([fault() in struct vm_operations_struct in mm.h], mm.h, + , NO_FAULT_IN_VMOPS=yes, [^.*int (\*fault)]) +AC_SUBST(NO_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index f27b3a1..5b67f93 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -40,6 +40,10 @@ SOURCES += compat_sync_mapping_range.c EXTRA_CFLAGS += -DNO_SYNC_MAPPING_RANGE endif +ifdef NO_FAULT_IN_VMOPS +EXTRA_CFLAGS += -DNO_FAULT_IN_VMOPS +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 9875615..a827b0b 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -60,6 +60,7 @@ static inline int ocfs2_vm_op_unblock_sigs(sigset_t *oldset) return sigprocmask(SIG_SETMASK, oldset, NULL); } +#ifndef NO_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 = { +#ifndef NO_FAULT_IN_VMOPS .fault = ocfs2_fault, +#else + .nopage = ocfs2_nopage, +#endif .page_mkwrite = ocfs2_page_mkwrite, }; @@ -214,16 +255,22 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma) { int ret = 0, lock_level = 0; - ret = ocfs2_meta_lock_atime(file->f_dentry->d_inode, + 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_path.dentry->d_inode, file->f_vfsmnt, &lock_level); if (ret < 0) { mlog_errno(ret); goto out; } - ocfs2_meta_unlock(file->f_dentry->d_inode, lock_level); + ocfs2_meta_unlock(file->f_path.dentry->d_inode, lock_level); out: vma->vm_ops = &ocfs2_file_vm_ops; +#ifndef NO_FAULT_IN_VMOPS vma->vm_flags |= VM_CAN_NONLINEAR; - return 0; +#endif + mlog_exit(ret); + return ret; } - -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 28/30] ocfs2: Handle missing __splice_from_pipe()
Commit c66ab6fa705e1b2887a6d9246b798bdc526839e2 in mainline introduced __splice_from_pipe(). This patch allows one to build ocfs2 with kernels having/not having this change. TODO: This patch disables splice io for kernels not providing __splice_from_pipe(). We need to enable this later. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + configure.in | 5 +++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/file.c | 4 ++++ 4 files changed, 14 insertions(+), 0 deletions(-) diff --git a/Config.make.in b/Config.make.in index 6a3e418..6fae3a8 100644 --- a/Config.make.in +++ b/Config.make.in @@ -73,6 +73,7 @@ NO_GENERIC_SEGMENT_CHECKS = @NO_GENERIC_SEGMENT_CHECKS@ SOP_IS_NOT_CONST = @SOP_IS_NOT_CONST@ IOP_IS_NOT_CONST = @IOP_IS_NOT_CONST@ NO_VECTORIZED_AIO = @NO_VECTORIZED_AIO@ +NO_SPLICE_FROM_PIPE = @NO_SPLICE_FROM_PIPE@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index ae20ad6..f01fea8 100644 --- a/configure.in +++ b/configure.in @@ -302,6 +302,11 @@ OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], f AC_SUBST(NO_VECTORIZED_AIO) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS aiovec.h" +NO_SPLICE_FROM_PIPE+OCFS2_CHECK_KERNEL([__splice_from_pipe() in splice.h], splice.h, + , NO_SPLICE_FROM_PIPE=yes, [^extern ssize_t __splice_from_pipe(struct pipe_inode_info \*]) +AC_SUBST(NO_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index e6cfda0..277cddf 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -88,6 +88,10 @@ ifdef NO_VECTORIZED_AIO CFLAGS_file.o += -DNO_VECTORIZED_AIO endif +ifdef NO_SPLICE_FROM_PIPE +EXTRA_CFLAGS += -DNO_SPLICE_FROM_PIPE +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 62040aa..ad73b3c 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2173,6 +2173,7 @@ out_sems: return written ? written : ret; } +#ifndef NO_SPLICE_FROM_PIPE static int ocfs2_splice_write_actor(struct pipe_inode_info *pipe, struct pipe_buffer *buf, struct splice_desc *sd) @@ -2321,6 +2322,7 @@ bail: mlog_exit(ret); return ret; } +#endif static ssize_t __ocfs2_file_aio_read(struct kiocb *iocb, const struct iovec *iov, @@ -2435,8 +2437,10 @@ const struct file_operations ocfs2_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = ocfs2_compat_ioctl, #endif +#ifndef NO_SPLICE_FROM_PIPE .splice_read = ocfs2_file_splice_read, .splice_write = ocfs2_file_splice_write, +#endif }; const struct file_operations ocfs2_dops = { -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 23/30] ocfs2: Handles missing export should_remove_suid()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + Makefile | 3 +- configure.in | 6 ++++ fs/ocfs2/Makefile | 6 ++++ fs/ocfs2/compat_should_remove_suid.c | 39 ++++++++++++++++++++++++++++++ kapi-compat/include/should_remove_suid.h | 12 +++++++++ 6 files changed, 66 insertions(+), 1 deletions(-) create mode 100644 fs/ocfs2/compat_should_remove_suid.c create mode 100644 kapi-compat/include/should_remove_suid.h diff --git a/Config.make.in b/Config.make.in index ad1c8e9..6afaef6 100644 --- a/Config.make.in +++ b/Config.make.in @@ -68,6 +68,7 @@ NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM = @NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSY STRUCT_SUBSYSTEM_DEFINED = @STRUCT_SUBSYSTEM_DEFINED@ NO_FALLOCATE = @NO_FALLOCATE@ NO_SPLICE_HEADER = @NO_SPLICE_HEADER@ +NO_SHOULD_REMOVE_SUID = @NO_SHOULD_REMOVE_SUID@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index ea4b979..0c17fec 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/su_mutex.h \ kapi-compat/include/kobject.h \ kapi-compat/include/cap.h \ - kapi-compat/include/relatime.h + kapi-compat/include/relatime.h \ + kapi-compat/include/should_remove_suid.h PATCH_FILES diff --git a/configure.in b/configure.in index 2f2a263..6d20acc 100644 --- a/configure.in +++ b/configure.in @@ -274,6 +274,12 @@ OCFS2_CHECK_KERNEL([MNT_RELATIME in mount.h], mount.h, , relatime_compat_header="relatime.h", [^#define MNT_RELATIME]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $relatime_compat_header" +NO_SHOULD_REMOVE_SUID+OCFS2_CHECK_KERNEL([should_remove_suid() in fs.h], fs.h, + , NO_SHOULD_REMOVE_SUID=yes, [should_remove_suid()]) +AC_SUBST(NO_SHOULD_REMOVE_SUID) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS should_remove_suid.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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index f4c9428..8360fe3 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -64,6 +64,12 @@ ifdef NO_SPLICE_HEADER EXTRA_CFLAGS += -DNO_SPLICE_HEADER endif +COMPAT_SOURCES += compat_should_remove_suid.c +ifdef NO_SHOULD_REMOVE_SUID +SOURCES += compat_should_remove_suid.c +EXTRA_CFLAGS += -DNO_SHOULD_REMOVE_SUID +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/compat_should_remove_suid.c b/fs/ocfs2/compat_should_remove_suid.c new file mode 100644 index 0000000..ae843db --- /dev/null +++ b/fs/ocfs2/compat_should_remove_suid.c @@ -0,0 +1,39 @@ +/* + * compat_should_remove_suid.c + * + * This code has been copied from mainline linux kernel git commit + * e7b34019606ab1dd06196635e931b0c302799228 to allow ocfs2 to build + * against older kernels. For license, refer to mm/filemap.c in mainline + * linux kernel. + * + */ + +#include <linux/fs.h> + +/* + * 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; +} diff --git a/kapi-compat/include/should_remove_suid.h b/kapi-compat/include/should_remove_suid.h new file mode 100644 index 0000000..1d1a9c3 --- /dev/null +++ b/kapi-compat/include/should_remove_suid.h @@ -0,0 +1,12 @@ +#ifndef KAP_SHOULD_REMOVE_SUID_H +#define KAP_SHOULD_REMOVE_SUID_H + +#ifdef NO_SHOULD_REMOVE_SUID + +#include <linux/fs.h> + +int should_remove_suid(struct dentry *dentry); + +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 04/30] ocfs2: Handle macro uninitialized_var
Commit 9490991482a2091a828d997adbc088e24c310a4d in mainline introduced macro uninitialized_var(). This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index 4752593..21ff590 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/configure.in b/configure.in index 46a4bc2..26c4575 100644 --- a/configure.in +++ b/configure.in @@ -162,6 +162,11 @@ OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h, AC_SUBST(NO_DELAYED_WORK_STRUCT) 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 diff --git a/kapi-compat/include/compiler.h b/kapi-compat/include/compiler.h new file mode 100644 index 0000000..c104ed1 --- /dev/null +++ b/kapi-compat/include/compiler.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 27/30] ocfs2: Handle missing vectorized fileops aio_read() and aio_write()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + Makefile | 3 +- configure.in | 6 ++++ fs/ocfs2/Makefile | 4 ++ fs/ocfs2/file.c | 6 ++-- kapi-compat/include/aiovec.h | 68 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 kapi-compat/include/aiovec.h diff --git a/Config.make.in b/Config.make.in index b9b65e6..6a3e418 100644 --- a/Config.make.in +++ b/Config.make.in @@ -72,6 +72,7 @@ NO_SHOULD_REMOVE_SUID = @NO_SHOULD_REMOVE_SUID@ NO_GENERIC_SEGMENT_CHECKS = @NO_GENERIC_SEGMENT_CHECKS@ SOP_IS_NOT_CONST = @SOP_IS_NOT_CONST@ IOP_IS_NOT_CONST = @IOP_IS_NOT_CONST@ +NO_VECTORIZED_AIO = @NO_VECTORIZED_AIO@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 9427ce6..a3a0c9d 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/cap.h \ kapi-compat/include/relatime.h \ kapi-compat/include/should_remove_suid.h \ - kapi-compat/include/generic_segment_checks.h + kapi-compat/include/generic_segment_checks.h \ + kapi-compat/include/aiovec.h PATCH_FILES diff --git a/configure.in b/configure.in index 8503153..ae20ad6 100644 --- a/configure.in +++ b/configure.in @@ -296,6 +296,12 @@ OCFS2_CHECK_KERNEL([i_op declared as const in struct inode in fs.h], fs.h, , IOP_IS_NOT_CONST=yes, [^.*const struct inode_operations.*\*i_op;]) AC_SUBST(IOP_IS_NOT_CONST) +NO_VECTORIZED_AIO+OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], fs.h, + , NO_VECTORIZED_AIO=yes, [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);]) +AC_SUBST(NO_VECTORIZED_AIO) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS aiovec.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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index d25eea0..e6cfda0 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -84,6 +84,10 @@ ifdef IOP_IS_NOT_CONST EXTRA_CFLAGS += -DIOP_IS_NOT_CONST endif +ifdef NO_VECTORIZED_AIO +CFLAGS_file.o += -DNO_VECTORIZED_AIO +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index a19322e..62040aa 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2017,7 +2017,7 @@ out: return total ? total : ret; } -static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, +static ssize_t __ocfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) @@ -2322,7 +2322,7 @@ bail: return ret; } -static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, +static ssize_t __ocfs2_file_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) @@ -2376,7 +2376,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, } ocfs2_meta_unlock(inode, lock_level); - ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos); + ret = kapi_generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos); if (ret == -EINVAL) mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n"); diff --git a/kapi-compat/include/aiovec.h b/kapi-compat/include/aiovec.h new file mode 100644 index 0000000..e6cb3fb --- /dev/null +++ b/kapi-compat/include/aiovec.h @@ -0,0 +1,68 @@ +#ifndef KAPI_AIOVEC_H +#define KAPI_AIOVEC_H + +#ifdef NO_VECTORIZED_AIO + +#include <linux/fs.h> +#include <linux/uio.h> + +static ssize_t kapi_generic_file_aio_read(struct kiocb *iocb, + const struct iovec *iov, + unsigned long nr_segs, + loff_t pos) +{ + BUG_ON(nr_segs != 1); + return generic_file_aio_read(iocb, iov->iov_base, iov->iov_len, pos); +} + +static ssize_t __ocfs2_file_aio_read(struct kiocb *iocb, + const struct iovec *iov, + unsigned long nr_segs, + loff_t pos); + +static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, + char __user *buf, + size_t buflen, + loff_t pos) +{ + struct iovec iov_local = { .iov_base = (void __user *)buf, + .iov_len = buflen }; + const struct iovec *iov = &iov_local; + unsigned long nr_segs = 1; + + return __ocfs2_file_aio_read(iocb, iov, nr_segs, pos); +} + +static ssize_t __ocfs2_file_aio_write(struct kiocb *iocb, + const struct iovec *iov, + unsigned long nr_segs, + loff_t pos); + +static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, + const char __user *buf, + size_t buflen, + loff_t pos) +{ + struct iovec iov_local = { .iov_base = (void __user *)buf, + .iov_len = buflen }; + const struct iovec *iov = &iov_local; + unsigned long nr_segs = 1; + + iocb->ki_left = buflen; + return __ocfs2_file_aio_write(iocb, iov, nr_segs, pos); +} + +#else /* ! NO_VECTORIZED_AIO */ + +#define kapi_generic_file_aio_read(a, b, c, d) \ + generic_file_aio_read(a, b, c, d) + +#define ocfs2_file_aio_read(a, b, c, d) \ + __ocfs2_file_aio_read(a, b, c, d) + +#define ocfs2_file_aio_write(a, b, c, d) \ + __ocfs2_file_aio_write(a, b, c, d) + +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 10/30] ocfs2: Add helper inc_nlink
Commit d8c76e6f45c111c32a4b3e50a2adc9210737b0d8 in mainline introduced helper inc_nlink(). This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index b937c2b..2995450 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/highmem.h \ kapi-compat/include/sync_mapping_range.h \ kapi-compat/include/fpath.h \ - kapi-compat/include/umh_wait.h + kapi-compat/include/umh_wait.h \ + kapi-compat/include/inc_nlink.h PATCH_FILES diff --git a/configure.in b/configure.in index 803ded1..1cdd243 100644 --- a/configure.in +++ b/configure.in @@ -194,6 +194,11 @@ OCFS2_CHECK_KERNEL([enum umh_wait in kmod.h], kmod.h, , kmod_compat_header="umh_wait.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 diff --git a/kapi-compat/include/inc_nlink.h b/kapi-compat/include/inc_nlink.h new file mode 100644 index 0000000..26ddaac --- /dev/null +++ b/kapi-compat/include/inc_nlink.h @@ -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 -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 30/30] ocfs2: Handle missing exportfs.h
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 1 + configure.in | 5 +++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/export.h | 2 ++ 4 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Config.make.in b/Config.make.in index 6329e83..55e509c 100644 --- a/Config.make.in +++ b/Config.make.in @@ -75,6 +75,7 @@ IOP_IS_NOT_CONST = @IOP_IS_NOT_CONST@ NO_VECTORIZED_AIO = @NO_VECTORIZED_AIO@ NO_SPLICE_FROM_PIPE = @NO_SPLICE_FROM_PIPE@ OLD_BIO_END_IO = @OLD_BIO_END_IO@ +NO_EXPORTFS_HEADER = @NO_EXPORTFS_HEADER@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index 5799760..5251bf3 100644 --- a/configure.in +++ b/configure.in @@ -312,6 +312,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) +NO_EXPORTFS_HEADER+OCFS2_CHECK_KERNEL([exportfs.h], exportfs.h, + , NO_EXPORTFS_HEADER=yes, [^struct export_operations {]) +AC_SUBST(NO_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 277cddf..5efb843 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -92,6 +92,10 @@ ifdef NO_SPLICE_FROM_PIPE EXTRA_CFLAGS += -DNO_SPLICE_FROM_PIPE endif +ifdef NO_EXPORTFS_HEADER +EXTRA_CFLAGS += -DNO_EXPORTFS_HEADER +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/export.h b/fs/ocfs2/export.h index e08bed9..591b185 100644 --- a/fs/ocfs2/export.h +++ b/fs/ocfs2/export.h @@ -26,7 +26,9 @@ #ifndef OCFS2_EXPORT_H #define OCFS2_EXPORT_H +#ifndef NO_EXPORTFS_HEADER #include <linux/exportfs.h> +#endif extern struct export_operations ocfs2_export_ops; -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 06/30] ocfs2: Include do_sync_mapping_range() from mainline
Commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 introduced export symbol do_sync_mapping_range(). This patch allows one to build ocfs2 with kernels having/not having that change. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- Config.make.in | 2 + Makefile | 3 +- configure.in | 6 + fs/ocfs2/Makefile | 6 + fs/ocfs2/compat_sync_mapping_range.c | 157 ++++++++++++++++++++++++++++++ kapi-compat/include/sync_mapping_range.h | 18 ++++ 6 files changed, 191 insertions(+), 1 deletions(-) create mode 100644 fs/ocfs2/compat_sync_mapping_range.c create mode 100644 kapi-compat/include/sync_mapping_range.h diff --git a/Config.make.in b/Config.make.in index 37412ba..09f02e1 100644 --- a/Config.make.in +++ b/Config.make.in @@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ +NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ + OCFS_DEBUG = @OCFS_DEBUG@ ifneq ($(OCFS_DEBUG),) diff --git a/Makefile b/Makefile index b7b86db..3ddb1aa 100644 --- a/Makefile +++ b/Makefile @@ -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/sync_mapping_range.h PATCH_FILES diff --git a/configure.in b/configure.in index 3d5ee8e..abe848c 100644 --- a/configure.in +++ b/configure.in @@ -172,6 +172,12 @@ 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" +NO_SYNC_MAPPING_RANGE+OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h, + , NO_SYNC_MAPPING_RANGE=yes, [do_sync_mapping_range(]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS sync_mapping_range.h" +AC_SUBST(NO_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 diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 1dc6847..f27b3a1 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -34,6 +34,12 @@ ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif +COMPAT_SOURCES += compat_sync_mapping_range.c +ifdef NO_SYNC_MAPPING_RANGE +SOURCES += compat_sync_mapping_range.c +EXTRA_CFLAGS += -DNO_SYNC_MAPPING_RANGE +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/compat_sync_mapping_range.c b/fs/ocfs2/compat_sync_mapping_range.c new file mode 100644 index 0000000..839c6a7 --- /dev/null +++ b/fs/ocfs2/compat_sync_mapping_range.c @@ -0,0 +1,157 @@ +/* + * compat_sync_mapping_range.c + * + * This code has been copied from mainline linux kernel git commit + * e7b34019606ab1dd06196635e931b0c302799228 to allow ocfs2 to build + * against older kernels. For license, refer to fs/sync.c in mainline + * linux kernel. + * + */ + +#include <linux/fs.h> +#include <linux/types.h> +#include <linux/slab.h> +#include <linux/highmem.h> +#include <linux/swap.h> +#include <linux/writeback.h> +#include <linux/mpage.h> +#include <linux/pagemap.h> +#include <linux/pagevec.h> + +/** + * wait_on_page_writeback_range - wait for writeback to complete + * @mapping: target address_space + * @start: beginning page index + * @end: ending page index + * + * Wait for writeback to complete against pages indexed by start->end + * inclusive + */ +int wait_on_page_writeback_range(struct address_space *mapping, + pgoff_t start, pgoff_t end) +{ + struct pagevec pvec; + int nr_pages; + int ret = 0; + pgoff_t index; + + if (end < start) + return 0; + + pagevec_init(&pvec, 0); + index = start; + while ((index <= end) && + (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, + PAGECACHE_TAG_WRITEBACK, + min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1)) != 0) { + unsigned i; + + for (i = 0; i < nr_pages; i++) { + struct page *page = pvec.pages[i]; + + /* until radix tree lookup accepts end_index */ + if (page->index > end) + continue; + + wait_on_page_writeback(page); + if (PageError(page)) + ret = -EIO; + } + pagevec_release(&pvec); + cond_resched(); + } + + /* Check for outstanding write errors */ + if (test_and_clear_bit(AS_ENOSPC, &mapping->flags)) + ret = -ENOSPC; + if (test_and_clear_bit(AS_EIO, &mapping->flags)) + ret = -EIO; + + return ret; +} + +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 + */ +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; +} diff --git a/kapi-compat/include/sync_mapping_range.h b/kapi-compat/include/sync_mapping_range.h new file mode 100644 index 0000000..1ee6f42 --- /dev/null +++ b/kapi-compat/include/sync_mapping_range.h @@ -0,0 +1,18 @@ +#ifndef KAPI_SYNC_MAPPING_RANGE_H +#define KAPI_SYNC_MAPPING_RANGE_H + +#ifdef NO_SYNC_MAPPING_RANGE + +#include <linux/fs.h> +#include <linux/types.h> +#include <linux/slab.h> +#include <linux/highmem.h> +#include <linux/swap.h> +#include <linux/writeback.h> +#include <linux/pagemap.h> + +int do_sync_mapping_range(struct address_space *mapping, loff_t offset, + loff_t endbyte, unsigned int flags); +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 17/30] ocfs2: Handle su_mutex in struct configfs_subsystem
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Config.make.in b/Config.make.in index 9e2b466..3dd84e2 100644 --- a/Config.make.in +++ b/Config.make.in @@ -64,6 +64,7 @@ NO_FAULT_IN_VMOPS = @NO_FAULT_IN_VMOPS@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ KMEM_CACHE_CREATE_DTOR = @KMEM_CACHE_CREATE_DTOR@ REGISTER_SYSCTL_TWO_ARGS = @REGISTER_SYSCTL_TWO_ARGS@ +NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM = @NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 4256eb7..1ecedd2 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/fs_rename_does_d_move.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 diff --git a/configure.in b/configure.in index 795437c..f04af3d 100644 --- a/configure.in +++ b/configure.in @@ -242,6 +242,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" +NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM+OCFS2_CHECK_KERNEL([su_mutex in struct configfs_subsystem in configfs.h], configfs.h, + , NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM=yes, [su_mutex]) +AC_SUBST(NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM) +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 diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index 28fe533..4c3f6e5 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -26,6 +26,10 @@ ifdef REGISTER_SYSCTL_TWO_ARGS EXTRA_CFLAGS += -DREGISTER_SYSCTL_TWO_ARGS endif +ifdef NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM +EXTRA_CFLAGS += -DNO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM +endif + SOURCES += \ heartbeat.c \ masklog.c \ diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c index 9fff881..cb06ef4 100644 --- a/fs/ocfs2/cluster/nodemanager.c +++ b/fs/ocfs2/cluster/nodemanager.c @@ -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); + init_su_mutex(&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); diff --git a/kapi-compat/include/su_mutex.h b/kapi-compat/include/su_mutex.h new file mode 100644 index 0000000..12ebc2d --- /dev/null +++ b/kapi-compat/include/su_mutex.h @@ -0,0 +1,13 @@ +#ifndef KAPI_SUMUTEX_H +#define KAPI_SUMUTEX_H + +#ifdef NO_SU_MUTEX_IN_STRUCT_CONFIGFS_SUBSYSTEM +# include "asm/semaphore.h" +# define init_su_mutex init_MUTEX +# define su_mutex su_sem +#else +# define init_su_mutex mutex_init +# define su_mutex su_mutex +#endif + +#endif -- 1.5.2.5
Sunil Mushran
2008-Jan-09 18:00 UTC
[Ocfs2-devel] [PATCH 19/30] ocfs2: Handle missing macro is_owner_or_cap()
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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com> --- 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 diff --git a/Makefile b/Makefile index b035e29..5539d48 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,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 diff --git a/configure.in b/configure.in index 0f165c9..8dfcad6 100644 --- a/configure.in +++ b/configure.in @@ -254,6 +254,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 diff --git a/kapi-compat/include/cap.h b/kapi-compat/include/cap.h new file mode 100644 index 0000000..a10a12f --- /dev/null +++ b/kapi-compat/include/cap.h @@ -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 -- 1.5.2.5
On Wed, Jan 09, 2008 at 05:59:02PM -0800, Sunil Mushran wrote:> Hopefully this is the last drop before we create the repos. > > The big change in this drop is moving the kernel code to from kapi-include > headers to compat-file.cThis all looks fine to me. --Mark -- Mark Fasheh Principal Software Developer, Oracle mark.fasheh@oracle.com
On Wed, Jan 09, 2008 at 05:59:02PM -0800, Sunil Mushran wrote:> Hopefully this is the last drop before we create the repos. > > The big change in this drop is moving the kernel code to from kapi-include > headers to compat-file.cThese look good to me. I couldn't see where COMPAT_SOURCES got added to DIST_FILES, but I see it in the git tree. I assume you just didn't send the Makefile patch? Joel -- Life's Little Instruction Book #451 "Don't be afraid to say, 'I'm sorry.'" Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127