diff --git a/arch/x86_64/tools/mcreboot-smp-x86.sh.in b/arch/x86_64/tools/mcreboot-smp-x86.sh.in index 318c9999..d1eab5dc 100644 --- a/arch/x86_64/tools/mcreboot-smp-x86.sh.in +++ b/arch/x86_64/tools/mcreboot-smp-x86.sh.in @@ -232,7 +232,7 @@ if [ "${ENABLE_MCOVERLAYFS}" == "yes" ]; then enable_mcoverlay="yes" fi else - if [ ${linux_version_code} -eq 199168 -a ${rhel_release} -ge 327 -a ${rhel_release} -le 693 ]; then + if [ ${linux_version_code} -eq 199168 -a ${rhel_release} -ge 327 -a ${rhel_release} -le 862 ]; then enable_mcoverlay="yes" fi if [ ${linux_version_code} -ge 262144 -a ${linux_version_code} -lt 262400 ]; then diff --git a/executer/kernel/mcoverlayfs/Makefile.in b/executer/kernel/mcoverlayfs/Makefile.in index d8bfbb2f..c34094de 100644 --- a/executer/kernel/mcoverlayfs/Makefile.in +++ b/executer/kernel/mcoverlayfs/Makefile.in @@ -21,7 +21,7 @@ endif endif ifeq ($(BUILD_MODULE_TMP),rhel) ifeq ($(BUILD_MODULE),none) -BUILD_MODULE=$(shell if [ ${LINUX_VERSION_CODE} -eq 199168 -a ${RHEL_RELEASE} -ge 327 -a ${RHEL_RELEASE} -le 693 ]; then echo "linux-3.10.0-327.36.1.el7"; else echo "none"; fi) +BUILD_MODULE=$(shell if [ ${LINUX_VERSION_CODE} -eq 199168 -a ${RHEL_RELEASE} -ge 327 -a ${RHEL_RELEASE} -le 862 ]; then echo "linux-3.10.0-327.36.1.el7"; else echo "none"; fi) endif ifeq ($(BUILD_MODULE),none) BUILD_MODULE=$(shell if [ ${LINUX_VERSION_CODE} -ge 262144 -a ${LINUX_VERSION_CODE} -lt 262400 ]; then echo "linux-4.0.9"; else echo "none"; fi) diff --git a/executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/readdir.c b/executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/readdir.c index 9b47c7dd..f7df9841 100644 --- a/executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/readdir.c +++ b/executer/kernel/mcoverlayfs/linux-3.10.0-327.36.1.el7/readdir.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "overlayfs.h" struct ovl_cache_entry { @@ -34,10 +35,18 @@ struct ovl_dir_cache { struct list_head entries; }; +/* vfs_readdir vs. iterate_dir compat */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0) || \ + (defined(RHEL_RELEASE_CODE) && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) +#define USE_ITERATE_DIR 1 +#endif + +#ifndef USE_ITERATE_DIR struct dir_context { const filldir_t actor; //loff_t pos; }; +#endif struct ovl_readdir_data { struct dir_context ctx; @@ -256,7 +265,11 @@ static inline int ovl_dir_read(struct path *realpath, do { rdd->count = 0; rdd->err = 0; +#ifdef USE_ITERATE_DIR + err = iterate_dir(realfile, &rdd->ctx); +#else err = vfs_readdir(realfile, rdd->ctx.actor, rdd); +#endif if (err >= 0) err = rdd->err; } while (!err && rdd->count); @@ -365,6 +378,22 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry) return cache; } +#ifdef USE_ITERATE_DIR +struct iterate_wrapper { + struct dir_context ctx; + filldir_t actor; + void *buf; +}; + +static int ovl_wrap_readdir(void *ctx, const char *name, int namelen, + loff_t offset, u64 ino, unsigned int d_type) +{ + struct iterate_wrapper *w = ctx; + + return w->actor(w->buf, name, namelen, offset, ino, d_type); +} +#endif + static int ovl_readdir(struct file *file, void *buf, filldir_t filler) { struct ovl_dir_file *od = file->private_data; @@ -376,7 +405,16 @@ static int ovl_readdir(struct file *file, void *buf, filldir_t filler) ovl_dir_reset(file); if (od->is_real) { +#ifdef USE_ITERATE_DIR + struct iterate_wrapper w = { + .ctx.actor = ovl_wrap_readdir, + .actor = filler, + .buf = buf, + }; + res = iterate_dir(od->realfile, &w.ctx); +#else res = vfs_readdir(od->realfile, filler, buf); +#endif file->f_pos = od->realfile->f_pos; return res;