* code. Note, the user of this function is responsible of kfree()'ing the
  * returned superblock buffer.
  */
-struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c)
+static struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c)
 {
        struct ubifs_sb_node *sup;
        int err;
        if (IS_ERR(sup))
                return PTR_ERR(sup);
 
+       c->sup_node = sup;
+
        c->fmt_version = le32_to_cpu(sup->fmt_version);
        c->ro_compat_version = le32_to_cpu(sup->ro_compat_version);
 
 
        err = validate_sb(c, sup);
 out:
-       kfree(sup);
        return err;
 }
 
 int ubifs_fixup_free_space(struct ubifs_info *c)
 {
        int err;
-       struct ubifs_sb_node *sup;
+       struct ubifs_sb_node *sup = c->sup_node;
 
        ubifs_assert(c, c->space_fixup);
        ubifs_assert(c, !c->ro_mount);
        if (err)
                return err;
 
-       sup = ubifs_read_sb_node(c);
-       if (IS_ERR(sup))
-               return PTR_ERR(sup);
-
        /* Free-space fixup is no longer required */
        c->space_fixup = 0;
        sup->flags &= cpu_to_le32(~UBIFS_FLG_SPACE_FIXUP);
 
        err = ubifs_write_sb_node(c, sup);
-       kfree(sup);
        if (err)
                return err;
 
 int ubifs_enable_encryption(struct ubifs_info *c)
 {
        int err;
-       struct ubifs_sb_node *sup;
+       struct ubifs_sb_node *sup = c->sup_node;
 
        if (c->encrypted)
                return 0;
                return -EINVAL;
        }
 
-       sup = ubifs_read_sb_node(c);
-       if (IS_ERR(sup))
-               return PTR_ERR(sup);
-
        sup->flags |= cpu_to_le32(UBIFS_FLG_ENCRYPTION);
 
        err = ubifs_write_sb_node(c, sup);
        if (!err)
                c->encrypted = 1;
-       kfree(sup);
 
        return err;
 }
 
                goto out;
 
        if (c->old_leb_cnt != c->leb_cnt) {
-               struct ubifs_sb_node *sup;
+               struct ubifs_sb_node *sup = c->sup_node;
 
-               sup = ubifs_read_sb_node(c);
-               if (IS_ERR(sup)) {
-                       err = PTR_ERR(sup);
-                       goto out;
-               }
                sup->leb_cnt = cpu_to_le32(c->leb_cnt);
                err = ubifs_write_sb_node(c, sup);
-               kfree(sup);
                if (err)
                        goto out;
        }
 
  * struct ubifs_info - UBIFS file-system description data structure
  * (per-superblock).
  * @vfs_sb: VFS @struct super_block object
+ * @sup_node: The super block node as read from the device
  *
  * @highest_inum: highest used inode number
  * @max_sqnum: current global sequence number
  */
 struct ubifs_info {
        struct super_block *vfs_sb;
+       struct ubifs_sb_node *sup_node;
 
        ino_t highest_inum;
        unsigned long long max_sqnum;
 
 /* sb.c */
 int ubifs_read_superblock(struct ubifs_info *c);
-struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c);
 int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup);
 int ubifs_fixup_free_space(struct ubifs_info *c);
 int ubifs_enable_encryption(struct ubifs_info *c);