* [PATCH v2 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 2/8] btrfs-progs: start tracking extent encryption context info Sweet Tea Dorminy
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 59533879b..6c9ff866f 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 85b04f89a..e347cceb0 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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 2/8] btrfs-progs: start tracking extent encryption context info
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 3/8] btrfs-progs: add inode encryption contexts Sweet Tea Dorminy
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 | 2 ++
kernel-shared/fscrypt.h | 25 ++++++++++++++++++++++++
kernel-shared/tree-checker.c | 37 ++++++++++++++++++++++++++++--------
3 files changed, 56 insertions(+), 8 deletions(-)
create mode 100644 kernel-shared/fscrypt.h
diff --git a/kernel-shared/accessors.h b/kernel-shared/accessors.h
index 539c20d09..1302ce5e6 100644
--- a/kernel-shared/accessors.h
+++ b/kernel-shared/accessors.h
@@ -949,6 +949,8 @@ 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);
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,
diff --git a/kernel-shared/fscrypt.h b/kernel-shared/fscrypt.h
new file mode 100644
index 000000000..32fda99ca
--- /dev/null
+++ b/kernel-shared/fscrypt.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef BTRFS_FSCRYPT_H
+#define BTRFS_FSCRYPT_H
+
+static inline u32
+btrfs_file_extent_encryption_ctxsize(const struct extent_buffer *eb,
+ struct btrfs_file_extent_item *e)
+{
+ if (!btrfs_file_extent_encryption(eb, e))
+ return 0;
+
+ return btrfs_get_32(eb, e, offsetof(struct btrfs_file_extent_item,
+ encryption_context));
+}
+
+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));
+}
+
+#endif
diff --git a/kernel-shared/tree-checker.c b/kernel-shared/tree-checker.c
index 107975891..2665b2038 100644
--- a/kernel-shared/tree-checker.c
+++ b/kernel-shared/tree-checker.c
@@ -25,6 +25,7 @@
#include "kernel-shared/ctree.h"
#include "kernel-shared/tree-checker.h"
#include "kernel-shared/disk-io.h"
+#include "kernel-shared/fscrypt.h"
#include "kernel-shared/compression.h"
#include "kernel-shared/volumes.h"
#include "kernel-shared/misc.h"
@@ -229,6 +230,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 +282,11 @@ 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))) {
+ policy = btrfs_file_extent_encryption(leaf, fi);
+ 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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 3/8] btrfs-progs: add inode encryption contexts
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 1/8] btrfs-progs: add new FEATURE_INCOMPAT_ENCRYPT flag Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 2/8] btrfs-progs: start tracking extent encryption context info Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 4/8] btrfs-progs: save and load fscrypt extent contexts Sweet Tea Dorminy
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 ad555e705..2df7cfec4 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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 4/8] btrfs-progs: save and load fscrypt extent contexts
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (2 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 3/8] btrfs-progs: add inode encryption contexts Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 5/8] btrfs-progs: interpret encrypted file extents Sweet Tea Dorminy
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 2df7cfec4..c1c3a46e4 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 encryption_context[0];
} __attribute__ ((__packed__));
struct btrfs_csum_item {
--
2.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 5/8] btrfs-progs: interpret encrypted file extents.
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (3 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 4/8] btrfs-progs: save and load fscrypt extent contexts Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 6/8] btrfs-progs: handle fscrypt context items Sweet Tea Dorminy
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 | 5 ++++-
kernel-shared/print-tree.c | 27 +++++++++++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/check/main.c b/check/main.c
index d66e10e8f..00f73c43e 100644
--- a/check/main.c
+++ b/check/main.c
@@ -37,6 +37,7 @@
#include "kernel-shared/ctree.h"
#include "kernel-shared/volumes.h"
#include "kernel-shared/disk-io.h"
+#include "kernel-shared/fscrypt.h"
#include "kernel-shared/print-tree.h"
#include "kernel-shared/transaction.h"
#include "kernel-shared/free-space-cache.h"
@@ -6345,6 +6346,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 +6482,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 0f7f7b72f..9f332f811 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -23,6 +23,7 @@
#include "kerncompat.h"
#include "kernel-shared/ctree.h"
#include "kernel-shared/disk-io.h"
+#include "kernel-shared/fscrypt.h"
#include "kernel-shared/print-tree.h"
#include "kernel-shared/volumes.h"
#include "kernel-shared/compression.h"
@@ -356,6 +357,27 @@ 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 policy = btrfs_file_extent_encryption(leaf, fi);
+ u32 ctxsize = btrfs_file_extent_encryption_ctxsize(leaf, fi);
+ 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->encryption_context;
+
+ ret += sprintf(ret, "(%hhu, %u", 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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 6/8] btrfs-progs: handle fscrypt context items
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (4 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 5/8] btrfs-progs: interpret encrypted file extents Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 7/8] btrfs-progs: escape unprintable characters in names Sweet Tea Dorminy
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 9f332f811..19a0e8ac8 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -100,6 +100,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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 7/8] btrfs-progs: escape unprintable characters in names
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (5 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 6/8] btrfs-progs: handle fscrypt context items Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-08 17:22 ` [PATCH v2 8/8] btrfs-progs: check: update inline extent length checking Sweet Tea Dorminy
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 19a0e8ac8..fa9f73cba 100644
--- a/kernel-shared/print-tree.c
+++ b/kernel-shared/print-tree.c
@@ -31,6 +31,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)
{
@@ -80,7 +93,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) {
@@ -138,7 +151,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;
@@ -168,7 +181,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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 8/8] btrfs-progs: check: update inline extent length checking
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (6 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 7/8] btrfs-progs: escape unprintable characters in names Sweet Tea Dorminy
@ 2023-08-08 17:22 ` Sweet Tea Dorminy
2023-08-09 20:41 ` [PATCH v2 0/8] btrfs-progs: add encryption support Josef Bacik
2023-08-10 12:23 ` Neal Gompa
9 siblings, 0 replies; 11+ messages in thread
From: Sweet Tea Dorminy @ 2023-08-08 17:22 UTC (permalink / raw)
To: linux-btrfs, ebiggers, 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 00f73c43e..b78e8b55a 100644
--- a/check/main.c
+++ b/check/main.c
@@ -1643,7 +1643,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;
@@ -1668,25 +1668,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.41.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH v2 0/8] btrfs-progs: add encryption support
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (7 preceding siblings ...)
2023-08-08 17:22 ` [PATCH v2 8/8] btrfs-progs: check: update inline extent length checking Sweet Tea Dorminy
@ 2023-08-09 20:41 ` Josef Bacik
2023-08-10 12:23 ` Neal Gompa
9 siblings, 0 replies; 11+ messages in thread
From: Josef Bacik @ 2023-08-09 20:41 UTC (permalink / raw)
To: Sweet Tea Dorminy; +Cc: linux-btrfs, ebiggers, kernel-team
On Tue, Aug 08, 2023 at 01:22:19PM -0400, Sweet Tea Dorminy wrote:
> 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.1691510179.git.sweettea-kernel@dorminy.me/
>
You can add
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
to the series. Thanks,
Josef
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v2 0/8] btrfs-progs: add encryption support
2023-08-08 17:22 [PATCH v2 0/8] btrfs-progs: add encryption support Sweet Tea Dorminy
` (8 preceding siblings ...)
2023-08-09 20:41 ` [PATCH v2 0/8] btrfs-progs: add encryption support Josef Bacik
@ 2023-08-10 12:23 ` Neal Gompa
9 siblings, 0 replies; 11+ messages in thread
From: Neal Gompa @ 2023-08-10 12:23 UTC (permalink / raw)
To: Sweet Tea Dorminy; +Cc: linux-btrfs, ebiggers, kernel-team
On Tue, Aug 8, 2023 at 2:42 PM Sweet Tea Dorminy
<sweettea-kernel@dorminy.me> wrote:
>
> 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.1691510179.git.sweettea-kernel@dorminy.me/
>
> Changelog:
> v2:
> - updated to match new extent context format
>
> v1:
> - https://lore.kernel.org/linux-btrfs/cover.1688068420.git.sweettea-kernel@dorminy.me/
>
> 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 | 29 ++++++++-------
> kernel-shared/accessors.h | 2 ++
> kernel-shared/ctree.h | 3 +-
> kernel-shared/fscrypt.h | 25 +++++++++++++
> 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, 151 insertions(+), 26 deletions(-)
> create mode 100644 kernel-shared/fscrypt.h
>
>
> base-commit: 9a7c1226664ab3145f7382ffeae80770bd2d8d3a
> --
> 2.41.0
>
This patch set series looks reasonable to me.
Reviewed-by: Neal Gompa <neal@gompa.dev>
--
真実はいつも一つ!/ Always, there's only one truth!
^ permalink raw reply [flat|nested] 11+ messages in thread