#define CEPH_LOCK_IDFT 32 /* dir frag tree */
#define CEPH_LOCK_IDIR 64 /* mds internal */
#define CEPH_LOCK_IXATTR 128
-#define CEPH_LOCK_INO 256 /* immutable inode bits; not actually a lock */
+#define CEPH_LOCK_INESTED 256
+#define CEPH_LOCK_INO 2048 /* immutable inode bits; not actually a lock */
#define CEPH_LOCK_ICONTENT (CEPH_LOCK_IFILE|CEPH_LOCK_IDIR) /* alias for either filelock or dirlock */
#define CEPH_STAT_MASK_SIZE CEPH_LOCK_ICONTENT
#define CEPH_STAT_MASK_ATIME CEPH_LOCK_ICONTENT /* fixme */
#define CEPH_STAT_MASK_XATTR CEPH_LOCK_IXATTR
+#define CEPH_STAT_MASK_NSIZE CEPH_LOCK_INESTED
+#define CEPH_STAT_MASK_NCTIME CEPH_LOCK_INESTED
#define CEPH_STAT_MASK_INODE_ALL (CEPH_LOCK_ICONTENT|CEPH_LOCK_IAUTH|CEPH_LOCK_ILINK|CEPH_LOCK_INO)
#define CEPH_UTIME_ATIME 1
__le32 mode, uid, gid;
__le32 nlink;
__le64 size, max_size;
+ __le64 nested_size;
+ struct ceph_timespec nested_ctime;
__le32 rdev;
struct ceph_frag_tree_head fragtree;
} __attribute__ ((packed));
bool anchored; // auth only?
// file (data access)
- uint64_t size;
- uint64_t max_size; // client(s) are auth to write this much...
+ uint64_t size; // on directory, # dentries
+ uint64_t max_size; // client(s) are auth to write this much...
utime_t mtime; // file data modify time.
utime_t atime; // file data access time.
- utime_t rmtime; // recursive mtime?
uint64_t time_warp_seq; // count of (potential) mtime/atime timewarps (i.e., utimes())
+
+ // recursive accounting
+ uint64_t nested_size; // \sum_{children}(size + nested_size)
+ utime_t nested_ctime; // \max_{children}(ctime, nested_ctime)
// special stuff
version_t version; // auth only
::encode(xattrs, bl);
break;
+ case CEPH_LOCK_INESTED:
+ //_encode(inode.nested_ctime, bl);
+ //_encode(inode.nested_size, bl);
+ break;
+
default:
assert(0);
}
::decode(xattrs, p);
break;
+ case CEPH_LOCK_INESTED:
+ // ***
+ break;
+
default:
assert(0);
}
static const int WAIT_DIRLOCK_OFFSET = 5 + 4*SimpleLock::WAIT_BITS;
static const int WAIT_VERSIONLOCK_OFFSET = 5 + 5*SimpleLock::WAIT_BITS;
static const int WAIT_XATTRLOCK_OFFSET = 5 + 6*SimpleLock::WAIT_BITS;
+ static const int WAIT_NESTEDLOCK_OFFSET = 5 + 7*SimpleLock::WAIT_BITS;
static const int WAIT_ANY_MASK = (0xffffffff);
dirfragtreelock(this, CEPH_LOCK_IDFT, WAIT_DIRFRAGTREELOCK_OFFSET),
filelock(this, CEPH_LOCK_IFILE, WAIT_FILELOCK_OFFSET),
dirlock(this, CEPH_LOCK_IDIR, WAIT_DIRLOCK_OFFSET),
- xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET)
+ xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET),
+ nestedlock(this, CEPH_LOCK_INESTED, WAIT_NESTEDLOCK_OFFSET)
{
memset(&inode, 0, sizeof(inode));
state = 0;
FileLock filelock;
ScatterLock dirlock;
SimpleLock xattrlock;
-
+ ScatterLock nestedlock;
SimpleLock* get_lock(int type) {
switch (type) {
case CEPH_LOCK_IDFT: return &dirfragtreelock;
case CEPH_LOCK_IDIR: return &dirlock;
case CEPH_LOCK_IXATTR: return &xattrlock;
+ case CEPH_LOCK_INESTED: return &nestedlock;
}
return 0;
}
+
void set_object_info(MDSCacheObjectInfo &info);
void encode_lock_state(int type, bufferlist& bl);
void decode_lock_state(int type, bufferlist& bl);
};
struct InodeStat {
- //inode_t inode;
inodeno_t ino;
version_t version;
ceph_file_layout layout;
- utime_t ctime, mtime, atime;
+ utime_t ctime, mtime, atime, nested_ctime;
unsigned mode, uid, gid, nlink, rdev;
- loff_t size, max_size;
+ loff_t size, max_size, nested_size;
version_t time_warp_seq;
string symlink; // symlink content (if symlink)
max_size = e.max_size;
rdev = e.rdev;
+ nested_ctime.decode_timeval(&e.nested_ctime);
+ nested_size = e.nested_size;
+
int n = e.fragtree.nsplits;
while (n) {
ceph_frag_tree_split s;
in->inode.ctime.encode_timeval(&e.ctime);
in->inode.mtime.encode_timeval(&e.mtime);
in->inode.atime.encode_timeval(&e.atime);
+ in->inode.nested_ctime.encode_timeval(&e.nested_ctime);
e.time_warp_seq = in->inode.time_warp_seq;
e.mode = in->inode.mode;
e.uid = in->inode.uid;
e.nlink = in->inode.nlink;
e.size = in->inode.size;
e.max_size = in->inode.max_size;
+ e.nested_size = in->inode.nested_size;
e.rdev = in->inode.rdev;
e.fragtree.nsplits = in->dirfragtree._splits.size();
::encode(e, bl);