|
@@ -845,7 +845,7 @@ static void ceph_set_dentry_offset(struct dentry *dn)
|
|
|
* the caller) if we fail.
|
|
|
*/
|
|
|
static struct dentry *splice_dentry(struct dentry *dn, struct inode *in,
|
|
|
- bool *prehash)
|
|
|
+ bool *prehash, bool set_offset)
|
|
|
{
|
|
|
struct dentry *realdn;
|
|
|
|
|
@@ -877,7 +877,8 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in,
|
|
|
}
|
|
|
if ((!prehash || *prehash) && d_unhashed(dn))
|
|
|
d_rehash(dn);
|
|
|
- ceph_set_dentry_offset(dn);
|
|
|
+ if (set_offset)
|
|
|
+ ceph_set_dentry_offset(dn);
|
|
|
out:
|
|
|
return dn;
|
|
|
}
|
|
@@ -1062,7 +1063,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
|
|
|
d_delete(dn);
|
|
|
goto done;
|
|
|
}
|
|
|
- dn = splice_dentry(dn, in, &have_lease);
|
|
|
+ dn = splice_dentry(dn, in, &have_lease, true);
|
|
|
if (IS_ERR(dn)) {
|
|
|
err = PTR_ERR(dn);
|
|
|
goto done;
|
|
@@ -1105,7 +1106,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
|
|
|
goto done;
|
|
|
}
|
|
|
dout(" linking snapped dir %p to dn %p\n", in, dn);
|
|
|
- dn = splice_dentry(dn, in, NULL);
|
|
|
+ dn = splice_dentry(dn, in, NULL, true);
|
|
|
if (IS_ERR(dn)) {
|
|
|
err = PTR_ERR(dn);
|
|
|
goto done;
|
|
@@ -1237,7 +1238,7 @@ retry_lookup:
|
|
|
err = PTR_ERR(in);
|
|
|
goto out;
|
|
|
}
|
|
|
- dn = splice_dentry(dn, in, NULL);
|
|
|
+ dn = splice_dentry(dn, in, NULL, false);
|
|
|
if (IS_ERR(dn))
|
|
|
dn = NULL;
|
|
|
}
|