}
-void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask,
- utime_t now, bufferlist &bl)
+void Locker::issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now,
+ bufferlist &bl)
{
client_t client = mdr->get_client();
Session *session = mdr->session;
!diri->is_stray() && // do not issue dn leases in stray dir!
!diri->filelock.can_lease(client) &&
!(diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL))) {
+ int mask = 0;
+ CDentry::linkage_t *dnl = dn->get_linkage(client, mdr);
+ if (dnl->is_primary()) {
+ ceph_assert(dnl->get_inode() == in);
+ mask = CEPH_LEASE_PRIMARY_LINK;
+ } else {
+ if (dnl->is_remote())
+ ceph_assert(dnl->get_remote_ino() == in->ino());
+ else
+ ceph_assert(!in);
+ }
// issue a dentry lease
ClientLease *l = dn->add_client_lease(client, session);
session->touch_lease(l);
} else {
// null lease
LeaseStat lstat;
- lstat.mask = mask;
+ lstat.mask = 0;
lstat.alternate_name = std::string(dn->alternate_name);
encode_lease(bl, session->info, lstat);
dout(20) << "issue_client_lease no/null lease on " << *dn << dendl;
// -- client leases --
void handle_client_lease(const cref_t<MClientLease> &m);
- void issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, utime_t now, bufferlist &bl);
+ void issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now, bufferlist &bl);
void revoke_client_leases(SimpleLock *lock);
static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls);
dout(20) << "set_trace_dist added dir " << *dir << dendl;
encode(dn->get_name(), bl);
-
- int lease_mask = 0;
- CDentry::linkage_t *dnl = dn->get_linkage(mdr->get_client(), mdr);
- if (dnl->is_primary()) {
- ceph_assert(dnl->get_inode() == in);
- lease_mask = CEPH_LEASE_PRIMARY_LINK;
- } else {
- if (dnl->is_remote())
- ceph_assert(dnl->get_remote_ino() == in->ino());
- else
- ceph_assert(!in);
- }
- mds->locker->issue_client_lease(dn, mdr, lease_mask, now, bl);
- dout(20) << "set_trace_dist added dn " << snapid << " " << *dn << dendl;
+ mds->locker->issue_client_lease(dn, in, mdr, now, bl);
} else
reply->head.is_dentry = 0;
// dentry
dout(12) << "including dn " << *dn << dendl;
encode(dn->get_name(), dnbl);
- int lease_mask = dnl->is_primary() ? CEPH_LEASE_PRIMARY_LINK : 0;
- mds->locker->issue_client_lease(dn, mdr, lease_mask, now, dnbl);
+ mds->locker->issue_client_lease(dn, in, mdr, now, dnbl);
// inode
dout(12) << "including inode " << *in << dendl;