ubifs: Create hash for default LPT
authorSascha Hauer <s.hauer@pengutronix.de>
Fri, 7 Sep 2018 12:36:41 +0000 (14:36 +0200)
committerRichard Weinberger <richard@nod.at>
Tue, 23 Oct 2018 11:48:56 +0000 (13:48 +0200)
During creation of the default filesystem on an empty flash the default
LPT is created. With this patch a hash over the default LPT is
calculated which can be added to the default filesystems master node.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/lpt.c
fs/ubifs/sb.c
fs/ubifs/ubifs.h

index ee18305..d1d5e96 100644 (file)
@@ -604,11 +604,12 @@ static int calc_pnode_num_from_parent(const struct ubifs_info *c,
  * @lpt_first: LEB number of first LPT LEB
  * @lpt_lebs: number of LEBs for LPT is passed and returned here
  * @big_lpt: use big LPT model is passed and returned here
+ * @hash: hash of the LPT is returned here
  *
  * This function returns %0 on success and a negative error code on failure.
  */
 int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
-                         int *lpt_lebs, int *big_lpt)
+                         int *lpt_lebs, int *big_lpt, u8 *hash)
 {
        int lnum, err = 0, node_sz, iopos, i, j, cnt, len, alen, row;
        int blnum, boffs, bsz, bcnt;
@@ -617,6 +618,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
        void *buf = NULL, *p;
        struct ubifs_lpt_lprops *ltab = NULL;
        int *lsave = NULL;
+       struct shash_desc *desc;
 
        err = calc_dflt_lpt_geom(c, main_lebs, big_lpt);
        if (err)
@@ -630,6 +632,10 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
        /* Needed by 'ubifs_pack_lsave()' */
        c->main_first = c->leb_cnt - *main_lebs;
 
+       desc = ubifs_hash_get_desc(c);
+       if (IS_ERR(desc))
+               return PTR_ERR(desc);
+
        lsave = kmalloc_array(c->lsave_cnt, sizeof(int), GFP_KERNEL);
        pnode = kzalloc(sizeof(struct ubifs_pnode), GFP_KERNEL);
        nnode = kzalloc(sizeof(struct ubifs_nnode), GFP_KERNEL);
@@ -677,6 +683,10 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
 
        /* Add first pnode */
        ubifs_pack_pnode(c, p, pnode);
+       err = ubifs_shash_update(c, desc, p, c->pnode_sz);
+       if (err)
+               goto out;
+
        p += c->pnode_sz;
        len = c->pnode_sz;
        pnode->num += 1;
@@ -711,6 +721,10 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
                        len = 0;
                }
                ubifs_pack_pnode(c, p, pnode);
+               err = ubifs_shash_update(c, desc, p, c->pnode_sz);
+               if (err)
+                       goto out;
+
                p += c->pnode_sz;
                len += c->pnode_sz;
                /*
@@ -830,6 +844,10 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
        if (err)
                goto out;
 
+       err = ubifs_shash_final(c, desc, hash);
+       if (err)
+               goto out;
+
        c->nhead_lnum = lnum;
        c->nhead_offs = ALIGN(len, c->min_io_size);
 
@@ -853,6 +871,7 @@ int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
                dbg_lp("LPT lsave is at %d:%d", c->lsave_lnum, c->lsave_offs);
 out:
        c->ltab = NULL;
+       kfree(desc);
        kfree(lsave);
        vfree(ltab);
        vfree(buf);
index 7e08c81..5727565 100644 (file)
@@ -87,6 +87,7 @@ static int create_default_filesystem(struct ubifs_info *c)
        __le64 tmp_le64;
        __le32 tmp_le32;
        struct timespec64 ts;
+       u8 hash_lpt[UBIFS_HASH_ARR_SZ];
 
        /* Some functions called from here depend on the @c->key_len filed */
        c->key_len = UBIFS_SK_LEN;
@@ -148,7 +149,7 @@ static int create_default_filesystem(struct ubifs_info *c)
        c->lsave_cnt = DEFAULT_LSAVE_CNT;
        c->max_leb_cnt = c->leb_cnt;
        err = ubifs_create_dflt_lpt(c, &main_lebs, lpt_first, &lpt_lebs,
-                                   &big_lpt);
+                                   &big_lpt, hash_lpt);
        if (err)
                return err;
 
index c26d3c6..504b651 100644 (file)
@@ -1934,7 +1934,7 @@ int ubifs_clear_orphans(struct ubifs_info *c);
 /* lpt.c */
 int ubifs_calc_lpt_geom(struct ubifs_info *c);
 int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
-                         int *lpt_lebs, int *big_lpt);
+                         int *lpt_lebs, int *big_lpt, u8 *hash);
 int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr);
 struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum);
 struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum);