From: Anand Jain <anand.jain@oracle.com>
To: linux-btrfs@vger.kernel.org
Cc: dsterba@suse.cz
Subject: [PATCH v2 1/5] btrfs-progs: introduce framework to check kernel supported features
Date: Mon, 23 Nov 2015 20:56:14 +0800 [thread overview]
Message-ID: <1448283378-10579-2-git-send-email-anand.jain@oracle.com> (raw)
In-Reply-To: <1448283378-10579-1-git-send-email-anand.jain@oracle.com>
In the newer kernel, supported kernel features can be known from
/sys/fs/btrfs/features
however this interface was introduced only after 3.14, and most the
incompatible FS features were introduce before 3.14.
This patch proposes to maintain kernel version against the feature list,
and so that will be the minimum kernel version needed to use the feature.
Further, for features supported later than 3.14 this list can still be
updated, so it serves as a repository which can be displayed for easy
reference.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
v2: Check for condition that what happens when we fail to read kernel
version. Now the code will fail back to use the default as set by
the progs.
utils.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
utils.h | 1 +
2 files changed, 76 insertions(+), 5 deletions(-)
diff --git a/utils.c b/utils.c
index b754686..24042e5 100644
--- a/utils.c
+++ b/utils.c
@@ -32,10 +32,12 @@
#include <linux/loop.h>
#include <linux/major.h>
#include <linux/kdev_t.h>
+#include <linux/version.h>
#include <limits.h>
#include <blkid/blkid.h>
#include <sys/vfs.h>
#include <sys/statfs.h>
+#include <sys/utsname.h>
#include <linux/magic.h>
#include "kerncompat.h"
@@ -567,21 +569,28 @@ out:
return ret;
}
+/*
+ * min_ker_ver: update with minimum kernel version at which the feature
+ * was integrated into the mainline. For the transit period, that is
+ * feature not yet in mainline but in mailing list and for testing,
+ * please use "0.0" to indicate the same.
+ */
static const struct btrfs_fs_feature {
const char *name;
u64 flag;
const char *desc;
+ const char *min_ker_ver;
} mkfs_features[] = {
{ "mixed-bg", BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS,
- "mixed data and metadata block groups" },
+ "mixed data and metadata block groups", "2.7.31"},
{ "extref", BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
- "increased hardlink limit per file to 65536" },
+ "increased hardlink limit per file to 65536", "3.7"},
{ "raid56", BTRFS_FEATURE_INCOMPAT_RAID56,
- "raid56 extended format" },
+ "raid56 extended format", "3.9"},
{ "skinny-metadata", BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA,
- "reduced-size metadata extent refs" },
+ "reduced-size metadata extent refs", "3.10"},
{ "no-holes", BTRFS_FEATURE_INCOMPAT_NO_HOLES,
- "no explicit hole extents for files" },
+ "no explicit hole extents for files", "3.14"},
/* Keep this one last */
{ "list-all", BTRFS_FEATURE_LIST_ALL, NULL }
};
@@ -3077,3 +3086,64 @@ unsigned int get_unit_mode_from_arg(int *argc, char *argv[], int df_mode)
return unit_mode;
}
+
+static int version_to_code(char *v)
+{
+ int i = 0;
+ char *b[3] = {NULL};
+ char *save_b = NULL;
+
+ for (b[i] = strtok_r(v, ".", &save_b);
+ b[i] != NULL;
+ b[i] = strtok_r(NULL, ".", &save_b))
+ i++;
+
+ if (b[2] == NULL)
+ return KERNEL_VERSION(atoi(b[0]), atoi(b[1]), 0);
+ else
+ return KERNEL_VERSION(atoi(b[0]), atoi(b[1]), atoi(b[2]));
+
+}
+
+static int get_kernel_code()
+{
+ int ret;
+ struct utsname utsbuf;
+ char *version;
+
+ ret = uname(&utsbuf);
+ if (ret)
+ return -ret;
+
+ if (!strlen(utsbuf.release))
+ return -EINVAL;
+
+ version = strtok(utsbuf.release, "-");
+
+ return version_to_code(version);
+}
+
+u64 btrfs_features_allowed_by_kernel(void)
+{
+ int i;
+ int local_kernel_code = get_kernel_code();
+ u64 features = 0;
+
+ /*
+ * When system did not provide the kernel version then just
+ * return 0, the caller has to depend on the intelligence as
+ * per btrfs-progs version
+ */
+ if (local_kernel_code <= 0)
+ return 0;
+
+ for (i = 0; i < ARRAY_SIZE(mkfs_features) - 1; i++) {
+ char *ver = strdup(mkfs_features[i].min_ker_ver);
+
+ if (local_kernel_code >= version_to_code(ver))
+ features |= mkfs_features[i].flag;
+
+ free(ver);
+ }
+ return (features);
+}
diff --git a/utils.h b/utils.h
index 192f3d1..9044643 100644
--- a/utils.h
+++ b/utils.h
@@ -104,6 +104,7 @@ void btrfs_list_all_fs_features(u64 mask_disallowed);
char* btrfs_parse_fs_features(char *namelist, u64 *flags);
void btrfs_process_fs_features(u64 flags);
void btrfs_parse_features_to_string(char *buf, u64 flags);
+u64 btrfs_features_allowed_by_kernel(void);
struct btrfs_mkfs_config {
char *label;
--
2.6.2
next prev parent reply other threads:[~2015-11-23 12:56 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-23 12:56 [PATCH v2 0/5] Make btrfs-progs really compatible with any kernel version Anand Jain
2015-11-23 12:56 ` Anand Jain [this message]
2015-11-24 14:39 ` [PATCH v2 1/5] btrfs-progs: introduce framework to check kernel supported features Mike Fleetwood
2015-11-24 20:21 ` Austin S Hemmelgarn
2015-11-26 17:38 ` David Sterba
2015-11-30 12:30 ` Austin S Hemmelgarn
2015-11-25 10:58 ` [PATCH v3 " Anand Jain
2015-11-23 12:56 ` [PATCH v2 2/5] btrfs-progs: add framework to check features supported by sysfs Anand Jain
2015-11-23 12:56 ` [PATCH v2 3/5] btrfs-progs: kernel based default features for mkfs Anand Jain
2015-11-23 15:57 ` Christoph Anton Mitterer
2015-11-23 16:05 ` Austin S Hemmelgarn
2015-11-23 16:14 ` Christoph Anton Mitterer
2015-11-23 16:55 ` Austin S Hemmelgarn
2015-11-23 12:56 ` [PATCH v2 4/5] btrfs-progs: kernel based default features for btrfs-convert Anand Jain
2015-11-23 12:56 ` [PATCH 5/5] btrfs-progs: add warning when we fail to read sysfs or version Anand Jain
2015-11-23 17:56 ` [PATCH v2 0/5] Make btrfs-progs really compatible with any kernel version David Sterba
2015-11-23 20:14 ` Austin S Hemmelgarn
2015-11-24 6:29 ` Duncan
2015-11-24 13:22 ` Anand Jain
2015-12-04 1:44 ` Liu Bo
2015-12-04 2:08 ` Qu Wenruo
2015-12-04 2:53 ` Liu Bo
2015-12-04 3:57 ` Qu Wenruo
2015-12-04 18:23 ` Liu Bo
2015-12-04 14:19 ` David Sterba
2015-12-05 5:12 ` Anand Jain
2015-11-24 13:04 ` Anand Jain
2016-11-08 13:14 ` Anand Jain
2016-11-14 12:13 ` David Sterba
2016-11-22 8:54 ` Anand Jain
2016-11-22 13:16 ` David Sterba
2016-11-23 3:00 ` Anand Jain
2016-11-23 10:31 ` David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1448283378-10579-2-git-send-email-anand.jain@oracle.com \
--to=anand.jain@oracle.com \
--cc=dsterba@suse.cz \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).