On Thu, 2017-07-06 at 16:02 +0800, Yan, Zheng wrote: > Current code does not update ceph_dentry_info::lease_session once > it is set. If auth mds of corresponding dentry changes, dentry lease > stays in invalid state. > > Signed-off-by: "Yan, Zheng" <zyan@xxxxxxxxxx> > --- > fs/ceph/inode.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c > index 53f23c9..220dfd8 100644 > --- a/fs/ceph/inode.c > +++ b/fs/ceph/inode.c > @@ -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; > } > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html