#include "mds/MDSContinuation.h"
#include "mds/InoTable.h"
+#include "cephfs_features.h"
#define dout_context g_ceph_context
#define dout_subsys ceph_subsys_mds
{
client_t client = session->get_client();
assert(snapid);
- assert(session->connection);
bool valid = true;
/*
* note: encoding matches MClientReply::InodeStat
*/
- encode(oi->ino, bl);
- encode(snapid, bl);
- encode(oi->rdev, bl);
- encode(version, bl);
-
- encode(xattr_version, bl);
-
- encode(ecap, bl);
- {
- ceph_file_layout legacy_layout;
- layout.to_legacy(&legacy_layout);
- encode(legacy_layout, bl);
- }
- encode(any_i->ctime, bl);
- encode(file_i->mtime, bl);
- encode(file_i->atime, bl);
- encode(file_i->time_warp_seq, bl);
- encode(file_i->size, bl);
- encode(max_size, bl);
- encode(file_i->truncate_size, bl);
- encode(file_i->truncate_seq, bl);
-
- encode(auth_i->mode, bl);
- encode((uint32_t)auth_i->uid, bl);
- encode((uint32_t)auth_i->gid, bl);
-
- encode(link_i->nlink, bl);
-
- encode(file_i->dirstat.nfiles, bl);
- encode(file_i->dirstat.nsubdirs, bl);
- encode(file_i->rstat.rbytes, bl);
- encode(file_i->rstat.rfiles, bl);
- encode(file_i->rstat.rsubdirs, bl);
- encode(file_i->rstat.rctime, bl);
-
- dirfragtree.encode(bl);
-
- encode(symlink, bl);
- if (session->connection->has_feature(CEPH_FEATURE_DIRLAYOUTHASH)) {
+ if (session->info.has_feature(CEPHFS_FEATURE_REPLY_ENCODING)) {
+ ENCODE_START(1, 1, bl);
+ encode(oi->ino, bl);
+ encode(snapid, bl);
+ encode(oi->rdev, bl);
+ encode(version, bl);
+ encode(xattr_version, bl);
+ encode(ecap, bl);
+ {
+ ceph_file_layout legacy_layout;
+ layout.to_legacy(&legacy_layout);
+ encode(legacy_layout, bl);
+ }
+ encode(any_i->ctime, bl);
+ encode(file_i->mtime, bl);
+ encode(file_i->atime, bl);
+ encode(file_i->time_warp_seq, bl);
+ encode(file_i->size, bl);
+ encode(max_size, bl);
+ encode(file_i->truncate_size, bl);
+ encode(file_i->truncate_seq, bl);
+ encode(auth_i->mode, bl);
+ encode((uint32_t)auth_i->uid, bl);
+ encode((uint32_t)auth_i->gid, bl);
+ encode(link_i->nlink, bl);
+ encode(file_i->dirstat.nfiles, bl);
+ encode(file_i->dirstat.nsubdirs, bl);
+ encode(file_i->rstat.rbytes, bl);
+ encode(file_i->rstat.rfiles, bl);
+ encode(file_i->rstat.rsubdirs, bl);
+ encode(file_i->rstat.rctime, bl);
+ dirfragtree.encode(bl);
+ encode(symlink, bl);
encode(file_i->dir_layout, bl);
- }
- encode(xbl, bl);
- if (session->connection->has_feature(CEPH_FEATURE_MDS_INLINE_DATA)) {
+ encode(xbl, bl);
encode(inline_version, bl);
encode(inline_data, bl);
- }
- if (session->connection->has_feature(CEPH_FEATURE_MDS_QUOTA)) {
mempool_inode *policy_i = ppolicy ? pi : oi;
encode(policy_i->quota, bl);
- }
- if (session->connection->has_feature(CEPH_FEATURE_FS_FILE_LAYOUT_V2)) {
encode(layout.pool_ns, bl);
- }
- if (session->connection->has_feature(CEPH_FEATURE_FS_BTIME)) {
encode(any_i->btime, bl);
encode(any_i->change_attr, bl);
+ ENCODE_FINISH(bl);
+ }
+ else {
+ assert(session->connection);
+
+ encode(oi->ino, bl);
+ encode(snapid, bl);
+ encode(oi->rdev, bl);
+ encode(version, bl);
+ encode(xattr_version, bl);
+ encode(ecap, bl);
+ {
+ ceph_file_layout legacy_layout;
+ layout.to_legacy(&legacy_layout);
+ encode(legacy_layout, bl);
+ }
+ encode(any_i->ctime, bl);
+ encode(file_i->mtime, bl);
+ encode(file_i->atime, bl);
+ encode(file_i->time_warp_seq, bl);
+ encode(file_i->size, bl);
+ encode(max_size, bl);
+ encode(file_i->truncate_size, bl);
+ encode(file_i->truncate_seq, bl);
+ encode(auth_i->mode, bl);
+ encode((uint32_t)auth_i->uid, bl);
+ encode((uint32_t)auth_i->gid, bl);
+ encode(link_i->nlink, bl);
+ encode(file_i->dirstat.nfiles, bl);
+ encode(file_i->dirstat.nsubdirs, bl);
+ encode(file_i->rstat.rbytes, bl);
+ encode(file_i->rstat.rfiles, bl);
+ encode(file_i->rstat.rsubdirs, bl);
+ encode(file_i->rstat.rctime, bl);
+ dirfragtree.encode(bl);
+ encode(symlink, bl);
+ if (session->connection->has_feature(CEPH_FEATURE_DIRLAYOUTHASH)) {
+ encode(file_i->dir_layout, bl);
+ }
+ encode(xbl, bl);
+ if (session->connection->has_feature(CEPH_FEATURE_MDS_INLINE_DATA)) {
+ encode(inline_version, bl);
+ encode(inline_data, bl);
+ }
+ if (session->connection->has_feature(CEPH_FEATURE_MDS_QUOTA)) {
+ mempool_inode *policy_i = ppolicy ? pi : oi;
+ encode(policy_i->quota, bl);
+ }
+ if (session->connection->has_feature(CEPH_FEATURE_FS_FILE_LAYOUT_V2)) {
+ encode(layout.pool_ns, bl);
+ }
+ if (session->connection->has_feature(CEPH_FEATURE_FS_BTIME)) {
+ encode(any_i->btime, bl);
+ encode(any_i->change_attr, bl);
+ }
}
return valid;
public:
InodeStat() {}
- InodeStat(bufferlist::const_iterator& p, uint64_t features) {
+ InodeStat(bufferlist::const_iterator& p, const uint64_t features) {
decode(p, features);
}
- void decode(bufferlist::const_iterator &p, uint64_t features) {
+ void decode(bufferlist::const_iterator &p, const uint64_t features) {
using ceph::decode;
- decode(vino.ino, p);
- decode(vino.snapid, p);
- decode(rdev, p);
- decode(version, p);
- decode(xattr_version, p);
- decode(cap, p);
- {
- ceph_file_layout legacy_layout;
- decode(legacy_layout, p);
- layout.from_legacy(legacy_layout);
- }
- decode(ctime, p);
- decode(mtime, p);
- decode(atime, p);
- decode(time_warp_seq, p);
- decode(size, p);
- decode(max_size, p);
- decode(truncate_size, p);
- decode(truncate_seq, p);
- decode(mode, p);
- decode(uid, p);
- decode(gid, p);
- decode(nlink, p);
- decode(dirstat.nfiles, p);
- decode(dirstat.nsubdirs, p);
- decode(rstat.rbytes, p);
- decode(rstat.rfiles, p);
- decode(rstat.rsubdirs, p);
- decode(rstat.rctime, p);
-
- decode(dirfragtree, p);
-
- decode(symlink, p);
-
- if (features & CEPH_FEATURE_DIRLAYOUTHASH)
+ if (features == (uint64_t)-1) {
+ DECODE_START(1, p);
+ decode(vino.ino, p);
+ decode(vino.snapid, p);
+ decode(rdev, p);
+ decode(version, p);
+ decode(xattr_version, p);
+ decode(cap, p);
+ {
+ ceph_file_layout legacy_layout;
+ decode(legacy_layout, p);
+ layout.from_legacy(legacy_layout);
+ }
+ decode(ctime, p);
+ decode(mtime, p);
+ decode(atime, p);
+ decode(time_warp_seq, p);
+ decode(size, p);
+ decode(max_size, p);
+ decode(truncate_size, p);
+ decode(truncate_seq, p);
+ decode(mode, p);
+ decode(uid, p);
+ decode(gid, p);
+ decode(nlink, p);
+ decode(dirstat.nfiles, p);
+ decode(dirstat.nsubdirs, p);
+ decode(rstat.rbytes, p);
+ decode(rstat.rfiles, p);
+ decode(rstat.rsubdirs, p);
+ decode(rstat.rctime, p);
+ decode(dirfragtree, p);
+ decode(symlink, p);
decode(dir_layout, p);
- else
- memset(&dir_layout, 0, sizeof(dir_layout));
-
- decode(xattrbl, p);
-
- if (features & CEPH_FEATURE_MDS_INLINE_DATA) {
+ decode(xattrbl, p);
decode(inline_version, p);
decode(inline_data, p);
- } else {
- inline_version = CEPH_INLINE_NONE;
- }
-
- if (features & CEPH_FEATURE_MDS_QUOTA)
decode(quota, p);
- else
- quota = quota_info_t{};
-
- if ((features & CEPH_FEATURE_FS_FILE_LAYOUT_V2))
decode(layout.pool_ns, p);
- if ((features & CEPH_FEATURE_FS_BTIME)) {
decode(btime, p);
decode(change_attr, p);
- } else {
- btime = utime_t();
- change_attr = 0;
+ DECODE_FINISH(p);
+ }
+ else {
+ decode(vino.ino, p);
+ decode(vino.snapid, p);
+ decode(rdev, p);
+ decode(version, p);
+ decode(xattr_version, p);
+ decode(cap, p);
+ {
+ ceph_file_layout legacy_layout;
+ decode(legacy_layout, p);
+ layout.from_legacy(legacy_layout);
+ }
+ decode(ctime, p);
+ decode(mtime, p);
+ decode(atime, p);
+ decode(time_warp_seq, p);
+ decode(size, p);
+ decode(max_size, p);
+ decode(truncate_size, p);
+ decode(truncate_seq, p);
+ decode(mode, p);
+ decode(uid, p);
+ decode(gid, p);
+ decode(nlink, p);
+ decode(dirstat.nfiles, p);
+ decode(dirstat.nsubdirs, p);
+ decode(rstat.rbytes, p);
+ decode(rstat.rfiles, p);
+ decode(rstat.rsubdirs, p);
+ decode(rstat.rctime, p);
+ decode(dirfragtree, p);
+ decode(symlink, p);
+ if (features & CEPH_FEATURE_DIRLAYOUTHASH)
+ decode(dir_layout, p);
+ else
+ memset(&dir_layout, 0, sizeof(dir_layout));
+
+ decode(xattrbl, p);
+
+ if (features & CEPH_FEATURE_MDS_INLINE_DATA) {
+ decode(inline_version, p);
+ decode(inline_data, p);
+ } else {
+ inline_version = CEPH_INLINE_NONE;
+ }
+
+ if (features & CEPH_FEATURE_MDS_QUOTA)
+ decode(quota, p);
+ else
+ quota = quota_info_t{};
+
+ if ((features & CEPH_FEATURE_FS_FILE_LAYOUT_V2))
+ decode(layout.pool_ns, p);
+
+ if ((features & CEPH_FEATURE_FS_BTIME)) {
+ decode(btime, p);
+ decode(change_attr, p);
+ } else {
+ btime = utime_t();
+ change_attr = 0;
+ }
}
}