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> --- 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 7d0ca7d..a912f40 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 a5268e1..2a7dc9c 100644 --- a/configure.in +++ b/configure.in @@ -253,6 +253,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 3b13b0c..58be004 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -53,6 +53,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@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 cb395cc..b3998b4 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 2a7dc9c..9cef1f8 100644 --- a/configure.in +++ b/configure.in @@ -258,6 +258,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 34c4825..7d0ca7d 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 c1525a6..a5268e1 100644 --- a/configure.in +++ b/configure.in @@ -248,6 +248,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 2511fba..3b13b0c 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -49,6 +49,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 98577c6..ed67a49 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 ba2153a..2c3ea77 100644 --- a/configure.in +++ b/configure.in @@ -300,6 +300,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 529de3d..5045b3e 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -81,6 +81,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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..1dc4d44 100644 --- a/Config.make.in +++ b/Config.make.in @@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ +NO_DELAYED_WORK = @NO_DELAYED_WORK@ + 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..46f0057 100644 --- a/configure.in +++ b/configure.in @@ -156,6 +156,12 @@ case "$kversion" in ;; esac +NO_DELAYED_WORK+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h, + , NO_DELAYED_WORK=yes, [^struct delayed_work]) +AC_SUBST(NO_DELAYED_WORK) +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 dce2a62..8bc2dff 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -25,6 +25,10 @@ EXTRA_CFLAGS += -DOCFS2_CDSL EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK +EXTRA_CFLAGS += -DNO_DELAYED_WORK +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 c9c2e9b..c40eae0 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -13,6 +13,10 @@ endif EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK +EXTRA_CFLAGS += -DNO_DELAYED_WORK +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 7e1031e..aeae5fd 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -16,6 +16,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK +EXTRA_CFLAGS += -DNO_DELAYED_WORK +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..277fca6 --- /dev/null +++ b/kapi-compat/include/workqueue.h @@ -0,0 +1,17 @@ +#ifndef KAPI_WORKQUEUE_H +#define KAPI_WORKQUEUE_H + +#ifdef NO_DELAYED_WORK +# define delayed_work work_struct +typedef void kapi_work_struct_t; +# define work_to_object(a, b, c) (a) +# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b, c) +# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_WORK(a, b, c) +#else +typedef struct work_struct kapi_work_struct_t; +# define work_to_object(a, b, c) container_of(a, b, c) +# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b) +# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_DELAYED_WORK(a, b) +#endif + +#endif -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Config.make.in | 1 + Makefile | 3 +- configure.in | 6 +++++ fs/ocfs2/Makefile | 4 +++ kapi-compat/include/should_remove_suid.h | 37 ++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/should_remove_suid.h diff --git a/Config.make.in b/Config.make.in index a912f40..53792d0 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 b3998b4..5daa098 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 9cef1f8..c2356da 100644 --- a/configure.in +++ b/configure.in @@ -263,6 +263,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 58be004..cecd610 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -57,6 +57,10 @@ ifdef NO_SPLICE_HEADER EXTRA_CFLAGS += -DNO_SPLICE_HEADER endif +ifdef NO_SHOULD_REMOVE_SUID +CFLAGS_file.o += -DNO_SHOULD_REMOVE_SUID +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/kapi-compat/include/should_remove_suid.h b/kapi-compat/include/should_remove_suid.h new file mode 100644 index 0000000..4c9e598 --- /dev/null +++ b/kapi-compat/include/should_remove_suid.h @@ -0,0 +1,37 @@ +#ifndef KAP_SHOULD_REMOVE_SUID_H +#define KAP_SHOULD_REMOVE_SUID_H + +#ifdef NO_SHOULD_REMOVE_SUID + +#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; +} +#endif + +#endif -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 67ee363..4208ece 100644 --- a/Config.make.in +++ b/Config.make.in @@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK = @NO_DELAYED_WORK@ 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 72698ae..1aced84 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 737c12a..cbf3118 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -33,6 +33,10 @@ ifdef NO_SYNC_MAPPING_RANGE CFLAGS_alloc.o += -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.3.4
Sunil Mushran
2007-Dec-31 14:25 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 | 5 +++++ kapi-compat/include/fstype.h | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/fstype.h diff --git a/Makefile b/Makefile index 7a472fb..7d6788e 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/kmod.h \ kapi-compat/include/inc_nlink.h \ kapi-compat/include/drop_nlink.h \ - kapi-compat/include/slab.h + kapi-compat/include/slab.h \ + kapi-compat/include/fstype.h PATCH_FILES diff --git a/configure.in b/configure.in index 0e1e33e..abc835b 100644 --- a/configure.in +++ b/configure.in @@ -210,6 +210,11 @@ OCFS2_CHECK_KERNEL([kmem_cache_create() with dtor arg in slab.h], slab.h, AC_SUBST(KMEM_CACHE_CREATE_DTOR) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS slab.h" +fstype_compat_header="" +OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h, + , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header" + # using -include has two advantages: # the source doesn't need to know to include compat headers # the compat header file names don't go through the search path diff --git a/kapi-compat/include/fstype.h b/kapi-compat/include/fstype.h new file mode 100644 index 0000000..895ea86 --- /dev/null +++ b/kapi-compat/include/fstype.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.3.4
Sunil Mushran
2007-Dec-31 14:25 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. Note: This patch disables splice io for kernels not providing __splice_from_pipe(). We will later add a patch to enable splice io with such kernels too. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@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 c6deb57..114cf90 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 248b167..d1e6557 100644 --- a/configure.in +++ b/configure.in @@ -290,6 +290,11 @@ OCFS2_CHECK_KERNEL([aio_read() in struct file_operations using iovec in fs.h], f , NO_VECTORIZED_AIO=yes, [ssize_t (\*aio_read) (struct kiocb \*, const struct iovec \*, unsigned long, loff_t);]) AC_SUBST(NO_VECTORIZED_AIO) +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 e85fcea..529de3d 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -77,6 +77,10 @@ ifdef NO_VECTORIZED_AIO EXTRA_CFLAGS += -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 a7b965a..55226a5 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2189,6 +2189,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) @@ -2337,6 +2338,7 @@ bail: mlog_exit(ret); return ret; } +#endif #ifdef NO_VECTORIZED_AIO static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, @@ -2461,8 +2463,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 8479f37..4b2d1c5 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 cba4609..9caf68d 100644 --- a/configure.in +++ b/configure.in @@ -280,6 +280,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 5a8a838..a894c45 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -69,6 +69,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 5108301..30a8d43 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -36,6 +36,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 46f0057..70c4041 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) 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Config.make.in | 1 + configure.in | 5 +++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/file.c | 34 ++++++++++++++++++++++++++++++---- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Config.make.in b/Config.make.in index 4b2d1c5..c6deb57 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/configure.in b/configure.in index 9caf68d..248b167 100644 --- a/configure.in +++ b/configure.in @@ -285,6 +285,11 @@ 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) + # 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 a894c45..e85fcea 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -73,6 +73,10 @@ ifdef IOP_IS_NOT_CONST EXTRA_CFLAGS += -DIOP_IS_NOT_CONST endif +ifdef NO_VECTORIZED_AIO +EXTRA_CFLAGS += -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..a7b965a 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2017,10 +2017,19 @@ out: return total ? total : ret; } +#ifdef NO_VECTORIZED_AIO +#define iocb_ki_left buflen +static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, + const char __user *buf, + size_t buflen, + loff_t pos) +#else +#define iocb_ki_left iocb->ki_left static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) +#endif { int ret, direct_io, appending, rw_level, have_alloc_sem = 0; int can_do_direct, sync = 0; @@ -2030,13 +2039,20 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, loff_t *ppos = &iocb->ki_pos; struct file *file = iocb->ki_filp; struct inode *inode = filp_dentry(file)->d_inode; +#ifdef NO_VECTORIZED_AIO + struct iovec iov_local = { .iov_base = (void __user *)buf, + .iov_len = buflen }; + const struct iovec *iov = &iov_local; + unsigned long nr_segs = 1; +#endif + mlog_entry("(0x%p, %u, '%.*s')\n", file, (unsigned int)nr_segs, filp_dentry(file)->d_name.len, filp_dentry(file)->d_name.name); - if (iocb->ki_left == 0) + if (iocb_ki_left == 0) return 0; ret = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ); @@ -2069,7 +2085,7 @@ relock: can_do_direct = direct_io; ret = ocfs2_prepare_inode_for_write(filp_dentry(file), ppos, - iocb->ki_left, appending, + iocb_ki_left, appending, &can_do_direct); if (ret < 0) { mlog_errno(ret); @@ -2322,17 +2338,23 @@ bail: return ret; } +#ifdef NO_VECTORIZED_AIO +static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, + char __user *buf, + size_t buflen, + loff_t pos) +#else static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) +#endif { int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0; struct file *filp = iocb->ki_filp; struct inode *inode = filp_dentry(filp)->d_inode; - mlog_entry("(0x%p, %u, '%.*s')\n", filp, - (unsigned int)nr_segs, + mlog_entry("(0x%p, '%.*s')\n", filp, filp_dentry(filp)->d_name.len, filp_dentry(filp)->d_name.name); @@ -2376,7 +2398,11 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, } ocfs2_meta_unlock(inode, lock_level); +#ifdef NO_VECTORIZED_AIO + ret = generic_file_aio_read(iocb, buf, buflen, iocb->ki_pos); +#else ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos); +#endif if (ret == -EINVAL) mlog(ML_ERROR, "generic_file_aio_read returned -EINVAL\n"); -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 2b2a041..b12623a 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 685f1d1..f603540 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/fstype.h \ kapi-compat/include/sysctl.h \ kapi-compat/include/configfs.h \ - kapi-compat/include/register_sysctl.h + kapi-compat/include/register_sysctl.h \ + kapi-compat/include/su_mutex.h PATCH_FILES diff --git a/configure.in b/configure.in index 590f338..23fe796 100644 --- a/configure.in +++ b/configure.in @@ -231,6 +231,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 68b434b..671104a 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -21,6 +21,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 34db742..d289a16 100644 --- a/Config.make.in +++ b/Config.make.in @@ -62,6 +62,7 @@ NO_DELAYED_WORK = @NO_DELAYED_WORK@ 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 a7277f3..7a472fb 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/fpath.h \ kapi-compat/include/kmod.h \ kapi-compat/include/inc_nlink.h \ - kapi-compat/include/drop_nlink.h + kapi-compat/include/drop_nlink.h \ + kapi-compat/include/slab.h PATCH_FILES diff --git a/configure.in b/configure.in index 969a558..0e1e33e 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 34dfbc2..1924d5c 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -41,6 +41,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 7e7abda..f8a5376 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -24,6 +24,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/kmod.h | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/kmod.h diff --git a/Makefile b/Makefile index c1ebc15..a12754c 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/kmod.h PATCH_FILES diff --git a/configure.in b/configure.in index 62588ac..584b564 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="kmod.h", [umh_wait]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header" + # using -include has two advantages: # the source doesn't need to know to include compat headers # the compat header file names don't go through the search path diff --git a/kapi-compat/include/kmod.h b/kapi-compat/include/kmod.h new file mode 100644 index 0000000..42a082b --- /dev/null +++ b/kapi-compat/include/kmod.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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 114cf90..98577c6 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 d1e6557..ba2153a 100644 --- a/configure.in +++ b/configure.in @@ -295,6 +295,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 512bfa1..0a5e287 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -29,6 +29,10 @@ ifdef STRUCT_SUBSYSTEM_DEFINED EXTRA_CFLAGS += -DSTRUCT_SUBSYSTEM_DEFINED endif +ifdef OLD_BIO_END_IO +EXTRA_CFLAGS += -DOLD_BIO_END_IO +endif + SOURCES = \ heartbeat.c \ masklog.c \ 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 a12754c..8900c89 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/kmod.h + kapi-compat/include/kmod.h \ + kapi-compat/include/inc_nlink.h PATCH_FILES diff --git a/configure.in b/configure.in index 584b564..8c94d23 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="kmod.h", [umh_wait]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $kmod_compat_header" +inc_nlink_compat_header="" +OCFS2_CHECK_KERNEL([inc_nlink() in fs.h], fs.h, + , inc_nlink_compat_header="inc_nlink.h", [^static inline void inc_nlink(]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $inc_nlink_compat_header" + # using -include has two advantages: # the source doesn't need to know to include compat headers # the compat header file names don't go through the search path 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 d289a16..2b2a041 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 cbb99be..685f1d1 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/slab.h \ kapi-compat/include/fstype.h \ kapi-compat/include/sysctl.h \ - kapi-compat/include/configfs.h + kapi-compat/include/configfs.h \ + kapi-compat/include/register_sysctl.h PATCH_FILES diff --git a/configure.in b/configure.in index eb8fe18..590f338 100644 --- a/configure.in +++ b/configure.in @@ -225,6 +225,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 c40eae0..68b434b 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -17,6 +17,10 @@ ifdef NO_DELAYED_WORK EXTRA_CFLAGS += -DNO_DELAYED_WORK 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 70c4041..0108f99 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Config.make.in | 2 + Makefile | 3 +- configure.in | 6 ++ fs/ocfs2/Makefile | 4 + fs/ocfs2/alloc.c | 2 + kapi-compat/include/sync_mapping_range.h | 103 ++++++++++++++++++++++++++++++ 6 files changed, 119 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/sync_mapping_range.h diff --git a/Config.make.in b/Config.make.in index 1dc4d44..67ee363 100644 --- a/Config.make.in +++ b/Config.make.in @@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK = @NO_DELAYED_WORK@ +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 0108f99..72698ae 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 8bc2dff..737c12a 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -29,6 +29,10 @@ ifdef NO_DELAYED_WORK EXTRA_CFLAGS += -DNO_DELAYED_WORK endif +ifdef NO_SYNC_MAPPING_RANGE +CFLAGS_alloc.o += -DNO_SYNC_MAPPING_RANGE +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 4791433..fc7ee22 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c @@ -23,11 +23,13 @@ * Boston, MA 021110-1307, USA. */ +#ifndef NO_SYNC_MAPPING_RANGE #include <linux/fs.h> #include <linux/types.h> #include <linux/slab.h> #include <linux/highmem.h> #include <linux/swap.h> +#endif #define MLOG_MASK_PREFIX ML_DISK_ALLOC #include <cluster/masklog.h> diff --git a/kapi-compat/include/sync_mapping_range.h b/kapi-compat/include/sync_mapping_range.h new file mode 100644 index 0000000..d6e1b30 --- /dev/null +++ b/kapi-compat/include/sync_mapping_range.h @@ -0,0 +1,103 @@ +#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/mpage.h> +#include <linux/pagemap.h> + + +int do_writepages(struct address_space *mapping, struct writeback_control *wbc) +{ + int ret; + + if (wbc->nr_to_write <= 0) + return 0; + wbc->for_writepages = 1; + if (mapping->a_ops->writepages) + ret = mapping->a_ops->writepages(mapping, wbc); + else + ret = generic_writepages(mapping, wbc); + wbc->for_writepages = 0; + return ret; +} + +/** + * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range + * @mapping: address space structure to write + * @start: offset in bytes where the range starts + * @end: offset in bytes where the range ends (inclusive) + * @sync_mode: enable synchronous operation + * + * Start writeback against all of a mapping's dirty pages that lie + * within the byte offsets <start, end> inclusive. + * + * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as + * opposed to a regular memory cleansing writeback. The difference between + * these two operations is that if a dirty page/buffer is encountered, it must + * be waited upon, and not just skipped over. + */ +int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, + loff_t end, int sync_mode) +{ + int ret; + struct writeback_control wbc = { + .sync_mode = sync_mode, + .nr_to_write = mapping->nrpages * 2, + .range_start = start, + .range_end = end, + }; + + if (!mapping_cap_writeback_dirty(mapping)) + return 0; + + ret = do_writepages(mapping, &wbc); + return ret; +} + +/* + * `endbyte' is inclusive + */ +static int do_sync_mapping_range(struct address_space *mapping, loff_t offset, + loff_t endbyte, unsigned int flags) +{ + int ret; + + if (!mapping) { + ret = -EINVAL; + goto out; + } + + ret = 0; + if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) { + ret = wait_on_page_writeback_range(mapping, + offset >> PAGE_CACHE_SHIFT, + endbyte >> PAGE_CACHE_SHIFT); + if (ret < 0) + goto out; + } + + if (flags & SYNC_FILE_RANGE_WRITE) { + ret = __filemap_fdatawrite_range(mapping, offset, endbyte, + WB_SYNC_NONE); + if (ret < 0) + goto out; + } + + if (flags & SYNC_FILE_RANGE_WAIT_AFTER) { + ret = wait_on_page_writeback_range(mapping, + offset >> PAGE_CACHE_SHIFT, + endbyte >> PAGE_CACHE_SHIFT); + } +out: + return ret; +} +#endif + +#endif -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 4208ece..34db742 100644 --- a/Config.make.in +++ b/Config.make.in @@ -61,6 +61,7 @@ NO_DELAYED_WORK = @NO_DELAYED_WORK@ 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 1aced84..62588ac 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 cbf3118..34dfbc2 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -37,6 +37,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 aeae5fd..7e7abda 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -20,6 +20,10 @@ ifdef NO_DELAYED_WORK EXTRA_CFLAGS += -DNO_DELAYED_WORK 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 7d6788e..8823752 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/fstype.h + kapi-compat/include/fstype.h \ + kapi-compat/include/sysctl.h PATCH_FILES diff --git a/configure.in b/configure.in index abc835b..8f6eb37 100644 --- a/configure.in +++ b/configure.in @@ -215,6 +215,11 @@ OCFS2_CHECK_KERNEL([flag FS_RENAME_DOES_D_MOVE in fs.h], fs.h, , fstype_compat_header="fstype.h", [FS_RENAME_DOES_D_MOVE]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $fstype_compat_header" +sysctl_compat_header="" +OCFS2_CHECK_KERNEL([enum FS_OCFS2 in sysctl.h], sysctl.h, + , sysctl_compat_header="sysctl.h", [FS_OCFS2]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $sysctl_compat_header" + # using -include has two advantages: # the source doesn't need to know to include compat headers # the compat header file names don't go through the search path 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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Config.make.in | 1 + Makefile | 3 ++- configure.in | 6 ++++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/cluster/Makefile | 4 ++++ fs/ocfs2/cluster/masklog.c | 2 +- fs/ocfs2/cluster/masklog.h | 2 +- fs/ocfs2/cluster/sys.c | 6 +++--- fs/ocfs2/dlm/Makefile | 4 ++++ kapi-compat/include/kobject.h | 14 ++++++++++++++ 10 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 kapi-compat/include/kobject.h diff --git a/Config.make.in b/Config.make.in index b12623a..34c4825 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 f603540..1807eac 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 23fe796..3ea990f 100644 --- a/configure.in +++ b/configure.in @@ -237,6 +237,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 1924d5c..2511fba 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -45,6 +45,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 671104a..512bfa1 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -25,6 +25,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..a1449df 100644 --- a/fs/ocfs2/cluster/masklog.c +++ b/fs/ocfs2/cluster/masklog.c @@ -146,7 +146,7 @@ static struct kset mlog_kset = { .kobj = {.name = "logmask", .ktype = &mlog_ktype}, }; -int mlog_sys_init(struct kset *o2cb_subsys) +int mlog_sys_init(struct kapi_kset *o2cb_subsys) { int i = 0; diff --git a/fs/ocfs2/cluster/masklog.h b/fs/ocfs2/cluster/masklog.h index 75cd877..2b78a1b 100644 --- a/fs/ocfs2/cluster/masklog.h +++ b/fs/ocfs2/cluster/masklog.h @@ -278,7 +278,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; #include <linux/kobject.h> #include <linux/sysfs.h> -int mlog_sys_init(struct kset *o2cb_subsys); +int mlog_sys_init(struct kapi_kset *o2cb_subsys); void mlog_sys_shutdown(void); #endif /* O2CLUSTER_MASKLOG_H */ diff --git a/fs/ocfs2/cluster/sys.c b/fs/ocfs2/cluster/sys.c index 64f6f37..c22c158 100644 --- a/fs/ocfs2/cluster/sys.c +++ b/fs/ocfs2/cluster/sys.c @@ -78,7 +78,7 @@ static ssize_t o2cb_show(struct kobject * kobj, struct attribute * attr, char * buffer) { struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr); - struct kset *sbs = to_kset(kobj); + struct kapi_kset *sbs = to_kapi_kset(kobj); BUG_ON(sbs != &o2cb_subsys); @@ -92,7 +92,7 @@ o2cb_store(struct kobject * kobj, struct attribute * attr, const char * buffer, size_t count) { struct o2cb_attribute *o2cb_attr = to_o2cb_attr(attr); - struct kset *sbs = to_kset(kobj); + struct kapi_kset *sbs = to_kapi_kset(kobj); BUG_ON(sbs != &o2cb_subsys); @@ -111,7 +111,7 @@ int o2cb_sys_init(void) { int ret; - o2cb_subsys.kobj.ktype = &o2cb_subsys_type; + o2cb_subsys.kapi_kobj.ktype = &o2cb_subsys_type; ret = subsystem_register(&o2cb_subsys); if (ret) return ret; diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index f8a5376..76d794b 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -28,6 +28,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..4061901 --- /dev/null +++ b/kapi-compat/include/kobject.h @@ -0,0 +1,14 @@ +#ifndef KAPI_KOBJECT_H +#define KAPI_KOBJECT_H + +#ifdef STRUCT_SUBSYSTEM_DEFINED +# define kapi_kset subsystem +# define to_kapi_kset(k) container_of(to_kset(k), struct subsystem, kset) +# define kapi_kobj kset.kobj +#else +# define kapi_kset kset +# define to_kapi_kset(k) to_kset(k) +# define kapi_kobj kobj +#endif + +#endif -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 8823752..cbb99be 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/fstype.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 8f6eb37..eb8fe18 100644 --- a/configure.in +++ b/configure.in @@ -220,6 +220,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.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- Config.make.in | 1 + Makefile | 3 +- configure.in | 6 +++ fs/ocfs2/Makefile | 4 ++ kapi-compat/include/generic_segment_checks.h | 49 ++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/generic_segment_checks.h diff --git a/Config.make.in b/Config.make.in index 53792d0..a44bbe3 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 5daa098..a4febde 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 c2356da..9f0131f 100644 --- a/configure.in +++ b/configure.in @@ -269,6 +269,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 cecd610..98a7ada 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -61,6 +61,10 @@ ifdef NO_SHOULD_REMOVE_SUID CFLAGS_file.o += -DNO_SHOULD_REMOVE_SUID endif +ifdef NO_GENERIC_SEGMENT_CHECKS +CFLAGS_file.o += -DNO_GENERIC_SEGMENT_CHECKS +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/kapi-compat/include/generic_segment_checks.h b/kapi-compat/include/generic_segment_checks.h new file mode 100644 index 0000000..84aa888 --- /dev/null +++ b/kapi-compat/include/generic_segment_checks.h @@ -0,0 +1,49 @@ +#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> + +/* + * Performs necessary checks before doing a write + * @iov: io vector request + * @nr_segs: number of segments in the iovec + * @count: number of bytes to write + * @access_flags: type of access: %VERIFY_READ or %VERIFY_WRITE + * + * Adjust number of segments and amount of bytes to write (nr_segs should be + * properly initialized first). Returns appropriate error code that caller + * should return or zero in case that write should be allowed. + */ +int generic_segment_checks(const struct iovec *iov, + unsigned long *nr_segs, size_t *count, int access_flags) +{ + unsigned long seg; + size_t cnt = 0; + for (seg = 0; seg < *nr_segs; seg++) { + const struct iovec *iv = &iov[seg]; + + /* + * If any segment has a negative length, or the cumulative + * length ever wraps negative then return -EINVAL. + */ + cnt += iv->iov_len; + if (unlikely((ssize_t)(cnt|iv->iov_len) < 0)) + return -EINVAL; + if (access_ok(access_flags, iv->iov_base, iv->iov_len)) + continue; + if (seg == 0) + return -EFAULT; + *nr_segs = seg; + cnt -= iv->iov_len; /* This segment is no good */ + break; + } + *count = cnt; + return 0; +} +#endif + +#endif -- 1.5.3.4
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 8900c89..a7277f3 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/kmod.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 8c94d23..969a558 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.3.4
Sunil Mushran
2007-Dec-31 14:25 UTC
[Ocfs2-devel] ocfs2-1.4: A new beginning - 2nd attempt
These patches have incorporated almost all of Joel's comments. I still need to discuss 0018-ocfs2-Handle-the-removal-of-struct-subsystem.patch with him. Joel, I added your sign-offs even in patches that required changes (that is after making the change.) I did so for easier tracking. Let me know if you have any other comments. Thanks Sunil ==================================================================These patches allow ocfs2 pulled from mainline commit e7b34019606ab1dd06196635e931b0c302799228 to build on 2.6.18. I am not emailing the first set of patches that essentially copy the source from the mainline and copy the build infrastructure files from ocfs2-1.2. The rationale behind this series of patches is not only to allow it to build with el5 (2.6.18) but to do so with minimal code changes. The latter will help us later when we have to backport new patches from mainline. Please review the patches concentrating on the tricks played to allow one to build the same tree against both 2.6.18 and mainline. =====================================================================
Sunil Mushran
2007-Dec-31 14:25 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> --- 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 1807eac..cb395cc 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 3ea990f..c1525a6 100644 --- a/configure.in +++ b/configure.in @@ -243,6 +243,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.3.4
Sunil Mushran
2007-Dec-31 14:26 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> --- 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 a44bbe3..8479f37 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 9f0131f..cba4609 100644 --- a/configure.in +++ b/configure.in @@ -275,6 +275,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 98a7ada..5a8a838 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -65,6 +65,10 @@ ifdef NO_GENERIC_SEGMENT_CHECKS CFLAGS_file.o += -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 76d794b..5108301 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -32,6 +32,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.3.4
Joel Becker
2008-Jan-02 15:10 UTC
[Ocfs2-devel] Re: [PATCH 06/30] ocfs2: Include do_sync_mapping_range() from mainline
On Mon, Dec 31, 2007 at 02:23:58PM -0800, Sunil Mushran wrote:> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c > index 4791433..fc7ee22 100644 > --- a/fs/ocfs2/alloc.c > +++ b/fs/ocfs2/alloc.c > @@ -23,11 +23,13 @@ > * Boston, MA 021110-1307, USA. > */ > > +#ifndef NO_SYNC_MAPPING_RANGE > #include <linux/fs.h> > #include <linux/types.h> > #include <linux/slab.h> > #include <linux/highmem.h> > #include <linux/swap.h> > +#endifWhy are you adding these #ifdefs? The headers can be included twice safely, they prevent re-inclusion - or at least they should. Joel -- Life's Little Instruction Book #356 "Be there when people need you." Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127
Joel Becker
2008-Jan-02 15:12 UTC
[Ocfs2-devel] Re: [PATCH 09/30] ocfs2: Define enum umh_wait
On Mon, Dec 31, 2007 at 02:24:01PM -0800, Sunil Mushran wrote:> 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> > --- > Makefile | 3 ++- > configure.in | 5 +++++ > kapi-compat/include/kmod.h | 10 ++++++++++I'd call it kapi-compat/include/umh_wait.h, but that's a tiny niggle. Joel -- Life's Little Instruction Book #94 "Make it a habit to do nice things for people who will never find out." Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127
Joel Becker
2008-Jan-02 15:14 UTC
[Ocfs2-devel] Re: [PATCH 13/30] ocfs2: Define FS_RENAME_DOES_D_MOVE
On Mon, Dec 31, 2007 at 02:24:05PM -0800, Sunil Mushran wrote:> kapi-compat/include/fstype.h | 6 ++++++And here I'd call it fs_rename_does_d_move.h Joel -- "Glory is fleeting, but obscurity is forever." - Napoleon Bonaparte Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127