]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firewire: ohci: use cleanup helper for isoc context header allocation
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sat, 17 Jan 2026 14:28:17 +0000 (23:28 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 18 Jan 2026 08:18:48 +0000 (17:18 +0900)
Some cleanup helpers are useful in error path after memory allocation for
header storage.

Link: https://lore.kernel.org/r/20260117142823.440811-5-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
drivers/firewire/ohci.c

index 5d9857cbbd24ec5efe2d858d694a7917cfe68de0..6760c8d12637e7d9f11de05ae9c33032ab80b15a 100644 (file)
@@ -2958,6 +2958,7 @@ static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
                                int type, int channel, size_t header_size)
 {
        struct fw_ohci *ohci = fw_ohci(card);
+       void *header __free(free_page) = NULL;
        struct iso_context *ctx;
        descriptor_callback_t callback;
        u64 *channels;
@@ -3015,8 +3016,8 @@ static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
 
        if (type != FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
                ctx->sc.header_length = 0;
-               ctx->sc.header = (void *) __get_free_page(GFP_KERNEL);
-               if (!ctx->sc.header) {
+               header = (void *) __get_free_page(GFP_KERNEL);
+               if (!header) {
                        ret = -ENOMEM;
                        goto out;
                }
@@ -3024,21 +3025,17 @@ static struct fw_iso_context *ohci_allocate_iso_context(struct fw_card *card,
 
        ret = context_init(&ctx->context, ohci, regs, callback);
        if (ret < 0)
-               goto out_with_header;
+               goto out;
        fw_iso_context_init_work(&ctx->base, ohci_isoc_context_work);
 
-       if (type == FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
+       if (type != FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
+               ctx->sc.header = no_free_ptr(header);
+       } else {
                set_multichannel_mask(ohci, 0);
                ctx->mc.completed = 0;
        }
 
        return &ctx->base;
-
- out_with_header:
-       if (type != FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL) {
-               free_page((unsigned long)ctx->sc.header);
-               ctx->sc.header = NULL;
-       }
  out:
        scoped_guard(spinlock_irq, &ohci->lock) {
                switch (type) {