get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2196250/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2196250,
    "url": "http://patchwork.ozlabs.org/api/patches/2196250/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260213092958.864411-7-tzungbi@kernel.org/",
    "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": "<20260213092958.864411-7-tzungbi@kernel.org>",
    "list_archive_url": null,
    "date": "2026-02-13T09:29:53",
    "name": "[v3,06/11] selftests: gpio: Add gpio-cdev-uaf tests",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "001627b00ef31a55a962bd778876e42d5cb06878",
    "submitter": {
        "id": 83557,
        "url": "http://patchwork.ozlabs.org/api/people/83557/?format=api",
        "name": "Tzung-Bi Shih",
        "email": "tzungbi@kernel.org"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-gpio/patch/20260213092958.864411-7-tzungbi@kernel.org/mbox/",
    "series": [
        {
            "id": 492068,
            "url": "http://patchwork.ozlabs.org/api/series/492068/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=492068",
            "date": "2026-02-13T09:29:47",
            "name": "gpio: Adopt revocable mechanism for UAF prevention",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/492068/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2196250/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2196250/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-gpio+bounces-31663-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=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=fbBPFdb5;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-31663-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"fbBPFdb5\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"
        ],
        "Received": [
            "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::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 4fC6SH3qwsz1xvQ\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 13 Feb 2026 20:34:07 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 8EC81315EBB3\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 13 Feb 2026 09:31:21 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 2480D2DC774;\n\tFri, 13 Feb 2026 09:31:21 +0000 (UTC)",
            "from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id D64E4330D2F;\n\tFri, 13 Feb 2026 09:31:20 +0000 (UTC)",
            "by smtp.kernel.org (Postfix) with ESMTPSA id EEA89C116C6;\n\tFri, 13 Feb 2026 09:31:17 +0000 (UTC)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1770975080; cv=none;\n b=hVjB6aXpVM6dcRwXeLOGVWCvJ8+DjrMrqXShIvd0CTxkqAfy09FrRt7/ua7XRCRHaTsjJo3xOCOf50ttPMpg4ZGBKZ35VFE2MgLc9TzfR9o7vc2ep42LrTXRfb8Pr/7wCg1z5PM0f3xb3cFHJ2lMbIfjITdEzi+WmAcu4rYlz7o=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1770975080; c=relaxed/simple;\n\tbh=e2rjlk7t7f4ZfFXrzmIQZo5qI3Y6tD4XAgPM3cvoa0o=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=YAd68liSMjt8aV4vK2GMiuHRR4CCENqedSdiKVAMhqUEyYYWYaUq7hyLzsl3iVBel0mDQOw+pJyqdvw+fUOmGpWhNoudoNx/3sdw4HgtXclAN+pTQrJizJgcO7npUGZF0cvmbxEC+TLRwW2cQ1x0x4OYkIqnItDlT0vuiqkDZ+U=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=fbBPFdb5; arc=none smtp.client-ip=10.30.226.201",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1770975080;\n\tbh=e2rjlk7t7f4ZfFXrzmIQZo5qI3Y6tD4XAgPM3cvoa0o=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=fbBPFdb538bvYN5cXWUaJd5BouODIj8x/1byeXIP5kajQwi59A8W2F5B7pfcZHgOt\n\t 4vW6rEsMKK1RA8yOXjZKc8rS0lvuCiT2ffLweazioqf7WoG5+geACE8DYOqn5qrrk6\n\t OOwS6v5Eu9IwSACsOzqRuDYxKVglcf/mox5otpm1ZGAeJtFt6W+h3/PtvdmvqTSwOc\n\t 5XdA4QBx4NkskPYatrqlxnn3Jnm6xZOuDcqXX6De85TTTeGvo5Y4ebEGg4TAdmWk53\n\t sAANC9ZpDZa6tIhY8k61NUm4mteVcCZKnRsyCdjCy07PimHa+nQZBJ26403Rk77kGL\n\t l4IoIaaSJa/ZQ==",
        "From": "Tzung-Bi Shih <tzungbi@kernel.org>",
        "To": "Bartosz Golaszewski <brgl@kernel.org>,\n\tLinus Walleij <linusw@kernel.org>",
        "Cc": "Greg Kroah-Hartman <gregkh@linuxfoundation.org>,\n\t\"Rafael J. Wysocki\" <rafael@kernel.org>,\n\tDanilo Krummrich <dakr@kernel.org>,\n\tJonathan Corbet <corbet@lwn.net>,\n\tShuah Khan <shuah@kernel.org>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tWolfram Sang <wsa+renesas@sang-engineering.com>,\n\tJason Gunthorpe <jgg@nvidia.com>,\n\tJohan Hovold <johan@kernel.org>,\n\t\"Paul E . McKenney\" <paulmck@kernel.org>,\n\tDan Williams <dan.j.williams@intel.com>,\n\tchrome-platform@lists.linux.dev,\n\ttzungbi@kernel.org,\n\tlinux-gpio@vger.kernel.org,\n\tlinux-kselftest@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org",
        "Subject": "[PATCH v3 06/11] selftests: gpio: Add gpio-cdev-uaf tests",
        "Date": "Fri, 13 Feb 2026 09:29:53 +0000",
        "Message-ID": "<20260213092958.864411-7-tzungbi@kernel.org>",
        "X-Mailer": "git-send-email 2.53.0.310.g728cabbaf7-goog",
        "In-Reply-To": "<20260213092958.864411-1-tzungbi@kernel.org>",
        "References": "<20260213092958.864411-1-tzungbi@kernel.org>",
        "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": "Add tests for gpiolib-cdev to make sure accessing to dangling resources\nvia the opening file descriptor won't crash the system after the\nunderlying resource providers have gone.\n\nSigned-off-by: Tzung-Bi Shih <tzungbi@kernel.org>\n---\nv3:\n- No changes.\n\nv2: https://lore.kernel.org/all/20260203061059.975605-7-tzungbi@kernel.org\n- Remove fdinfo test which is redundant.\n\nv1: https://lore.kernel.org/all/20260116081036.352286-12-tzungbi@kernel.org\n\n tools/testing/selftests/gpio/Makefile         |   5 +-\n tools/testing/selftests/gpio/gpio-cdev-uaf.c  | 292 ++++++++++++++++++\n tools/testing/selftests/gpio/gpio-cdev-uaf.sh |  63 ++++\n 3 files changed, 358 insertions(+), 2 deletions(-)\n create mode 100644 tools/testing/selftests/gpio/gpio-cdev-uaf.c\n create mode 100755 tools/testing/selftests/gpio/gpio-cdev-uaf.sh",
    "diff": "diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile\nindex 7bfe315f7001..741ab21e1260 100644\n--- a/tools/testing/selftests/gpio/Makefile\n+++ b/tools/testing/selftests/gpio/Makefile\n@@ -1,8 +1,9 @@\n # SPDX-License-Identifier: GPL-2.0\n \n-TEST_PROGS := gpio-mockup.sh gpio-sim.sh gpio-aggregator.sh\n+TEST_PROGS := gpio-mockup.sh gpio-sim.sh gpio-aggregator.sh gpio-cdev-uaf.sh\n TEST_FILES := gpio-mockup-sysfs.sh\n-TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev gpio-chip-info gpio-line-name\n+TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev gpio-chip-info gpio-line-name \\\n+\t\t\t   gpio-cdev-uaf\n CFLAGS += -O2 -g -Wall $(KHDR_INCLUDES)\n \n include ../lib.mk\ndiff --git a/tools/testing/selftests/gpio/gpio-cdev-uaf.c b/tools/testing/selftests/gpio/gpio-cdev-uaf.c\nnew file mode 100644\nindex 000000000000..765d3cc4f0ef\n--- /dev/null\n+++ b/tools/testing/selftests/gpio/gpio-cdev-uaf.c\n@@ -0,0 +1,292 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * GPIO character device helper for UAF tests.\n+ *\n+ * Copyright 2026 Google LLC\n+ */\n+\n+#include <errno.h>\n+#include <fcntl.h>\n+#include <linux/gpio.h>\n+#include <poll.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <sys/ioctl.h>\n+#include <sys/stat.h>\n+#include <sys/types.h>\n+#include <unistd.h>\n+\n+#define CONFIGFS_DIR \"/sys/kernel/config/gpio-sim\"\n+#define PROCFS_DIR \"/proc\"\n+\n+static void print_usage(void)\n+{\n+\tprintf(\"usage:\\n\");\n+\tprintf(\"  gpio-cdev-uaf [chip|handle|event|req] [poll|read|ioctl]\\n\");\n+}\n+\n+static int _create_chip(const char *name, int create)\n+{\n+\tchar path[64];\n+\n+\tsnprintf(path, sizeof(path), CONFIGFS_DIR \"/%s\", name);\n+\n+\tif (create)\n+\t\treturn mkdir(path, 0755);\n+\telse\n+\t\treturn rmdir(path);\n+}\n+\n+static int create_chip(const char *name)\n+{\n+\treturn _create_chip(name, 1);\n+}\n+\n+static void remove_chip(const char *name)\n+{\n+\t_create_chip(name, 0);\n+}\n+\n+static int _create_bank(const char *chip_name, const char *name, int create)\n+{\n+\tchar path[64];\n+\n+\tsnprintf(path, sizeof(path), CONFIGFS_DIR \"/%s/%s\", chip_name, name);\n+\n+\tif (create)\n+\t\treturn mkdir(path, 0755);\n+\telse\n+\t\treturn rmdir(path);\n+}\n+\n+static int create_bank(const char *chip_name, const char *name)\n+{\n+\treturn _create_bank(chip_name, name, 1);\n+}\n+\n+static void remove_bank(const char *chip_name, const char *name)\n+{\n+\t_create_bank(chip_name, name, 0);\n+}\n+\n+static int _enable_chip(const char *name, int enable)\n+{\n+\tchar path[64];\n+\tint fd, ret;\n+\n+\tsnprintf(path, sizeof(path), CONFIGFS_DIR \"/%s/live\", name);\n+\n+\tfd = open(path, O_WRONLY);\n+\tif (fd == -1)\n+\t\treturn fd;\n+\n+\tif (enable)\n+\t\tret = write(fd, \"1\", 1);\n+\telse\n+\t\tret = write(fd, \"0\", 1);\n+\n+\tclose(fd);\n+\treturn ret == 1 ? 0 : -1;\n+}\n+\n+static int enable_chip(const char *name)\n+{\n+\treturn _enable_chip(name, 1);\n+}\n+\n+static void disable_chip(const char *name)\n+{\n+\t_enable_chip(name, 0);\n+}\n+\n+static int open_chip(const char *chip_name, const char *bank_name)\n+{\n+\tchar path[64], dev_name[32];\n+\tint ret, fd;\n+\n+\tret = create_chip(chip_name);\n+\tif (ret) {\n+\t\tfprintf(stderr, \"failed to create chip\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = create_bank(chip_name, bank_name);\n+\tif (ret) {\n+\t\tfprintf(stderr, \"failed to create bank\\n\");\n+\t\tgoto err_remove_chip;\n+\t}\n+\n+\tret = enable_chip(chip_name);\n+\tif (ret) {\n+\t\tfprintf(stderr, \"failed to enable chip\\n\");\n+\t\tgoto err_remove_bank;\n+\t}\n+\n+\tsnprintf(path, sizeof(path), CONFIGFS_DIR \"/%s/%s/chip_name\",\n+\t\t chip_name, bank_name);\n+\n+\tfd = open(path, O_RDONLY);\n+\tif (fd == -1) {\n+\t\tret = fd;\n+\t\tfprintf(stderr, \"failed to open %s\\n\", path);\n+\t\tgoto err_disable_chip;\n+\t}\n+\n+\tret = read(fd, dev_name, sizeof(dev_name) - 1);\n+\tclose(fd);\n+\tif (ret == -1) {\n+\t\tfprintf(stderr, \"failed to read %s\\n\", path);\n+\t\tgoto err_disable_chip;\n+\t}\n+\tdev_name[ret] = '\\0';\n+\tif (ret && dev_name[ret - 1] == '\\n')\n+\t\tdev_name[ret - 1] = '\\0';\n+\n+\tsnprintf(path, sizeof(path), \"/dev/%s\", dev_name);\n+\n+\tfd = open(path, O_RDWR);\n+\tif (fd == -1) {\n+\t\tret = fd;\n+\t\tfprintf(stderr, \"failed to open %s\\n\", path);\n+\t\tgoto err_disable_chip;\n+\t}\n+\n+\treturn fd;\n+err_disable_chip:\n+\tdisable_chip(chip_name);\n+err_remove_bank:\n+\tremove_bank(chip_name, bank_name);\n+err_remove_chip:\n+\tremove_chip(chip_name);\n+\treturn ret;\n+}\n+\n+static void close_chip(const char *chip_name, const char *bank_name)\n+{\n+\tdisable_chip(chip_name);\n+\tremove_bank(chip_name, bank_name);\n+\tremove_chip(chip_name);\n+}\n+\n+static int test_poll(int fd)\n+{\n+\tstruct pollfd pfds;\n+\n+\tpfds.fd = fd;\n+\tpfds.events = POLLIN;\n+\tpfds.revents = 0;\n+\n+\tif (poll(&pfds, 1, 0) == -1)\n+\t\treturn -1;\n+\n+\treturn (pfds.revents & ~(POLLHUP | POLLERR)) ? -1 : 0;\n+}\n+\n+static int test_read(int fd)\n+{\n+\tchar data;\n+\n+\tif (read(fd, &data, 1) == -1 && errno == ENODEV)\n+\t\treturn 0;\n+\treturn -1;\n+}\n+\n+static int test_ioctl(int fd)\n+{\n+\tif (ioctl(fd, 0, NULL) == -1 && errno == ENODEV)\n+\t\treturn 0;\n+\treturn -1;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+\tint cfd, fd, ret;\n+\tint (*test_func)(int);\n+\n+\tif (argc != 3) {\n+\t\tprint_usage();\n+\t\treturn EXIT_FAILURE;\n+\t}\n+\n+\tif (strcmp(argv[1], \"chip\") == 0 ||\n+\t    strcmp(argv[1], \"event\") == 0 ||\n+\t    strcmp(argv[1], \"req\") == 0) {\n+\t\tif (strcmp(argv[2], \"poll\") &&\n+\t\t    strcmp(argv[2], \"read\") &&\n+\t\t    strcmp(argv[2], \"ioctl\")) {\n+\t\t\tfprintf(stderr, \"unknown command: %s\\n\", argv[2]);\n+\t\t\treturn EXIT_FAILURE;\n+\t\t}\n+\t} else if (strcmp(argv[1], \"handle\") == 0) {\n+\t\tif (strcmp(argv[2], \"ioctl\")) {\n+\t\t\tfprintf(stderr, \"unknown command: %s\\n\", argv[2]);\n+\t\t\treturn EXIT_FAILURE;\n+\t\t}\n+\t} else {\n+\t\tfprintf(stderr, \"unknown command: %s\\n\", argv[1]);\n+\t\treturn EXIT_FAILURE;\n+\t}\n+\n+\tif (strcmp(argv[2], \"poll\") == 0)\n+\t\ttest_func = test_poll;\n+\telse if (strcmp(argv[2], \"read\") == 0)\n+\t\ttest_func = test_read;\n+\telse\t/* strcmp(argv[2], \"ioctl\") == 0 */\n+\t\ttest_func = test_ioctl;\n+\n+\tcfd = open_chip(\"chip\", \"bank\");\n+\tif (cfd == -1) {\n+\t\tfprintf(stderr, \"failed to open chip\\n\");\n+\t\treturn EXIT_FAILURE;\n+\t}\n+\n+\t/* Step 1: Hold a FD to the test target. */\n+\tif (strcmp(argv[1], \"chip\") == 0) {\n+\t\tfd = cfd;\n+\t} else if (strcmp(argv[1], \"handle\") == 0) {\n+\t\tstruct gpiohandle_request req = {0};\n+\n+\t\treq.lines = 1;\n+\t\tif (ioctl(cfd, GPIO_GET_LINEHANDLE_IOCTL, &req) == -1) {\n+\t\t\tfprintf(stderr, \"failed to get handle FD\\n\");\n+\t\t\tgoto err_close_chip;\n+\t\t}\n+\n+\t\tclose(cfd);\n+\t\tfd = req.fd;\n+\t} else if (strcmp(argv[1], \"event\") == 0) {\n+\t\tstruct gpioevent_request req = {0};\n+\n+\t\tif (ioctl(cfd, GPIO_GET_LINEEVENT_IOCTL, &req) == -1) {\n+\t\t\tfprintf(stderr, \"failed to get event FD\\n\");\n+\t\t\tgoto err_close_chip;\n+\t\t}\n+\n+\t\tclose(cfd);\n+\t\tfd = req.fd;\n+\t} else {\t/* strcmp(argv[1], \"req\") == 0 */\n+\t\tstruct gpio_v2_line_request req = {0};\n+\n+\t\treq.num_lines = 1;\n+\t\tif (ioctl(cfd, GPIO_V2_GET_LINE_IOCTL, &req) == -1) {\n+\t\t\tfprintf(stderr, \"failed to get req FD\\n\");\n+\t\t\tgoto err_close_chip;\n+\t\t}\n+\n+\t\tclose(cfd);\n+\t\tfd = req.fd;\n+\t}\n+\n+\t/* Step 2: Free the chip. */\n+\tclose_chip(\"chip\", \"bank\");\n+\n+\t/* Step 3: Access the dangling FD to trigger UAF. */\n+\tret = test_func(fd);\n+\tclose(fd);\n+\treturn ret ? EXIT_FAILURE : EXIT_SUCCESS;\n+err_close_chip:\n+\tclose(cfd);\n+\tclose_chip(\"chip\", \"bank\");\n+\treturn EXIT_FAILURE;\n+}\ndiff --git a/tools/testing/selftests/gpio/gpio-cdev-uaf.sh b/tools/testing/selftests/gpio/gpio-cdev-uaf.sh\nnew file mode 100755\nindex 000000000000..6e47533019cf\n--- /dev/null\n+++ b/tools/testing/selftests/gpio/gpio-cdev-uaf.sh\n@@ -0,0 +1,63 @@\n+#!/bin/sh\n+# SPDX-License-Identifier: GPL-2.0\n+# Copyright 2026 Google LLC\n+\n+BASE_DIR=`dirname $0`\n+MODULE=\"gpio-cdev-uaf\"\n+\n+fail() {\n+\techo \"$*\" >&2\n+\techo \"GPIO $MODULE test FAIL\"\n+\texit 1\n+}\n+\n+skip() {\n+\techo \"$*\" >&2\n+\techo \"GPIO $MODULE test SKIP\"\n+\texit 4\n+}\n+\n+# Load the gpio-sim module. This will pull in configfs if needed too.\n+modprobe gpio-sim || skip \"unable to load the gpio-sim module\"\n+# Make sure configfs is mounted at /sys/kernel/config. Wait a bit if needed.\n+for _ in `seq 5`; do\n+\tmountpoint -q /sys/kernel/config && break\n+\tmount -t configfs none /sys/kernel/config\n+\tsleep 0.1\n+done\n+mountpoint -q /sys/kernel/config || \\\n+\tskip \"configfs not mounted at /sys/kernel/config\"\n+\n+echo \"1. GPIO\"\n+\n+echo \"1.1. poll\"\n+$BASE_DIR/gpio-cdev-uaf chip poll || fail \"failed to test chip poll\"\n+echo \"1.2. read\"\n+$BASE_DIR/gpio-cdev-uaf chip read || fail \"failed to test chip read\"\n+echo \"1.3. ioctl\"\n+$BASE_DIR/gpio-cdev-uaf chip ioctl || fail \"failed to test chip ioctl\"\n+\n+echo \"2. linehandle\"\n+\n+echo \"2.1. ioctl\"\n+$BASE_DIR/gpio-cdev-uaf handle ioctl || fail \"failed to test handle ioctl\"\n+\n+echo \"3. lineevent\"\n+\n+echo \"3.1. read\"\n+$BASE_DIR/gpio-cdev-uaf event read || fail \"failed to test event read\"\n+echo \"3.2. poll\"\n+$BASE_DIR/gpio-cdev-uaf event poll || fail \"failed to test event poll\"\n+echo \"3.3. ioctl\"\n+$BASE_DIR/gpio-cdev-uaf event ioctl || fail \"failed to test event ioctl\"\n+\n+echo \"4. linereq\"\n+\n+echo \"4.1. read\"\n+$BASE_DIR/gpio-cdev-uaf req read || fail \"failed to test req read\"\n+echo \"4.2. poll\"\n+$BASE_DIR/gpio-cdev-uaf req poll || fail \"failed to test req poll\"\n+echo \"4.3. ioctl\"\n+$BASE_DIR/gpio-cdev-uaf req ioctl || fail \"failed to test req ioctl\"\n+\n+echo \"GPIO $MODULE test PASS\"\n",
    "prefixes": [
        "v3",
        "06/11"
    ]
}