From: Luis Henriques <lhenriques@suse.de>
To: Jeff Layton <jlayton@kernel.org>
Cc: ceph-devel@vger.kernel.org, idryomov@gmail.com, pdonnell@redhat.com
Subject: Re: [PATCH v2] ceph: ensure we have Fs caps when fetching dir link count
Date: Wed, 11 Nov 2020 09:34:13 +0000 [thread overview]
Message-ID: <877dqsfd9m.fsf@suse.de> (raw)
In-Reply-To: <20201110163052.482965-1-jlayton@kernel.org> (Jeff Layton's message of "Tue, 10 Nov 2020 11:30:52 -0500")
Jeff Layton <jlayton@kernel.org> writes:
> The link count for a directory is defined as inode->i_subdirs + 2,
> (for "." and ".."). i_subdirs is only populated when Fs caps are held.
> Ensure we grab Fs caps when fetching the link count for a directory.
>
Maybe this would be worth a stable@ tag too...?
Cheers,
--
Luis
> URL: https://tracker.ceph.com/issues/48125
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/ceph/inode.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
> index 7c22bc2ea076..ab02966ef0a4 100644
> --- a/fs/ceph/inode.c
> +++ b/fs/ceph/inode.c
> @@ -2343,15 +2343,23 @@ int ceph_permission(struct inode *inode, int mask)
> }
>
> /* Craft a mask of needed caps given a set of requested statx attrs. */
> -static int statx_to_caps(u32 want)
> +static int statx_to_caps(u32 want, umode_t mode)
> {
> int mask = 0;
>
> if (want & (STATX_MODE|STATX_UID|STATX_GID|STATX_CTIME|STATX_BTIME))
> mask |= CEPH_CAP_AUTH_SHARED;
>
> - if (want & (STATX_NLINK|STATX_CTIME))
> - mask |= CEPH_CAP_LINK_SHARED;
> + if (want & (STATX_NLINK|STATX_CTIME)) {
> + /*
> + * The link count for directories depends on inode->i_subdirs,
> + * and that is only updated when Fs caps are held.
> + */
> + if (S_ISDIR(mode))
> + mask |= CEPH_CAP_FILE_SHARED;
> + else
> + mask |= CEPH_CAP_LINK_SHARED;
> + }
>
> if (want & (STATX_ATIME|STATX_MTIME|STATX_CTIME|STATX_SIZE|
> STATX_BLOCKS))
> @@ -2377,7 +2385,7 @@ int ceph_getattr(const struct path *path, struct kstat *stat,
>
> /* Skip the getattr altogether if we're asked not to sync */
> if (!(flags & AT_STATX_DONT_SYNC)) {
> - err = ceph_do_getattr(inode, statx_to_caps(request_mask),
> + err = ceph_do_getattr(inode, statx_to_caps(request_mask, inode->i_mode),
> flags & AT_STATX_FORCE_SYNC);
> if (err)
> return err;
next prev parent reply other threads:[~2020-11-11 9:34 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-10 16:30 [PATCH v2] ceph: ensure we have Fs caps when fetching dir link count Jeff Layton
2020-11-11 9:34 ` Luis Henriques [this message]
2020-11-11 12:53 ` Jeff Layton
2020-11-11 13:24 ` Luis Henriques
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=877dqsfd9m.fsf@suse.de \
--to=lhenriques@suse.de \
--cc=ceph-devel@vger.kernel.org \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.org \
--cc=pdonnell@redhat.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 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.