Commit fd615005 authored by Sascha Hauer's avatar Sascha Hauer Committed by Richard Weinberger

ubifs: Store read superblock node

The superblock node is read/modified/written several times throughout
the UBIFS code. Instead of reading it from the device each time just
keep a copy in memory and write back the modified copy when necessary.
This patch helps for authentication support, here we not only have to
read the superblock node, but also have to authenticate it, which
is easier if we do it once during initialization.
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 83407437
...@@ -497,7 +497,7 @@ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup) ...@@ -497,7 +497,7 @@ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup)
* code. Note, the user of this function is responsible of kfree()'ing the * code. Note, the user of this function is responsible of kfree()'ing the
* returned superblock buffer. * 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; struct ubifs_sb_node *sup;
int err; int err;
...@@ -554,6 +554,8 @@ int ubifs_read_superblock(struct ubifs_info *c) ...@@ -554,6 +554,8 @@ int ubifs_read_superblock(struct ubifs_info *c)
if (IS_ERR(sup)) if (IS_ERR(sup))
return PTR_ERR(sup); return PTR_ERR(sup);
c->sup_node = sup;
c->fmt_version = le32_to_cpu(sup->fmt_version); c->fmt_version = le32_to_cpu(sup->fmt_version);
c->ro_compat_version = le32_to_cpu(sup->ro_compat_version); c->ro_compat_version = le32_to_cpu(sup->ro_compat_version);
...@@ -685,7 +687,6 @@ int ubifs_read_superblock(struct ubifs_info *c) ...@@ -685,7 +687,6 @@ int ubifs_read_superblock(struct ubifs_info *c)
err = validate_sb(c, sup); err = validate_sb(c, sup);
out: out:
kfree(sup);
return err; return err;
} }
...@@ -814,7 +815,7 @@ static int fixup_free_space(struct ubifs_info *c) ...@@ -814,7 +815,7 @@ static int fixup_free_space(struct ubifs_info *c)
int ubifs_fixup_free_space(struct ubifs_info *c) int ubifs_fixup_free_space(struct ubifs_info *c)
{ {
int err; 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->space_fixup);
ubifs_assert(c, !c->ro_mount); ubifs_assert(c, !c->ro_mount);
...@@ -825,16 +826,11 @@ int ubifs_fixup_free_space(struct ubifs_info *c) ...@@ -825,16 +826,11 @@ int ubifs_fixup_free_space(struct ubifs_info *c)
if (err) if (err)
return err; return err;
sup = ubifs_read_sb_node(c);
if (IS_ERR(sup))
return PTR_ERR(sup);
/* Free-space fixup is no longer required */ /* Free-space fixup is no longer required */
c->space_fixup = 0; c->space_fixup = 0;
sup->flags &= cpu_to_le32(~UBIFS_FLG_SPACE_FIXUP); sup->flags &= cpu_to_le32(~UBIFS_FLG_SPACE_FIXUP);
err = ubifs_write_sb_node(c, sup); err = ubifs_write_sb_node(c, sup);
kfree(sup);
if (err) if (err)
return err; return err;
...@@ -845,7 +841,7 @@ int ubifs_fixup_free_space(struct ubifs_info *c) ...@@ -845,7 +841,7 @@ int ubifs_fixup_free_space(struct ubifs_info *c)
int ubifs_enable_encryption(struct ubifs_info *c) int ubifs_enable_encryption(struct ubifs_info *c)
{ {
int err; int err;
struct ubifs_sb_node *sup; struct ubifs_sb_node *sup = c->sup_node;
if (c->encrypted) if (c->encrypted)
return 0; return 0;
...@@ -858,16 +854,11 @@ int ubifs_enable_encryption(struct ubifs_info *c) ...@@ -858,16 +854,11 @@ int ubifs_enable_encryption(struct ubifs_info *c)
return -EINVAL; return -EINVAL;
} }
sup = ubifs_read_sb_node(c);
if (IS_ERR(sup))
return PTR_ERR(sup);
sup->flags |= cpu_to_le32(UBIFS_FLG_ENCRYPTION); sup->flags |= cpu_to_le32(UBIFS_FLG_ENCRYPTION);
err = ubifs_write_sb_node(c, sup); err = ubifs_write_sb_node(c, sup);
if (!err) if (!err)
c->encrypted = 1; c->encrypted = 1;
kfree(sup);
return err; return err;
} }
...@@ -1605,16 +1605,10 @@ static int ubifs_remount_rw(struct ubifs_info *c) ...@@ -1605,16 +1605,10 @@ static int ubifs_remount_rw(struct ubifs_info *c)
goto out; goto out;
if (c->old_leb_cnt != c->leb_cnt) { 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); sup->leb_cnt = cpu_to_le32(c->leb_cnt);
err = ubifs_write_sb_node(c, sup); err = ubifs_write_sb_node(c, sup);
kfree(sup);
if (err) if (err)
goto out; goto out;
} }
......
...@@ -983,6 +983,7 @@ struct ubifs_debug_info; ...@@ -983,6 +983,7 @@ struct ubifs_debug_info;
* struct ubifs_info - UBIFS file-system description data structure * struct ubifs_info - UBIFS file-system description data structure
* (per-superblock). * (per-superblock).
* @vfs_sb: VFS @struct super_block object * @vfs_sb: VFS @struct super_block object
* @sup_node: The super block node as read from the device
* *
* @highest_inum: highest used inode number * @highest_inum: highest used inode number
* @max_sqnum: current global sequence number * @max_sqnum: current global sequence number
...@@ -1230,6 +1231,7 @@ struct ubifs_debug_info; ...@@ -1230,6 +1231,7 @@ struct ubifs_debug_info;
*/ */
struct ubifs_info { struct ubifs_info {
struct super_block *vfs_sb; struct super_block *vfs_sb;
struct ubifs_sb_node *sup_node;
ino_t highest_inum; ino_t highest_inum;
unsigned long long max_sqnum; unsigned long long max_sqnum;
...@@ -1664,7 +1666,6 @@ int ubifs_write_master(struct ubifs_info *c); ...@@ -1664,7 +1666,6 @@ int ubifs_write_master(struct ubifs_info *c);
/* sb.c */ /* sb.c */
int ubifs_read_superblock(struct ubifs_info *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_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup);
int ubifs_fixup_free_space(struct ubifs_info *c); int ubifs_fixup_free_space(struct ubifs_info *c);
int ubifs_enable_encryption(struct ubifs_info *c); int ubifs_enable_encryption(struct ubifs_info *c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment