summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2015-02-24 18:43:37 +0100
committerLennart Poettering <lennart@poettering.net>2015-02-24 18:46:49 +0100
commit754061ce7173fd8cb66ade1a48381e2cead35522 (patch)
tree5db2ea3f26d7c19a82b3af2f725ba2900dc4a7cb
parentmachined/machinectl: when "machinectl image-status" is used without arguments... (diff)
downloadsystemd-754061ce7173fd8cb66ade1a48381e2cead35522.tar.xz
systemd-754061ce7173fd8cb66ade1a48381e2cead35522.zip
importd: enable btrfs quota in /var/lib/machines, if necessary
-rw-r--r--src/import/importd.c9
-rw-r--r--src/shared/btrfs-util.c23
-rw-r--r--src/shared/btrfs-util.h3
3 files changed, 35 insertions, 0 deletions
diff --git a/src/import/importd.c b/src/import/importd.c
index 25d9ab2e71..f315212685 100644
--- a/src/import/importd.c
+++ b/src/import/importd.c
@@ -792,6 +792,11 @@ static int setup_machine_directory(sd_bus_error *error) {
return sd_bus_error_set_errnof(error, r, "Failed to determine whether /var/lib/machines is located on btrfs: %m");
if (r > 0) {
(void) btrfs_subvol_make_label("/var/lib/machines");
+
+ r = btrfs_quota_enable("/var/lib/machines", true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to enable quota, ignoring: %m");
+
return 0;
}
@@ -858,6 +863,10 @@ static int setup_machine_directory(sd_bus_error *error) {
}
mntdir_mounted = true;
+ r = btrfs_quota_enable(mntdir, true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to enable quota, ignoring: %m");
+
if (chmod(mntdir, 0700) < 0) {
r = sd_bus_error_set_errnof(error, errno, "Failed to fix owner: %m");
goto fail;
diff --git a/src/shared/btrfs-util.c b/src/shared/btrfs-util.c
index 2a70dfea45..980963b748 100644
--- a/src/shared/btrfs-util.c
+++ b/src/shared/btrfs-util.c
@@ -646,3 +646,26 @@ int btrfs_defrag(const char *p) {
return btrfs_defrag_fd(fd);
}
+
+int btrfs_quota_enable_fd(int fd, bool b) {
+ struct btrfs_ioctl_quota_ctl_args args = {
+ .cmd = b ? BTRFS_QUOTA_CTL_ENABLE : BTRFS_QUOTA_CTL_DISABLE,
+ };
+
+ assert(fd >= 0);
+
+ if (ioctl(fd, BTRFS_IOC_QUOTA_CTL, &args) < 0)
+ return -errno;
+
+ return 0;
+}
+
+int btrfs_quota_enable(const char *path, bool b) {
+ _cleanup_close_ int fd = -1;
+
+ fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
+ if (fd < 0)
+ return -errno;
+
+ return btrfs_quota_enable_fd(fd, b);
+}
diff --git a/src/shared/btrfs-util.h b/src/shared/btrfs-util.h
index 1b9c142e5c..93c3f13ed5 100644
--- a/src/shared/btrfs-util.h
+++ b/src/shared/btrfs-util.h
@@ -64,3 +64,6 @@ int btrfs_get_block_device(const char *path, dev_t *dev);
int btrfs_defrag_fd(int fd);
int btrfs_defrag(const char *p);
+
+int btrfs_quota_enable_fd(int fd, bool b);
+int btrfs_quota_enable(const char *path, bool b);