* [PATCH 0/8] btrfs-progs: add encryption support
@ 2023-06-29 19:57 Sweet Tea Dorminy
2023-06-29 19:57 ` [PATCH 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:57 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
This is the progs side of the encryption feature [1]. The first four
changes are attempts to replicate the relevant kernel changes precisely
to the equivalents in kernel-shared; the next four add support to check
and dump-tree.
[1] https://lore.kernel.org/linux-btrfs/cover.1687988380.git.sweettea-kernel@dorminy.me/T/#t
Sweet Tea Dorminy (8):
btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag
btrfs-progs: start tracking extent encryption context info
btrfs-progs: add inode encryption contexts
btrfs-progs: save and load fscrypt extent contexts
btrfs-progs: interpret encrypted file extents.
btrfs-progs: handle fscrypt context items
btrfs-progs: escape unprintable characters in names
btrfs-progs: check: update inline extent length checking
check/main.c | 28 ++++++++-------
kernel-shared/accessors.h | 31 ++++++++++++++++
kernel-shared/ctree.h | 3 +-
kernel-shared/fscrypt.h | 30 ++++++++++++++++
kernel-shared/print-tree.c | 64 +++++++++++++++++++++++++++++++--
kernel-shared/tree-checker.c | 37 ++++++++++++++-----
kernel-shared/uapi/btrfs.h | 1 +
kernel-shared/uapi/btrfs_tree.h | 16 ++++++++-
8 files changed, 184 insertions(+), 26 deletions(-)
create mode 100644 kernel-shared/fscrypt.h
base-commit: a0f1c5308320d781d13f6ecd8c127c6609b32281
--
2.40.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
@ 2023-06-29 19:57 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 2/8] btrfs-progs: start tracking extent encryption context info Sweet Tea Dorminy
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:57 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
Matches kernel change by the same name.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/ctree.h | 3 ++-
kernel-shared/uapi/btrfs.h | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h
index 59533879..6c9ff866 100644
--- a/kernel-shared/ctree.h
+++ b/kernel-shared/ctree.h
@@ -103,7 +103,8 @@ static inline u32 __BTRFS_LEAF_DATA_SIZE(u32 nodesize)
BTRFS_FEATURE_INCOMPAT_RAID1C34 | \
BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \
BTRFS_FEATURE_INCOMPAT_ZONED | \
- BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2)
+ BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2 | \
+ BTRFS_FEATURE_INCOMPAT_ENCRYPT)
#else
#define BTRFS_FEATURE_INCOMPAT_SUPP \
(BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \
diff --git a/kernel-shared/uapi/btrfs.h b/kernel-shared/uapi/btrfs.h
index 85b04f89..e347cceb 100644
--- a/kernel-shared/uapi/btrfs.h
+++ b/kernel-shared/uapi/btrfs.h
@@ -356,6 +356,7 @@ _static_assert(sizeof(struct btrfs_ioctl_fs_info_args) == 1024);
#define BTRFS_FEATURE_INCOMPAT_RAID1C34 (1ULL << 11)
#define BTRFS_FEATURE_INCOMPAT_ZONED (1ULL << 12)
#define BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2 (1ULL << 13)
+#define BTRFS_FEATURE_INCOMPAT_ENCRYPT (1ULL << 14)
struct btrfs_ioctl_feature_flags {
__u64 compat_flags;
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/8] btrfs-progs: start tracking extent encryption context info
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
2023-06-29 19:57 ` [PATCH 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 3/8] btrfs-progs: add inode encryption contexts Sweet Tea Dorminy
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
This recapitulates the kernel change named 'btrfs: start tracking extent
encryption context info".
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/accessors.h | 31 ++++++++++++++++++++++++++++++
kernel-shared/fscrypt.h | 30 +++++++++++++++++++++++++++++
kernel-shared/tree-checker.c | 37 ++++++++++++++++++++++++++++--------
3 files changed, 90 insertions(+), 8 deletions(-)
create mode 100644 kernel-shared/fscrypt.h
diff --git a/kernel-shared/accessors.h b/kernel-shared/accessors.h
index 539c20d0..62e9282d 100644
--- a/kernel-shared/accessors.h
+++ b/kernel-shared/accessors.h
@@ -3,6 +3,8 @@
#ifndef BTRFS_ACCESSORS_H
#define BTRFS_ACCESSORS_H
+#include "fscrypt.h"
+
#include "kerncompat.h"
#ifndef _static_assert
@@ -949,6 +951,16 @@ BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_num_bytes,
struct btrfs_file_extent_item, disk_num_bytes, 64);
BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression,
struct btrfs_file_extent_item, compression, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_encryption,
+ struct btrfs_file_extent_item, encryption, 8);
+static inline u8 btrfs_stack_file_extent_encryption_ctxsize(
+ struct btrfs_file_extent_item *e)
+{
+ u8 ctxsize;
+
+ btrfs_unpack_encryption(e->encryption, NULL, &ctxsize);
+ return ctxsize;
+}
BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
@@ -970,6 +982,25 @@ BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
other_encoding, 16);
+static inline u8
+btrfs_file_extent_encryption_ctxsize(const struct extent_buffer *eb,
+ struct btrfs_file_extent_item *e)
+{
+ u8 ctxsize;
+
+ btrfs_unpack_encryption(btrfs_file_extent_encryption(eb, e),
+ NULL, &ctxsize);
+ return ctxsize;
+}
+
+static inline u8
+btrfs_file_extent_ctxsize_from_item(const struct extent_buffer *leaf,
+ int nr)
+{
+ return (btrfs_item_size(leaf, nr) -
+ sizeof(struct btrfs_file_extent_item));
+}
+
/* btrfs_qgroup_status_item */
BTRFS_SETGET_FUNCS(qgroup_status_generation, struct btrfs_qgroup_status_item,
generation, 64);
diff --git a/kernel-shared/fscrypt.h b/kernel-shared/fscrypt.h
new file mode 100644
index 00000000..de32593e
--- /dev/null
+++ b/kernel-shared/fscrypt.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef BTRFS_FSCRYPT_H
+#define BTRFS_FSCRYPT_H
+
+#define BTRFS_ENCRYPTION_POLICY_BITS 2
+#define BTRFS_ENCRYPTION_CTXSIZE_BITS 6
+
+#define BTRFS_ENCRYPTION_POLICY_MASK ((1 << BTRFS_ENCRYPTION_POLICY_BITS) - 1)
+#define BTRFS_ENCRYPTION_CTXSIZE_MASK \
+ (((1 << BTRFS_ENCRYPTION_CTXSIZE_BITS) - 1) << \
+ BTRFS_ENCRYPTION_POLICY_BITS)
+
+static inline void btrfs_unpack_encryption(u8 encryption,
+ u8 *policy,
+ u8 *ctxsize)
+{
+ if (policy)
+ *policy = encryption & BTRFS_ENCRYPTION_POLICY_MASK;
+ if (ctxsize)
+ *ctxsize = ((encryption & BTRFS_ENCRYPTION_CTXSIZE_MASK) >>
+ BTRFS_ENCRYPTION_POLICY_BITS);
+}
+
+static inline u8 btrfs_pack_encryption(u8 policy, u8 ctxsize)
+{
+ return policy | (ctxsize << BTRFS_ENCRYPTION_POLICY_BITS);
+}
+
+#endif
diff --git a/kernel-shared/tree-checker.c b/kernel-shared/tree-checker.c
index 10797589..0412e97d 100644
--- a/kernel-shared/tree-checker.c
+++ b/kernel-shared/tree-checker.c
@@ -229,6 +229,7 @@ static int check_extent_data_item(struct extent_buffer *leaf,
u32 sectorsize = fs_info->sectorsize;
u32 item_size = btrfs_item_size(leaf, slot);
u64 extent_end;
+ u8 policy;
if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) {
file_extent_err(leaf, slot,
@@ -280,10 +281,12 @@ static int check_extent_data_item(struct extent_buffer *leaf,
BTRFS_NR_COMPRESS_TYPES - 1);
return -EUCLEAN;
}
- if (unlikely(btrfs_file_extent_encryption(leaf, fi))) {
+ btrfs_unpack_encryption(btrfs_file_extent_encryption(leaf, fi),
+ &policy, NULL);
+ if (unlikely(policy >= BTRFS_NR_ENCRYPTION_TYPES)) {
file_extent_err(leaf, slot,
- "invalid encryption for file extent, have %u expect 0",
- btrfs_file_extent_encryption(leaf, fi));
+ "invalid encryption for file extent, have %u expect range [0, %u]",
+ policy, BTRFS_NR_ENCRYPTION_TYPES - 1);
return -EUCLEAN;
}
if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_INLINE) {
@@ -312,12 +315,30 @@ static int check_extent_data_item(struct extent_buffer *leaf,
return 0;
}
- /* Regular or preallocated extent has fixed item size */
- if (unlikely(item_size != sizeof(*fi))) {
- file_extent_err(leaf, slot,
+ if (policy == BTRFS_ENCRYPTION_FSCRYPT) {
+ u8 ctxsize = btrfs_file_extent_encryption_ctxsize(leaf, fi);
+
+ if (unlikely(item_size != sizeof(*fi) + ctxsize)) {
+ file_extent_err(leaf, slot,
+ "invalid item size for encrypted file extent, have %u expect = %zu + context of size %u",
+ item_size, sizeof(*fi), ctxsize);
+ return -EUCLEAN;
+ }
+ /* Only regular extents should be encrypted. */
+ if (btrfs_file_extent_type(leaf, fi) != BTRFS_FILE_EXTENT_REG) {
+ file_extent_err(leaf, slot,
+ "invalid type for encrypted file extent, have %u expect %u",
+ btrfs_file_extent_type(leaf, fi),
+ BTRFS_FILE_EXTENT_REG);
+ return -EUCLEAN;
+ }
+ } else {
+ if (unlikely(item_size != sizeof(*fi))) {
+ file_extent_err(leaf, slot,
"invalid item size for reg/prealloc file extent, have %u expect %zu",
- item_size, sizeof(*fi));
- return -EUCLEAN;
+ item_size, sizeof(*fi));
+ return -EUCLEAN;
+ }
}
if (unlikely(CHECK_FE_ALIGNED(leaf, slot, fi, ram_bytes, sectorsize) ||
CHECK_FE_ALIGNED(leaf, slot, fi, disk_bytenr, sectorsize) ||
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/8] btrfs-progs: add inode encryption contexts
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
2023-06-29 19:57 ` [PATCH 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 2/8] btrfs-progs: start tracking extent encryption context info Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 4/8] btrfs-progs: save and load fscrypt extent contexts Sweet Tea Dorminy
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
Recapitulates relevant parts of kernel change 'btrfs: add inode
encryption contexts'.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/uapi/btrfs_tree.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/kernel-shared/uapi/btrfs_tree.h b/kernel-shared/uapi/btrfs_tree.h
index ad555e70..2df7cfec 100644
--- a/kernel-shared/uapi/btrfs_tree.h
+++ b/kernel-shared/uapi/btrfs_tree.h
@@ -162,6 +162,8 @@
#define BTRFS_VERITY_DESC_ITEM_KEY 36
#define BTRFS_VERITY_MERKLE_ITEM_KEY 37
+#define BTRFS_FSCRYPT_CTXT_ITEM_KEY 41
+
#define BTRFS_ORPHAN_ITEM_KEY 48
/* reserve 2-15 close to the inode for later flexibility */
@@ -400,6 +402,7 @@ static inline __u8 btrfs_dir_flags_to_ftype(__u8 flags)
#define BTRFS_INODE_NOATIME (1U << 9)
#define BTRFS_INODE_DIRSYNC (1U << 10)
#define BTRFS_INODE_COMPRESS (1U << 11)
+#define BTRFS_INODE_ENCRYPT (1U << 12)
#define BTRFS_INODE_ROOT_ITEM_INIT (1U << 31)
@@ -416,6 +419,7 @@ static inline __u8 btrfs_dir_flags_to_ftype(__u8 flags)
BTRFS_INODE_NOATIME | \
BTRFS_INODE_DIRSYNC | \
BTRFS_INODE_COMPRESS | \
+ BTRFS_INODE_ENCRYPT | \
BTRFS_INODE_ROOT_ITEM_INIT)
#define BTRFS_INODE_RO_VERITY (1U << 0)
@@ -1016,6 +1020,12 @@ enum {
BTRFS_NR_FILE_EXTENT_TYPES = 3,
};
+enum {
+ BTRFS_ENCRYPTION_NONE,
+ BTRFS_ENCRYPTION_FSCRYPT,
+ BTRFS_NR_ENCRYPTION_TYPES,
+};
+
struct btrfs_file_extent_item {
/*
* transaction id that created this extent
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/8] btrfs-progs: save and load fscrypt extent contexts
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (2 preceding siblings ...)
2023-06-29 19:58 ` [PATCH 3/8] btrfs-progs: add inode encryption contexts Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 5/8] btrfs-progs: interpret encrypted file extents Sweet Tea Dorminy
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
Mirrors the relevant part of kernel change 'btrfs: save and load fscrypt
extent contexts' to progs.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/uapi/btrfs_tree.h | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/kernel-shared/uapi/btrfs_tree.h b/kernel-shared/uapi/btrfs_tree.h
index 2df7cfec..0e62f46b 100644
--- a/kernel-shared/uapi/btrfs_tree.h
+++ b/kernel-shared/uapi/btrfs_tree.h
@@ -1075,7 +1075,11 @@ struct btrfs_file_extent_item {
* always reflects the size uncompressed and without encoding.
*/
__le64 num_bytes;
-
+ /*
+ * fscrypt extent encryption context. Only present if extent is
+ * encrypted (stored in the encryption field).
+ */
+ __u8 fscrypt_context[0];
} __attribute__ ((__packed__));
struct btrfs_csum_item {
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/8] btrfs-progs: interpret encrypted file extents.
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (3 preceding siblings ...)
2023-06-29 19:58 ` [PATCH 4/8] btrfs-progs: save and load fscrypt extent contexts Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 6/8] btrfs-progs: handle fscrypt context items Sweet Tea Dorminy
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
Encrypted file extents now have the 'encryption' field set to a
encryption type plus a context length, and have an extent context
appended to the item. This necessitates adjusting the struct to have a
variable-length fscrypt_context member at the end, and printing contexts
if one is provided.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
check/main.c | 4 +++-
kernel-shared/print-tree.c | 27 +++++++++++++++++++++++++++
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/check/main.c b/check/main.c
index 77bb50a0..ce64f762 100644
--- a/check/main.c
+++ b/check/main.c
@@ -6345,6 +6345,7 @@ static int run_next_block(struct btrfs_root *root,
for (i = 0; i < nritems; i++) {
struct btrfs_file_extent_item *fi;
unsigned long inline_offset;
+ u8 ctxsize;
inline_offset = offsetof(struct btrfs_file_extent_item,
disk_bytenr);
@@ -6480,8 +6481,9 @@ static int run_next_block(struct btrfs_root *root,
continue;
/* Prealloc/regular extent must have fixed item size */
+ ctxsize = btrfs_file_extent_encryption_ctxsize(buf, fi);
if (btrfs_item_size(buf, i) !=
- sizeof(struct btrfs_file_extent_item)) {
+ sizeof(struct btrfs_file_extent_item) + ctxsize) {
ret = -EUCLEAN;
error(
"invalid file extent item size, have %u expect %zu",
diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c
index 0f7f7b72..688e4c1a 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -356,6 +356,28 @@ static void compress_type_to_str(u8 compress_type, char *ret)
}
}
+static void generate_encryption_string(struct extent_buffer *leaf,
+ struct btrfs_file_extent_item *fi,
+ char *ret)
+{
+ u8 encryption = btrfs_file_extent_encryption(leaf, fi);
+ u8 policy, ctxsize;
+ unsigned long offset = (unsigned long) fi;
+ const struct btrfs_file_extent_item *fi2 = (struct btrfs_file_extent_item *)(leaf->data + offset);
+ const __u8 *ctx = fi2->fscrypt_context;
+
+ btrfs_unpack_encryption(encryption, &policy, &ctxsize);
+ ret += sprintf(ret, "(%hhu, %hhu", policy, ctxsize);
+
+ if (ctxsize) {
+ int i;
+ ret += sprintf(ret, ": context ");
+ for (i = 0; i < ctxsize; i++)
+ ret += sprintf(ret, "%02hhx", ctx[i]);
+ }
+ sprintf(ret, ")");
+}
+
static const char* file_extent_type_to_str(u8 type)
{
switch (type) {
@@ -372,9 +394,11 @@ static void print_file_extent_item(struct extent_buffer *eb,
{
unsigned char extent_type = btrfs_file_extent_type(eb, fi);
char compress_str[16];
+ char encrypt_str[16];
compress_type_to_str(btrfs_file_extent_compression(eb, fi),
compress_str);
+ generate_encryption_string(eb, fi, encrypt_str);
printf("\t\tgeneration %llu type %hhu (%s)\n",
btrfs_file_extent_generation(eb, fi),
@@ -407,6 +431,9 @@ static void print_file_extent_item(struct extent_buffer *eb,
printf("\t\textent compression %hhu (%s)\n",
btrfs_file_extent_compression(eb, fi),
compress_str);
+ printf("\t\textent encryption %hhu (%s)\n",
+ btrfs_file_extent_encryption(eb, fi),
+ encrypt_str);
}
/* Caller should ensure sizeof(*ret) >= 16("DATA|TREE_BLOCK") */
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/8] btrfs-progs: handle fscrypt context items
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (4 preceding siblings ...)
2023-06-29 19:58 ` [PATCH 5/8] btrfs-progs: interpret encrypted file extents Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 7/8] btrfs-progs: escape unprintable characters in names Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 8/8] btrfs-progs: check: update inline extent length checking Sweet Tea Dorminy
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
Encrypted inodes have a new associated item, the fscrypt context, which
can be printed as a pure hex string in dump-tree.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/print-tree.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c
index 688e4c1a..fa32b586 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -99,6 +99,20 @@ static void print_dir_item(struct extent_buffer *eb, u32 size,
}
}
+static void print_fscrypt_context(struct extent_buffer *eb, int slot)
+{
+ int i;
+ unsigned long ptr = btrfs_item_ptr_offset(eb, slot);
+ u32 item_size = btrfs_item_size(eb, slot);
+ u8 ctx_buf[item_size];
+
+ read_extent_buffer(eb, ctx_buf, ptr, item_size);
+ printf("\t\tvalue: ");
+ for(i = 0; i < item_size; i++)
+ printf("%02x", ctx_buf[i]);
+ printf("\n");
+}
+
static void print_inode_extref_item(struct extent_buffer *eb, u32 size,
struct btrfs_inode_extref *extref)
{
@@ -675,6 +689,7 @@ void print_key_type(FILE *stream, u64 objectid, u8 type)
[BTRFS_DIR_LOG_ITEM_KEY] = "DIR_LOG_ITEM",
[BTRFS_DIR_LOG_INDEX_KEY] = "DIR_LOG_INDEX",
[BTRFS_XATTR_ITEM_KEY] = "XATTR_ITEM",
+ [BTRFS_FSCRYPT_CTXT_ITEM_KEY] = "FSCRYPT_CTXT_ITEM",
[BTRFS_VERITY_DESC_ITEM_KEY] = "VERITY_DESC_ITEM",
[BTRFS_VERITY_MERKLE_ITEM_KEY] = "VERITY_MERKLE_ITEM",
[BTRFS_ORPHAN_ITEM_KEY] = "ORPHAN_ITEM",
@@ -1395,6 +1410,9 @@ void btrfs_print_leaf(struct extent_buffer *eb, unsigned int mode)
case BTRFS_XATTR_ITEM_KEY:
print_dir_item(eb, item_size, ptr);
break;
+ case BTRFS_FSCRYPT_CTXT_ITEM_KEY:
+ print_fscrypt_context(eb, i);
+ break;
case BTRFS_DIR_LOG_INDEX_KEY:
case BTRFS_DIR_LOG_ITEM_KEY: {
struct btrfs_dir_log_item *dlog;
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 7/8] btrfs-progs: escape unprintable characters in names
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (5 preceding siblings ...)
2023-06-29 19:58 ` [PATCH 6/8] btrfs-progs: handle fscrypt context items Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 8/8] btrfs-progs: check: update inline extent length checking Sweet Tea Dorminy
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
There are several item types which have an associated name: inode refs
and dir items. While they could always be unprintable, the advent of
encryption makes it much more likely that the names contain characters
outside the normal ASCII range. As such, it's useful to print the
characters outside normal ASCII in hex format.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
kernel-shared/print-tree.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c
index fa32b586..c02c00d7 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -30,6 +30,19 @@
#include "kernel-shared/file-item.h"
#include "common/utils.h"
+static void print_name(const char *buf, size_t len)
+{
+ size_t i;
+ printf("name: ");
+ for(i = 0; i < len; i++) {
+ if (buf[i] >= ' ' && buf[i] <= '~')
+ printf("%c", buf[i]);
+ else
+ printf("\\x%02hhx", buf[i]);
+ }
+ printf("\n");
+}
+
static void print_dir_item_type(struct extent_buffer *eb,
struct btrfs_dir_item *di)
{
@@ -79,7 +92,7 @@ static void print_dir_item(struct extent_buffer *eb, u32 size,
} else {
read_extent_buffer(eb, namebuf,
(unsigned long)(di + 1), len);
- printf("\t\tname: %.*s\n", len, namebuf);
+ print_name(namebuf, len);
}
if (data_len) {
@@ -137,7 +150,7 @@ static void print_inode_extref_item(struct extent_buffer *eb, u32 size,
} else {
read_extent_buffer(eb, namebuf,
(unsigned long)extref->name, len);
- printf("name: %.*s\n", len, namebuf);
+ print_name(namebuf, len);
}
len = sizeof(*extref) + name_len;
@@ -167,7 +180,7 @@ static void print_inode_ref_item(struct extent_buffer *eb, u32 size,
} else {
read_extent_buffer(eb, namebuf,
(unsigned long)(ref + 1), len);
- printf("name: %.*s\n", len, namebuf);
+ print_name(namebuf, len);
}
len = sizeof(*ref) + name_len;
ref = (struct btrfs_inode_ref *)((char *)ref + len);
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 8/8] btrfs-progs: check: update inline extent length checking
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (6 preceding siblings ...)
2023-06-29 19:58 ` [PATCH 7/8] btrfs-progs: escape unprintable characters in names Sweet Tea Dorminy
@ 2023-06-29 19:58 ` Sweet Tea Dorminy
7 siblings, 0 replies; 9+ messages in thread
From: Sweet Tea Dorminy @ 2023-06-29 19:58 UTC (permalink / raw)
To: linux-btrfs, kernel-team; +Cc: Sweet Tea Dorminy
As part of the encryption changes, encrypted inline file extents record
their actual data length in ram_bytes, like compressed inline file
extents, while the item's length records the actual size. As such,
encrypted inline extents must be treated like compressed ones for
inode length consistency checking.
Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
---
check/main.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/check/main.c b/check/main.c
index ce64f762..9a17c121 100644
--- a/check/main.c
+++ b/check/main.c
@@ -1642,7 +1642,7 @@ static int process_file_extent(struct btrfs_root *root,
u64 mask = gfs_info->sectorsize - 1;
u32 max_inline_size = min_t(u32, mask,
BTRFS_MAX_INLINE_DATA_SIZE(gfs_info));
- u8 compression;
+ u8 compression, encryption;
int extent_type;
int ret;
@@ -1667,25 +1667,25 @@ static int process_file_extent(struct btrfs_root *root,
fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
extent_type = btrfs_file_extent_type(eb, fi);
compression = btrfs_file_extent_compression(eb, fi);
+ encryption = btrfs_file_extent_encryption(eb, fi);
if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
- num_bytes = btrfs_file_extent_ram_bytes(eb, fi);
- if (num_bytes == 0)
+ u64 num_decoded_bytes = btrfs_file_extent_ram_bytes(eb, fi);
+ u64 num_disk_bytes = btrfs_file_extent_inline_item_len(eb, slot);
+ if (num_decoded_bytes == 0)
rec->errors |= I_ERR_BAD_FILE_EXTENT;
- if (compression) {
- if (btrfs_file_extent_inline_item_len(eb, slot) >
- max_inline_size ||
- num_bytes > gfs_info->sectorsize)
+ if (compression || encryption) {
+ if (num_disk_bytes > max_inline_size ||
+ num_decoded_bytes > gfs_info->sectorsize)
rec->errors |= I_ERR_FILE_EXTENT_TOO_LARGE;
} else {
- if (num_bytes > max_inline_size)
+ if (num_decoded_bytes > max_inline_size)
rec->errors |= I_ERR_FILE_EXTENT_TOO_LARGE;
- if (btrfs_file_extent_inline_item_len(eb, slot) !=
- num_bytes)
+ if (num_disk_bytes != num_decoded_bytes)
rec->errors |= I_ERR_INLINE_RAM_BYTES_WRONG;
}
- rec->found_size += num_bytes;
- num_bytes = (num_bytes + mask) & ~mask;
+ rec->found_size += num_decoded_bytes;
+ num_bytes = (num_decoded_bytes + mask) & ~mask;
} else if (extent_type == BTRFS_FILE_EXTENT_REG ||
extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
num_bytes = btrfs_file_extent_num_bytes(eb, fi);
--
2.40.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-06-29 19:58 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-29 19:57 [PATCH 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
2023-06-29 19:57 ` [PATCH 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 2/8] btrfs-progs: start tracking extent encryption context info Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 3/8] btrfs-progs: add inode encryption contexts Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 4/8] btrfs-progs: save and load fscrypt extent contexts Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 5/8] btrfs-progs: interpret encrypted file extents Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 6/8] btrfs-progs: handle fscrypt context items Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 7/8] btrfs-progs: escape unprintable characters in names Sweet Tea Dorminy
2023-06-29 19:58 ` [PATCH 8/8] btrfs-progs: check: update inline extent length checking Sweet Tea Dorminy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).