From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Amir Goldstein <amir73il@gmail.com>, Miklos Szeredi <miklos@szeredi.hu>
Cc: Jeff Layton <jlayton@poochiereds.net>,
"J . Bruce Fields" <bfields@fieldses.org>,
linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Hugh Dickins <hughd@google.com>,
Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH] tmpfs: allow decoding a file handle of an unlinked file
Date: Tue, 07 Nov 2017 12:58:00 -0800 [thread overview]
Message-ID: <1510088280.3118.42.camel@HansenPartnership.com> (raw)
In-Reply-To: <1510087801-20663-1-git-send-email-amir73il@gmail.com>
On Tue, 2017-11-07 at 22:50 +0200, Amir Goldstein wrote:
> tmpfs uses the helper d_find_alias() to find a dentry from a decoded
> inode, but d_find_alias() skips unhashed dentries, so unlinked files
> cannot be decoded from a file handle.
>
> This can be reproduced using xfstests test program open_by_handle:
> $ open_by handle -c /tmp/testdir
> $ open_by_handle -dk /tmp/testdir
> open_by_handle(/tmp/testdir/file000000) returned 116 incorrectly on
> an
> unlinked open file!
>
> To fix this, use a variant of d_find_alias() that returns any alias,
> even an unhashed one.
>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Al Viro <viro@zeniv.linux.org.uk>
> Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> ---
> mm/shmem.c | 22 +++++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> Miklos,
>
> Please see if that patch looks correct.
>
> Bruce and Jeff indicated that the current tmpfs behavior is not
> desirable
> for nfsd. It may be uncommon to export a tmpfs, but it is going to
> become
> a lot more common when exporting an overlayfs with upper tmpfs.
>
> Thanks,
> Amir.
>
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 07a1d22807be..f7c555ebf0f2 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -3404,6 +3404,26 @@ static int shmem_match(struct inode *ino, void
> *vfh)
> return ino->i_ino == inum && fh[0] == ino->i_generation;
> }
>
> +/* Find any alias of inode, even an unhashed one */
> +static struct dentry *shmem_find_alias(struct inode *inode)
> +{
> + struct dentry *alias;
> +
> + spin_lock(&inode->i_lock);
> + hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
> + dget(alias);
> + if (alias->d_inode == inode) {
> + spin_unlock(&inode->i_lock);
> + return alias;
> + }
> + dput(alias);
> + }
> + spin_unlock(&inode->i_lock);
> +
> + return NULL;
> +}
This doesn't look right in the case of a multiply linked inode for
which you've removing some of the link names because it will return the
first alias it finds, which may be unhashed. Isn't what you want for
it to return the first hashed alias if one exists, or the first
unhashed one if none do, so this code
> @@ -3420,7 +3440,7 @@ static struct dentry *shmem_fh_to_dentry(struct
> super_block *sb,
> inode = ilookup5(sb, (unsigned long)(inum + fid->raw[0]),
> shmem_match, fid->raw);
> if (inode) {
> - dentry = d_find_alias(inode);
> + dentry = shmem_find_alias(inode);
> iput(inode);
> }
Should actually be
if (inode) {
dentry = d_find_alias(inode);
if (!dentry)
dentry = shmem_find_alias(inode);
iput(inode)
}
?
James
next prev parent reply other threads:[~2017-11-07 20:58 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-07 20:50 [PATCH] tmpfs: allow decoding a file handle of an unlinked file Amir Goldstein
2017-11-07 20:58 ` James Bottomley [this message]
2017-11-07 21:17 ` Amir Goldstein
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=1510088280.3118.42.camel@HansenPartnership.com \
--to=james.bottomley@hansenpartnership.com \
--cc=amir73il@gmail.com \
--cc=bfields@fieldses.org \
--cc=hughd@google.com \
--cc=jlayton@poochiereds.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-unionfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox