summaryrefslogtreecommitdiff
path: root/libbtrfsutil/filesystem.c
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2018-01-25 01:18:20 -0800
committerDavid Sterba <dsterba@suse.com>2018-02-24 01:37:17 +0100
commit9615c23d1570c22a249c9eced754156e844c26b6 (patch)
tree64395b8cfe5302c2205ea1755d4434972c3ff83c /libbtrfsutil/filesystem.c
parentbad4208da33f3ef2adf9af2b06a597f2ce23d228 (diff)
libbtrfsutil: add filesystem sync helpers
Namely, sync, start_sync, and wait_sync. Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'libbtrfsutil/filesystem.c')
-rw-r--r--libbtrfsutil/filesystem.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/libbtrfsutil/filesystem.c b/libbtrfsutil/filesystem.c
new file mode 100644
index 00000000..dfd171bf
--- /dev/null
+++ b/libbtrfsutil/filesystem.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 Facebook
+ *
+ * This file is part of libbtrfsutil.
+ *
+ * libbtrfsutil is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * libbtrfsutil is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libbtrfsutil. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/btrfs.h>
+
+#include "btrfsutil_internal.h"
+
+PUBLIC enum btrfs_util_error btrfs_util_sync(const char *path)
+{
+ enum btrfs_util_error err;
+ int fd;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ return BTRFS_UTIL_ERROR_OPEN_FAILED;
+
+ err = btrfs_util_sync_fd(fd);
+ SAVE_ERRNO_AND_CLOSE(fd);
+ return err;
+}
+
+PUBLIC enum btrfs_util_error btrfs_util_sync_fd(int fd)
+{
+ int ret;
+
+ ret = ioctl(fd, BTRFS_IOC_SYNC, NULL);
+ if (ret == -1)
+ return BTRFS_UTIL_ERROR_SYNC_FAILED;
+
+ return BTRFS_UTIL_OK;
+}
+
+PUBLIC enum btrfs_util_error btrfs_util_start_sync(const char *path,
+ uint64_t *transid)
+{
+ enum btrfs_util_error err;
+ int fd;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ return BTRFS_UTIL_ERROR_OPEN_FAILED;
+
+ err = btrfs_util_start_sync_fd(fd, transid);
+ SAVE_ERRNO_AND_CLOSE(fd);
+ return err;
+}
+
+PUBLIC enum btrfs_util_error btrfs_util_start_sync_fd(int fd, uint64_t *transid)
+{
+ int ret;
+
+ ret = ioctl(fd, BTRFS_IOC_START_SYNC, transid);
+ if (ret == -1)
+ return BTRFS_UTIL_ERROR_START_SYNC_FAILED;
+
+ return BTRFS_UTIL_OK;
+}
+
+PUBLIC enum btrfs_util_error btrfs_util_wait_sync(const char *path,
+ uint64_t transid)
+{
+ enum btrfs_util_error err;
+ int fd;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ return BTRFS_UTIL_ERROR_OPEN_FAILED;
+
+ err = btrfs_util_wait_sync_fd(fd, transid);
+ SAVE_ERRNO_AND_CLOSE(fd);
+ return err;
+}
+
+PUBLIC enum btrfs_util_error btrfs_util_wait_sync_fd(int fd, uint64_t transid)
+{
+ int ret;
+
+ ret = ioctl(fd, BTRFS_IOC_WAIT_SYNC, &transid);
+ if (ret == -1)
+ return BTRFS_UTIL_ERROR_WAIT_SYNC_FAILED;
+
+ return BTRFS_UTIL_OK;
+}