assert(in.get_replica_nonce() >= 0);
}
- if (in.is_symlink()) out << " symlink='" << in.symlink << "'";
- if (in.is_dir() && !in.dirfragtree.empty()) out << " " << in.dirfragtree;
+ if (in.is_symlink())
+ out << " symlink='" << in.symlink << "'";
+ if (in.is_dir() && !in.dirfragtree.empty())
+ out << " " << in.dirfragtree;
out << " v" << in.get_version();
// locks
out << " " << in.authlock;
out << " " << in.linklock;
- out << " " << in.dirfragtreelock;
- if (in.inode.is_dir())
+ if (in.inode.is_dir()) {
+ out << " " << in.dirfragtreelock;
out << " " << in.dirlock;
- else
+ out << " " << in.snaplock;
+ } else
out << " " << in.filelock;
out << " " << in.xattrlock;
case CEPH_LOCK_IXATTR:
::encode(xattrs, bl);
break;
+
+ case CEPH_LOCK_ISNAP:
+ encode_snap(bl);
+ break;
default:
assert(0);
::decode(xattrs, p);
break;
+ case CEPH_LOCK_ISNAP:
+ decode_snap(p);
+ break;
+
default:
assert(0);
}
::encode(filelock, bl);
::encode(dirlock, bl);
::encode(xattrlock, bl);
+ ::encode(snaplock, bl);
get(PIN_TEMPEXPORTING);
}
::decode(filelock, p);
::decode(dirlock, p);
::decode(xattrlock, p);
+ ::decode(snaplock, p);
}
static const int WAIT_DIRLOCK_OFFSET = 4 + 3*SimpleLock::WAIT_BITS; // same
static const int WAIT_VERSIONLOCK_OFFSET = 4 + 4*SimpleLock::WAIT_BITS;
static const int WAIT_XATTRLOCK_OFFSET = 4 + 5*SimpleLock::WAIT_BITS;
+ static const int WAIT_SNAPLOCK_OFFSET = 4 + 6*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),
+ snaplock(this, CEPH_LOCK_ISNAP, WAIT_SNAPLOCK_OFFSET)
{
memset(&inode, 0, sizeof(inode));
state = 0;
FileLock filelock;
ScatterLock dirlock;
SimpleLock xattrlock;
+ SimpleLock snaplock;
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_ISNAP: return &snaplock;
}
return 0;
}
dirlock.replicate_relax();
xattrlock.replicate_relax();
+ snaplock.replicate_relax();
}
__u32 filelock_state;
__u32 dirlock_state;
__u32 xattrlock_state;
+ __u32 snaplock_state;
public:
CInodeDiscover() {}
filelock_state = in->filelock.get_replica_state();
dirlock_state = in->dirlock.get_replica_state();
xattrlock_state = in->xattrlock.get_replica_state();
+ snaplock_state = in->snaplock.get_replica_state();
}
CInodeDiscover(bufferlist::iterator &p) {
decode(p);
in->filelock.set_state(filelock_state);
in->dirlock.set_state(dirlock_state);
in->xattrlock.set_state(xattrlock_state);
+ in->snaplock.set_state(snaplock_state);
}
void encode(bufferlist &bl) const {
::encode(filelock_state, bl);
::encode(dirlock_state, bl);
::encode(xattrlock_state, bl);
+ ::encode(snaplock_state, bl);
}
void decode(bufferlist::iterator &p) {
::decode(filelock_state, p);
::decode(dirlock_state, p);
::decode(xattrlock_state, p);
+ ::decode(snaplock_state, p);
}
};