mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Trond Myklebust <trond.myklebust@fys.uio.no>
To: David Howells <dhowells@redhat.com>
Cc: Stephen Smalley <sds@tycho.nsa.gov>,
	Karl MacMillan <kmacmill@redhat.com>,
	jmorris@namei.org, chrisw@sous-sol.org, selinux@tycho.nsa.gov,
	linux-kernel@vger.kernel.org, aviro@redhat.com
Subject: Re: Security issues with local filesystem caching
Date: Wed, 15 Nov 2006 09:05:42 -0500	[thread overview]
Message-ID: <1163599542.5691.84.camel@lade.trondhjem.org> (raw)
In-Reply-To: <11957.1163532168@redhat.com>

On Tue, 2006-11-14 at 19:22 +0000, David Howells wrote:
> Trond Myklebust <trond.myklebust@fys.uio.no> wrote:
> 
> > > Avoiding context switches aren't the main problem; avoiding serialisation
> > > is.
> > 
> > Why? It is a backing cache. The only case where serialisation ought to
> > bother you is the case where the client has to invalidate the cache due
> > to a server-side update of the file.
> 
> Cache invalidation is not so much of a problem as at that point we know exactly
> where whatever it is that we're invalidating is, and if it's a big object we
> just move it somewhere for the userspace daemon to splat.
> 
> The serialisation problem is that if we put cache lookup in its own thread,
> then in effect every open[*] of an NFS file, AFS file, whatever, will be
> serialised.
>
> It almost certainly wouldn't matter if what we did was to asynchronously look
> up the cache cookie for a file.  In the common case, an open(O_RDONLY) syscall
> is followed almost immediately by a read(), so there's not much to be gained
> from asynchronising things as the cache cookie has to be available by the time
> we come to process the read, but we can't get the cache cookie before
> completing the server checks made by open, as we need the coherency data before
> attempting to acquire a cookie.

No. All you should need is the result of the lookup(). The coherency
data needs to be checked against an eventual existing CacheFiles entry
during the call to read(), not before.

> The serialisation would stem from having to do several synchronous filesystem
> ops for each cache lookup, but only having one thread in which to do them.
> Okay, I could have several worker threads, but why?  Each process attempting to
> access the cache provides me with a suitable worker thread, and then I can have
> as many as there are tasks on the system.

Umm...because the former is a model which actually fits your security
requirements (i.e. one privileged daemon gets lookup()+open()+mkdir()...
rights on the CacheFiles partition), whereas the latter is not (all
tasks need lookup()+open()+mkdir().... privileges)?

> [*] Note that for NFS I've now incorporated a patch from Steve Dickson to
> acquire file cookies on the NFS open() file op, rather than during iget because
> NFS readdir calls iget.
> 
> > Once the RPC calls have been launched, the process returns to the VM
> > layer and just waits for the next page to be unlocked. It never returns
> > to the filesystem layer. So where are you using the process context to
> > write out the cached data?
> 
> What do you mean by "write out the cached data"?  Do you mean write the data to
> the cache?
> 
> If so, that'd be nfs_readpage_to_fscache() as called from nfs_readpage_sync()
> or nfs_readpage_release().

nfs_readpage_release() is an rpciod context, _not_ a user thread
context.

> That calls fscache_write_page() which calls cachefiles_write_page() which calls
> generic_file_buffered_write_one_kernel_page().
> 
> That last copies the data into the pagecache attached to an ext3 inode to be
> written out (hopefully) asynchronously.
> 
> However, that may do other disk accesses, I suppose, as it calls
> prepare_write() and commit_write() on ext3.

Which would generally be forbidden under the rpciod context, BTW, since
they imply calls to generic memory allocation (== nasty tricksy deadlock
potential, since rpciod may be called upon to help write out NFS pages
via shrink_page_list and friends).

