drivers/block/loop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
loop_change_fd() and loop_configure() call loop_check_backing_file()
to validate the new backing file. If validation fails, the reference
acquired by fget() was not dropped, leaking a file reference.
Fix this by calling fput(file) before returning the error.
Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
---
drivers/block/loop.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 053a086d547e..94ec7f747f36 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -551,8 +551,10 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
return -EBADF;
error = loop_check_backing_file(file);
- if (error)
+ if (error) {
+ fput(file);
return error;
+ }
/* suppress uevents while reconfiguring the device */
dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 1);
@@ -993,8 +995,10 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
return -EBADF;
error = loop_check_backing_file(file);
- if (error)
+ if (error) {
+ fput(file);
return error;
+ }
is_loop = is_loop_device(file);
--
2.51.0
On Fri, Sep 26, 2025 at 8:13 PM Li Chen <me@linux.beauty> wrote:
>
> loop_change_fd() and loop_configure() call loop_check_backing_file()
> to validate the new backing file. If validation fails, the reference
> acquired by fget() was not dropped, leaking a file reference.
>
> Fix this by calling fput(file) before returning the error.
>
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
Good catch:
Fixes: f5c84eff634b ("loop: Add sanity check for read/write_iter")
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Thanks,
Hi,
在 2025/09/26 20:12, Li Chen 写道:
> loop_change_fd() and loop_configure() call loop_check_backing_file()
> to validate the new backing file. If validation fails, the reference
> acquired by fget() was not dropped, leaking a file reference.
>
> Fix this by calling fput(file) before returning the error.
>
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
> ---
> drivers/block/loop.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index 053a086d547e..94ec7f747f36 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -551,8 +551,10 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
> return -EBADF;
>
> error = loop_check_backing_file(file);
> - if (error)
> + if (error) {
> + fput(file);
> return error;
> + }
>
> /* suppress uevents while reconfiguring the device */
> dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 1);
> @@ -993,8 +995,10 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
> return -EBADF;
>
> error = loop_check_backing_file(file);
> - if (error)
> + if (error) {
> + fput(file);
> return error;
> + }
>
> is_loop = is_loop_device(file);
>
>
The changes look correct, however, I'll prefer to change the error path
to the reverse order and add a new error tag.
Thanks,
Kuai
Hi Yu,
---- On Mon, 29 Sep 2025 09:11:04 +0800 Yu Kuai <yukuai1@huaweicloud.com> wrote ---
> Hi,
>
> 在 2025/09/26 20:12, Li Chen 写道:
> > loop_change_fd() and loop_configure() call loop_check_backing_file()
> > to validate the new backing file. If validation fails, the reference
> > acquired by fget() was not dropped, leaking a file reference.
> >
> > Fix this by calling fput(file) before returning the error.
> >
> > Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
> > ---
> > drivers/block/loop.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> > index 053a086d547e..94ec7f747f36 100644
> > --- a/drivers/block/loop.c
> > +++ b/drivers/block/loop.c
> > @@ -551,8 +551,10 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
> > return -EBADF;
> >
> > error = loop_check_backing_file(file);
> > - if (error)
> > + if (error) {
> > + fput(file);
> > return error;
> > + }
> >
> > /* suppress uevents while reconfiguring the device */
> > dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 1);
> > @@ -993,8 +995,10 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
> > return -EBADF;
> >
> > error = loop_check_backing_file(file);
> > - if (error)
> > + if (error) {
> > + fput(file);
> > return error;
> > + }
> >
> > is_loop = is_loop_device(file);
> >
> >
>
> The changes look correct, however, I'll prefer to change the error path
> to the reverse order and add a new error tag.
Thanks, but I will switch to scope-based resource management in v2, as suggested by Markus.
Regards,
Li
… > Fix this by calling fput(file) before returning the error. … > +++ b/drivers/block/loop.c … How do you think about to increase the application of scope-based resource management? https://elixir.bootlin.com/linux/v6.17-rc7/source/include/linux/file.h#L97 Regards, Markus
Hi Markus, ---- On Sun, 28 Sep 2025 21:48:23 +0800 Markus Elfring <Markus.Elfring@web.de> wrote --- > … > > Fix this by calling fput(file) before returning the error. > … > > +++ b/drivers/block/loop.c > … > > How do you think about to increase the application of scope-based resource management? > https://elixir.bootlin.com/linux/v6.17-rc7/source/include/linux/file.h#L97 Looks good; I will add a commit to switch to scope-based resource management in v2. Thanks for your suggestion! Regards, Li
On Mon, Sep 29, 2025 at 8:54 PM Li Chen <me@linux.beauty> wrote: > > Hi Markus, > > ---- On Sun, 28 Sep 2025 21:48:23 +0800 Markus Elfring <Markus.Elfring@web.de> wrote --- > > … > > > Fix this by calling fput(file) before returning the error. > > … > > > +++ b/drivers/block/loop.c > > … > > > > How do you think about to increase the application of scope-based resource management? > > https://elixir.bootlin.com/linux/v6.17-rc7/source/include/linux/file.h#L97 > > Looks good; I will add a commit to switch to scope-based resource management in v2. > Thanks for your suggestion! Please don't do it as one bug fix, the whole fix chain needs to backport, and scope-based fput is just added in v6.15. However, you can do it as one cleanup after the fix is merged. Thanks,
Hi Ming, ---- On Mon, 29 Sep 2025 23:01:50 +0800 Ming Lei <ming.lei@redhat.com> wrote --- > On Mon, Sep 29, 2025 at 8:54 PM Li Chen <me@linux.beauty> wrote: > > > > Hi Markus, > > > > ---- On Sun, 28 Sep 2025 21:48:23 +0800 Markus Elfring <Markus.Elfring@web.de> wrote --- > > > … > > > > Fix this by calling fput(file) before returning the error. > > > … > > > > +++ b/drivers/block/loop.c > > > … > > > > > > How do you think about to increase the application of scope-based resource management? > > > https://elixir.bootlin.com/linux/v6.17-rc7/source/include/linux/file.h#L97 > > > > Looks good; I will add a commit to switch to scope-based resource management in v2. > > Thanks for your suggestion! > > Please don't do it as one bug fix, the whole fix chain needs to > backport, and scope-based > fput is just added in v6.15. > > However, you can do it as one cleanup after the fix is merged. Noted, thanks for your tip. Regards, Li
在 2025/9/26 20:12, Li Chen 写道:
> loop_change_fd() and loop_configure() call loop_check_backing_file()
> to validate the new backing file. If validation fails, the reference
> acquired by fget() was not dropped, leaking a file reference.
>
> Fix this by calling fput(file) before returning the error.
>
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
You'd better add a fix tag:
Fixes: f5c84eff634b ("loop: Add sanity check for read/write_iter")
Or this patch looks good to me.
Reviewed-by: Yang Erkun <yangerkun@huawei.com>
> ---
> drivers/block/loop.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index 053a086d547e..94ec7f747f36 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -551,8 +551,10 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
> return -EBADF;
>
> error = loop_check_backing_file(file);
> - if (error)
> + if (error) {
> + fput(file);
> return error;
> + }
>
> /* suppress uevents while reconfiguring the device */
> dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 1);
> @@ -993,8 +995,10 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
> return -EBADF;
>
> error = loop_check_backing_file(file);
> - if (error)
> + if (error) {
> + fput(file);
> return error;
> + }
>
> is_loop = is_loop_device(file);
>
Hi Erkun,
---- On Sun, 28 Sep 2025 09:54:51 +0800 yangerkun <yangerkun@huawei.com> wrote ---
>
>
> 在 2025/9/26 20:12, Li Chen 写道:
> > loop_change_fd() and loop_configure() call loop_check_backing_file()
> > to validate the new backing file. If validation fails, the reference
> > acquired by fget() was not dropped, leaking a file reference.
> >
> > Fix this by calling fput(file) before returning the error.
> >
> > Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
>
> You'd better add a fix tag:
>
> Fixes: f5c84eff634b ("loop: Add sanity check for read/write_iter")
Thanks, I would add it in v2.
Regards,
Li
© 2016 - 2026 Red Hat, Inc.