From: Franck Bui Date: Tue, 3 Jan 2023 17:34:11 +0000 (+0100) Subject: udev: merge link_directory_lock() into link_directory_open() X-Git-Tag: v253-rc1~115^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9032f910c02288d08cac68f266f869cb1f66f64;p=thirdparty%2Fsystemd.git udev: merge link_directory_lock() into link_directory_open() These 2 operations are inseparable. --- diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 1990282c754..ef6f604478a 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -280,38 +280,6 @@ static int stack_directory_update(sd_device *dev, int fd, bool add) { return 1; /* Updated. */ } -static int stack_directory_open(const char *dirname) { - _cleanup_close_ int fd = -EBADF; - int r; - - assert(dirname); - - r = mkdir_parents(dirname, 0755); - if (r < 0) - return r; - - fd = open_mkdir_at(AT_FDCWD, dirname, O_CLOEXEC | O_DIRECTORY | O_NOFOLLOW | O_RDONLY, 0755); - if (fd < 0) - return fd; - - return TAKE_FD(fd); -} - -static int stack_directory_lock(int dirfd) { - _cleanup_close_ int fd = -EBADF; - - assert(dirfd >= 0); - - fd = openat(dirfd, ".lock", O_CLOEXEC | O_NOFOLLOW | O_RDONLY | O_CREAT, 0600); - if (fd < 0) - return -errno; - - if (flock(fd, LOCK_EX) < 0) - return -errno; - - return TAKE_FD(fd); -} - size_t udev_node_escape_path(const char *src, char *dest, size_t size) { size_t i, j; uint64_t h; @@ -385,6 +353,35 @@ static int stack_directory_get_name(const char *slink, char **ret) { return 0; } +static int stack_directory_open(sd_device *dev, const char *dirname, int *ret_dirfd, int *ret_lockfd) { + _cleanup_close_ int dirfd = -EBADF, lockfd = -EBADF; + int r; + + assert(dev); + assert(dirname); + assert(ret_dirfd); + assert(ret_lockfd); + + r = mkdir_parents(dirname, 0755); + if (r < 0) + return log_device_debug_errno(dev, r, "Failed to create stack directory '%s': %m", dirname); + + dirfd = open_mkdir_at(AT_FDCWD, dirname, O_CLOEXEC | O_DIRECTORY | O_NOFOLLOW | O_RDONLY, 0755); + if (dirfd < 0) + return log_device_debug_errno(dev, dirfd, "Failed to open stack directory '%s': %m", dirname); + + lockfd = openat(dirfd, ".lock", O_CLOEXEC | O_NOFOLLOW | O_RDONLY | O_CREAT, 0600); + if (lockfd < 0) + return log_device_debug_errno(dev, errno, "Failed to create lock file for stack directory '%s': %m", dirname); + + if (flock(lockfd, LOCK_EX) < 0) + return log_device_debug_errno(dev, errno, "Failed to place a lock on lock file for '%s': %m", dirname); + + *ret_dirfd = TAKE_FD(dirfd); + *ret_lockfd = TAKE_FD(lockfd); + return 0; +} + static int link_update(sd_device *dev, const char *slink, bool add) { _cleanup_free_ char *dirname = NULL, *devnode = NULL; _cleanup_close_ int dirfd = -EBADF, lockfd = -EBADF; @@ -397,13 +394,9 @@ static int link_update(sd_device *dev, const char *slink, bool add) { if (r < 0) return log_device_debug_errno(dev, r, "Failed to build stack directory name for '%s': %m", slink); - dirfd = stack_directory_open(dirname); - if (dirfd < 0) - return log_device_debug_errno(dev, dirfd, "Failed to open stack directory '%s': %m", dirname); - - lockfd = stack_directory_lock(dirfd); - if (lockfd < 0) - return log_device_debug_errno(dev, lockfd, "Failed to lock stack directory '%s': %m", dirname); + r = stack_directory_open(dev, dirname, &dirfd, &lockfd); + if (r < 0) + return r; r = stack_directory_update(dev, dirfd, add); if (r < 0)