2019-11-15 10:22:47

by Jan Kara

[permalink] [raw]
Subject: [PATCH] jbd2: Make jbd2_handle_buffer_credits() handle reserved handles

The helper jbd2_handle_buffer_credits() doesn't correctly handle reserved
handles which can lead to crashes. Fix it getting of journal pointer to
work for reserved handles as well.

Fixes: a9a8344ee171 ("ext4, jbd2: Provide accessor function for handle credits")
Reported-by: Eric Biggers <[email protected]>
Signed-off-by: Jan Kara <[email protected]>
---
include/linux/jbd2.h | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index 3115eeb44039..a23a3528e07a 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -1648,10 +1648,14 @@ static inline tid_t jbd2_get_latest_transaction(journal_t *journal)
return tid;
}

-
static inline int jbd2_handle_buffer_credits(handle_t *handle)
{
- journal_t *journal = handle->h_transaction->t_journal;
+ journal_t *journal;
+
+ if (!handle->h_reserved)
+ journal = handle->h_transaction->t_journal;
+ else
+ journal = handle->h_journal;

return handle->h_total_credits -
DIV_ROUND_UP(handle->h_revoke_credits_requested,
--
2.16.4


2019-11-15 14:23:50

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] jbd2: Make jbd2_handle_buffer_credits() handle reserved handles

On Fri, Nov 15, 2019 at 11:22:10AM +0100, Jan Kara wrote:
> The helper jbd2_handle_buffer_credits() doesn't correctly handle reserved
> handles which can lead to crashes. Fix it getting of journal pointer to
> work for reserved handles as well.
>
> Fixes: a9a8344ee171 ("ext4, jbd2: Provide accessor function for handle credits")
> Reported-by: Eric Biggers <[email protected]>
> Signed-off-by: Jan Kara <[email protected]>

Thanks, applied.

- Ted

2019-11-18 08:00:52

by Ritesh Harjani

[permalink] [raw]
Subject: Re: [PATCH] jbd2: Make jbd2_handle_buffer_credits() handle reserved handles



On 11/15/19 3:52 PM, Jan Kara wrote:
> The helper jbd2_handle_buffer_credits() doesn't correctly handle reserved
> handles which can lead to crashes. Fix it getting of journal pointer to
> work for reserved handles as well.
>
> Fixes: a9a8344ee171 ("ext4, jbd2: Provide accessor function for handle credits")
> Reported-by: Eric Biggers <[email protected]>
> Signed-off-by: Jan Kara <[email protected]>

Thanks Jan,
Yes, this also fixes the problem for me with dioread_nolock on ppc64
machine.

You may add -

Tested-by: Ritesh Harjani <[email protected]>


> ---
> include/linux/jbd2.h | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
> index 3115eeb44039..a23a3528e07a 100644
> --- a/include/linux/jbd2.h
> +++ b/include/linux/jbd2.h
> @@ -1648,10 +1648,14 @@ static inline tid_t jbd2_get_latest_transaction(journal_t *journal)
> return tid;
> }
>
> -
> static inline int jbd2_handle_buffer_credits(handle_t *handle)
> {
> - journal_t *journal = handle->h_transaction->t_journal;
> + journal_t *journal;
> +
> + if (!handle->h_reserved)
> + journal = handle->h_transaction->t_journal;
> + else
> + journal = handle->h_journal;
>
> return handle->h_total_credits -
> DIV_ROUND_UP(handle->h_revoke_credits_requested,
>