]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: (nilfs2) check size for backup superblock only
authorKarel Zak <kzak@redhat.com>
Tue, 9 Jun 2015 13:53:20 +0000 (15:53 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 9 Jun 2015 14:01:16 +0000 (16:01 +0200)
The size of the device seems irrelevant for the primary superblock.
The primary superblock is stored on fixed offset, possible collision
between last partition and whole-disk is possible only for backup
superblock only.

Signed-off-by: Karel Zak <kzak@redhat.com>
libblkid/src/superblocks/nilfs.c

index 14a4b74c63160b71948eab08e0f47fd135b8e52b..011ad95216f93cc9607cc3dcc9273aad22771950 100644 (file)
@@ -67,7 +67,7 @@ struct nilfs_super_block {
 #define NILFS_SB_OFFSET                0x400
 #define NILFS_SBB_OFFSET(_sz)  ((((_sz) / 0x200) - 8) * 0x200)
 
-static int nilfs_valid_sb(blkid_probe pr, struct nilfs_super_block *sb)
+static int nilfs_valid_sb(blkid_probe pr, struct nilfs_super_block *sb, int is_bak)
 {
        static unsigned char sum[4];
        const int sumoff = offsetof(struct nilfs_super_block, s_sum);
@@ -77,7 +77,8 @@ static int nilfs_valid_sb(blkid_probe pr, struct nilfs_super_block *sb)
        if (!sb || le16_to_cpu(sb->s_magic) != NILFS_SB_MAGIC)
                return 0;
 
-       if (sb->s_dev_size != pr->size)
+       if (is_bak && blkid_probe_is_wholedisk(pr) &&
+           sb->s_dev_size != pr->size)
                return 0;
 
        bytes = le16_to_cpu(sb->s_bytes);
@@ -110,8 +111,8 @@ static int probe_nilfs2(blkid_probe pr, const struct blkid_idmag *mag)
         * Compare two super blocks and set 1 in swp if the secondary
         * super block is valid and newer.  Otherwise, set 0 in swp.
         */
-       valid[0] = nilfs_valid_sb(pr, sbp);
-       valid[1] = nilfs_valid_sb(pr, sbb);
+       valid[0] = nilfs_valid_sb(pr, sbp, 0);
+       valid[1] = nilfs_valid_sb(pr, sbb, 1);
        if (!valid[0] && !valid[1])
                return 1;