ceph: use flag bit for at_end readdir flag
This saves us a word of memory per file. Reviewed-by: Yehuda Sadeh <yehuda@hq.newdream.net> Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
4918b6d140
commit
9cfa1098dc
|
@ -133,7 +133,7 @@ more:
|
||||||
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)
|
||||||
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 @@ more:
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
* 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 {
|
||||||
/* 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 .. */
|
||||||
|
|
Loading…
Reference in New Issue