return btrfs_csums[csum_type].name;
 }
 
+size_t __const btrfs_get_num_csums(void)
+{
+       return ARRAY_SIZE(btrfs_csums);
+}
+
 struct btrfs_path *btrfs_alloc_path(void)
 {
        return kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
 
 
 int btrfs_super_csum_size(const struct btrfs_super_block *s);
 const char *btrfs_super_csum_name(u16 csum_type);
+size_t __const btrfs_get_num_csums(void);
+
 
 /*
  * The leaf data grows from end-to-front in the node.
 
 }
 BTRFS_ATTR(static_feature, rmdir_subvol, rmdir_subvol_show);
 
+static ssize_t supported_checksums_show(struct kobject *kobj,
+                                       struct kobj_attribute *a, char *buf)
+{
+       ssize_t ret = 0;
+       int i;
+
+       for (i = 0; i < btrfs_get_num_csums(); i++) {
+               /*
+                * This "trick" only works as long as 'enum btrfs_csum_type' has
+                * no holes in it
+                */
+               ret += snprintf(buf + ret, PAGE_SIZE - ret, "%s%s",
+                               (i == 0 ? "" : " "), btrfs_super_csum_name(i));
+
+       }
+
+       ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
+       return ret;
+}
+BTRFS_ATTR(static_feature, supported_checksums, supported_checksums_show);
+
 static struct attribute *btrfs_supported_static_feature_attrs[] = {
        BTRFS_ATTR_PTR(static_feature, rmdir_subvol),
+       BTRFS_ATTR_PTR(static_feature, supported_checksums),
        NULL
 };