Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2196885/?format=api
{ "id": 2196885, "url": "http://patchwork.ozlabs.org/api/patches/2196885/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260216123709.281444-1-warthog618@gmail.com/", "project": { "id": 42, "url": "http://patchwork.ozlabs.org/api/projects/42/?format=api", "name": "Linux GPIO development", "link_name": "linux-gpio", "list_id": "linux-gpio.vger.kernel.org", "list_email": "linux-gpio@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260216123709.281444-1-warthog618@gmail.com>", "list_archive_url": null, "date": "2026-02-16T12:37:09", "name": "gpio: cdev: convert lineevent_create() and linereq_create() to FD_PREPARE()", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "eb1c0375a6fc80149ae8f763b844826089302d9d", "submitter": { "id": 77412, "url": "http://patchwork.ozlabs.org/api/people/77412/?format=api", "name": "Kent Gibson", "email": "warthog618@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260216123709.281444-1-warthog618@gmail.com/mbox/", "series": [ { "id": 492304, "url": "http://patchwork.ozlabs.org/api/series/492304/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=492304", "date": "2026-02-16T12:37:09", "name": "gpio: cdev: convert lineevent_create() and linereq_create() to FD_PREPARE()", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/492304/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2196885/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2196885/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-gpio+bounces-31714-incoming=patchwork.ozlabs.org@vger.kernel.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-gpio@vger.kernel.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=fi0a+xo6;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c09:e001:a7::12fc:5321; helo=sto.lore.kernel.org;\n envelope-from=linux-gpio+bounces-31714-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=\"fi0a+xo6\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.210.177", "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=gmail.com" ], "Received": [ "from sto.lore.kernel.org (sto.lore.kernel.org\n [IPv6:2600:3c09:e001:a7::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fF2P72Lmmz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 23:38:03 +1100 (AEDT)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sto.lore.kernel.org (Postfix) with ESMTP id C871D30065E2\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 12:37:59 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 6413713AD26;\n\tMon, 16 Feb 2026 12:37:56 +0000 (UTC)", "from mail-pf1-f177.google.com (mail-pf1-f177.google.com\n [209.85.210.177])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id E8BD818024\n\tfor <linux-gpio@vger.kernel.org>; Mon, 16 Feb 2026 12:37:54 +0000 (UTC)", "by mail-pf1-f177.google.com with SMTP id\n d2e1a72fcca58-82418b0178cso1694152b3a.1\n for <linux-gpio@vger.kernel.org>;\n Mon, 16 Feb 2026 04:37:54 -0800 (PST)", "from rigel.home.arpa (27-32-126-215.static.tpgi.com.au.\n [27.32.126.215])\n by smtp.gmail.com with ESMTPSA id\n 41be03b00d2f7-c6e53342ce4sm7959795a12.34.2026.02.16.04.37.51\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 16 Feb 2026 04:37:53 -0800 (PST)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771245476; cv=none;\n b=HzalWRsFBQqALFcOXTtPEIGEVII14gaqGHVKMI1XvAwIPuiC82psdgTlyFaTOaJ7+kRSSba3c6HMhjxSatTGstu8aI0y6w/1subKq30oy/PlcblISPnczKkGaJqMJeM7psr5W4u9UCUJes8ditRqpIN+EXD9D9WyUavNm7KeDZk=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771245476; c=relaxed/simple;\n\tbh=JyW4xCH2v4mV6eU4kP1v+j5sI8KnRgxrZ9O+Z3bSt+o=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=SQ7Bk4qRXSvpXqvaVtzQuLOEmNoD88pGdNWYpNn6otQ6aHFxQMZ3OBxLvtuPuW5OH/Kv0PziaDyiueeICZxlLYs5EDh5BfDLjsOFdgym3Wg41nVQ5ZG2yW8nkP2G5aRFjfH1tprQ5gBw6+y+bLVeg4ELHO4wGTapqTUUje4v0qY=", "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com;\n spf=pass smtp.mailfrom=gmail.com;\n dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=fi0a+xo6; arc=none smtp.client-ip=209.85.210.177", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1771245474; x=1771850274;\n darn=vger.kernel.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=MHdBO7D48PMjrQF+vFby8p0IkVa7d5hczXXHGgZD74w=;\n b=fi0a+xo6+NhX7TIMqxIBrLKmAshkKqCwdX5HtfPX9+uC8osn0b7rSsIVUxpR3h4T7N\n ZdqFg9CfBBMsXD5U98BVmSSPay2G5vE6UjG5HrmJXXVOMjisu3FPBo/G8soj6KRpaOPH\n s9yYNl19h8jo/wMpKYebeFhS1zdjr9tYaEsKETGOQH6ubyFOdjYdVoyaaFXxHX2dYunW\n WHwebNabMd7qrvwZ5OLhoCyH5ePhciCHhdhqKFwt6/K80/6dfDcZADdgp6+9SD5030w2\n /OX8XaUQr6tcyCFihg68APLcQjM5NYy58PDB2InuTmLSUSx7jKfgt/W/OpwmYRZC+sLP\n yokg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1771245474; x=1771850274;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=MHdBO7D48PMjrQF+vFby8p0IkVa7d5hczXXHGgZD74w=;\n b=lrNmKBGPImrCmyg27NUCVXzy3MyvrO4wXtLXgYHAGA6tiglLELvmF0wY+l1jO0jFV7\n 6yY4BdDjsYYJUM6XgHxUHzbL/6N5UK08IAbDr/ryI9rPnzIxBibqw99PRTrUWkEMms6B\n 1exhpZMEzC0yPZC+7KFEEcvSCCOFYGdsLcvURDMBhIP1iuq9cxNTg05uKLamoNAKDM1Y\n 607j64r1DFaEzlPCBzf/c1e7GhNRySsZM3L+AAH1Jn2OcDZvKkaqtRvFrnBmtOErXU+G\n 81pzjxdEGrYDX0+Qf1PI/s7t5aOn1Wzfzbke+fLqynu64clKZpOkBRFyCkTfhbCFyaOt\n OOUg==", "X-Gm-Message-State": "AOJu0Yx9MyYgiv6AEjkS2dmUfuaI68cP7rxdhAS1aVy9BHxV2dAtc2us\n\t5yL6Xowl8WCKTS2nLu09H1WaY0cDi+TMJDkcHULxfU+4RHla9x/86yDnsvhHvlRg", "X-Gm-Gg": "AZuq6aIS48wuu0g7I7RnJwCHYDa1kkZ1bPQgSxPLO+ekGBeqMXlwGrR3/URIHkfU2C0\n\tjspOY4Qlts+gQz4o6Il3ypKSOvONZTO5ZOx3tCAzYBu8XEuKaGtdu5JwcZ7DPfl3g7C+2a7s3dl\n\tEunGaxWVUVjDNmupbCKtykPH0KEbbgfW43NN3DJcPkLlgmeccXrq9TnV/ZeMeDghEYZjpYqjmjs\n\te0pPcjMu9CLIEeFreyqw0kysQLIYcnZgZ/KtsTL1U9aPAcx/unJLRJ94LcPJbrgC86UQt3XbXKY\n\thrQWBsKyqFazET3GqsB9ASDeBgJi0wkLJnqbKo5g1V0tZBLkFm/ystZ03ByHpGbiwfTj+FWT5cp\n\t0qEDiITvzFYMvDgs+BGUAdlTEd6jdCvVClMJdz8B5qIj7pKCd4YGcKgdyVW2reRrpUOvr3UUsqf\n\tQMkBD7n/baBiJx0JNPLPp685sPtgUcxoqWgD0yK0cZ1+tp0341rZgTNd6JZ1OTvX4=", "X-Received": "by 2002:a05:6a21:e0ab:b0:38e:9ebe:525e with SMTP id\n adf61e73a8af0-3946c87f17fmr10420023637.52.1771245474144;\n Mon, 16 Feb 2026 04:37:54 -0800 (PST)", "From": "Kent Gibson <warthog618@gmail.com>", "To": "linux-gpio@vger.kernel.org,\n\tbrgl@kernel.org,\n\tlinusw@kernel.org", "Cc": "Kent Gibson <warthog618@gmail.com>", "Subject": "[PATCH] gpio: cdev: convert lineevent_create() and linereq_create()\n to FD_PREPARE()", "Date": "Mon, 16 Feb 2026 20:37:09 +0800", "Message-ID": "<20260216123709.281444-1-warthog618@gmail.com>", "X-Mailer": "git-send-email 2.53.0", "Precedence": "bulk", "X-Mailing-List": "linux-gpio@vger.kernel.org", "List-Id": "<linux-gpio.vger.kernel.org>", "List-Subscribe": "<mailto:linux-gpio+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-gpio+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit" }, "content": "linehandle_create() was recently converted to use FD_PREPARE() to\nsimplify fd creation and cleanup logic.\nApply the equivalent conversion to lineevent_create() and\nlinereq_create().\n\nSigned-off-by: Kent Gibson <warthog618@gmail.com>\n---\n drivers/gpio/gpiolib-cdev.c | 141 ++++++++++++------------------------\n 1 file changed, 46 insertions(+), 95 deletions(-)", "diff": "diff --git a/drivers/gpio/gpiolib-cdev.c b/drivers/gpio/gpiolib-cdev.c\nindex 3735c9fe1502..8b89f1d86de0 100644\n--- a/drivers/gpio/gpiolib-cdev.c\n+++ b/drivers/gpio/gpiolib-cdev.c\n@@ -1586,15 +1586,16 @@ static const struct file_operations line_fileops = {\n #endif\n };\n \n+DEFINE_FREE(linereq_free, struct linereq *, if (!IS_ERR_OR_NULL(_T)) linereq_free(_T))\n+\n static int linereq_create(struct gpio_device *gdev, void __user *ip)\n {\n \tstruct gpio_v2_line_request ulr;\n \tstruct gpio_v2_line_config *lc;\n-\tstruct linereq *lr;\n-\tstruct file *file;\n+\tstruct linereq *lr __free(linereq_free) = NULL;\n \tu64 flags, edflags;\n \tunsigned int i;\n-\tint fd, ret;\n+\tint ret;\n \n \tif (copy_from_user(&ulr, ip, sizeof(ulr)))\n \t\treturn -EFAULT;\n@@ -1627,10 +1628,8 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)\n \t\t/* label is only initialized if consumer is set */\n \t\tlr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1,\n \t\t\t\t GFP_KERNEL);\n-\t\tif (!lr->label) {\n-\t\t\tret = -ENOMEM;\n-\t\t\tgoto out_free_linereq;\n-\t\t}\n+\t\tif (!lr->label)\n+\t\t\treturn -ENOMEM;\n \t}\n \n \tmutex_init(&lr->config_mutex);\n@@ -1649,14 +1648,12 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)\n \t\tu32 offset = ulr.offsets[i];\n \t\tstruct gpio_desc *desc = gpio_device_get_desc(gdev, offset);\n \n-\t\tif (IS_ERR(desc)) {\n-\t\t\tret = PTR_ERR(desc);\n-\t\t\tgoto out_free_linereq;\n-\t\t}\n+\t\tif (IS_ERR(desc))\n+\t\t\treturn PTR_ERR(desc);\n \n \t\tret = gpiod_request_user(desc, lr->label);\n \t\tif (ret)\n-\t\t\tgoto out_free_linereq;\n+\t\t\treturn ret;\n \n \t\tlr->lines[i].desc = desc;\n \t\tflags = gpio_v2_line_config_flags(lc, i);\n@@ -1664,7 +1661,7 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)\n \n \t\tret = gpiod_set_transitory(desc, false);\n \t\tif (ret < 0)\n-\t\t\tgoto out_free_linereq;\n+\t\t\treturn ret;\n \n \t\tedflags = flags & GPIO_V2_LINE_EDGE_DETECTOR_FLAGS;\n \t\t/*\n@@ -1676,16 +1673,16 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)\n \n \t\t\tret = gpiod_direction_output_nonotify(desc, val);\n \t\t\tif (ret)\n-\t\t\t\tgoto out_free_linereq;\n+\t\t\t\treturn ret;\n \t\t} else if (flags & GPIO_V2_LINE_FLAG_INPUT) {\n \t\t\tret = gpiod_direction_input_nonotify(desc);\n \t\t\tif (ret)\n-\t\t\t\tgoto out_free_linereq;\n+\t\t\t\treturn ret;\n \n \t\t\tret = edge_detector_setup(&lr->lines[i], lc, i,\n \t\t\t\t\t\t edflags);\n \t\t\tif (ret)\n-\t\t\t\tgoto out_free_linereq;\n+\t\t\t\treturn ret;\n \t\t}\n \n \t\tlr->lines[i].edflags = edflags;\n@@ -1700,44 +1697,25 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)\n \tret = blocking_notifier_chain_register(&gdev->device_notifier,\n \t\t\t\t\t &lr->device_unregistered_nb);\n \tif (ret)\n-\t\tgoto out_free_linereq;\n-\n-\tfd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC);\n-\tif (fd < 0) {\n-\t\tret = fd;\n-\t\tgoto out_free_linereq;\n-\t}\n+\t\treturn ret;\n \n-\tfile = anon_inode_getfile(\"gpio-line\", &line_fileops, lr,\n-\t\t\t\t O_RDONLY | O_CLOEXEC);\n-\tif (IS_ERR(file)) {\n-\t\tret = PTR_ERR(file);\n-\t\tgoto out_put_unused_fd;\n-\t}\n+\tFD_PREPARE(fdf, O_RDONLY | O_CLOEXEC,\n+\t\t anon_inode_getfile(\"gpio-line\", &line_fileops, lr,\n+\t\t\t\t O_RDONLY | O_CLOEXEC));\n+\tif (fdf.err)\n+\t\treturn fdf.err;\n+\tretain_and_null_ptr(lr);\n \n-\tulr.fd = fd;\n-\tif (copy_to_user(ip, &ulr, sizeof(ulr))) {\n-\t\t/*\n-\t\t * fput() will trigger the release() callback, so do not go onto\n-\t\t * the regular error cleanup path here.\n-\t\t */\n-\t\tfput(file);\n-\t\tput_unused_fd(fd);\n+\tulr.fd = fd_prepare_fd(fdf);\n+\tif (copy_to_user(ip, &ulr, sizeof(ulr)))\n \t\treturn -EFAULT;\n-\t}\n \n-\tfd_install(fd, file);\n+\tfd_publish(fdf);\n \n \tdev_dbg(&gdev->dev, \"registered chardev handle for %d lines\\n\",\n-\t\tlr->num_lines);\n+\t\tulr.num_lines);\n \n \treturn 0;\n-\n-out_put_unused_fd:\n-\tput_unused_fd(fd);\n-out_free_linereq:\n-\tlinereq_free(lr);\n-\treturn ret;\n }\n \n #ifdef CONFIG_GPIO_CDEV_V1\n@@ -2010,16 +1988,16 @@ static irqreturn_t lineevent_irq_handler(int irq, void *p)\n \treturn IRQ_WAKE_THREAD;\n }\n \n+DEFINE_FREE(lineevent_free, struct lineevent_state *, if (!IS_ERR_OR_NULL(_T)) lineevent_free(_T))\n+\n static int lineevent_create(struct gpio_device *gdev, void __user *ip)\n {\n \tstruct gpioevent_request eventreq;\n-\tstruct lineevent_state *le;\n+\tstruct lineevent_state *le __free(lineevent_free) = NULL;\n \tstruct gpio_desc *desc;\n-\tstruct file *file;\n \tu32 offset;\n \tu32 lflags;\n \tu32 eflags;\n-\tint fd;\n \tint ret;\n \tint irq, irqflags = 0;\n \tchar *label;\n@@ -2064,15 +2042,13 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)\n \t\tle->label = kstrndup(eventreq.consumer_label,\n \t\t\t\t sizeof(eventreq.consumer_label) - 1,\n \t\t\t\t GFP_KERNEL);\n-\t\tif (!le->label) {\n-\t\t\tret = -ENOMEM;\n-\t\t\tgoto out_free_le;\n-\t\t}\n+\t\tif (!le->label)\n+\t\t\treturn -ENOMEM;\n \t}\n \n \tret = gpiod_request_user(desc, le->label);\n \tif (ret)\n-\t\tgoto out_free_le;\n+\t\treturn ret;\n \tle->desc = desc;\n \tle->eflags = eflags;\n \n@@ -2080,15 +2056,13 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)\n \n \tret = gpiod_direction_input(desc);\n \tif (ret)\n-\t\tgoto out_free_le;\n+\t\treturn ret;\n \n \tgpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_REQUESTED);\n \n \tirq = gpiod_to_irq(desc);\n-\tif (irq <= 0) {\n-\t\tret = -ENODEV;\n-\t\tgoto out_free_le;\n-\t}\n+\tif (irq <= 0)\n+\t\treturn -ENODEV;\n \n \tif (eflags & GPIOEVENT_REQUEST_RISING_EDGE)\n \t\tirqflags |= test_bit(GPIOD_FLAG_ACTIVE_LOW, &desc->flags) ?\n@@ -2105,13 +2079,11 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)\n \tret = blocking_notifier_chain_register(&gdev->device_notifier,\n \t\t\t\t\t &le->device_unregistered_nb);\n \tif (ret)\n-\t\tgoto out_free_le;\n+\t\treturn ret;\n \n \tlabel = make_irq_label(le->label);\n-\tif (IS_ERR(label)) {\n-\t\tret = PTR_ERR(label);\n-\t\tgoto out_free_le;\n-\t}\n+\tif (IS_ERR(label))\n+\t\treturn PTR_ERR(label);\n \n \t/* Request a thread to read the events */\n \tret = request_threaded_irq(irq,\n@@ -2122,46 +2094,25 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)\n \t\t\t\t le);\n \tif (ret) {\n \t\tfree_irq_label(label);\n-\t\tgoto out_free_le;\n+\t\treturn ret;\n \t}\n \n \tle->irq = irq;\n \n-\tfd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC);\n-\tif (fd < 0) {\n-\t\tret = fd;\n-\t\tgoto out_free_le;\n-\t}\n-\n-\tfile = anon_inode_getfile(\"gpio-event\",\n-\t\t\t\t &lineevent_fileops,\n-\t\t\t\t le,\n-\t\t\t\t O_RDONLY | O_CLOEXEC);\n-\tif (IS_ERR(file)) {\n-\t\tret = PTR_ERR(file);\n-\t\tgoto out_put_unused_fd;\n-\t}\n+\tFD_PREPARE(fdf, O_RDONLY | O_CLOEXEC,\n+\t\t anon_inode_getfile(\"gpio-event\", &lineevent_fileops, le,\n+\t\t\t\t O_RDONLY | O_CLOEXEC));\n+\tif (fdf.err)\n+\t\treturn fdf.err;\n+\tretain_and_null_ptr(le);\n \n-\teventreq.fd = fd;\n-\tif (copy_to_user(ip, &eventreq, sizeof(eventreq))) {\n-\t\t/*\n-\t\t * fput() will trigger the release() callback, so do not go onto\n-\t\t * the regular error cleanup path here.\n-\t\t */\n-\t\tfput(file);\n-\t\tput_unused_fd(fd);\n+\teventreq.fd = fd_prepare_fd(fdf);\n+\tif (copy_to_user(ip, &eventreq, sizeof(eventreq)))\n \t\treturn -EFAULT;\n-\t}\n \n-\tfd_install(fd, file);\n+\tfd_publish(fdf);\n \n \treturn 0;\n-\n-out_put_unused_fd:\n-\tput_unused_fd(fd);\n-out_free_le:\n-\tlineevent_free(le);\n-\treturn ret;\n }\n \n static void gpio_v2_line_info_to_v1(struct gpio_v2_line_info *info_v2,\n", "prefixes": [] }