import: drop logic of setting up /var/lib/machines as btrfs loopback mount
Let's simplify things and drop the logic that /var/lib/machines is setup as auto-growing btrfs loopback file /var/lib/machines.raw. THis was done in order to make quota available for machine management, but quite frankly never really worked properly, as we couldn't grow the file system in sync with its use properly. Moreover philosophically it's problematic overriding the admin's choice of file system like this. Let's hence drop this, and simplify things. Deleting code is a good feeling. Now that regular file systems provide project quota we could probably add per-machine quota support based on that, hence the btrfs quota argument is not that interesting anymore (though btrfs quota is a bit more powerful as it allows recursive quota, i.e. that the machine pool gets an overall quota in addition to per-machine quota).
This commit is contained in:
@@ -870,96 +870,6 @@ int btrfs_subvol_set_subtree_quota_limit(const char *path, uint64_t subvol_id, u
|
||||
return btrfs_subvol_set_subtree_quota_limit_fd(fd, subvol_id, referenced_max);
|
||||
}
|
||||
|
||||
int btrfs_resize_loopback_fd(int fd, uint64_t new_size, bool grow_only) {
|
||||
struct btrfs_ioctl_vol_args args = {};
|
||||
char p[SYS_BLOCK_PATH_MAX("/loop/backing_file")], q[DEV_NUM_PATH_MAX];
|
||||
_cleanup_free_ char *backing = NULL;
|
||||
_cleanup_close_ int loop_fd = -1, backing_fd = -1;
|
||||
struct stat st;
|
||||
dev_t dev = 0;
|
||||
int r;
|
||||
|
||||
/* In contrast to btrfs quota ioctls ftruncate() cannot make sense of "infinity" or file sizes > 2^31 */
|
||||
if (!FILE_SIZE_VALID(new_size))
|
||||
return -EINVAL;
|
||||
|
||||
/* btrfs cannot handle file systems < 16M, hence use this as minimum */
|
||||
if (new_size < 16*1024*1024)
|
||||
new_size = 16*1024*1024;
|
||||
|
||||
r = btrfs_get_block_device_fd(fd, &dev);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
return -ENODEV;
|
||||
|
||||
xsprintf_sys_block_path(p, "/loop/backing_file", dev);
|
||||
r = read_one_line_file(p, &backing);
|
||||
if (r == -ENOENT)
|
||||
return -ENODEV;
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (isempty(backing) || !path_is_absolute(backing))
|
||||
return -ENODEV;
|
||||
|
||||
backing_fd = open(backing, O_RDWR|O_CLOEXEC|O_NOCTTY);
|
||||
if (backing_fd < 0)
|
||||
return -errno;
|
||||
|
||||
if (fstat(backing_fd, &st) < 0)
|
||||
return -errno;
|
||||
if (!S_ISREG(st.st_mode))
|
||||
return -ENODEV;
|
||||
|
||||
if (new_size == (uint64_t) st.st_size)
|
||||
return 0;
|
||||
|
||||
if (grow_only && new_size < (uint64_t) st.st_size)
|
||||
return -EINVAL;
|
||||
|
||||
xsprintf_dev_num_path(q, "block", dev);
|
||||
loop_fd = open(q, O_RDWR|O_CLOEXEC|O_NOCTTY);
|
||||
if (loop_fd < 0)
|
||||
return -errno;
|
||||
|
||||
if (snprintf(args.name, sizeof(args.name), "%" PRIu64, new_size) >= (int) sizeof(args.name))
|
||||
return -EINVAL;
|
||||
|
||||
if (new_size < (uint64_t) st.st_size) {
|
||||
/* Decrease size: first decrease btrfs size, then shorten loopback */
|
||||
if (ioctl(fd, BTRFS_IOC_RESIZE, &args) < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if (ftruncate(backing_fd, new_size) < 0)
|
||||
return -errno;
|
||||
|
||||
if (ioctl(loop_fd, LOOP_SET_CAPACITY, 0) < 0)
|
||||
return -errno;
|
||||
|
||||
if (new_size > (uint64_t) st.st_size) {
|
||||
/* Increase size: first enlarge loopback, then increase btrfs size */
|
||||
if (ioctl(fd, BTRFS_IOC_RESIZE, &args) < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* Make sure the free disk space is correctly updated for both file systems */
|
||||
(void) fsync(fd);
|
||||
(void) fsync(backing_fd);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int btrfs_resize_loopback(const char *p, uint64_t new_size, bool grow_only) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
|
||||
fd = open(p, O_RDONLY|O_NOCTTY|O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
return btrfs_resize_loopback_fd(fd, new_size, grow_only);
|
||||
}
|
||||
|
||||
int btrfs_qgroupid_make(uint64_t level, uint64_t id, uint64_t *ret) {
|
||||
assert(ret);
|
||||
|
||||
|
||||
@@ -62,9 +62,6 @@ int btrfs_quota_scan_start(int fd);
|
||||
int btrfs_quota_scan_wait(int fd);
|
||||
int btrfs_quota_scan_ongoing(int fd);
|
||||
|
||||
int btrfs_resize_loopback_fd(int fd, uint64_t size, bool grow_only);
|
||||
int btrfs_resize_loopback(const char *path, uint64_t size, bool grow_only);
|
||||
|
||||
int btrfs_subvol_make(const char *path);
|
||||
int btrfs_subvol_make_fd(int fd, const char *subvolume);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user