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:
+14
-20
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user