summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2016-03-21 15:21:01 +0800
committerDavid Sterba <dsterba@suse.com>2016-03-30 16:25:13 +0200
commita5dbd2064ef8a9b78eb0c2819b4d432623e1917d (patch)
treebac5860cfe09af9c77eb0e6533e8456ec24055af /utils.c
parent906dfb9e387812484718c981b7ec2ffbb9e892be (diff)
btrfs-progs: move test_issubvolume() to utils.c
Signed-off-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/utils.c b/utils.c
index 09962f8e..6dea54f2 100644
--- a/utils.c
+++ b/utils.c
@@ -3151,3 +3151,30 @@ int test_issubvolname(const char *name)
return name[0] != '\0' && !strchr(name, '/') &&
strcmp(name, ".") && strcmp(name, "..");
}
+
+/*
+ * Test if path is a subvolume
+ * Returns:
+ * 0 - path exists but it is not a subvolume
+ * 1 - path exists and it is a subvolume
+ * < 0 - error
+ */
+int test_issubvolume(const char *path)
+{
+ struct stat st;
+ struct statfs stfs;
+ int res;
+
+ res = stat(path, &st);
+ if (res < 0)
+ return -errno;
+
+ if (st.st_ino != BTRFS_FIRST_FREE_OBJECTID || !S_ISDIR(st.st_mode))
+ return 0;
+
+ res = statfs(path, &stfs);
+ if (res < 0)
+ return -errno;
+
+ return (int)stfs.f_type == BTRFS_SUPER_MAGIC;
+}