we will never link dentry in deleted directory to inode, so it's
OK to remove client leases prematurely. This optimization allows
us to purge deleted directory inode earlier.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
locker->eval_gather(&lock);
}
+void CDentry::remove_client_leases(Locker *locker)
+{
+ while (!client_lease_map.empty())
+ remove_client_lease(client_lease_map.begin()->second, locker);
+}
+
void CDentry::_put()
{
if (get_num_ref() <= ((int)is_dirty() + 1)) {
class CInode;
class CDir;
-
+class Locker;
class Message;
class CDentry;
class LogSegment;
}
ClientLease *add_client_lease(client_t c, Session *session);
- void remove_client_lease(ClientLease *r, class Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers
-
+ void remove_client_lease(ClientLease *r, Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers
+ void remove_client_leases(Locker *locker);
ostream& print_db_line_prefix(ostream& out);
continue; // shouldn't happen
if (dn->is_dirty())
dn->mark_clean();
+ // It's OK to remove lease prematurely because we will never link
+ // the dentry to inode again.
+ if (dn->is_any_leases())
+ dn->remove_client_leases(cache->mds->locker);
if (dn->get_num_ref() == 0)
remove_dentry(dn);
}