From b7c5a08a26a6be1292fa013251c09e1319f653bb Mon Sep 17 00:00:00 2001 From: sageweil Date: Tue, 20 Nov 2007 18:18:34 +0000 Subject: [PATCH] client reply encoding uses ceph_fs structs git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2095 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/messages/MClientReply.h | 53 ++++++++++++++++++++++++---- trunk/ceph/messages/MClientRequest.h | 5 ++- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/trunk/ceph/messages/MClientReply.h b/trunk/ceph/messages/MClientReply.h index 83d77a97ed1ec..8de58ba1bef0f 100644 --- a/trunk/ceph/messages/MClientReply.h +++ b/trunk/ceph/messages/MClientReply.h @@ -103,10 +103,30 @@ struct InodeStat { } void _decode(bufferlist::iterator &p) { - ::_decode_simple(mask, p); - ::_decode_simple(inode, p); + struct ceph_client_reply_inode e; + ::_decode_simple(e, p); + inode.ino = e.ino; + inode.layout = e.layout; + inode.ctime.tv_ref() = e.ctime; + inode.mtime.tv_ref() = e.mtime; + inode.atime.tv_ref() = e.atime; + inode.mode = e.mode; + inode.uid = e.uid; + inode.gid = e.gid; + inode.nlink = e.nlink; + inode.size = e.size; + inode.rdev = e.rdev; + + int n = e.fragtree.nsplits; + while (n) { + __u32 s, by; + ::_decode_simple(s, p); + ::_decode_simple(by, p); + dirfragtree._splits[s] = by; + n--; + } ::_decode_simple(symlink, p); - dirfragtree._decode(p); + mask = e.mask; } static void _encode(bufferlist &bl, CInode *in) { @@ -117,10 +137,31 @@ struct InodeStat { if (in->linklock.can_rdlock(0)) mask |= STAT_MASK_LINK; if (in->filelock.can_rdlock(0)) mask |= STAT_MASK_FILE; - ::_encode_simple(mask, bl); - ::_encode_simple(in->inode, bl); + /* + * note: encoding matches struct ceph_client_reply_inode + */ + struct ceph_client_reply_inode e; + e.ino = in->inode.ino; + e.layout = in->inode.layout; + e.ctime = in->inode.ctime.tv_ref(); + e.mtime = in->inode.mtime.tv_ref(); + e.atime = in->inode.atime.tv_ref(); + e.mode = in->inode.mode; + e.uid = in->inode.uid; + e.gid = in->inode.gid; + e.nlink = in->inode.nlink; + e.size = in->inode.size; + e.rdev = in->inode.rdev; + e.mask = mask; + e.fragtree.nsplits = in->dirfragtree._splits.size(); + ::_encode_simple(e, bl); + for (map::iterator p = in->dirfragtree._splits.begin(); + p != in->dirfragtree._splits.end(); + p++) { + ::_encode_simple(p->first, bl); + ::_encode_simple(p->second, bl); + } ::_encode_simple(in->symlink, bl); - in->dirfragtree._encode(bl); } }; diff --git a/trunk/ceph/messages/MClientRequest.h b/trunk/ceph/messages/MClientRequest.h index e63695f401899..d8fd180a46a25 100644 --- a/trunk/ceph/messages/MClientRequest.h +++ b/trunk/ceph/messages/MClientRequest.h @@ -197,14 +197,13 @@ public: void decode_payload() { int off = 0; - payload.copy(off, sizeof(head), (char*)&head); - off += sizeof(head); + ::_decode(head, payload, off); path._decode(payload, off); path2._decode(payload, off); } void encode_payload() { - payload.append((char*)&head, sizeof(head)); + ::_encode(head, payload); path._encode(payload); path2._encode(payload); } -- 2.39.5