From: Timothy Shimmin <tes@sgi.com>
To: Barry Naujok <bnaujok@sgi.com>
Cc: "xfs@oss.sgi.com" <xfs@oss.sgi.com>, xfs-dev <xfs-dev@sgi.com>
Subject: Re: Adding attr, inode reference query
Date: Tue, 07 Oct 2008 11:45:12 +1100 [thread overview]
Message-ID: <48EAB118.7070606@sgi.com> (raw)
In-Reply-To: <op.uimntunh3jf8g2@pc-bnaujok.melbourne.sgi.com>
Barry Naujok wrote:
> I'm doing a bit of debugging with attr creation in xfs_repair which uses
> libxfs which has it's own simple cache/ref counting/transaction mechanism
> for inodes and buffers.
>
> I came across a refcounting issue when adding an extended attribute to an
> inode, calling xfs_attr_set_int (indirectly in Phase 6):
> - if there are no extended attributes, a attr fork area is created within
> the inode (calling xfs_bmap_add_attrfork). After this call in libxfs,
> the inode is derefenced.
> - if extended attributes already exist, the inode isn't dereferenced
> after calling xfs_attr_set_int.
>
> I seem to have traced this down to xfs_bmap_add_attrfork not calling
> xfs_trans_ihold after calling xfs_trans_ijoin like other similar functions.
> BUT, it does call IHOLD(ip).
>
> It seems most other routines do call xfs_trans_ihold, esp in the attr code.
>
> Also, it seems IHOLD isn't normally called in these routine in the
> core XFS code.
>
> Is this a bug in xfs_bmap_add_attrfork?
Yeah, it looks wrong to me too.
doucette |1.153| | ASSERT(ip->i_d.di_anextents == 0);
doucette |1.148| | VN_HOLD(XFS_ITOV(ip));
doucette |1.146| | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
doucette |1.213| | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
----------------------------
revision 1.148
date: 1995/05/19 22:41:52; author: doucette; state: Exp; lines: +5 -4
More progress on attributes: fix the transaction reservation in
xfs_bmap_add_attrfork (to be permanent). Hold the vnode so it won't
go away at transaction commit.
----------------------------
So the xfs_trans_ihold sets a flag on item:
ip->i_itemp->ili_flags |= XFS_ILI_HOLD;
preventing an xfs_iput (unlock, irele) from xfs_inode_item_unlock, from IOP_UNLOCK,
from xfs_trans_unlock_chunk() from xfs_trans_unlock_items() from
_xfs_trans_commit etc...
i.e. from unlocking,unrefing on transaction commit.
So I guess, in current code we are taking an extra reference here instead of just stopping
the inode from being unlocked, and a ref dropped at commit time.
Be interesting to see where we do this throughout the code -> audit.
And why have we normally gotten away with this?
--Tim
next prev parent reply other threads:[~2008-10-07 0:43 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-07 0:04 Adding attr, inode reference query Barry Naujok
2008-10-07 0:45 ` Timothy Shimmin [this message]
2008-10-07 0:54 ` Dave Chinner
2008-10-07 1:23 ` Timothy Shimmin
2008-10-07 1:30 ` Timothy Shimmin
2008-10-07 1:51 ` Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48EAB118.7070606@sgi.com \
--to=tes@sgi.com \
--cc=bnaujok@sgi.com \
--cc=xfs-dev@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox