All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: NeilBrown <neil@brown.name>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
	Christian Brauner	 <brauner@kernel.org>,
	Chuck Lever <cel@kernel.org>,
	Jori Koolstra	 <jkoolstra@xs4all.nl>,
	Mateusz Guzik <mjguzik@gmail.com>,
	Dorjoy Chowdhury	 <dorjoychy111@gmail.com>,
	Trond Myklebust <trondmy@kernel.org>,
	Anna Schumaker	 <anna@kernel.org>,
	Andreas Gruenbacher <agruenba@redhat.com>,
	 gfs2@lists.linux.dev, Ilya Dryomov <idryomov@gmail.com>,
	Alex Markuze	 <amarkuze@redhat.com>,
	Viacheslav Dubeyko <slava@dubeyko.com>,
	 ceph-devel@vger.kernel.org, Paulo Alcantara <pc@manguebit.org>,
	Namjae Jeon <linkinjeon@kernel.org>,
	linux-cifs@vger.kernel.org,  linux-fsdevel@vger.kernel.org,
	linux-nfs@vger.kernel.org
Subject: Re: [PATCH v2 04/14] ceph: simplify atomic_open to use finish_no_open()
Date: Sat, 26 Sep 2026 07:48:17 -0400	[thread overview]
Message-ID: <230f4080d975d1960a5f38e53d9d43242acaeeed.camel@kernel.org> (raw)
In-Reply-To: <179037298028.37859.3168205779174130691@noble.neil.brown.name>

On Sat, 2026-09-26 at 07:49 +1000, NeilBrown wrote:
> On Thu, 24 Sep 2026, Jeff Layton wrote:
> > Another LLM review:
> > 
> > > diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> > > index bd3e3f5c269e..83ceb2906f85 100644
> > > --- a/fs/ceph/file.c
> > > +++ b/fs/ceph/file.c
> > 
> > [ ... ]
> > 
> > > @@ -977,33 +976,25 @@ int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
> > >  	}
> > >  	if (err)
> > >  		goto out_req;
> > > -	if (dn || d_really_is_negative(dentry) || d_is_symlink(dentry)) {
> > > -		/* make vfs retry on splice, ENOENT, or symlink */
> > > -		doutc(cl, "finish_no_open on dn %p\n", dn);
> > > -		err = finish_no_open(file, dn);
> > > -	} else {
> > > -		if (IS_ENCRYPTED(dir) &&
> > > -		    !fscrypt_has_permitted_context(dir, d_inode(dentry))) {
> > > -			pr_warn_client(cl,
> > > -					"Inconsistent encryption context (parent %llx:%llx child %llx:%llx)\n",
> > > -					ceph_vinop(dir), ceph_vinop(d_inode(dentry)));
> > > -			goto out_req;
> > > -		}
> > > +	if (IS_ENCRYPTED(dir) &&
> > > +	    !fscrypt_has_permitted_context(dir, d_inode(dentry))) {
> > > +		pr_warn_client(cl,
> > > +			       "Inconsistent encryption context (parent %llx:%llx child %llx:%llx)\n",
> > > +			       ceph_vinop(dir), ceph_vinop(d_inode(dentry)));
> > > +		goto out_req;
> > > +	}
> > 
> > The fscrypt check used to run only when the dentry was positive, not
> > a symlink, and had no alias. Now it runs unconditionally, but
> > d_inode() can still be NULL here: a lookup that found nothing leaves
> > a negative dentry with err == 0, and when the MDS reply splices an
> > alias the original dentry is never instantiated.
> > 
> > fscrypt_has_permitted_context() dereferences its child argument
> > without checking for NULL:
> > 
> > fs/crypto/policy.c:fscrypt_has_permitted_context() {
> > 	...
> > 	if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
> > 	    !S_ISLNK(child->i_mode))
> > 		return 1;
> > 	...
> > }
> > 
> > Every other in-tree caller passes a known inode, while this one can
> > pass NULL. An open of a name that does not exist in an encrypted
> > directory reaches this through lookup_open() -> atomic_open() ->
> > ceph_atomic_open().
> > 
> > Could the fscrypt check stay behind the positive-dentry test, as
> > before?
> 
> Alternately: can we simply remove the fscrypt check?  I don't know a
> whole lot about fscrypt, but it seems that ceph_open() does all
> necessary fscrypt checks, and we already didn't need this one before
> calling ceph_open().
> 
> You added this in
>   Commit: 94af0470924c ("ceph: add some fscrypt guardrails")
> but the commit doesn't explain why ceph_atomic_open() needed more that
> ceph_open() needed.
> 

Yes, let's just drop it. I had an LLM verify that too, and here's it's
rationales:

Three reasons to remove rather than re-nest it:

1) For regular files it's redundant. finish_open() calls ceph_open(),
   which calls fscrypt_file_open(). That does the same
   fscrypt_has_permitted_context() against the parent (d_parent's inode
   is dir on this path), plus fscrypt_require_key(), which the
   open-coded version doesn't.

2) It's broken as written. err is 0 at that point, so tripping it
   returns 0 from ->atomic_open with FMODE_OPENED clear and
   f_path.dentry still DENTRY_NOT_SET. That hits the WARN_ON() in
   atomic_open() in fs/namei.c and gives back -EIO instead of -EPERM.
   Clearly it has never fired in testing.

3) The only thing it covers that ceph_open() doesn't is a directory
   child (symlinks and spliced/negative dentries all go to
   finish_no_open). But that coverup()
   has no context check at all, unlike ext4/f2fs/ubifs which check
   S_ISDIR||S_ISLNK children in -> via
   the normal lookup path -- including everything finish_no_open()
   bounces back to the VFS -- are already unchecked.

-- 
Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2026-09-26 11:48 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-19  2:06 [PATCH v2 01/14] fixes for vfs_lookup_open, and integration with nfsd NeilBrown
2026-09-19  2:06 ` [PATCH v2 01/14] VFS: revise and expand documentation for atomic_open NeilBrown
2026-09-24 12:25   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 02/14] nfs: correctly handle NFS4ERR_WRONG_TYPE from v4 OPEN request NeilBrown
2026-09-24 12:55   ` Jeff Layton
2026-09-24 13:01   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 03/14] gfs2: simplify atomic_open handling NeilBrown
2026-09-19 16:49   ` Andreas Gruenbacher
2026-09-19 22:22     ` NeilBrown
2026-09-20 16:31       ` Andreas Gruenbacher
2026-09-22 21:16         ` NeilBrown
2026-09-19  2:06 ` [PATCH v2 04/14] ceph: simplify atomic_open to use finish_no_open() NeilBrown
2026-09-24 13:02   ` Jeff Layton
2026-09-25 21:49     ` NeilBrown
2026-09-26 11:48       ` Jeff Layton [this message]
2026-09-19  2:06 ` [PATCH v2 05/14] cifs: allow -EISDIR precedence over -EFTYPE in __cifs_do_create() NeilBrown
2026-09-23  5:54   ` Namjae Jeon
2026-09-23  6:50     ` NeilBrown
2026-09-23  7:52       ` Namjae Jeon
2026-09-23  8:13   ` Namjae Jeon
2026-09-19  2:06 ` [PATCH v2 06/14] vfs: add some allowed open flags to vfs_lookup_open() NeilBrown
2026-09-24 12:54   ` Jeff Layton
2026-09-29 15:18   ` Jori Koolstra
2026-09-29 22:04     ` NeilBrown
2026-09-19  2:06 ` [PATCH v2 07/14] vfs: O_NONBLOCK|O_CREAT open shouldn't wait for directory delegation NeilBrown
2026-09-24 12:51   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 08/14] vfs: don't return -ENODEV from vfs_lookup_open() NeilBrown
2026-09-24 13:07   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 09/14] vfs: change vfs_lookup_open() to use do_open(), not vfs_open() NeilBrown
2026-09-24 13:13   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 10/14] nfsd: make EEXIST checks in nfsd4_create_file() more consistent NeilBrown
2026-09-24 13:23   ` Jeff Layton
2026-09-25 21:57     ` NeilBrown
2026-09-19  2:06 ` [PATCH v2 11/14] nfsd: check for mountpoints after non-creating open NeilBrown
2026-09-24 13:03   ` Jeff Layton
2026-09-25 22:14     ` NeilBrown
2026-09-19  2:06 ` [PATCH v2 12/14] nfsd: switch NFS4 OPEN to use vfs_lookup_open() NeilBrown
2026-09-20 17:10   ` Chuck Lever
2026-09-22 21:55     ` NeilBrown
2026-09-23  4:07       ` NeilBrown
2026-09-19  2:06 ` [PATCH v2 13/14] nfsd: change nfsd_check_obj_isreg() to use nfs error codes NeilBrown
2026-09-24 13:25   ` Jeff Layton
2026-09-19  2:06 ` [PATCH v2 14/14] nfsd: use vfs_lookup_open() for non-creating open requests too NeilBrown
2026-09-20 17:13   ` Chuck Lever
2026-09-25 22:26     ` NeilBrown
2026-09-25 16:04 ` [PATCH v2 01/14] fixes for vfs_lookup_open, and integration with nfsd Christian Brauner
2026-09-25 16:56   ` Chuck Lever

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=230f4080d975d1960a5f38e53d9d43242acaeeed.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=agruenba@redhat.com \
    --cc=amarkuze@redhat.com \
    --cc=anna@kernel.org \
    --cc=brauner@kernel.org \
    --cc=cel@kernel.org \
    --cc=ceph-devel@vger.kernel.org \
    --cc=dorjoychy111@gmail.com \
    --cc=gfs2@lists.linux.dev \
    --cc=idryomov@gmail.com \
    --cc=jkoolstra@xs4all.nl \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=mjguzik@gmail.com \
    --cc=neil@brown.name \
    --cc=pc@manguebit.org \
    --cc=slava@dubeyko.com \
    --cc=trondmy@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.