On Thu, Nov 28, 2013 at 10:37:29AM +0800, Zhi Yong Wu wrote: > On Mon, Nov 25, 2013 at 9:51 PM, Christoph Hellwig <hch@xxxxxxxxxxxxx> wrote: > >> - ASSERT(ip->i_d.di_nlink > 0); > >> + if ((VFS_I(ip)->i_nlink == 0) && > >> + !(VFS_I(ip)->i_state & I_LINKABLE)) > >> + ASSERT(ip->i_d.di_nlink > 0); > > > > ASSERT(ip->i_d.di_nlink > 0 || (VFS_I(ip)->i_state & I_LINKABLE)); > This is wrong, and it should be > ASSERT(ip->i_d.di_nlink > 0 || !(VFS_I(ip)->i_state & I_LINKABLE)); Why we want to assrrt that either the link count is bigger than 0, or that the I_LINKABLE flag is set (for files created using O_TMPFILE) > >> + > >> + if ((VFS_I(sip)->i_nlink == 0) && > >> + (VFS_I(sip)->i_state & I_LINKABLE)) > >> + tres = &M_RES(mp)->tr_link_tmpfile; > >> + else > >> + tres = &M_RES(mp)->tr_link; > > > > Just check i_nlink, and for consistency it might make sense to just use > > the xfs_inode one. The VFS already made sure we don't inodes with > but struct xfs_inode has no stuff similar to i_nlink.... ip->i_d.di_nlink is the equivalent. > > I_LINKABLE and a zero link count. > No, pls see the chunk of code: > int vfs_link(struct dentry *old_dentry, struct inode *dir, struct > dentry *new_dentry) > { > ... > /* Make sure we don't allow creating hardlink to an unlinked file */ > if (inode->i_nlink == 0 && !(inode->i_state & I_LINKABLE)) > error = -ENOENT; This makes sure we never created a link if the count is zero unless the I_LINKABLE is set, so we'll never see a zero link count without I_LINKABLE. _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs