homed: always use quotactl_fd() if its available

Let's always prefer quotactl_fd() when it's available and use quotactl()
only as as a fallback on old kernels.

This way we can operate on the fds we typically already have open, or if
needed we can open a new one, and use for multiple fs operation.

In the long run we should really focus on operating exclusively by fd
instead of by path, by device nor or otherwise. This gets us a step
closer to that.
This commit is contained in:
Lennart Poettering
2025-03-31 11:51:15 +02:00
parent da24983526
commit 5daca30b0f
9 changed files with 80 additions and 59 deletions
+14 -20
View File
@@ -1,42 +1,36 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <stdint.h>
#include <sys/quota.h>
#include <sys/stat.h>
#include "alloc-util.h"
#include "blockdev-util.h"
#include "device-util.h"
#include "errno-util.h"
#include "missing_syscall.h"
#include "quota-util.h"
int quotactl_devnum(int cmd, dev_t devnum, int id, void *addr) {
_cleanup_free_ char *devnode = NULL;
int quotactl_fd_with_fallback(int fd, int cmd, int id, void *addr) {
int r;
/* Like quotactl() but takes a dev_t instead of a path to a device node, and fixes caddr_t → void*,
* like we should, today */
/* Emulates quotactl_fd() on older kernels that lack it. (i.e. kernels < 5.14) */
r = devname_from_devnum(S_IFBLK, devnum, &devnode);
if (r < 0)
r = RET_NERRNO(quotactl_fd(fd, cmd, id, addr));
if (!ERRNO_IS_NEG_NOT_SUPPORTED(r))
return r;
if (quotactl(cmd, devnode, id, addr) < 0)
return -errno;
return 0;
}
int quotactl_path(int cmd, const char *path, int id, void *addr) {
dev_t devno;
int r;
/* Like quotactl() but takes a path to some fs object, and changes the backing file system. I.e. the
* argument shouldn't be a block device but a regular file system object */
r = get_block_device(path, &devno);
r = get_block_device_fd(fd, &devno);
if (r < 0)
return r;
if (devno == 0) /* Doesn't have a block device */
return -ENODEV;
return quotactl_devnum(cmd, devno, id, addr);
_cleanup_free_ char *devnode = NULL;
r = devname_from_devnum(S_IFBLK, devno, &devnode);
if (r < 0)
return r;
return RET_NERRNO(quotactl(cmd, devnode, id, addr));
}
+1 -2
View File
@@ -15,5 +15,4 @@ static inline int QCMD_FIXED(uint32_t cmd, uint32_t type) {
return (int) QCMD(cmd, type);
}
int quotactl_devnum(int cmd, dev_t devnum, int id, void *addr);
int quotactl_path(int cmd, const char *path, int id, void *addr);
int quotactl_fd_with_fallback(int fd, int cmd, int id, void *addr);