From 6fc06276a4cafa58cf7dd3875066bd5def7a58ce Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 25 May 2008 13:17:31 -0700 Subject: [PATCH] kclient: (unnested) file/subdir stats for dir, too --- src/include/types.h | 7 +++++++ src/kernel/dir.c | 16 ++++++++-------- src/mds/Locker.cc | 2 ++ src/messages/MClientReply.h | 10 ++++++++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/include/types.h b/src/include/types.h index 807e8fefd0e49..aac8974ff6a13 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -246,6 +246,7 @@ struct inode_t { uint64_t time_warp_seq; // count of (potential) mtime/atime timewarps (i.e., utimes()) // dirfrag, recursive accounting + uint64_t nfiles, nsubdirs; nested_info_t accounted_nested; // what dirfrag has seen nested_info_t nested; // inline summation for child dirfrags. /* @@ -277,7 +278,10 @@ static inline void encode(const inode_t &i, bufferlist &bl) { ::encode(i.max_size, bl); ::encode(i.mtime, bl); ::encode(i.atime, bl); + ::encode(i.nfiles, bl); + ::encode(i.nsubdirs, bl); ::encode(i.nested, bl); + ::encode(i.accounted_nested, bl); ::encode(i.version, bl); ::encode(i.file_data_version, bl); } @@ -295,7 +299,10 @@ static inline void decode(inode_t &i, bufferlist::iterator &p) { ::decode(i.max_size, p); ::decode(i.mtime, p); ::decode(i.atime, p); + ::decode(i.nfiles, p); + ::decode(i.nsubdirs, p); ::decode(i.nested, p); + ::decode(i.accounted_nested, p); ::decode(i.version, p); ::decode(i.file_data_version, p); } diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 76818154ec090..df63a3ebf2219 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -641,14 +641,14 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size, return -ENOMEM; cf->dir_info_len = sprintf(cf->dir_info, - "entries: %20lld\n" - "files: %20lld\n" - "subdirs: %20lld\n" - "rentries: %20lld\n" - "rfiles: %20lld\n" - "rsubdirs: %20lld\n" - "rbytes: %20lld\n" - "rctime: %10ld.%09ld\n", + "entries: %20lld\n" + " files: %20lld\n" + " subdirs: %20lld\n" + "rentries: %20lld\n" + " rfiles: %20lld\n" + " rsubdirs: %20lld\n" + "rbytes: %20lld\n" + "rctime: %10ld.%09ld\n", ci->i_files + ci->i_subdirs, ci->i_files, ci->i_subdirs, diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 3351ebee40d84..f2e0f9aae57b4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1332,6 +1332,8 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob, dout(10) << "predirty_nested updating size/mtime on " << *pin << dendl; if (pf->fraginfo.mtime > pi->mtime) pi->mtime = pf->fraginfo.mtime; + pi->nfiles += pf->fraginfo.nfiles - pf->accounted_fraginfo.nfiles; + pi->nsubdirs += pf->fraginfo.nsubdirs - pf->accounted_fraginfo.nsubdirs; pi->size += pf->fraginfo.size() - pf->accounted_fraginfo.size(); pf->accounted_fraginfo = pf->fraginfo; } diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index 9587139b5a5e4..b51d4cf041acb 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -104,12 +104,14 @@ struct InodeStat { inodeno_t ino; version_t version; ceph_file_layout layout; - utime_t ctime, mtime, atime, rctime; + utime_t ctime, mtime, atime; unsigned mode, uid, gid, nlink, rdev; loff_t size, max_size, nested_size; version_t time_warp_seq; - nested_info_t nested; + uint64_t nfiles, nsubdirs; + nested_info_t nested; + string symlink; // symlink content (if symlink) fragtree_t dirfragtree; map xattrs; @@ -138,6 +140,8 @@ struct InodeStat { max_size = e.max_size; rdev = e.rdev; + nfiles = e.files; + nsubdirs = e.subdirs; nested.rctime.decode_timeval(&e.rctime); nested.rbytes = e.rbytes; nested.rfiles = e.rfiles; @@ -178,6 +182,8 @@ struct InodeStat { e.size = in->inode.size; e.max_size = in->inode.max_size; + e.files = in->inode.nfiles; + e.subdirs = in->inode.nsubdirs; in->inode.nested.rctime.encode_timeval(&e.rctime); e.rbytes = in->inode.nested.rbytes; e.rfiles = in->inode.nested.rfiles; -- 2.39.5