ceph: keep reference to parent inode on ceph_dentry
When creating a new dentry we now hold a reference to the parent
inode in the ceph_dentry. This is required due to the new RCU
changes from 949854d0
, which set dentry->d_parent to NULL in d_kill before
calling the ->release() callback. If/when that behavior is changed, we can
revert this hack.
Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
Родитель
e8e1ba96b2
Коммит
97d79b403e
|
@ -60,6 +60,7 @@ int ceph_init_dentry(struct dentry *dentry)
|
|||
}
|
||||
di->dentry = dentry;
|
||||
di->lease_session = NULL;
|
||||
di->parent_inode = igrab(dentry->d_parent->d_inode);
|
||||
dentry->d_fsdata = di;
|
||||
dentry->d_time = jiffies;
|
||||
ceph_dentry_lru_add(dentry);
|
||||
|
@ -1025,7 +1026,7 @@ static void ceph_dentry_release(struct dentry *dentry)
|
|||
u64 snapid = CEPH_NOSNAP;
|
||||
|
||||
if (!IS_ROOT(dentry)) {
|
||||
parent_inode = dentry->d_parent->d_inode;
|
||||
parent_inode = di->parent_inode;
|
||||
if (parent_inode)
|
||||
snapid = ceph_snap(parent_inode);
|
||||
}
|
||||
|
@ -1050,6 +1051,8 @@ static void ceph_dentry_release(struct dentry *dentry)
|
|||
kmem_cache_free(ceph_dentry_cachep, di);
|
||||
dentry->d_fsdata = NULL;
|
||||
}
|
||||
if (parent_inode)
|
||||
iput(parent_inode);
|
||||
}
|
||||
|
||||
static int ceph_snapdir_d_revalidate(struct dentry *dentry,
|
||||
|
|
|
@ -207,6 +207,7 @@ struct ceph_dentry_info {
|
|||
struct dentry *dentry;
|
||||
u64 time;
|
||||
u64 offset;
|
||||
struct inode *parent_inode;
|
||||
};
|
||||
|
||||
struct ceph_inode_xattrs_info {
|
||||
|
|
Загрузка…
Ссылка в новой задаче