return entry;
}
+#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;
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;
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);
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;
}
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,
};
#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 */
/* 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);
int ll_get_mdt_idx_by_fid(struct ll_sb_info *sbi, const struct lu_fid *fid);
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;
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))
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)