mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-11 05:17:44 +03:00
btrfs-util: add helper that abstracts "might be btrfs subvol?" check
Let#s not hardcode inode nr 256 everywhere, but abstract this check slightly.
This commit is contained in:
parent
35f4b6d8ba
commit
674b04ff1b
@ -91,7 +91,7 @@ int btrfs_is_subvol_fd(int fd) {
|
||||
if (fstat(fd, &st) < 0)
|
||||
return -errno;
|
||||
|
||||
if (!S_ISDIR(st.st_mode) || st.st_ino != 256)
|
||||
if (!btrfs_might_be_subvol(&st))
|
||||
return 0;
|
||||
|
||||
return btrfs_is_filesystem(fd);
|
||||
@ -194,7 +194,7 @@ int btrfs_subvol_set_read_only_fd(int fd, bool b) {
|
||||
if (fstat(fd, &st) < 0)
|
||||
return -errno;
|
||||
|
||||
if (!S_ISDIR(st.st_mode) || st.st_ino != 256)
|
||||
if (!btrfs_might_be_subvol(&st))
|
||||
return -EINVAL;
|
||||
|
||||
if (ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags) < 0)
|
||||
@ -229,7 +229,7 @@ int btrfs_subvol_get_read_only_fd(int fd) {
|
||||
if (fstat(fd, &st) < 0)
|
||||
return -errno;
|
||||
|
||||
if (!S_ISDIR(st.st_mode) || st.st_ino != 256)
|
||||
if (!btrfs_might_be_subvol(&st))
|
||||
return -EINVAL;
|
||||
|
||||
if (ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags) < 0)
|
||||
|
@ -127,3 +127,13 @@ static inline int btrfs_log_dev_root(int level, int ret, const char *p) {
|
||||
"File system behind %s is reported by btrfs to be backed by pseudo-device /dev/root, which is not a valid userspace accessible device node. "
|
||||
"Cannot determine correct backing block device.", p);
|
||||
}
|
||||
|
||||
static inline bool btrfs_might_be_subvol(const struct stat *st) {
|
||||
if (!st)
|
||||
return false;
|
||||
|
||||
/* Returns true if this 'struct stat' looks like it could refer to a btrfs subvolume. To make a final
|
||||
* decision, needs to be combined with an fstatfs() check to see if this is actually btrfs. */
|
||||
|
||||
return S_ISDIR(st->st_mode) && st->st_ino == 256;
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
|
||||
if (r > 0)
|
||||
continue;
|
||||
|
||||
if ((flags & REMOVE_SUBVOLUME) && st.st_ino == 256) {
|
||||
if ((flags & REMOVE_SUBVOLUME) && btrfs_might_be_subvol(&st)) {
|
||||
|
||||
/* This could be a subvolume, try to remove it */
|
||||
|
||||
|
@ -283,7 +283,7 @@ int tar_export_start(TarExport *e, const char *path, int fd, ImportCompressType
|
||||
|
||||
e->quota_referenced = (uint64_t) -1;
|
||||
|
||||
if (e->st.st_ino == 256) { /* might be a btrfs subvolume? */
|
||||
if (btrfs_might_be_subvol(&e->st)) {
|
||||
BtrfsQuotaInfo q;
|
||||
|
||||
r = btrfs_subvol_get_subtree_quota_fd(sfd, 0, &q);
|
||||
|
@ -260,8 +260,7 @@ static int image_make(
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
/* btrfs subvolumes have inode 256 */
|
||||
if (st->st_ino == 256) {
|
||||
if (btrfs_might_be_subvol(st)) {
|
||||
|
||||
r = btrfs_is_filesystem(fd);
|
||||
if (r < 0)
|
||||
|
Loading…
Reference in New Issue
Block a user