summarylogtreecommitdiffstats
path: root/vmblock-11.1.2-4.2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'vmblock-11.1.2-4.2.patch')
-rw-r--r--vmblock-11.1.2-4.2.patch339
1 files changed, 339 insertions, 0 deletions
diff --git a/vmblock-11.1.2-4.2.patch b/vmblock-11.1.2-4.2.patch
new file mode 100644
index 000000000000..59b2224f97b2
--- /dev/null
+++ b/vmblock-11.1.2-4.2.patch
@@ -0,0 +1,339 @@
+diff -ur a/vmblock-only/linux/control.c b/vmblock-only/linux/control.c
+--- vmblock-only/linux/control.c 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/linux/control.c 2015-08-08 00:23:51.000000000 +0300
+@@ -208,9 +208,11 @@
+ VMBlockSetProcEntryOwner(controlProcMountpoint);
+
+ /* Create /proc/fs/vmblock/dev */
+- controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
+- VMBLOCK_CONTROL_MODE,
+- controlProcDirEntry);
++ controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME,
++ VMBLOCK_CONTROL_MODE,
++ controlProcDirEntry,
++ &ControlFileOps);
++
+ if (!controlProcEntry) {
+ Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
+ remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
+@@ -218,7 +220,10 @@
+ return -EINVAL;
+ }
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ controlProcEntry->proc_fops = &ControlFileOps;
++#endif
++
+ return 0;
+ }
+
+@@ -272,17 +277,44 @@
+ *----------------------------------------------------------------------------
+ */
+
++/* copy-paste from Lustre FS by pavlinux */
++static char *ll_getname(const char __user *filename)
++{
++ int ret = 0, len;
++ char *tmp = __getname();
++
++ if (!tmp)
++ return ERR_PTR(-ENOMEM);
++
++ len = strncpy_from_user(tmp, filename, PATH_MAX);
++ if (len == 0)
++ ret = -ENOENT;
++ else if (len > PATH_MAX)
++ ret = -ENAMETOOLONG;
++
++ if (ret) {
++ __putname(tmp);
++ tmp = ERR_PTR(ret);
++ }
++ return tmp;
++}
++
+ static int
+ ExecuteBlockOp(const char __user *buf, // IN: buffer with name
+ const os_blocker_id_t blocker, // IN: blocker ID (file)
+ int (*blockOp)(const char *filename, // IN: block operation
+ const os_blocker_id_t blocker))
+ {
+- char *name;
++ struct filename *fn = NULL;
++ char *name = (char *)fn->name;
+ int i;
+ int retval;
+
+- name = getname(buf);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
++ name = (char *)getname(buf);
++#else
++ name = (char *)ll_getname(buf);
++#endif
+ if (IS_ERR(name)) {
+ return PTR_ERR(name);
+ }
+@@ -293,7 +325,12 @@
+
+ retval = i < 0 ? -EINVAL : blockOp(name, blocker);
+
+- putname(name);
++ if (fn->name != fn->iname) { /* add by pavlinux */
++ __putname(fn->name);
++ kvfree(fn);
++ } else {
++ __putname(fn);
++ }
+
+ return retval;
+ }
+diff -ur a/vmblock-only/linux/dentry.c b/vmblock-only/linux/dentry.c
+--- vmblock-only/linux/dentry.c 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/linux/dentry.c 2015-02-24 03:58:06.000000000 +0300
+@@ -32,7 +32,11 @@
+ #include "block.h"
+
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ static int DentryOpRevalidate(struct dentry *dentry, struct nameidata *nd);
++#else
++static int DentryOpRevalidate(struct dentry *dentry, unsigned int);
++#endif
+
+ struct dentry_operations LinkDentryOps = {
+ .d_revalidate = DentryOpRevalidate,
+@@ -58,9 +62,12 @@
+ *----------------------------------------------------------------------------
+ */
+
+-static int
+-DentryOpRevalidate(struct dentry *dentry, // IN: dentry revalidating
+- struct nameidata *nd) // IN: lookup flags & intent
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
++static int DentryOpRevalidate(struct dentry *dentry, struct nameidata *nd)
++#else
++static int DentryOpRevalidate(struct dentry *dentry, unsigned int flags)
++#endif
++
+ {
+ VMBlockInodeInfo *iinfo;
+ struct nameidata actualNd;
+@@ -101,7 +108,11 @@
+ if (actualDentry &&
+ actualDentry->d_op &&
+ actualDentry->d_op->d_revalidate) {
++#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 14, 0)
++ return actualDentry->d_op->d_revalidate(actualDentry, flags);
++#else
+ return actualDentry->d_op->d_revalidate(actualDentry, nd);
++#endif
+ }
+
+ if (compat_path_lookup(iinfo->name, 0, &actualNd)) {
+diff -ur a/vmblock-only/linux/file.c b/vmblock-only/linux/file.c
+--- vmblock-only/linux/file.c 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/linux/file.c 2015-02-24 03:58:06.000000000 +0300
+@@ -38,6 +38,7 @@
+ typedef ino_t inode_num_t;
+ #endif
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ /* Specifically for our filldir_t callback */
+ typedef struct FilldirInfo {
+ filldir_t filldir;
+@@ -76,7 +77,7 @@
+ /* Specify DT_LNK regardless */
+ return info->filldir(info->dirent, name, namelen, offset, ino, DT_LNK);
+ }
+-
++#endif
+
+ /* File operations */
+
+@@ -132,7 +133,7 @@
+ * and that would try to acquire the inode's semaphore; if the two inodes
+ * are the same we'll deadlock.
+ */
+- if (actualFile->f_dentry && inode == actualFile->f_dentry->d_inode) {
++ if (actualFile->f_path.dentry && inode == actualFile->f_path.dentry->d_inode) {
+ Warning("FileOpOpen: identical inode encountered, open cannot succeed.\n");
+ if (filp_close(actualFile, current->files) < 0) {
+ Warning("FileOpOpen: unable to close opened file.\n");
+@@ -164,6 +165,7 @@
+ *----------------------------------------------------------------------------
+ */
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ static int
+ FileOpReaddir(struct file *file, // IN
+ void *dirent, // IN
+@@ -193,7 +195,7 @@
+
+ return ret;
+ }
+-
++#endif
+
+ /*
+ *----------------------------------------------------------------------------
+@@ -237,7 +239,11 @@
+
+
+ struct file_operations RootFileOps = {
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ .readdir = FileOpReaddir,
++#endif
++ .owner = THIS_MODULE,
++ .llseek = no_llseek,
+ .open = FileOpOpen,
+ .release = FileOpRelease,
+ };
+diff -ur a/vmblock-only/linux/filesystem.c b/vmblock-only/linux/filesystem.c
+--- vmblock-only/linux/filesystem.c 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/linux/filesystem.c 2015-02-24 03:58:06.000000000 +0300
+@@ -322,6 +322,7 @@
+ {
+ VMBlockInodeInfo *iinfo;
+ struct inode *inode;
++
+ struct nameidata actualNd;
+
+ ASSERT(sb);
+diff -ur a/vmblock-only/linux/inode.c b/vmblock-only/linux/inode.c
+--- vmblock-only/linux/inode.c 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/linux/inode.c 2015-08-08 00:33:22.000000000 +0300
+@@ -35,26 +35,27 @@
+
+
+ /* Inode operations */
+-static struct dentry *InodeOpLookup(struct inode *dir,
+- struct dentry *dentry, struct nameidata *nd);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
++static struct dentry *InodeOpLookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd);
+ static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
+-static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
+ #else
+-static int InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
++static struct dentry *InodeOpLookup(struct inode *, struct dentry *, unsigned int);
++static int InodeOpReadlink(struct dentry *, char __user *, int);
+ #endif
+
++static const char *InodeOpFollowlink(struct dentry *dentry, void **cookie);
++
+
+ struct inode_operations RootInodeOps = {
+ .lookup = InodeOpLookup,
+ };
+
+-static struct inode_operations LinkInodeOps = {
++struct inode_operations LinkInodeOps = {
+ .readlink = InodeOpReadlink,
+ .follow_link = InodeOpFollowlink,
+ };
+
+-
+ /*
+ *----------------------------------------------------------------------------
+ *
+@@ -75,7 +76,11 @@
+ static struct dentry *
+ InodeOpLookup(struct inode *dir, // IN: parent directory's inode
+ struct dentry *dentry, // IN: dentry to lookup
+- struct nameidata *nd) // IN: lookup intent and information
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
++ struct nameidata *nd) // IN: lookup intent and information
++#else
++ unsigned int flags)
++#endif
+ {
+ char *filename;
+ struct inode *inode;
+@@ -135,7 +140,12 @@
+ inode->i_size = INODE_TO_IINFO(inode)->nameLen;
+ inode->i_version = 1;
+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ inode->i_uid = inode->i_gid = 0;
++#else
++ inode->i_gid = make_kgid(current_user_ns(), 0);
++ inode->i_uid = make_kuid(current_user_ns(), 0);
++#endif
+ inode->i_op = &LinkInodeOps;
+
+ d_add(dentry, inode);
+@@ -177,7 +187,12 @@
+ return -EINVAL;
+ }
+
+- return vfs_readlink(dentry, buffer, buflen, iinfo->name);
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 14, 99)
++ return vfs_readlink(dentry, buffer, buflen, iinfo->name);
++#else
++ return readlink_copy(buffer, buflen, iinfo->name);
++#endif
++
+ }
+
+
+@@ -198,13 +213,7 @@
+ *----------------------------------------------------------------------------
+ */
+
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
+-static void *
+-#else
+-static int
+-#endif
+-InodeOpFollowlink(struct dentry *dentry, // IN : dentry of symlink
+- struct nameidata *nd) // OUT: stores result
++static const char *InodeOpFollowlink(struct dentry *dentry, void **cookie)
+ {
+ int ret;
+ VMBlockInodeInfo *iinfo;
+@@ -221,7 +230,11 @@
+ goto out;
+ }
+
+- ret = vfs_follow_link(nd, iinfo->name);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
++ return *cookie = (char *)(iinfo->name);
++#else
++ nd_set_link(nd, iinfo->name);
++#endif
+
+ out:
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
+@@ -230,3 +243,4 @@
+ return ret;
+ #endif
+ }
++
+Только в a/vmblock-only/shared/autoconf: dalias.c
+Только в a/vmblock-only/shared/autoconf: truncate_pagecache.c
+diff -ur a/vmblock-only/shared/compat_namei.h b/vmblock-only/shared/compat_namei.h
+--- vmblock-only/shared/compat_namei.h 2015-05-31 16:01:25.000000000 +0300
++++ vmblock-only/shared/compat_namei.h 2015-02-24 03:51:25.000000000 +0300
+@@ -21,6 +21,20 @@
+
+ #include <linux/namei.h>
+
++/* Copy-n-paste from kernel's source/fs/namei.c */
++struct nameidata {
++ struct path path;
++ struct qstr last;
++ struct path root;
++ struct inode *inode; /* path.dentry.d_inode */
++ unsigned int flags;
++ unsigned seq, m_seq;
++ int last_type;
++ unsigned depth;
++ struct file *base;
++ char *saved_names[MAX_NESTED_LINKS + 1];
++};
++
+ /*
+ * In 2.6.25-rc2, dentry and mount objects were removed from the nameidata
+ * struct. They were both replaced with a struct path.