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:
parent
f5d55f0397
commit
cdde7c4351
|
@ -1360,6 +1360,26 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
req->r_dentry = dn; /* may have spliced */
|
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:
|
done:
|
||||||
dout("fill_trace done err=%d\n", err);
|
dout("fill_trace done err=%d\n", err);
|
||||||
|
|
Loading…
Reference in New Issue