|
@@ -1016,6 +1016,7 @@ static void update_dentry_lease(struct dentry *dentry,
|
|
|
long unsigned ttl = from_time + (duration * HZ) / 1000;
|
|
|
long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000;
|
|
|
struct inode *dir;
|
|
|
+ struct ceph_mds_session *old_lease_session = NULL;
|
|
|
|
|
|
/*
|
|
|
* Make sure dentry's inode matches tgt_vino. NULL tgt_vino means that
|
|
@@ -1051,8 +1052,10 @@ static void update_dentry_lease(struct dentry *dentry,
|
|
|
time_before(ttl, di->time))
|
|
|
goto out_unlock; /* we already have a newer lease. */
|
|
|
|
|
|
- if (di->lease_session && di->lease_session != session)
|
|
|
- goto out_unlock;
|
|
|
+ if (di->lease_session && di->lease_session != session) {
|
|
|
+ old_lease_session = di->lease_session;
|
|
|
+ di->lease_session = NULL;
|
|
|
+ }
|
|
|
|
|
|
ceph_dentry_lru_touch(dentry);
|
|
|
|
|
@@ -1065,6 +1068,8 @@ static void update_dentry_lease(struct dentry *dentry,
|
|
|
di->time = ttl;
|
|
|
out_unlock:
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
+ if (old_lease_session)
|
|
|
+ ceph_put_mds_session(old_lease_session);
|
|
|
return;
|
|
|
}
|
|
|
|