aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@google.com>2021-04-26 18:18:31 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-04-26 18:18:31 +0000
commitea8441776eed6e1cb37c6031ecc2cc0b0b0592b4 (patch)
tree44495b1bb969cc2e16495df26c47acd5524b575d
parent83d2d91d583139459adb315aee47512a6caeb8ae (diff)
parentbcc3a2212966cc608b2850a3fde54893b2bfaa6d (diff)
downloadf2fs-tools-ea8441776eed6e1cb37c6031ecc2cc0b0b0592b4.tar.gz
Merge remote-tracking branch 'aosp/upstream-master' into aosp am: bcc3a22129
Original change: https://android-review.googlesource.com/c/platform/external/f2fs-tools/+/1685537 Change-Id: I7241f92e1b15d35480332a5d009295f3950e419a
-rw-r--r--METADATA6
-rw-r--r--fsck/defrag.c2
-rw-r--r--fsck/main.c12
-rw-r--r--fsck/resize.c24
-rw-r--r--fsck/sload.c5
-rw-r--r--include/f2fs_fs.h1
-rw-r--r--lib/libf2fs.c11
-rw-r--r--lib/libf2fs_zoned.c3
-rw-r--r--man/sload.f2fs.87
-rw-r--r--mkfs/f2fs_format.c7
-rw-r--r--tools/f2fs_io/f2fs_io.c63
-rw-r--r--tools/f2fs_io/f2fs_io.h36
12 files changed, 166 insertions, 11 deletions
diff --git a/METADATA b/METADATA
index 9c14beb..15545a8 100644
--- a/METADATA
+++ b/METADATA
@@ -11,8 +11,8 @@ third_party {
version: "v1.14.0"
license_type: RESTRICTED
last_upgrade_date {
- year: 2020
- month: 12
- day: 28
+ year: 2021
+ month: 4
+ day: 24
}
}
diff --git a/fsck/defrag.c b/fsck/defrag.c
index 3473637..a630a78 100644
--- a/fsck/defrag.c
+++ b/fsck/defrag.c
@@ -53,7 +53,7 @@ static int migrate_block(struct f2fs_sb_info *sbi, u64 from, u64 to)
else
update_nat_blkaddr(sbi, 0, le32_to_cpu(sum.nid), to);
- DBG(0, "Migrate %s block %"PRIx64" -> %"PRIx64"\n",
+ DBG(1, "Migrate %s block %"PRIx64" -> %"PRIx64"\n",
IS_DATASEG(type) ? "data" : "node",
from, to);
free(raw);
diff --git a/fsck/main.c b/fsck/main.c
index a538c72..64efa87 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -138,6 +138,7 @@ void sload_usage()
MSG(0, " -S sparse_mode\n");
MSG(0, " -t mount point [prefix of target fs path, default:/]\n");
MSG(0, " -T timestamp\n");
+ MSG(0, " -P preserve owner: user and group\n");
MSG(0, " -c enable compression (default allow policy)\n");
MSG(0, " ------------ Compression sub-options -----------------\n");
MSG(0, " -L <log-of-blocks-per-cluster>, default 2\n");
@@ -505,7 +506,7 @@ void f2fs_parse_options(int argc, char *argv[])
#endif
} else if (!strcmp("resize.f2fs", prog)) {
#ifdef WITH_RESIZE
- const char *option_string = "d:st:iV";
+ const char *option_string = "d:fst:iV";
c.func = RESIZE;
while ((option = getopt(argc, argv, option_string)) != EOF) {
@@ -521,6 +522,10 @@ void f2fs_parse_options(int argc, char *argv[])
MSG(0, "Info: Debug level = %d\n",
c.dbg_lv);
break;
+ case 'f':
+ c.force = 1;
+ MSG(0, "Info: Force to resize\n");
+ break;
case 's':
c.safe_resize = 1;
break;
@@ -549,7 +554,7 @@ void f2fs_parse_options(int argc, char *argv[])
#endif
} else if (!strcmp("sload.f2fs", prog)) {
#ifdef WITH_SLOAD
- const char *option_string = "cL:a:i:x:m:rC:d:f:p:s:St:T:V";
+ const char *option_string = "cL:a:i:x:m:rC:d:f:p:s:St:T:VP";
#ifdef HAVE_LIBSELINUX
int max_nr_opt = (int)sizeof(c.seopt_file) /
sizeof(c.seopt_file[0]);
@@ -685,6 +690,9 @@ void f2fs_parse_options(int argc, char *argv[])
case 'V':
show_version(prog);
exit(0);
+ case 'P':
+ c.preserve_perms = 1;
+ break;
default:
err = EUNKNOWN_OPT;
break;
diff --git a/fsck/resize.c b/fsck/resize.c
index 46b1cfb..b043cd9 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -526,6 +526,11 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
memcpy(new_cp, cp, (unsigned char *)cp->sit_nat_version_bitmap -
(unsigned char *)cp);
+ if (c.safe_resize)
+ memcpy((void *)new_cp + CP_BITMAP_OFFSET,
+ (void *)cp + CP_BITMAP_OFFSET,
+ F2FS_BLKSIZE - CP_BITMAP_OFFSET);
+
new_cp->checkpoint_ver = cpu_to_le64(cp_ver + 1);
crc = f2fs_checkpoint_chksum(new_cp);
@@ -645,8 +650,11 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
struct f2fs_super_block new_sb_raw;
struct f2fs_super_block *new_sb = &new_sb_raw;
+ struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
block_t old_end_blkaddr, old_main_blkaddr;
block_t new_end_blkaddr, new_main_blkaddr, tmp_end_blkaddr;
+ block_t user_block_count;
+ unsigned int overprov_segment_count;
unsigned int offset;
int err = -1;
@@ -657,6 +665,17 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
if (get_new_sb(new_sb))
return -1;
+ overprov_segment_count = (get_newsb(segment_count_main) -
+ c.new_reserved_segments) *
+ c.new_overprovision / 100;
+ overprov_segment_count += c.new_reserved_segments;
+
+ user_block_count = (get_newsb(segment_count_main) -
+ overprov_segment_count) * c.blks_per_seg;
+
+ if (get_cp(valid_block_count) > user_block_count)
+ return -1;
+
/* check nat availability */
if (get_sb(segment_count_nat) > get_newsb(segment_count_nat)) {
err = shrink_nats(sbi, new_sb);
@@ -714,8 +733,9 @@ int f2fs_resize(struct f2fs_sb_info *sbi)
} else {
return f2fs_resize_shrink(sbi);
}
- else if ((c.target_sectors * c.sector_size >>
- get_sb(log_blocksize)) > get_sb(block_count))
+ else if (((c.target_sectors * c.sector_size >>
+ get_sb(log_blocksize)) > get_sb(block_count)) ||
+ c.force)
return f2fs_resize_grow(sbi);
else {
MSG(0, "Nothing to resize.\n");
diff --git a/fsck/sload.c b/fsck/sload.c
index 4dea78b..6929023 100644
--- a/fsck/sload.c
+++ b/fsck/sload.c
@@ -187,6 +187,11 @@ static void set_inode_metadata(struct dentry *de)
else
de->mtime = c.fixed_time;
+ if (c.preserve_perms) {
+ de->uid = stat.st_uid;
+ de->gid = stat.st_gid;
+ }
+
set_perms_and_caps(de);
}
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index a51a359..cdcce2c 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -505,6 +505,7 @@ struct f2fs_configuration {
struct selinux_opt seopt_file[8];
int nr_opt;
#endif
+ int preserve_perms;
/* resize parameters */
int safe_resize;
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 55fa391..85107ee 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -637,20 +637,25 @@ char *get_rootdev()
ptr = strstr(uevent, "DEVNAME");
if (!ptr)
- return NULL;
+ goto out_free;
ret = sscanf(ptr, "DEVNAME=%s\n", buf);
if (strlen(buf) == 0)
- return NULL;
+ goto out_free;
ret = strlen(buf) + 5;
rootdev = malloc(ret + 1);
if (!rootdev)
- return NULL;
+ goto out_free;
rootdev[ret] = '\0';
snprintf(rootdev, ret + 1, "/dev/%s", buf);
+ free(uevent);
return rootdev;
+
+out_free:
+ free(uevent);
+ return NULL;
#endif
}
diff --git a/lib/libf2fs_zoned.c b/lib/libf2fs_zoned.c
index 56c97d1..ce73b9a 100644
--- a/lib/libf2fs_zoned.c
+++ b/lib/libf2fs_zoned.c
@@ -495,6 +495,9 @@ uint32_t f2fs_get_usable_segments(struct f2fs_super_block *sb)
int i, j;
uint32_t usable_segs = 0, zone_segs;
+ if (c.func == RESIZE)
+ return get_sb(segment_count_main);
+
for (i = 0; i < c.ndevs; i++) {
if (c.devices[i].zoned_model != F2FS_ZONED_HM) {
usable_segs += c.devices[i].total_segments;
diff --git a/man/sload.f2fs.8 b/man/sload.f2fs.8
index c165b35..ed5ee4b 100644
--- a/man/sload.f2fs.8
+++ b/man/sload.f2fs.8
@@ -18,6 +18,9 @@ sload.f2fs \- load directories and files into the device directly
.I debugging-level
]
[
+.B \-P
+]
+[
.B \-c
[
.B \-L
@@ -66,6 +69,10 @@ Specify the mount point path in the partition to load.
Specify the level of debugging options.
The default number is 0, which shows basic debugging messages.
.TP
+.BI \-P
+Preserve owner: user and group.
+The user and group of the source files will be taken into account.
+.TP
.BI \-c
Enable a cluster-based file compression.
The file would be chopped into clusters, and each cluster is compressed
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index b4bec92..3f1fa32 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -96,6 +96,13 @@ const char *media_ext_lists[] = {
const char *hot_ext_lists[] = {
"db",
+
+#ifndef WITH_ANDROID
+ /* Virtual machines */
+ "vmdk", // VMware or VirtualBox
+ "vdi", // VirtualBox
+ "qcow2", // QEMU
+#endif
NULL
};
diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c
index 033c256..fa7d3f5 100644
--- a/tools/f2fs_io/f2fs_io.c
+++ b/tools/f2fs_io/f2fs_io.c
@@ -1096,6 +1096,68 @@ static void do_compress(int argc, char **argv, const struct cmd_desc *cmd)
exit(0);
}
+#define get_filename_encrypt_mode_desc "get file name encrypt mode"
+#define get_filename_encrypt_mode_help \
+"f2fs_io filename_encrypt_mode [file or directory path]\n\n" \
+"Get the file name encription mode of the given file/directory.\n" \
+
+static void do_get_filename_encrypt_mode (int argc, char **argv,
+ const struct cmd_desc *cmd)
+{
+ static const char *enc_name[] = {
+ "invalid", /* FS_ENCRYPTION_MODE_INVALID (0) */
+ "aes-256-xts", /* FS_ENCRYPTION_MODE_AES_256_XTS (1) */
+ "aes-256-gcm", /* FS_ENCRYPTION_MODE_AES_256_GCM (2) */
+ "aes-256-cbc", /* FS_ENCRYPTION_MODE_AES_256_CBC (3) */
+ "aes-256-cts", /* FS_ENCRYPTION_MODE_AES_256_CTS (4) */
+ "aes-128-cbc", /* FS_ENCRYPTION_MODE_AES_128_CBC (5) */
+ "aes-128-cts", /* FS_ENCRYPTION_MODE_AES_128_CTS (6) */
+ "speck128-256-xts", /* FS_ENCRYPTION_MODE_SPECK128_256_XTS (7) */
+ "speck128-256-cts", /* FS_ENCRYPTION_MODE_SPECK128_256_CTS (8) */
+ "adiantum", /* FS_ENCRYPTION_MODE_ADIANTUM (9) */
+ };
+ int fd, mode, ret;
+ struct fscrypt_get_policy_ex_arg arg;
+
+ if (argc != 2) {
+ fputs("Excess arguments\n\n", stderr);
+ fputs(cmd->cmd_help, stderr);
+ exit(1);
+ }
+
+ fd = xopen(argv[1], O_RDONLY, 0);
+ arg.policy_size = sizeof(arg.policy);
+ ret = ioctl(fd, FS_IOC_GET_ENCRYPTION_POLICY_EX, &arg);
+ if (ret != 0 && errno == ENOTTY)
+ ret = ioctl(fd, FS_IOC_GET_ENCRYPTION_POLICY, arg.policy.v1);
+ close(fd);
+
+ if (ret) {
+ perror("FS_IOC_GET_ENCRYPTION_POLICY|_EX");
+ exit(1);
+ }
+
+ switch (arg.policy.version) {
+ case FSCRYPT_POLICY_V1:
+ mode = arg.policy.v1.filenames_encryption_mode;
+ break;
+ case FSCRYPT_POLICY_V2:
+ mode = arg.policy.v2.filenames_encryption_mode;
+ break;
+ default:
+ printf("Do not support policy version: %d\n",
+ arg.policy.version);
+ exit(1);
+ }
+
+ if (mode >= sizeof(enc_name)/sizeof(enc_name[0])) {
+ printf("Do not support algorithm: %d\n", mode);
+ exit(1);
+ }
+ printf ("%s\n", enc_name[mode]);
+ exit(0);
+}
+
#define CMD_HIDDEN 0x0001
#define CMD(name) { #name, do_##name, name##_desc, name##_help, 0 }
#define _CMD(name) { #name, do_##name, NULL, NULL, CMD_HIDDEN }
@@ -1125,6 +1187,7 @@ const struct cmd_desc cmd_list[] = {
CMD(set_coption),
CMD(decompress),
CMD(compress),
+ CMD(get_filename_encrypt_mode),
{ NULL, NULL, NULL, NULL, 0 }
};
diff --git a/tools/f2fs_io/f2fs_io.h b/tools/f2fs_io/f2fs_io.h
index d53e576..3a0278f 100644
--- a/tools/f2fs_io/f2fs_io.h
+++ b/tools/f2fs_io/f2fs_io.h
@@ -91,6 +91,42 @@ typedef u32 __be32;
#define F2FS_IOC_DECOMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 23)
#define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24)
+#ifndef FS_IOC_GET_ENCRYPTION_POLICY
+#define FSCRYPT_POLICY_V1 0
+#define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
+struct fscrypt_policy_v1 {
+ __u8 version;
+ __u8 contents_encryption_mode;
+ __u8 filenames_encryption_mode;
+ __u8 flags;
+ __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
+};
+#define FS_IOC_GET_ENCRYPTION_POLICY _IOW('f', 21, struct fscrypt_policy_v1)
+#endif
+
+#ifndef FS_IOC_GET_ENCRYPTION_POLICY_EX
+#define FSCRYPT_POLICY_V2 2
+#define FSCRYPT_KEY_IDENTIFIER_SIZE 16
+struct fscrypt_policy_v2 {
+ __u8 version;
+ __u8 contents_encryption_mode;
+ __u8 filenames_encryption_mode;
+ __u8 flags;
+ __u8 __reserved[4];
+ __u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
+};
+/* Struct passed to FS_IOC_GET_ENCRYPTION_POLICY_EX */
+struct fscrypt_get_policy_ex_arg {
+ __u64 policy_size; /* input/output */
+ union {
+ __u8 version;
+ struct fscrypt_policy_v1 v1;
+ struct fscrypt_policy_v2 v2;
+ } policy; /* output */
+};
+#define FS_IOC_GET_ENCRYPTION_POLICY_EX _IOWR('f', 22, __u8[9]) /* size + version */
+#endif
+
#define F2FS_IOC_SET_ENCRYPTION_POLICY FS_IOC_SET_ENCRYPTION_POLICY
#define F2FS_IOC_GET_ENCRYPTION_POLICY FS_IOC_GET_ENCRYPTION_POLICY
#define F2FS_IOC_GET_ENCRYPTION_PWSALT FS_IOC_GET_ENCRYPTION_PWSALT