mcoverlayfs: vfs_readdir -> iterate_dir compat for el7.5
Also enable mcoverlay for new kernel version / actually build it Change-Id: I80bc043c65cf99c3b41a54a5666ea7652e6c2bbd
This commit is contained in:
committed by
Dominique Martinet
parent
e8f8660b73
commit
3e3f3c5590
@@ -232,7 +232,7 @@ if [ "${ENABLE_MCOVERLAYFS}" == "yes" ]; then
|
|||||||
enable_mcoverlay="yes"
|
enable_mcoverlay="yes"
|
||||||
fi
|
fi
|
||||||
else
|
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"
|
enable_mcoverlay="yes"
|
||||||
fi
|
fi
|
||||||
if [ ${linux_version_code} -ge 262144 -a ${linux_version_code} -lt 262400 ]; then
|
if [ ${linux_version_code} -ge 262144 -a ${linux_version_code} -lt 262400 ]; then
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ endif
|
|||||||
endif
|
endif
|
||||||
ifeq ($(BUILD_MODULE_TMP),rhel)
|
ifeq ($(BUILD_MODULE_TMP),rhel)
|
||||||
ifeq ($(BUILD_MODULE),none)
|
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
|
endif
|
||||||
ifeq ($(BUILD_MODULE),none)
|
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)
|
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)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <linux/rbtree.h>
|
#include <linux/rbtree.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/cred.h>
|
#include <linux/cred.h>
|
||||||
|
#include <linux/version.h>
|
||||||
#include "overlayfs.h"
|
#include "overlayfs.h"
|
||||||
|
|
||||||
struct ovl_cache_entry {
|
struct ovl_cache_entry {
|
||||||
@@ -34,10 +35,18 @@ struct ovl_dir_cache {
|
|||||||
struct list_head entries;
|
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 {
|
struct dir_context {
|
||||||
const filldir_t actor;
|
const filldir_t actor;
|
||||||
//loff_t pos;
|
//loff_t pos;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ovl_readdir_data {
|
struct ovl_readdir_data {
|
||||||
struct dir_context ctx;
|
struct dir_context ctx;
|
||||||
@@ -256,7 +265,11 @@ static inline int ovl_dir_read(struct path *realpath,
|
|||||||
do {
|
do {
|
||||||
rdd->count = 0;
|
rdd->count = 0;
|
||||||
rdd->err = 0;
|
rdd->err = 0;
|
||||||
|
#ifdef USE_ITERATE_DIR
|
||||||
|
err = iterate_dir(realfile, &rdd->ctx);
|
||||||
|
#else
|
||||||
err = vfs_readdir(realfile, rdd->ctx.actor, rdd);
|
err = vfs_readdir(realfile, rdd->ctx.actor, rdd);
|
||||||
|
#endif
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
err = rdd->err;
|
err = rdd->err;
|
||||||
} while (!err && rdd->count);
|
} while (!err && rdd->count);
|
||||||
@@ -365,6 +378,22 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry)
|
|||||||
return cache;
|
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)
|
static int ovl_readdir(struct file *file, void *buf, filldir_t filler)
|
||||||
{
|
{
|
||||||
struct ovl_dir_file *od = file->private_data;
|
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);
|
ovl_dir_reset(file);
|
||||||
|
|
||||||
if (od->is_real) {
|
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);
|
res = vfs_readdir(od->realfile, filler, buf);
|
||||||
|
#endif
|
||||||
file->f_pos = od->realfile->f_pos;
|
file->f_pos = od->realfile->f_pos;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
Reference in New Issue
Block a user