RISCV: configs: tizen_visionfive2: Enable DM_BOW feature
[platform/kernel/linux-starfive.git] / fs / efivarfs / super.c
index 9962714..d59d967 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/slab.h>
 #include <linux/magic.h>
 #include <linux/statfs.h>
+#include <linux/printk.h>
 
 #include "internal.h"
 
@@ -275,8 +276,19 @@ static int efivarfs_get_tree(struct fs_context *fc)
        return get_tree_single(fc, efivarfs_fill_super);
 }
 
+static int efivarfs_reconfigure(struct fs_context *fc)
+{
+       if (!efivar_supports_writes() && !(fc->sb_flags & SB_RDONLY)) {
+               pr_err("Firmware does not support SetVariableRT. Can not remount with rw\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static const struct fs_context_operations efivarfs_context_ops = {
        .get_tree       = efivarfs_get_tree,
+       .reconfigure    = efivarfs_reconfigure,
 };
 
 static int efivarfs_init_fs_context(struct fs_context *fc)
@@ -287,6 +299,8 @@ static int efivarfs_init_fs_context(struct fs_context *fc)
 
 static void efivarfs_kill_sb(struct super_block *sb)
 {
+       struct efivarfs_fs_info *sfi = sb->s_fs_info;
+
        kill_litter_super(sb);
 
        if (!efivar_is_available())
@@ -294,6 +308,7 @@ static void efivarfs_kill_sb(struct super_block *sb)
 
        /* Remove all entries and destroy */
        efivar_entry_iter(efivarfs_destroy, &efivarfs_list, NULL);
+       kfree(sfi);
 }
 
 static struct file_system_type efivarfs_type = {