::encode(fcntl_locks, bl);
::encode(flock_locks, bl);
break;
+
+ case CEPH_LOCK_IPOLICY:
+ if (inode.is_dir()) {
+ ::encode((default_layout ? true : false), bl);
+ if (default_layout)
+ encode(*default_layout, bl);
+ }
+ break;
default:
assert(0);
::decode(flock_locks, p);
break;
+ case CEPH_LOCK_IPOLICY:
+ if (inode.is_dir()) {
+ bool default_layout_exists;
+ ::decode(default_layout_exists, p);
+ if (default_layout_exists) {
+ default_layout = new default_file_layout;
+ decode(*default_layout, p);
+ }
+ }
+ break;
+
default:
assert(0);
}
extern cinode_lock_info_t cinode_lock_info[];
extern int num_cinode_locks;
+/**
+ * Default file layout stuff. This lets us set a default file layout on
+ * a directory inode that all files in its tree will use on creation.
+ */
+struct default_file_layout {
+
+ ceph_file_layout layout;
+
+ void encode(bufferlist &bl) const {
+ __u8 struct_v = 1;
+ ::encode(struct_v, bl);
+ ::encode(layout, bl);
+ }
+
+ void decode(bufferlist::iterator& bl) {
+ __u8 struct_v;
+ ::decode(struct_v, bl);
+ if (struct_v != 1) { //uh-oh
+ dout(0) << "got default layout I don't understand!" << dendl;
+ assert(0);
+ }
+ ::decode(layout, bl);
+ }
+};
+WRITE_CLASS_ENCODER(default_file_layout);
+
+
// cached inode wrapper
class CInode : public MDSCacheObject {
private:
//bool hack_accessed;
//utime_t hack_load_stamp;
+ default_file_layout *default_layout;
+
/**
* Projection methods, used to store inode changes until they have been journaled,
* at which point they are popped.
snaprealm(0), containing_realm(0),
first(f), last(l),
last_journaled(0), //last_open_journaled(0),
+ default_layout(NULL),
//hack_accessed(true),
stickydir_ref(0),
parent(0),
void encode_parent_mutation(ObjectOperation& m);
void encode_store(bufferlist& bl) {
- __u8 struct_v = 1;
+ __u8 struct_v = 2;
::encode(struct_v, bl);
::encode(inode, bl);
if (is_symlink())
encode_snap_blob(snapbl);
::encode(snapbl, bl);
::encode(old_inodes, bl);
+ if (inode.is_dir()) {
+ ::encode((default_layout ? true : false), bl);
+ if (default_layout)
+ ::encode(*default_layout, bl);
+ }
}
void decode_store(bufferlist::iterator& bl) {
__u8 struct_v;
::decode(snapbl, bl);
decode_snap_blob(snapbl);
::decode(old_inodes, bl);
+ if (struct_v >= 2 && inode.is_dir()) {
+ bool default_layout_exists;
+ ::decode(default_layout_exists, bl);
+ if (default_layout_exists) {
+ default_layout = new default_file_layout;
+ ::decode(*default_layout, bl);
+ }
+ }
}
void encode_replica(int rep, bufferlist& bl) {
_encode_base(bl);
_encode_locks_state_for_replica(bl);
+ if (inode.is_dir()) {
+ ::encode((default_layout ? true : false), bl);
+ if (default_layout)
+ ::encode(*default_layout, bl);
+ }
}
void decode_replica(bufferlist::iterator& p, bool is_new) {
__u32 nonce;
replica_nonce = nonce;
_decode_base(p);
- _decode_locks_state(p, is_new);
+ _decode_locks_state(p, is_new);
+ if (inode.is_dir()) {
+ bool default_layout_exists;
+ ::decode(default_layout_exists, p);
+ if (default_layout_exists) {
+ default_layout = new default_file_layout;
+ ::decode(*default_layout, p);
+ }
+ }
}