> I could try and make it asynchronous, but that means more overhead in other
> ways:-(  I presume this will then sometimes be running in rpciod context?
> 
> > The cookie lookups need to be synchronous, but why would the file
> > creation need to be synchronous? Creating the cachefs file and waiting
> > on that to complete etc are all utterly useless activities as far as
> > satisfying the user request for data goes. Just start the process of
> > creating a backing file, and then get on with the actual syscall.
> 
> vfs_mkdir() is synchronous.  vfs_create() is synchronous.  vfs_[sg]etxattr is
> synchronous.  Lookup is synchronous.

All of them are synchronous as far as accessing the remote filesystem is
concerned. Why would the user process care if a privileged daemon has
completed the shadow mkdir() or create() on the CacheFiles system or
not?

> Yes, I could make them all asynchronous, but it'd be a lot more work, and
> mostly unnecessary, and I'd probably have to fight down lots of objections.
> 
> 
> Remember: in the common case, open(O_RDONLY) is going to be followed quickly by
> a read().  I suppose there may be an intervening stat() and malloc(), but even
> so...

Which is why lookup() + open() + read() needs to be fast in the case
where you have a CacheFiles hit. It does not justify mkdir, create, etc
being fast, nor does it justify the open() + read() part needing to be
fast in the case of a CacheFiles miss.

  Trond


  reply	other threads:[~2006-11-15 14:06 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-25 10:14 David Howells
2006-10-25 16:52 ` Nate Diller
2006-10-25 16:48   ` Jeff V. Merkey
2006-10-25 17:21   ` David Howells
2006-10-25 17:42     ` Jeff V. Merkey
2006-10-25 18:15     ` David Howells
2006-10-25 20:21 ` Josef Sipek
2006-10-25 20:28   ` Josef Sipek
2006-10-25 21:12 ` Stephen Smalley
2006-10-25 23:37 ` Alan Cox
2006-10-26  0:32   ` Al Viro
2006-10-26 10:54     ` Alan Cox
2006-10-26 10:45   ` David Howells
2006-10-26  9:14 ` Jan Dittmer
2006-10-26 11:52   ` Alan Cox
2006-10-26  9:56 ` David Howells
2006-10-27 15:54   ` Josef Sipek
2006-10-26 10:40 ` David Howells
2006-10-26 12:51   ` Stephen Smalley
2006-10-26 16:04   ` David Howells
2006-10-26 16:34     ` Stephen Smalley
2006-10-26 17:09     ` David Howells
2006-10-26 17:45       ` Stephen Smalley
2006-10-26 22:53       ` David Howells
2006-10-27 14:48         ` Stephen Smalley
2006-10-27 15:42         ` David Howells
2006-10-27 16:10           ` Stephen Smalley
2006-10-27 16:25           ` David Howells
2006-10-27 17:09             ` Stephen Smalley
2006-10-27 17:34             ` David Howells
2006-10-27 14:41       ` David Howells
2006-10-26 10:55 ` David Howells
2006-10-31 21:26 ` David Howells
2006-11-01 13:28   ` Stephen Smalley
2006-11-01 15:34   ` David Howells
2006-11-01 15:58     ` Karl MacMillan
2006-11-01 17:45       ` Stephen Smalley
2006-11-02 16:29         ` Karl MacMillan
2006-11-02 18:04           ` Stephen Smalley
2006-11-01 17:30     ` Stephen Smalley
2006-11-02 17:16     ` David Howells
2006-11-02 19:49       ` Trond Myklebust
2006-11-02 20:33       ` Stephen Smalley
2006-11-02 20:38       ` David Howells
2006-11-02 21:24         ` Trond Myklebust
2006-11-03 10:27         ` David Howells
2006-11-03 13:41           ` Trond Myklebust
2006-11-03 15:23           ` David Howells
2006-11-03 17:30             ` Trond Myklebust
2006-11-14 19:22             ` David Howells
2006-11-15 14:05               ` Trond Myklebust [this message]
2006-11-15 15:28               ` David Howells
2006-11-15 16:41                 ` Trond Myklebust
2006-11-15 18:17                 ` David Howells
2006-11-03 15:33           ` David Howells
2006-11-02 21:05       ` David Howells

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=1163599542.5691.84.camel@lade.trondhjem.org \
    --to=trond.myklebust@fys.uio.no \
    --cc=aviro@redhat.com \
    --cc=chrisw@sous-sol.org \
    --cc=dhowells@redhat.com \
    --cc=jmorris@namei.org \
    --cc=kmacmill@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sds@tycho.nsa.gov \
    --cc=selinux@tycho.nsa.gov \
    /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

all inboxes | Powered by JetHome®