|
@@ -13,14 +13,14 @@
|
|
|
|
|
|
extern const struct reiserfs_key MIN_KEY;
|
|
|
|
|
|
-static int reiserfs_readdir(struct file *, void *, filldir_t);
|
|
|
+static int reiserfs_readdir(struct file *, struct dir_context *);
|
|
|
static int reiserfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
|
|
|
int datasync);
|
|
|
|
|
|
const struct file_operations reiserfs_dir_operations = {
|
|
|
.llseek = generic_file_llseek,
|
|
|
.read = generic_read_dir,
|
|
|
- .readdir = reiserfs_readdir,
|
|
|
+ .iterate = reiserfs_readdir,
|
|
|
.fsync = reiserfs_dir_fsync,
|
|
|
.unlocked_ioctl = reiserfs_ioctl,
|
|
|
#ifdef CONFIG_COMPAT
|
|
@@ -58,8 +58,7 @@ static inline bool is_privroot_deh(struct dentry *dir,
|
|
|
deh->deh_objectid == INODE_PKEY(privroot->d_inode)->k_objectid);
|
|
|
}
|
|
|
|
|
|
-int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
- filldir_t filldir, loff_t *pos)
|
|
|
+int reiserfs_readdir_dentry(struct dentry *dentry, struct dir_context *ctx)
|
|
|
{
|
|
|
struct inode *inode = dentry->d_inode;
|
|
|
struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */
|
|
@@ -81,7 +80,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
|
|
|
/* form key for search the next directory entry using f_pos field of
|
|
|
file structure */
|
|
|
- make_cpu_key(&pos_key, inode, *pos ?: DOT_OFFSET, TYPE_DIRENTRY, 3);
|
|
|
+ make_cpu_key(&pos_key, inode, ctx->pos ?: DOT_OFFSET, TYPE_DIRENTRY, 3);
|
|
|
next_pos = cpu_key_k_offset(&pos_key);
|
|
|
|
|
|
path_to_entry.reada = PATH_READA;
|
|
@@ -126,7 +125,6 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
entry_num++, deh++) {
|
|
|
int d_reclen;
|
|
|
char *d_name;
|
|
|
- off_t d_off;
|
|
|
ino_t d_ino;
|
|
|
|
|
|
if (!de_visible(deh))
|
|
@@ -158,8 +156,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
if (is_privroot_deh(dentry, deh))
|
|
|
continue;
|
|
|
|
|
|
- d_off = deh_offset(deh);
|
|
|
- *pos = d_off;
|
|
|
+ ctx->pos = deh_offset(deh);
|
|
|
d_ino = deh_objectid(deh);
|
|
|
if (d_reclen <= 32) {
|
|
|
local_buf = small_buf;
|
|
@@ -187,9 +184,9 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
* the write lock here for other waiters
|
|
|
*/
|
|
|
reiserfs_write_unlock(inode->i_sb);
|
|
|
- if (filldir
|
|
|
- (dirent, local_buf, d_reclen, d_off, d_ino,
|
|
|
- DT_UNKNOWN) < 0) {
|
|
|
+ if (!dir_emit
|
|
|
+ (ctx, local_buf, d_reclen, d_ino,
|
|
|
+ DT_UNKNOWN)) {
|
|
|
reiserfs_write_lock(inode->i_sb);
|
|
|
if (local_buf != small_buf) {
|
|
|
kfree(local_buf);
|
|
@@ -237,7 +234,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
|
|
|
} /* while */
|
|
|
|
|
|
end:
|
|
|
- *pos = next_pos;
|
|
|
+ ctx->pos = next_pos;
|
|
|
pathrelse(&path_to_entry);
|
|
|
reiserfs_check_path(&path_to_entry);
|
|
|
out:
|
|
@@ -245,10 +242,9 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int reiserfs_readdir(struct file *file, void *dirent, filldir_t filldir)
|
|
|
+static int reiserfs_readdir(struct file *file, struct dir_context *ctx)
|
|
|
{
|
|
|
- struct dentry *dentry = file->f_path.dentry;
|
|
|
- return reiserfs_readdir_dentry(dentry, dirent, filldir, &file->f_pos);
|
|
|
+ return reiserfs_readdir_dentry(file->f_path.dentry, ctx);
|
|
|
}
|
|
|
|
|
|
/* compose directory item containing "." and ".." entries (entries are
|