On 23 November 2015 at 12:56, Anand Jain <anand.j...@oracle.com> wrote: > 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.j...@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"}, I think you mean 2.6.37 here. 67377734fd24c3 "Btrfs: add support for mixed data+metadata block groups"
Thanks, Mike > { "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 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html