[Ocfs2-devel] [PATCH 5/5] ocfs2: Remove bogus link count decrement

Jan Kara jack at suse.cz
Wed Jan 14 03:19:11 PST 2009


On Wed 14-01-09 13:56:55, tristan.ye wrote:
> On Mon, 2009-01-12 at 23:20 +0100, Jan Kara wrote:
> > In ocfs2_unlink() we decremented i_nlink three times for directories (instead
> > of just two times). This actually did not matter because we have
> > ocfs2_drop_inode() which decides whether the inode should be deleted based on a
> > flag but it's at least surprising for a link count to wrap...
> > 
> > Signed-off-by: Jan Kara <jack at suse.cz>
> > ---
> >  fs/ocfs2/namei.c |    2 --
> >  1 files changed, 0 insertions(+), 2 deletions(-)
> > 
> > diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c
> > index 084aba8..892d5e7 100644
> > --- a/fs/ocfs2/namei.c
> > +++ b/fs/ocfs2/namei.c
> > @@ -888,8 +888,6 @@ static int ocfs2_unlink(struct inode *dir,
> >  	}
> >  
> >  	dir->i_ctime = dir->i_mtime = CURRENT_TIME;
> > -	if (S_ISDIR(inode->i_mode))
> > -		drop_nlink(dir);
> 
> I thought the logic of original ocfs2_unlink() has no problem, it seems
> just drop the link count 2 times to release reference count for  '.' and
> '..' in all for the deleting directory inode.
> 
> The code you've truncated is the logic to drop link count for its parent
> directory, and it's a REQUIRED action, you may see it as
> drop_nlink(inode) by mistake:-) ? 
  Yes, I've read the code wrong. Thanks for spotting this.

> Otherwise, VFS unlink() will hit a failure when deleting a dir which
> containes sub_dir entires.  Like following,
> 
> 1. mkdir a
> 
> 2. mkdir -p a/b
> 
> 3. rm -rf a
> rm: cannot remove directory `a/': Directory not empty
  Hmm, I was just testing on one level of directories so my testing didn't
reveal the problem. Sigh.

									Honza

-- 
Jan Kara <jack at suse.cz>
SUSE Labs, CR



More information about the Ocfs2-devel mailing list