ceph: call update_dentry_lease even when r_locked dir is not set
We don't really require that the parent be locked in order to update the lease on a dentry. Lease info is protected by the d_lock. In the event that the parent is not locked in ceph_fill_trace, and we have both parent and target info, go ahead and update the dentry lease. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Yan, Zheng <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
Родитель
f5d55f0397
Коммит
cdde7c4351
|
@ -1360,6 +1360,26 @@ retry_lookup:
|
|||
goto done;
|
||||
}
|
||||
req->r_dentry = dn; /* may have spliced */
|
||||
} else if (rinfo->head->is_dentry) {
|
||||
struct ceph_vino *ptvino = NULL;
|
||||
|
||||
if ((le32_to_cpu(rinfo->diri.in->cap.caps) & CEPH_CAP_FILE_SHARED) ||
|
||||
le32_to_cpu(rinfo->dlease->duration_ms)) {
|
||||
dvino.ino = le64_to_cpu(rinfo->diri.in->ino);
|
||||
dvino.snap = le64_to_cpu(rinfo->diri.in->snapid);
|
||||
|
||||
if (rinfo->head->is_target) {
|
||||
tvino.ino = le64_to_cpu(rinfo->targeti.in->ino);
|
||||
tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
|
||||
ptvino = &tvino;
|
||||
}
|
||||
|
||||
update_dentry_lease(req->r_dentry, rinfo->dlease,
|
||||
session, req->r_request_started, ptvino,
|
||||
&dvino);
|
||||
} else {
|
||||
dout("%s: no dentry lease or dir cap\n", __func__);
|
||||
}
|
||||
}
|
||||
done:
|
||||
dout("fill_trace done err=%d\n", err);
|
||||
|
|
Загрузка…
Ссылка в новой задаче