Skip to content

Commit

Permalink
Merge branch 'erofs_fix' into staging-linus
Browse files Browse the repository at this point in the history
A branch is needed here to get the fix into staging-next as well.

Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
gregkh committed Jun 17, 2019
2 parents d7a5417 + 5efe513 commit 9b94107
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/staging/erofs/erofs_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,16 @@
#define EROFS_SUPER_MAGIC_V1 0xE0F5E1E2
#define EROFS_SUPER_OFFSET 1024

/*
* Any bits that aren't in EROFS_ALL_REQUIREMENTS should be
* incompatible with this kernel version.
*/
#define EROFS_ALL_REQUIREMENTS 0

struct erofs_super_block {
/* 0 */__le32 magic; /* in the little endian */
/* 4 */__le32 checksum; /* crc32c(super_block) */
/* 8 */__le32 features;
/* 8 */__le32 features; /* (aka. feature_compat) */
/* 12 */__u8 blkszbits; /* support block_size == PAGE_SIZE only */
/* 13 */__u8 reserved;

Expand All @@ -34,9 +40,10 @@ struct erofs_super_block {
/* 44 */__le32 xattr_blkaddr;
/* 48 */__u8 uuid[16]; /* 128-bit uuid for volume */
/* 64 */__u8 volume_name[16]; /* volume name */
/* 80 */__le32 requirements; /* (aka. feature_incompat) */

/* 80 */__u8 reserved2[48]; /* 128 bytes */
} __packed;
/* 84 */__u8 reserved2[44];
} __packed; /* 128 bytes */

/*
* erofs inode data mapping:
Expand Down
2 changes: 2 additions & 0 deletions drivers/staging/erofs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ struct erofs_sb_info {

u8 uuid[16]; /* 128-bit uuid for volume */
u8 volume_name[16]; /* volume name */
u32 requirements;

char *dev_name;

unsigned int mount_opt;
Expand Down
19 changes: 19 additions & 0 deletions drivers/staging/erofs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@ static void free_inode(struct inode *inode)
kmem_cache_free(erofs_inode_cachep, vi);
}

static bool check_layout_compatibility(struct super_block *sb,
struct erofs_super_block *layout)
{
const unsigned int requirements = le32_to_cpu(layout->requirements);

EROFS_SB(sb)->requirements = requirements;

/* check if current kernel meets all mandatory requirements */
if (requirements & (~EROFS_ALL_REQUIREMENTS)) {
errln("unidentified requirements %x, please upgrade kernel version",
requirements & ~EROFS_ALL_REQUIREMENTS);
return false;
}
return true;
}

static int superblock_read(struct super_block *sb)
{
struct erofs_sb_info *sbi;
Expand Down Expand Up @@ -104,6 +120,9 @@ static int superblock_read(struct super_block *sb)
goto out;
}

if (!check_layout_compatibility(sb, layout))
goto out;

sbi->blocks = le32_to_cpu(layout->blocks);
sbi->meta_blkaddr = le32_to_cpu(layout->meta_blkaddr);
#ifdef CONFIG_EROFS_FS_XATTR
Expand Down

0 comments on commit 9b94107

Please sign in to comment.