overlayfs: make mcoverlayfs compile for 4.14.0-115 (el7 arm64)

Use the 4.18 module as a base

Change-Id: I6c9ef66399800828e1932573da5a97573545c5da
This commit is contained in:
Dominique Martinet
2019-01-15 14:29:05 +09:00
parent 0fbdcc44b9
commit f5320fc2b4
7 changed files with 46 additions and 0 deletions

View File

@@ -17,6 +17,7 @@
#include <linux/posix_acl_xattr.h>
#include <linux/atomic.h>
#include <linux/ratelimit.h>
#include <linux/version.h>
#include "overlayfs.h"
static unsigned short ovl_redirect_max = 256;
@@ -601,9 +602,12 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
if (!inode)
goto out_drop_write;
//normally added in 4.19, but rhel backported so lazy choice
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)
spin_lock(&inode->i_lock);
inode->i_state |= I_CREATING;
spin_unlock(&inode->i_lock);
#endif
inode_init_owner(inode, dentry->d_parent->d_inode, mode);
attr.mode = inode->i_mode;

View File

@@ -17,6 +17,7 @@
#include <linux/xattr.h>
#include <linux/exportfs.h>
#include <linux/ratelimit.h>
#include <linux/version.h>
#include "overlayfs.h"
static int ovl_encode_maybe_copy_up(struct dentry *dentry)
@@ -287,6 +288,7 @@ static int ovl_encode_fh(struct inode *inode, u32 *fid, int *max_len,
return type;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
/*
* Find or instantiate an overlay dentry from real dentries and index.
*/
@@ -838,11 +840,14 @@ static struct dentry *ovl_get_parent(struct dentry *dentry)
WARN_ON_ONCE(1);
return ERR_PTR(-EIO);
}
#endif
const struct export_operations ovl_export_operations = {
.encode_fh = ovl_encode_fh,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
.fh_to_dentry = ovl_fh_to_dentry,
.fh_to_parent = ovl_fh_to_parent,
.get_name = ovl_get_name,
.get_parent = ovl_get_parent,
#endif
};

View File

@@ -13,6 +13,7 @@
#include <linux/xattr.h>
#include <linux/posix_acl.h>
#include <linux/ratelimit.h>
#include <linux/version.h>
#include "overlayfs.h"
@@ -778,8 +779,12 @@ static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,
static struct inode *ovl_iget5(struct super_block *sb, struct inode *newinode,
struct inode *key)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)
return newinode ? inode_insert5(newinode, (unsigned long) key,
ovl_inode_test, ovl_inode_set, key) :
#else
return
#endif
iget5_locked(sb, (unsigned long) key,
ovl_inode_test, ovl_inode_set, key);
}

View File

@@ -15,6 +15,8 @@
#include <linux/ratelimit.h>
#include <linux/mount.h>
#include <linux/exportfs.h>
#include <linux/version.h>
#include <linux/kallsyms.h>
#include "overlayfs.h"
struct ovl_lookup_data {
@@ -94,6 +96,10 @@ invalid:
static int ovl_acceptable(void *ctx, struct dentry *dentry)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)
static bool (*is_subdir)(struct dentry *new_dentry, struct dentry *old_dentry);
#endif
/*
* A non-dir origin may be disconnected, which is fine, because
* we only need it for its unique inode number.
@@ -105,6 +111,13 @@ static int ovl_acceptable(void *ctx, struct dentry *dentry)
if (d_unhashed(dentry))
return 0;
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)
if (!is_subdir) {
is_subdir = (void *)kallsyms_lookup_name("is_subdir");
WARN_ON(!is_subdir);
}
#endif
/* Check if directory belongs to the layer we are decoding from */
return is_subdir(dentry, ((struct vfsmount *)ctx)->mnt_root);
}

View File

@@ -18,6 +18,7 @@
#include <linux/seq_file.h>
#include <linux/posix_acl_xattr.h>
#include <linux/exportfs.h>
#include <linux/version.h>
#include "overlayfs.h"
MODULE_AUTHOR("Miklos Szeredi <miklos@szeredi.hu>");
@@ -726,7 +727,11 @@ static int ovl_mount_dir_noesc(const char *name, struct path *path)
return 0;
out_put:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
path_put_init(path);
#else
path_put(path);
#endif
out:
return err;
}
@@ -744,7 +749,11 @@ static int ovl_mount_dir(const char *name, struct path *path)
if (ovl_dentry_remote(path->dentry)) {
pr_err("overlayfs: filesystem on '%s' not supported as upperdir\n",
tmp);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
path_put_init(path);
#else
path_put(path);
#endif
err = -EINVAL;
}
kfree(tmp);
@@ -805,7 +814,11 @@ static int ovl_lower_dir(const char *name, struct path *path,
return 0;
out_put:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)
path_put_init(path);
#else
path_put(path);
#endif
out:
return err;
}