Merge "fs_mgr: fix encryptable=footer support"
This commit is contained in:
commit
b67fed557f
3 changed files with 14 additions and 5 deletions
|
|
@ -586,6 +586,7 @@ int fs_mgr_mount_all(struct fstab *fstab)
|
||||||
|
|
||||||
/* mount(2) returned an error, handle the encryptable/formattable case */
|
/* mount(2) returned an error, handle the encryptable/formattable case */
|
||||||
bool wiped = partition_wiped(fstab->recs[top_idx].blk_device);
|
bool wiped = partition_wiped(fstab->recs[top_idx].blk_device);
|
||||||
|
bool crypt_footer = false;
|
||||||
if (mret && mount_errno != EBUSY && mount_errno != EACCES &&
|
if (mret && mount_errno != EBUSY && mount_errno != EACCES &&
|
||||||
fs_mgr_is_formattable(&fstab->recs[top_idx]) && wiped) {
|
fs_mgr_is_formattable(&fstab->recs[top_idx]) && wiped) {
|
||||||
/* top_idx and attempted_idx point at the same partition, but sometimes
|
/* top_idx and attempted_idx point at the same partition, but sometimes
|
||||||
|
|
@ -606,8 +607,11 @@ int fs_mgr_mount_all(struct fstab *fstab)
|
||||||
ERROR("%s(): %s wouldn't open (%s)\n", __func__,
|
ERROR("%s(): %s wouldn't open (%s)\n", __func__,
|
||||||
fstab->recs[top_idx].key_loc, strerror(errno));
|
fstab->recs[top_idx].key_loc, strerror(errno));
|
||||||
}
|
}
|
||||||
|
} else if (fs_mgr_is_encryptable(&fstab->recs[top_idx]) &&
|
||||||
|
!strcmp(fstab->recs[top_idx].key_loc, KEY_IN_FOOTER)) {
|
||||||
|
crypt_footer = true;
|
||||||
}
|
}
|
||||||
if (fs_mgr_do_format(&fstab->recs[top_idx]) == 0) {
|
if (fs_mgr_do_format(&fstab->recs[top_idx], crypt_footer) == 0) {
|
||||||
/* Let's replay the mount actions. */
|
/* Let's replay the mount actions. */
|
||||||
i = top_idx - 1;
|
i = top_idx - 1;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,12 @@
|
||||||
#include "ext4.h"
|
#include "ext4.h"
|
||||||
#include "make_ext4fs.h"
|
#include "make_ext4fs.h"
|
||||||
#include "fs_mgr_priv.h"
|
#include "fs_mgr_priv.h"
|
||||||
|
#include "cryptfs.h"
|
||||||
|
|
||||||
extern struct fs_info info; /* magic global from ext4_utils */
|
extern struct fs_info info; /* magic global from ext4_utils */
|
||||||
extern void reset_ext4fs_info();
|
extern void reset_ext4fs_info();
|
||||||
|
|
||||||
static int format_ext4(char *fs_blkdev, char *fs_mnt_point)
|
static int format_ext4(char *fs_blkdev, char *fs_mnt_point, bool crypt_footer)
|
||||||
{
|
{
|
||||||
uint64_t dev_sz;
|
uint64_t dev_sz;
|
||||||
int fd, rc = 0;
|
int fd, rc = 0;
|
||||||
|
|
@ -63,6 +64,9 @@ static int format_ext4(char *fs_blkdev, char *fs_mnt_point)
|
||||||
/* Format the partition using the calculated length */
|
/* Format the partition using the calculated length */
|
||||||
reset_ext4fs_info();
|
reset_ext4fs_info();
|
||||||
info.len = (off64_t)dev_sz;
|
info.len = (off64_t)dev_sz;
|
||||||
|
if (crypt_footer) {
|
||||||
|
info.len -= CRYPT_FOOTER_OFFSET;
|
||||||
|
}
|
||||||
|
|
||||||
/* Use make_ext4fs_internal to avoid wiping an already-wiped partition. */
|
/* Use make_ext4fs_internal to avoid wiping an already-wiped partition. */
|
||||||
rc = make_ext4fs_internal(fd, NULL, NULL, fs_mnt_point, 0, 0, 0, 0, 0, 0, sehandle, 0, 0, NULL);
|
rc = make_ext4fs_internal(fd, NULL, NULL, fs_mnt_point, 0, 0, 0, 0, 0, 0, sehandle, 0, 0, NULL);
|
||||||
|
|
@ -118,7 +122,7 @@ static int format_f2fs(char *fs_blkdev)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fs_mgr_do_format(struct fstab_rec *fstab)
|
int fs_mgr_do_format(struct fstab_rec *fstab, bool crypt_footer)
|
||||||
{
|
{
|
||||||
int rc = -EINVAL;
|
int rc = -EINVAL;
|
||||||
|
|
||||||
|
|
@ -127,7 +131,7 @@ int fs_mgr_do_format(struct fstab_rec *fstab)
|
||||||
if (!strncmp(fstab->fs_type, "f2fs", 4)) {
|
if (!strncmp(fstab->fs_type, "f2fs", 4)) {
|
||||||
rc = format_f2fs(fstab->blk_device);
|
rc = format_f2fs(fstab->blk_device);
|
||||||
} else if (!strncmp(fstab->fs_type, "ext4", 4)) {
|
} else if (!strncmp(fstab->fs_type, "ext4", 4)) {
|
||||||
rc = format_ext4(fstab->blk_device, fstab->mount_point);
|
rc = format_ext4(fstab->blk_device, fstab->mount_point, crypt_footer);
|
||||||
} else {
|
} else {
|
||||||
ERROR("File system type '%s' is not supported\n", fstab->fs_type);
|
ERROR("File system type '%s' is not supported\n", fstab->fs_type);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#define __CORE_FS_MGR_H
|
#define __CORE_FS_MGR_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <linux/dm-ioctl.h>
|
#include <linux/dm-ioctl.h>
|
||||||
|
|
||||||
// Magic number at start of verity metadata
|
// Magic number at start of verity metadata
|
||||||
|
|
@ -108,7 +109,7 @@ int fs_mgr_is_formattable(struct fstab_rec *fstab);
|
||||||
int fs_mgr_is_nofail(struct fstab_rec *fstab);
|
int fs_mgr_is_nofail(struct fstab_rec *fstab);
|
||||||
int fs_mgr_swapon_all(struct fstab *fstab);
|
int fs_mgr_swapon_all(struct fstab *fstab);
|
||||||
|
|
||||||
int fs_mgr_do_format(struct fstab_rec *fstab);
|
int fs_mgr_do_format(struct fstab_rec *fstab, bool reserve_footer);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue