Skip to content

Commit

Permalink
ceph: do not clear I_COMPLETE from d_release
Browse files Browse the repository at this point in the history
First, this was racy anyway: d_release isn't called until well after the
dentry is unhashed.  Second, this runs afoul of the recent dcache change
that clears d_parent prior to calling d_release (949854d), causing a NULL
pointer dereference.

Signed-off-by: Sage Weil <sage@newdream.net>
  • Loading branch information
Sage Weil committed Mar 3, 2011
1 parent b545cc1 commit 16a8b70
Showing 1 changed file with 1 addition and 21 deletions.
22 changes: 1 addition & 21 deletions fs/ceph/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,28 +1029,8 @@ static int ceph_d_revalidate(struct dentry *dentry, struct nameidata *nd)
static void ceph_dentry_release(struct dentry *dentry)
{
struct ceph_dentry_info *di = ceph_dentry(dentry);
struct inode *parent_inode = NULL;
u64 snapid = CEPH_NOSNAP;

if (!IS_ROOT(dentry)) {
parent_inode = dentry->d_parent->d_inode;
if (parent_inode)
snapid = ceph_snap(parent_inode);
}
dout("dentry_release %p parent %p\n", dentry, parent_inode);
if (parent_inode && snapid != CEPH_SNAPDIR) {
struct ceph_inode_info *ci = ceph_inode(parent_inode);

spin_lock(&parent_inode->i_lock);
if (ci->i_shared_gen == di->lease_shared_gen ||
snapid <= CEPH_MAXSNAP) {
dout(" clearing %p complete (d_release)\n",
parent_inode);
ci->i_ceph_flags &= ~CEPH_I_COMPLETE;
ci->i_release_count++;
}
spin_unlock(&parent_inode->i_lock);
}
dout("dentry_release %p\n", dentry);
if (di) {
ceph_dentry_lru_del(dentry);
if (di->lease_session)
Expand Down

0 comments on commit 16a8b70

Please sign in to comment.