[PATCH] fs: Use a cleanup attribute in copy_fdtable()

From: Miquel Sabaté Solà
Date: Sat Oct 04 2025 - 17:04:17 EST


This is a small cleanup in which by using the __free(kfree) cleanup
attribute we can avoid three labels to go to, and the code turns to be
more concise and easier to follow.

Signed-off-by: Miquel Sabaté Solà <mssola@xxxxxxxxxx>
---
fs/file.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/fs/file.c b/fs/file.c
index 28743b742e3c..32b937a04003 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -161,7 +161,7 @@ static void copy_fdtable(struct fdtable *nfdt, struct fdtable *ofdt)
*/
static struct fdtable *alloc_fdtable(unsigned int slots_wanted)
{
- struct fdtable *fdt;
+ struct fdtable *fdt __free(kfree) = NULL;
unsigned int nr;
void *data;

@@ -214,18 +214,20 @@ static struct fdtable *alloc_fdtable(unsigned int slots_wanted)

fdt = kmalloc(sizeof(struct fdtable), GFP_KERNEL_ACCOUNT);
if (!fdt)
- goto out;
+ return ERR_PTR(-ENOMEM);
fdt->max_fds = nr;
data = kvmalloc_array(nr, sizeof(struct file *), GFP_KERNEL_ACCOUNT);
if (!data)
- goto out_fdt;
+ return ERR_PTR(-ENOMEM);
fdt->fd = data;

data = kvmalloc(max_t(size_t,
2 * nr / BITS_PER_BYTE + BITBIT_SIZE(nr), L1_CACHE_BYTES),
GFP_KERNEL_ACCOUNT);
- if (!data)
- goto out_arr;
+ if (!data) {
+ kvfree(fdt->fd);
+ return ERR_PTR(-ENOMEM);
+ }
fdt->open_fds = data;
data += nr / BITS_PER_BYTE;
fdt->close_on_exec = data;
@@ -233,13 +235,6 @@ static struct fdtable *alloc_fdtable(unsigned int slots_wanted)
fdt->full_fds_bits = data;

return fdt;
-
-out_arr:
- kvfree(fdt->fd);
-out_fdt:
- kfree(fdt);
-out:
- return ERR_PTR(-ENOMEM);
}

/*
--
2.51.0