提交 9cfa1098 编写于 作者: S Sage Weil

ceph: use flag bit for at_end readdir flag

This saves us a word of memory per file.
Reviewed-by: NYehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: NSage Weil <sage@newdream.net>
上级 4918b6d1
...@@ -133,7 +133,7 @@ static int __dcache_readdir(struct file *filp, ...@@ -133,7 +133,7 @@ static int __dcache_readdir(struct file *filp,
d_unhashed(dentry) ? "!hashed" : "hashed", d_unhashed(dentry) ? "!hashed" : "hashed",
parent->d_subdirs.prev, parent->d_subdirs.next); parent->d_subdirs.prev, parent->d_subdirs.next);
if (p == &parent->d_subdirs) { if (p == &parent->d_subdirs) {
fi->at_end = 1; fi->flags |= CEPH_F_ATEND;
goto out_unlock; goto out_unlock;
} }
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
...@@ -234,7 +234,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -234,7 +234,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)
const int max_bytes = fsc->mount_options->max_readdir_bytes; const int max_bytes = fsc->mount_options->max_readdir_bytes;
dout("readdir %p filp %p frag %u off %u\n", inode, filp, frag, off); dout("readdir %p filp %p frag %u off %u\n", inode, filp, frag, off);
if (fi->at_end) if (fi->flags & CEPH_F_ATEND)
return 0; return 0;
/* always start with . and .. */ /* always start with . and .. */
...@@ -403,7 +403,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -403,7 +403,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)
dout("readdir next frag is %x\n", frag); dout("readdir next frag is %x\n", frag);
goto more; goto more;
} }
fi->at_end = 1; fi->flags |= CEPH_F_ATEND;
/* /*
* if dir_release_count still matches the dir, no dentries * if dir_release_count still matches the dir, no dentries
...@@ -435,7 +435,7 @@ static void reset_readdir(struct ceph_file_info *fi) ...@@ -435,7 +435,7 @@ static void reset_readdir(struct ceph_file_info *fi)
dput(fi->dentry); dput(fi->dentry);
fi->dentry = NULL; fi->dentry = NULL;
} }
fi->at_end = 0; fi->flags &= ~CEPH_F_ATEND;
} }
static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int origin) static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int origin)
...@@ -458,7 +458,7 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int origin) ...@@ -458,7 +458,7 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int origin)
if (offset != file->f_pos) { if (offset != file->f_pos) {
file->f_pos = offset; file->f_pos = offset;
file->f_version = 0; file->f_version = 0;
fi->at_end = 0; fi->flags &= ~CEPH_F_ATEND;
} }
retval = offset; retval = offset;
......
...@@ -544,6 +544,7 @@ extern void ceph_reservation_status(struct ceph_fs_client *client, ...@@ -544,6 +544,7 @@ extern void ceph_reservation_status(struct ceph_fs_client *client,
* we keep buffered readdir results attached to file->private_data * we keep buffered readdir results attached to file->private_data
*/ */
#define CEPH_F_SYNC 1 #define CEPH_F_SYNC 1
#define CEPH_F_ATEND 2
struct ceph_file_info { struct ceph_file_info {
short fmode; /* initialized on open */ short fmode; /* initialized on open */
...@@ -552,7 +553,6 @@ struct ceph_file_info { ...@@ -552,7 +553,6 @@ struct ceph_file_info {
/* readdir: position within the dir */ /* readdir: position within the dir */
u32 frag; u32 frag;
struct ceph_mds_request *last_readdir; struct ceph_mds_request *last_readdir;
int at_end;
/* readdir: position within a frag */ /* readdir: position within a frag */
unsigned offset; /* offset of last chunk, adjusted for . and .. */ unsigned offset; /* offset of last chunk, adjusted for . and .. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册