Skip to content

Commit

Permalink
udev: merge link_directory_lock() into link_directory_open()
Browse files Browse the repository at this point in the history
These 2 operations are inseparable.
  • Loading branch information
fbuihuu authored and yuwata committed Jan 13, 2023
1 parent e443cc7 commit c9032f9
Showing 1 changed file with 32 additions and 39 deletions.
71 changes: 32 additions & 39 deletions src/udev/udev-node.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down

0 comments on commit c9032f9

Please sign in to comment.