From: "J. Bruce Fields" <bfields@fieldses.org>
To: Mimi Zohar <zohar@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org,
linux-security-module@vger.kernel.org,
linux-fsdevel@vger.kernel.org, hch@infradead.org,
warthog9@kernel.org, david@fromorbit.com, jmorris@namei.org,
kyle@mcmartin.ca, hpa@zytor.com, akpm@linux-foundation.org,
torvalds@linux-foundation.org, mingo@elte.hu, eparis@redhat.com,
viro@zeniv.linux.org.uk, Matthew Wilcox <matthew@wil.cx>
Subject: Re: [PATCH 0/4] IMA: making i_readcount a first class inode citizen
Date: Fri, 5 Nov 2010 12:28:11 -0400 [thread overview]
Message-ID: <20101105162811.GA3270@fieldses.org> (raw)
In-Reply-To: <1288955286.3135.9.camel@localhost.localdomain>
On Fri, Nov 05, 2010 at 07:08:06AM -0400, Mimi Zohar wrote:
> On Thu, 2010-11-04 at 21:12 -0400, J. Bruce Fields wrote:
> > On Thu, Oct 28, 2010 at 06:02:01PM -0400, Mimi Zohar wrote:
> > > On Mon, 2010-10-25 at 14:41 -0400, Eric Paris wrote:
> > >
> > > <snip>
> > >
> > > > I believe that IBM is going to look into making i_readcount a first
> > > > class citizen which can be used by both IMA and generic_setlease().
> > > > Then people could say IMA had 0 per inode overhead :)
> > >
> > > This patchset separates the incrementing/decrementing of the i_readcount,
> > > in the VFS layer, from other IMA functionality, by replacing the current
> > > ima_counts_get() call with iget_readcount(). Its unclear whether this
> > > call to increment i_readcount should be made earlier.
> > >
> > > The patch ordering is a bit redundant in order to leave removing the ifdef
> > > around i_readcount until the last patch. The first three patches: defines
> > > iget/iput_readcount(), moves the IMA functionality in ima_counts_get() to
> > > ima_file_check(), and removes the IMA imbalance code, simplifying IMA. The
> > > last patch moves iget/iput_readcount() to the fs directory and removes the
> > > ifdef around i_readcount, making i_readcount into a "first class inode citizen".
> > >
> > > The generic_setlease code could then take advantage of i_readcount, assuming
> > > it can take the spin_lock, by doing something like:
> > >
> > > - if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0))
> > > +
> > > + spin_lock(&inode->i_lock);
> > > + if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0)){
> > > + spin_unlock(&inode->i_lock);
> > > goto out;
> > > - if ((arg == F_WRLCK)
> > > - && ((atomic_read(&dentry->d_count) > 1)
> > > - || (atomic_read(&inode->i_count) > 1)))
> > > + }
> > > + if ((arg == F_WRLCK) && (inode->i_readcount > 1)) {
> > > + spin_unlock(&inode->i_lock);
> > > goto out;
> > > + }
> > > + spin_unlock(&inode->i_lock);
> > > }
> >
> > Seems like an improvement.
> >
> > It still leaves the race:
> >
> > may_open calls lease_break, finds no lease
> >
> > setlease checks read/writecount, finds 0,
> > creates lease
> >
> > __dentry_open bumps read/writecount
> >
> > (Is there any reason we couldn't move the break_lease to after bumping
> > read or write count?)
> >
> > --b.
>
> Right, like the ima_file_check(), which is after the __dentry_open().
> Al, is it possible to move the break_lease() in may_open() to later?
That would still leave a race like:
check count
bump count
break lease
set lease
But we could extend the i_lock to prevent the lease being bumped between
the two steps on the right-hand side.
At that point I think we'd be done? We're assured the count is still
zero while the lease is added to the inode, so anyone in the process of
doing an open has yet to reach the break_lease, which will see the newly
added lease.
That leaves the problem that leases really should be broken on anything
that changes the attributes or the dentries pointing to the inode:
setattr, link, unlink, rename, at least.
One approach: add another counter to the inode named disable_leases, and
have any of those operations do something like:
disable_lease++
break_lease
... do operation ...
disable_lease--
?
--b.
next prev parent reply other threads:[~2010-11-05 16:28 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-28 22:02 [PATCH 0/4] IMA: making i_readcount a first class inode citizen Mimi Zohar
2010-10-28 22:02 ` [PATCH 1/4] IMA: define readcount functions Mimi Zohar
2010-10-28 22:02 ` [PATCH 2/4] IMA: maintain i_readcount in the VFS layer Mimi Zohar
2010-10-29 14:13 ` Valdis.Kletnieks
2010-10-29 15:15 ` Valdis.Kletnieks
2010-10-28 22:02 ` [PATCH 3/4] IMA: remove IMA imbalance checking Mimi Zohar
2010-10-28 22:02 ` [PATCH 4/4] IMA: making i_readcount a first class inode citizen Mimi Zohar
2010-10-28 22:24 ` [PATCH 0/4] " Dave Chinner
2010-10-28 22:29 ` Linus Torvalds
2010-10-28 22:38 ` Mimi Zohar
2010-10-28 22:46 ` Linus Torvalds
2010-10-28 23:25 ` Al Viro
2010-10-28 22:45 ` Eric Paris
2010-10-29 0:30 ` Mimi Zohar
2010-11-06 10:44 ` Pavel Machek
2010-11-05 1:12 ` J. Bruce Fields
2010-11-05 11:08 ` Mimi Zohar
2010-11-05 16:28 ` J. Bruce Fields [this message]
2010-11-05 17:38 ` Mimi Zohar
2010-11-05 19:08 ` J. Bruce Fields
2010-11-05 20:58 ` J. Bruce Fields
2010-11-07 0:03 ` Mimi Zohar
-- strict thread matches above, loose matches on Subject: below --
2011-02-14 20:29 Mimi Zohar
2011-02-16 23:08 ` Mimi Zohar
2011-02-17 1:46 ` James Morris
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=20101105162811.GA3270@fieldses.org \
--to=bfields@fieldses.org \
--cc=akpm@linux-foundation.org \
--cc=david@fromorbit.com \
--cc=eparis@redhat.com \
--cc=hch@infradead.org \
--cc=hpa@zytor.com \
--cc=jmorris@namei.org \
--cc=kyle@mcmartin.ca \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=mingo@elte.hu \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=warthog9@kernel.org \
--cc=zohar@linux.vnet.ibm.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;
as well as URLs for NNTP newsgroup(s).