aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-cluster/lustre/files/0011-LU-3974-llite-use-new-struct-dir_context.patch')
-rw-r--r--sys-cluster/lustre/files/0011-LU-3974-llite-use-new-struct-dir_context.patch265
1 files changed, 265 insertions, 0 deletions
diff --git a/sys-cluster/lustre/files/0011-LU-3974-llite-use-new-struct-dir_context.patch b/sys-cluster/lustre/files/0011-LU-3974-llite-use-new-struct-dir_context.patch
new file mode 100644
index 000000000..c2ca77147
--- /dev/null
+++ b/sys-cluster/lustre/files/0011-LU-3974-llite-use-new-struct-dir_context.patch
@@ -0,0 +1,265 @@
+From da6a877ec27753ce11499d1bde68d392f90179c4 Mon Sep 17 00:00:00 2001
+From: James Simmons <uja.ornl@gmail.com>
+Date: Mon, 20 Jan 2014 21:23:00 -0500
+Subject: [PATCH 11/12] LU-3974 llite: use new struct dir_context
+
+The readdir and nfs code over time has added more
+parameters to be passed to be processed. For the 3.11
+kernel a new struct dir_context was introduced to
+minimize the impact of future expansion. This patch
+addresses this change.
+
+Conflicts:
+ lustre/llite/dir.c
+
+Signed-off-by: James Simmons <uja.ornl@gmail.com>
+Change-Id: Ib42bf8cb06635a2a64e63b294d79e66ac82a1a5b
+Signed-off-by: Alexey Shvetsov <alexxy@gentoo.org>
+---
+ lustre/autoconf/lustre-core.m4 | 20 +++++++++++++
+ lustre/llite/dir.c | 65 ++++++++++++++++++++++++++++++++++--------
+ lustre/llite/llite_internal.h | 14 +++++++--
+ lustre/llite/llite_nfs.c | 17 +++++++----
+ 4 files changed, 96 insertions(+), 20 deletions(-)
+
+diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4
+index e6207c9..f44a277 100644
+--- a/lustre/autoconf/lustre-core.m4
++++ b/lustre/autoconf/lustre-core.m4
+@@ -1349,6 +1349,25 @@ LB_LINUX_TRY_COMPILE([
+ ])
+
+ #
++# 3.11 readdir now takes the new struct dir_context
++#
++AC_DEFUN([LC_HAVE_DIR_CONTEXT],
++[AC_MSG_CHECKING([if dir_context exist])
++LB_LINUX_TRY_COMPILE([
++ #include <linux/fs.h>
++],[
++ struct dir_context ctx;
++
++ ctx.pos = 0;
++],[
++ AC_DEFINE(HAVE_DIR_CONTEXT, 1, [dir_context exist])
++ AC_MSG_RESULT([yes])
++],[
++ AC_MSG_RESULT([no])
++])
++])
++
++#
+ # 3.11 dentry_operations.d_compare() taken 5 arguments.
+ #
+ AC_DEFUN([LC_D_COMPARE_5ARGS],
+@@ -1523,6 +1542,7 @@ AC_DEFUN([LC_PROG_LINUX],
+ LC_BLKDEV_RELEASE_RETURN_INT
+
+ # 3.11
++ LC_HAVE_DIR_CONTEXT
+ LC_D_COMPARE_5ARGS
+ LC_HAVE_DCOUNT
+
+diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c
+index dc5d623..5009934 100644
+--- a/lustre/llite/dir.c
++++ b/lustre/llite/dir.c
+@@ -195,9 +195,27 @@ struct lu_dirent *ll_dir_entry_next(struct inode *dir,
+ return entry;
+ }
+
++void ll_dir_entry_end(struct inode *dir, struct md_op_data *op_data,
++ struct lu_dirent *ent)
++{
++ struct lu_dirent *entry;
++ struct md_callback cb_op;
++
++ cb_op.md_blocking_ast = ll_md_blocking_ast;
++ op_data->op_cli_flags = CLI_READENT_END;
++ md_read_entry(ll_i2mdexp(dir), op_data, &cb_op, &entry);
++ return;
++}
++
++#ifdef HAVE_DIR_CONTEXT
++int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
++ struct dir_context *ctx)
++{
++#else
+ int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
+ void *cookie, filldir_t filldir)
+ {
++#endif
+ struct ll_sb_info *sbi = ll_i2sbi(inode);
+ struct ll_dir_chain chain;
+ struct lu_dirent *ent;
+@@ -241,12 +259,17 @@ int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
+ fid_le_to_cpu(&fid, &ent->lde_fid);
+ ino = cl_fid_build_ino(&fid, api32);
+ type = ll_dirent_type_get(ent);
++
++#ifdef HAVE_DIR_CONTEXT
+ /* For 'll_nfs_get_name_filldir()', it will try
+ * to access the 'ent' through its 'lde_name',
+ * so the parameter 'name' for 'filldir()' must
+ * be part of the 'ent'. */
++ done = !dir_emit(ctx, ent->lde_name, namelen, ino, type);
++#else
+ done = filldir(cookie, ent->lde_name, namelen, lhash,
+ ino, type);
++#endif
+ if (done) {
+ if (op_data->op_hash_offset != MDS_DIR_END_OFF)
+ op_data->op_hash_offset = last_hash;
+@@ -268,7 +291,11 @@ int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
+ RETURN(rc);
+ }
+
++#ifdef HAVE_DIR_CONTEXT
++static int ll_iterate(struct file *filp, struct dir_context *ctx)
++#else
+ static int ll_readdir(struct file *filp, void *cookie, filldir_t filldir)
++#endif
+ {
+ struct inode *inode = filp->f_dentry->d_inode;
+ struct ll_file_data *lfd = LUSTRE_FPRIVATE(filp);
+@@ -305,22 +332,32 @@ static int ll_readdir(struct file *filp, void *cookie, filldir_t filldir)
+
+ op_data->op_hash_offset = pos;
+ op_data->op_max_pages = sbi->ll_md_brw_size >> PAGE_CACHE_SHIFT;
++#ifdef HAVE_DIR_CONTEXT
++ ctx->pos = pos;
++ rc = ll_dir_read(inode, op_data, ctx);
++ pos = ctx->pos;
++#else
+ rc = ll_dir_read(inode, op_data, cookie, filldir);
++#endif
+ if (lfd != NULL)
+ lfd->lfd_pos = op_data->op_hash_offset;
+
+ if (pos == MDS_DIR_END_OFF) {
+ if (api32)
+- filp->f_pos = LL_DIR_END_OFF_32BIT;
++ pos = LL_DIR_END_OFF_32BIT;
+ else
+- filp->f_pos = LL_DIR_END_OFF;
++ pos = LL_DIR_END_OFF;
+ } else {
+ if (api32 && hash64)
+- filp->f_pos = op_data->op_hash_offset >> 32;
++ pos = op_data->op_hash_offset >> 32;
+ else
+- filp->f_pos = op_data->op_hash_offset;
++ pos = op_data->op_hash_offset;
+ }
+-
++#ifdef HAVE_DIR_CONTEXT
++ ctx->pos = pos;
++#else
++ filp->f_pos = pos;
++#endif
+ ll_finish_md_op_data(op_data);
+ filp->f_version = inode->i_version;
+ #ifdef HAVE_TOUCH_ATIME_1ARG
+@@ -1702,11 +1739,15 @@ int ll_dir_release(struct inode *inode, struct file *file)
+ }
+
+ struct file_operations ll_dir_operations = {
+- .llseek = ll_dir_seek,
+- .open = ll_dir_open,
+- .release = ll_dir_release,
+- .read = generic_read_dir,
+- .readdir = ll_readdir,
+- .unlocked_ioctl = ll_dir_ioctl,
+- .fsync = ll_fsync,
++ .llseek = ll_dir_seek,
++ .open = ll_dir_open,
++ .release = ll_dir_release,
++ .read = generic_read_dir,
++#ifdef HAVE_DIR_CONTEXT
++ .iterate = ll_iterate,
++#else
++ .readdir = ll_readdir,
++#endif
++ .unlocked_ioctl = ll_dir_ioctl,
++ .fsync = ll_fsync,
+ };
+diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h
+index 92b278e..c477b4c 100644
+--- a/lustre/llite/llite_internal.h
++++ b/lustre/llite/llite_internal.h
+@@ -91,9 +91,12 @@ extern struct file_operations ll_pgcache_seq_fops;
+ #define REMOTE_PERM_HASHSIZE 16
+
+ struct ll_getname_data {
+- char *lgd_name; /* points to a buffer with NAME_MAX+1 size */
+- struct lu_fid lgd_fid; /* target fid we are looking for */
+- int lgd_found; /* inode matched? */
++#ifdef HAVE_DIR_CONTEXT
++ struct dir_context ctx;
++#endif
++ char *lgd_name; /* points to a buffer with NAME_MAX+1 size */
++ struct lu_fid lgd_fid; /* target fid we are looking for */
++ int lgd_found; /* inode matched? */
+ };
+
+ /* llite setxid/access permission for user on remote client */
+@@ -719,8 +722,13 @@ static void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, int count) {}
+ /* llite/dir.c */
+ extern struct file_operations ll_dir_operations;
+ extern struct inode_operations ll_dir_inode_operations;
++#ifdef HAVE_DIR_CONTEXT
++int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
++ struct dir_context *ctx);
++#else
+ int ll_dir_read(struct inode *inode, struct md_op_data *op_data,
+ void *cookie, filldir_t filldir);
++#endif
+ int ll_get_mdt_idx(struct inode *inode);
+
+ struct lu_dirent *ll_dir_entry_start(struct inode *dir,
+diff --git a/lustre/llite/llite_nfs.c b/lustre/llite/llite_nfs.c
+index 68616e9..faad453 100644
+--- a/lustre/llite/llite_nfs.c
++++ b/lustre/llite/llite_nfs.c
+@@ -236,7 +236,14 @@ static int ll_get_name(struct dentry *dentry, char *name,
+ struct dentry *child)
+ {
+ struct inode *dir = dentry->d_inode;
+- struct ll_getname_data lgd;
++ struct ll_getname_data lgd = {
++ .lgd_name = name,
++ .lgd_fid = ll_i2info(child->d_inode)->lli_fid,
++#ifdef HAVE_DIR_CONTEXT
++ .ctx.actor = ll_nfs_get_name_filldir,
++#endif
++ .lgd_found = 0,
++ };
+ struct md_op_data *op_data;
+ int rc;
+ ENTRY;
+@@ -247,10 +254,6 @@ static int ll_get_name(struct dentry *dentry, char *name,
+ if (!dir->i_fop)
+ GOTO(out, rc = -EINVAL);
+
+- lgd.lgd_name = name;
+- lgd.lgd_fid = ll_i2info(child->d_inode)->lli_fid;
+- lgd.lgd_found = 0;
+-
+ op_data = ll_prep_md_op_data(NULL, dir, dir, NULL, 0, 0,
+ LUSTRE_OPC_ANY, dir);
+ if (IS_ERR(op_data))
+@@ -260,7 +263,11 @@ static int ll_get_name(struct dentry *dentry, char *name,
+ op_data->op_max_pages =
+ ll_i2sbi(dir)->ll_md_brw_size >> PAGE_CACHE_SHIFT;
+ mutex_lock(&dir->i_mutex);
++#ifdef HAVE_DIR_CONTEXT
++ rc = ll_dir_read(dir, op_data, &lgd.ctx);
++#else
+ rc = ll_dir_read(dir, op_data, &lgd, ll_nfs_get_name_filldir);
++#endif
+ mutex_unlock(&dir->i_mutex);
+ ll_finish_md_op_data(op_data);
+ if (!rc && !lgd.lgd_found)
+--
+1.8.5.3
+