From: Al Viro <viro@zeniv.linux.org.uk>
To: Aleksa Sarai <cyphar@cyphar.com>
Cc: Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
David Howells <dhowells@redhat.com>,
Shuah Khan <shuah@kernel.org>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH 1/2] fscontext: do not consume log entries for -EMSGSIZE case
Date: Wed, 6 Aug 2025 06:57:55 +0100 [thread overview]
Message-ID: <20250806055755.GF222315@ZenIV> (raw)
In-Reply-To: <20250806-fscontext-log-cleanups-v1-1-880597d42a5a@cyphar.com>
On Wed, Aug 06, 2025 at 03:31:10PM +1000, Aleksa Sarai wrote:
> Userspace generally expects APIs that return EMSGSIZE to allow for them
> to adjust their buffer size and retry the operation. However, the
> fscontext log would previously clear the message even in the EMSGSIZE
> case.
>
> Given that it is very cheap for us to check whether the buffer is too
> small before we remove the message from the ring buffer, let's just do
> that instead.
>
> Fixes: 007ec26cdc9f ("vfs: Implement logging through fs_context")
> Cc: David Howells <dhowells@redhat.com>
> Cc: <stable@vger.kernel.org> # v5.2+
> Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
> ---
> fs/fsopen.c | 22 ++++++++++++++--------
> 1 file changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/fs/fsopen.c b/fs/fsopen.c
> index 1aaf4cb2afb2..f5fdaa97965b 100644
> --- a/fs/fsopen.c
> +++ b/fs/fsopen.c
> @@ -36,23 +36,25 @@ static ssize_t fscontext_read(struct file *file,
> if (ret < 0)
> return ret;
>
> - if (log->head == log->tail) {
> - mutex_unlock(&fc->uapi_mutex);
> - return -ENODATA;
> - }
> + ret = -ENODATA;
> + if (log->head == log->tail)
> + goto err_unlock_nomsg;
>
> index = log->tail & (logsize - 1);
> p = log->buffer[index];
> + n = strlen(p);
> +
> + ret = -EMSGSIZE;
> + if (n > len)
> + goto err_unlock_nomsg;
> +
FWIW, I would rather turn that into a helper taking log and len and
returning p or ERR_PTR(...); something like
static inline const char *fetch_message(struct fc_log *log, size_t len,
bool *need_free)
{
int index = log->tail & (ARRAY_SIZE(log->buffer) - 1);
const char *p = log->buffer[index];
if (unlikely(log->head == log->tail))
return ERR_PTR(-ENODATA);
n = strlen(p);
if (unlikely(n > len))
return ERR_PTR(-EMSGSIZE);
log->buffer[index] = NULL;
*need_free = log->need_free & (1 << index);
log->need_free &= ~(1 << index);
log->tail++;
return p;
}
with caller being
ret = mutex_lock_interruptible(&fc->uapi_mutex);
if (ret < 0)
return ret;
p = fetch_message(log, len, &need_free);
mutex_unlock(&fc->uapi_mutex);
if (IS_ERR(p))
return PTR_ERR(p);
n = strlen(p);
if (copy_to_user(_buf, p, n))
n = -EFAULT;
if (need_free)
kfree(p);
return n;
and that's it.
next prev parent reply other threads:[~2025-08-06 5:57 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-06 5:31 [PATCH 0/2] fscontext: do not consume log entries for -EMSGSIZE case Aleksa Sarai
2025-08-06 5:31 ` [PATCH 1/2] " Aleksa Sarai
2025-08-06 5:57 ` Al Viro [this message]
2025-08-06 5:31 ` [PATCH 2/2] selftests/filesystems: add basic fscontext log tests Aleksa Sarai
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=20250806055755.GF222315@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=brauner@kernel.org \
--cc=cyphar@cyphar.com \
--cc=dhowells@redhat.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=shuah@kernel.org \
--cc=stable@vger.kernel.org \
/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.