diff options
author | Jaegeuk Kim <jaegeuk@google.com> | 2021-04-26 19:14:45 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-04-26 19:14:45 +0000 |
commit | f7d3db3bab3979ed135f4e811ca9c856362a55bc (patch) | |
tree | c00d93a52db205c519a38a12b5426613b9437e60 | |
parent | f9f7021eea1d768d63e434cdf26ca16cc836c09c (diff) | |
parent | d17286fb59c8d8aa98916a1eafadff72ee28c895 (diff) | |
download | f2fs-tools-f7d3db3bab3979ed135f4e811ca9c856362a55bc.tar.gz |
Merge remote-tracking branch 'aosp/upstream-master' into aosp am: bcc3a22129 am: ea8441776e am: d17286fb59
Original change: https://android-review.googlesource.com/c/platform/external/f2fs-tools/+/1685537
Change-Id: Ic7fe35ed5dc43f717d195b17d79bd7d822415d5f
-rw-r--r-- | METADATA | 6 | ||||
-rw-r--r-- | fsck/defrag.c | 2 | ||||
-rw-r--r-- | fsck/main.c | 12 | ||||
-rw-r--r-- | fsck/resize.c | 24 | ||||
-rw-r--r-- | fsck/sload.c | 5 | ||||
-rw-r--r-- | include/f2fs_fs.h | 1 | ||||
-rw-r--r-- | lib/libf2fs.c | 11 | ||||
-rw-r--r-- | lib/libf2fs_zoned.c | 3 | ||||
-rw-r--r-- | man/sload.f2fs.8 | 7 | ||||
-rw-r--r-- | mkfs/f2fs_format.c | 7 | ||||
-rw-r--r-- | tools/f2fs_io/f2fs_io.c | 63 | ||||
-rw-r--r-- | tools/f2fs_io/f2fs_io.h | 36 |
12 files changed, 166 insertions, 11 deletions
@@ -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 |