Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9cfa1098 authored by Sage Weil's avatar Sage Weil
Browse files

ceph: use flag bit for at_end readdir flag



This saves us a word of memory per file.

Reviewed-by: default avatarYehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 4918b6d1
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -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)
	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)
		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;


+1 −1
Original line number Original line Diff line number Diff line
@@ -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 .. */