Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

gpio: cdev: convert lineevent_create() and linereq_create() to FD_PREPARE()

linehandle_create() was recently converted to use FD_PREPARE() to
simplify fd creation and cleanup logic.
Apply the equivalent conversion to lineevent_create() and
linereq_create().

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Link: https://patch.msgid.link/20260216123709.281444-1-warthog618@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>

authored by

Kent Gibson and committed by
Bartosz Golaszewski
96c02c90 2c46f19c

+46 -95
+46 -95
drivers/gpio/gpiolib-cdev.c
··· 1586 1586 #endif 1587 1587 }; 1588 1588 1589 + DEFINE_FREE(linereq_free, struct linereq *, if (!IS_ERR_OR_NULL(_T)) linereq_free(_T)) 1590 + 1589 1591 static int linereq_create(struct gpio_device *gdev, void __user *ip) 1590 1592 { 1591 1593 struct gpio_v2_line_request ulr; 1592 1594 struct gpio_v2_line_config *lc; 1593 - struct linereq *lr; 1594 - struct file *file; 1595 + struct linereq *lr __free(linereq_free) = NULL; 1595 1596 u64 flags, edflags; 1596 1597 unsigned int i; 1597 - int fd, ret; 1598 + int ret; 1598 1599 1599 1600 if (copy_from_user(&ulr, ip, sizeof(ulr))) 1600 1601 return -EFAULT; ··· 1628 1627 /* label is only initialized if consumer is set */ 1629 1628 lr->label = kstrndup(ulr.consumer, sizeof(ulr.consumer) - 1, 1630 1629 GFP_KERNEL); 1631 - if (!lr->label) { 1632 - ret = -ENOMEM; 1633 - goto out_free_linereq; 1634 - } 1630 + if (!lr->label) 1631 + return -ENOMEM; 1635 1632 } 1636 1633 1637 1634 mutex_init(&lr->config_mutex); ··· 1648 1649 u32 offset = ulr.offsets[i]; 1649 1650 struct gpio_desc *desc = gpio_device_get_desc(gdev, offset); 1650 1651 1651 - if (IS_ERR(desc)) { 1652 - ret = PTR_ERR(desc); 1653 - goto out_free_linereq; 1654 - } 1652 + if (IS_ERR(desc)) 1653 + return PTR_ERR(desc); 1655 1654 1656 1655 ret = gpiod_request_user(desc, lr->label); 1657 1656 if (ret) 1658 - goto out_free_linereq; 1657 + return ret; 1659 1658 1660 1659 lr->lines[i].desc = desc; 1661 1660 flags = gpio_v2_line_config_flags(lc, i); ··· 1661 1664 1662 1665 ret = gpiod_set_transitory(desc, false); 1663 1666 if (ret < 0) 1664 - goto out_free_linereq; 1667 + return ret; 1665 1668 1666 1669 edflags = flags & GPIO_V2_LINE_EDGE_DETECTOR_FLAGS; 1667 1670 /* ··· 1673 1676 1674 1677 ret = gpiod_direction_output_nonotify(desc, val); 1675 1678 if (ret) 1676 - goto out_free_linereq; 1679 + return ret; 1677 1680 } else if (flags & GPIO_V2_LINE_FLAG_INPUT) { 1678 1681 ret = gpiod_direction_input_nonotify(desc); 1679 1682 if (ret) 1680 - goto out_free_linereq; 1683 + return ret; 1681 1684 1682 1685 ret = edge_detector_setup(&lr->lines[i], lc, i, 1683 1686 edflags); 1684 1687 if (ret) 1685 - goto out_free_linereq; 1688 + return ret; 1686 1689 } 1687 1690 1688 1691 lr->lines[i].edflags = edflags; ··· 1697 1700 ret = blocking_notifier_chain_register(&gdev->device_notifier, 1698 1701 &lr->device_unregistered_nb); 1699 1702 if (ret) 1700 - goto out_free_linereq; 1703 + return ret; 1701 1704 1702 - fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); 1703 - if (fd < 0) { 1704 - ret = fd; 1705 - goto out_free_linereq; 1706 - } 1705 + FD_PREPARE(fdf, O_RDONLY | O_CLOEXEC, 1706 + anon_inode_getfile("gpio-line", &line_fileops, lr, 1707 + O_RDONLY | O_CLOEXEC)); 1708 + if (fdf.err) 1709 + return fdf.err; 1710 + retain_and_null_ptr(lr); 1707 1711 1708 - file = anon_inode_getfile("gpio-line", &line_fileops, lr, 1709 - O_RDONLY | O_CLOEXEC); 1710 - if (IS_ERR(file)) { 1711 - ret = PTR_ERR(file); 1712 - goto out_put_unused_fd; 1713 - } 1714 - 1715 - ulr.fd = fd; 1716 - if (copy_to_user(ip, &ulr, sizeof(ulr))) { 1717 - /* 1718 - * fput() will trigger the release() callback, so do not go onto 1719 - * the regular error cleanup path here. 1720 - */ 1721 - fput(file); 1722 - put_unused_fd(fd); 1712 + ulr.fd = fd_prepare_fd(fdf); 1713 + if (copy_to_user(ip, &ulr, sizeof(ulr))) 1723 1714 return -EFAULT; 1724 - } 1725 1715 1726 - fd_install(fd, file); 1716 + fd_publish(fdf); 1727 1717 1728 1718 dev_dbg(&gdev->dev, "registered chardev handle for %d lines\n", 1729 - lr->num_lines); 1719 + ulr.num_lines); 1730 1720 1731 1721 return 0; 1732 - 1733 - out_put_unused_fd: 1734 - put_unused_fd(fd); 1735 - out_free_linereq: 1736 - linereq_free(lr); 1737 - return ret; 1738 1722 } 1739 1723 1740 1724 #ifdef CONFIG_GPIO_CDEV_V1 ··· 1988 2010 return IRQ_WAKE_THREAD; 1989 2011 } 1990 2012 2013 + DEFINE_FREE(lineevent_free, struct lineevent_state *, if (!IS_ERR_OR_NULL(_T)) lineevent_free(_T)) 2014 + 1991 2015 static int lineevent_create(struct gpio_device *gdev, void __user *ip) 1992 2016 { 1993 2017 struct gpioevent_request eventreq; 1994 - struct lineevent_state *le; 2018 + struct lineevent_state *le __free(lineevent_free) = NULL; 1995 2019 struct gpio_desc *desc; 1996 - struct file *file; 1997 2020 u32 offset; 1998 2021 u32 lflags; 1999 2022 u32 eflags; 2000 - int fd; 2001 2023 int ret; 2002 2024 int irq, irqflags = 0; 2003 2025 char *label; ··· 2042 2064 le->label = kstrndup(eventreq.consumer_label, 2043 2065 sizeof(eventreq.consumer_label) - 1, 2044 2066 GFP_KERNEL); 2045 - if (!le->label) { 2046 - ret = -ENOMEM; 2047 - goto out_free_le; 2048 - } 2067 + if (!le->label) 2068 + return -ENOMEM; 2049 2069 } 2050 2070 2051 2071 ret = gpiod_request_user(desc, le->label); 2052 2072 if (ret) 2053 - goto out_free_le; 2073 + return ret; 2054 2074 le->desc = desc; 2055 2075 le->eflags = eflags; 2056 2076 ··· 2056 2080 2057 2081 ret = gpiod_direction_input(desc); 2058 2082 if (ret) 2059 - goto out_free_le; 2083 + return ret; 2060 2084 2061 2085 gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_REQUESTED); 2062 2086 2063 2087 irq = gpiod_to_irq(desc); 2064 - if (irq <= 0) { 2065 - ret = -ENODEV; 2066 - goto out_free_le; 2067 - } 2088 + if (irq <= 0) 2089 + return -ENODEV; 2068 2090 2069 2091 if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) 2070 2092 irqflags |= test_bit(GPIOD_FLAG_ACTIVE_LOW, &desc->flags) ? ··· 2079 2105 ret = blocking_notifier_chain_register(&gdev->device_notifier, 2080 2106 &le->device_unregistered_nb); 2081 2107 if (ret) 2082 - goto out_free_le; 2108 + return ret; 2083 2109 2084 2110 label = make_irq_label(le->label); 2085 - if (IS_ERR(label)) { 2086 - ret = PTR_ERR(label); 2087 - goto out_free_le; 2088 - } 2111 + if (IS_ERR(label)) 2112 + return PTR_ERR(label); 2089 2113 2090 2114 /* Request a thread to read the events */ 2091 2115 ret = request_threaded_irq(irq, ··· 2094 2122 le); 2095 2123 if (ret) { 2096 2124 free_irq_label(label); 2097 - goto out_free_le; 2125 + return ret; 2098 2126 } 2099 2127 2100 2128 le->irq = irq; 2101 2129 2102 - fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); 2103 - if (fd < 0) { 2104 - ret = fd; 2105 - goto out_free_le; 2106 - } 2130 + FD_PREPARE(fdf, O_RDONLY | O_CLOEXEC, 2131 + anon_inode_getfile("gpio-event", &lineevent_fileops, le, 2132 + O_RDONLY | O_CLOEXEC)); 2133 + if (fdf.err) 2134 + return fdf.err; 2135 + retain_and_null_ptr(le); 2107 2136 2108 - file = anon_inode_getfile("gpio-event", 2109 - &lineevent_fileops, 2110 - le, 2111 - O_RDONLY | O_CLOEXEC); 2112 - if (IS_ERR(file)) { 2113 - ret = PTR_ERR(file); 2114 - goto out_put_unused_fd; 2115 - } 2116 - 2117 - eventreq.fd = fd; 2118 - if (copy_to_user(ip, &eventreq, sizeof(eventreq))) { 2119 - /* 2120 - * fput() will trigger the release() callback, so do not go onto 2121 - * the regular error cleanup path here. 2122 - */ 2123 - fput(file); 2124 - put_unused_fd(fd); 2137 + eventreq.fd = fd_prepare_fd(fdf); 2138 + if (copy_to_user(ip, &eventreq, sizeof(eventreq))) 2125 2139 return -EFAULT; 2126 - } 2127 2140 2128 - fd_install(fd, file); 2141 + fd_publish(fdf); 2129 2142 2130 2143 return 0; 2131 - 2132 - out_put_unused_fd: 2133 - put_unused_fd(fd); 2134 - out_free_le: 2135 - lineevent_free(le); 2136 - return ret; 2137 2144 } 2138 2145 2139 2146 static void gpio_v2_line_info_to_v1(struct gpio_v2_line_info *info_v2,