Skip to content

Commit

Permalink
Native data and metadata encryption for zfs
Browse files Browse the repository at this point in the history
Signed-off-by: Tom Caputi <tcaputi@datto.com>
  • Loading branch information
Tom Caputi authored and lundman committed Jul 18, 2017
1 parent 786324f commit 5ad8304
Show file tree
Hide file tree
Showing 157 changed files with 16,573 additions and 1,174 deletions.
21 changes: 17 additions & 4 deletions usr/src/cmd/mdb/common/modules/zfs/zfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ enum spa_flags {
SPA_FLAG_HISTOGRAMS = 1 << 5
};


const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {0};


/*
* If any of these flags are set, call spa_vdevs in spa_print
*/
Expand Down Expand Up @@ -424,7 +428,7 @@ zfs_params(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
static int
blkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{
char type[80], checksum[80], compress[80];
char type[80], checksum[80], compress[80], *crypt_type;
blkptr_t blk, *bp = &blk;
char buf[BP_SPRINTF_LEN];

Expand All @@ -443,8 +447,19 @@ blkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
return (DCMD_ERR);
}

if (BP_IS_ENCRYPTED(bp)) {
crypt_type = "encrypted";
/* LINTED E_SUSPICIOUS_COMPARISON */
} else if (BP_IS_AUTHENTICATED(bp)) {
crypt_type = "authenticated";
} else if (BP_HAS_INDIRECT_MAC_CKSUM(bp)) {
crypt_type = "indirect-MAC";
} else {
crypt_type = "unencrypted";
}

SNPRINTF_BLKPTR(mdb_snprintf, '\n', buf, sizeof (buf), bp, type,
checksum, compress);
checksum, crypt_type, compress);

mdb_printf("%s\n", buf);

Expand Down Expand Up @@ -2672,8 +2687,6 @@ zfs_blkstats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
dmu_object_type_t t;
zfs_blkstat_t *tzb;
uint64_t ditto;
dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES + 10];
/* +10 in case it grew */

if (mdb_readvar(&dmu_ot, "dmu_ot") == -1) {
mdb_warn("failed to read 'dmu_ot'");
Expand Down
3 changes: 2 additions & 1 deletion usr/src/cmd/mdb/intel/amd64/libzpool/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ MODSRCS_DIR = ../../../common/modules/zfs
GENUNIX_DIR = ../../../common/modules/genunix

CPPFLAGS += -I../../../../../lib/libzpool/common \
-I../../../../../uts/common/fs/zfs
-I../../../../../uts/common/fs/zfs \
-I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
1 change: 1 addition & 0 deletions usr/src/cmd/mdb/intel/amd64/zfs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ include ../../../common/modules/zfs/Makefile.zfs

CPPFLAGS += -I../../../../../uts/common/fs/zfs
CPPFLAGS += -I../../../../../uts/common/fs/zfs/lua
CPPFLAGS += -I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
3 changes: 2 additions & 1 deletion usr/src/cmd/mdb/intel/ia32/libzpool/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ GENUNIX_DIR = ../../../common/modules/genunix

CPPFLAGS += -I../../../../../lib/libzpool/common \
-I../../../../../uts/common/fs/zfs \
-I../../../../../uts/common/fs/zfs/lua
-I../../../../../uts/common/fs/zfs/lua \
-I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
1 change: 1 addition & 0 deletions usr/src/cmd/mdb/intel/ia32/zfs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ include ../../../common/modules/zfs/Makefile.zfs

CPPFLAGS += -I../../../../../uts/common/fs/zfs
CPPFLAGS += -I../../../../../uts/common/fs/zfs/lua
CPPFLAGS += -I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
3 changes: 2 additions & 1 deletion usr/src/cmd/mdb/sparc/v7/libzpool/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ GENUNIX_DIR = ../../../common/modules/genunix

CPPFLAGS += -I../../../../../lib/libzpool/common \
-I../../../../../uts/common/fs/zfs \
-I../../../../../uts/common/fs/zfs/lua
-I../../../../../uts/common/fs/zfs/lua \
-I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
3 changes: 2 additions & 1 deletion usr/src/cmd/mdb/sparc/v9/libzpool/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ GENUNIX_DIR = ../../../common/modules/genunix

CPPFLAGS += -I../../../../../lib/libzpool/common \
-I../../../../../uts/common/fs/zfs \
-I../../../../../uts/common/fs/zfs/lua
-I../../../../../uts/common/fs/zfs/lua \
-I../../../../../common/zfs

C99MODE= -xc99=%all
C99LMODE= -Xc99=%all
Expand Down
3 changes: 3 additions & 0 deletions usr/src/cmd/zdb/Makefile.com
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ LINTFLAGS64 += -xerroff=E_NAME_DEF_NOT_USED2
LINTFLAGS += -erroff=E_STATIC_UNUSED
LINTFLAGS64 += -erroff=E_STATIC_UNUSED

LINTFLAGS += -erroff=E_BAD_PTR_CAST_ALIGN
LINTFLAGS64 += -erroff=E_BAD_PTR_CAST_ALIGN

.KEEP_STATE:

all: $(PROG)
Expand Down
75 changes: 55 additions & 20 deletions usr/src/cmd/zdb/zdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
#include <sys/zfeature.h>
#include <sys/abd.h>
#include <sys/blkptr.h>
#include <sys/dsl_crypt.h>
#include <zfs_comutil.h>
#undef verify
#include <libzfs.h>
Expand Down Expand Up @@ -1185,7 +1186,7 @@ static void
snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp)
{
const dva_t *dva = bp->blk_dva;
int ndvas = dump_opt['d'] > 5 ? BP_GET_NDVAS(bp) : 1;
unsigned int ndvas = dump_opt['d'] > 5 ? BP_GET_NDVAS(bp) : 1;

if (dump_opt['b'] >= 6) {
snprintf_blkptr(blkbuf, buflen, bp);
Expand Down Expand Up @@ -1602,14 +1603,14 @@ open_objset(const char *path, dmu_objset_type_t type, void *tag, objset_t **osp)
uint64_t version = 0;

VERIFY3P(sa_os, ==, NULL);
err = dmu_objset_own(path, type, B_TRUE, tag, osp);
err = dmu_objset_own(path, type, B_TRUE, B_FALSE, tag, osp);
if (err != 0) {
(void) fprintf(stderr, "failed to own dataset '%s': %s\n", path,
strerror(err));
return (err);
}

if (dmu_objset_type(*osp) == DMU_OST_ZFS) {
if (dmu_objset_type(*osp) == DMU_OST_ZFS && !(*osp)->os_encrypted) {
(void) zap_lookup(*osp, MASTER_NODE_OBJ, ZPL_VERSION_STR,
8, 1, &version);
if (version >= ZPL_VERSION_SA) {
Expand All @@ -1621,7 +1622,7 @@ open_objset(const char *path, dmu_objset_type_t type, void *tag, objset_t **osp)
if (err != 0) {
(void) fprintf(stderr, "sa_setup failed: %s\n",
strerror(err));
dmu_objset_disown(*osp, tag);
dmu_objset_disown(*osp, B_FALSE, tag);
*osp = NULL;
}
}
Expand All @@ -1636,7 +1637,7 @@ close_objset(objset_t *os, void *tag)
VERIFY3P(os, ==, sa_os);
if (os->os_sa != NULL)
sa_tear_down(os);
dmu_objset_disown(os, tag);
dmu_objset_disown(os, B_FALSE, tag);
sa_attr_table = NULL;
sa_os = NULL;
}
Expand Down Expand Up @@ -1789,6 +1790,7 @@ dump_dmu_objset(objset_t *os, uint64_t object, void *data, size_t size)
{
}


static object_viewer_t *object_viewer[DMU_OT_NUMTYPES + 1] = {
dump_none, /* unallocated */
dump_zap, /* object directory */
Expand Down Expand Up @@ -1853,6 +1855,7 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
dmu_buf_t *db = NULL;
dmu_object_info_t doi;
dnode_t *dn;
boolean_t dnode_held = B_FALSE;
void *bonus = NULL;
size_t bsize = 0;
char iblk[32], dblk[32], lsize[32], asize[32], fill[32];
Expand All @@ -1869,16 +1872,33 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)

if (object == 0) {
dn = DMU_META_DNODE(os);
dmu_object_info_from_dnode(dn, &doi);
} else {
error = dmu_bonus_hold(os, object, FTAG, &db);
/*
* Encrypted datasets will have sensitive bonus buffers
* encrypted. Therefore we cannot hold the bonus buffer and
* must hold the dnode itself instead.
*/
error = dmu_object_info(os, object, &doi);
if (error)
fatal("dmu_bonus_hold(%llu) failed, errno %u",
object, error);
bonus = db->db_data;
bsize = db->db_size;
dn = DB_DNODE((dmu_buf_impl_t *)db);
fatal("dmu_object_info() failed, errno %u", error);

if (os->os_encrypted &&
DMU_OT_IS_ENCRYPTED(doi.doi_bonus_type)) {
error = dnode_hold(os, object, FTAG, &dn);
if (error)
fatal("dnode_hold() failed, errno %u", error);
dnode_held = B_TRUE;
} else {
error = dmu_bonus_hold(os, object, FTAG, &db);
if (error)
fatal("dmu_bonus_hold(%llu) failed, errno %u",
object, error);
bonus = db->db_data;
bsize = db->db_size;
dn = DB_DNODE((dmu_buf_impl_t *)db);
}
}
dmu_object_info_from_dnode(dn, &doi);

zdb_nicenum(doi.doi_metadata_block_size, iblk);
zdb_nicenum(doi.doi_data_block_size, dblk);
Expand Down Expand Up @@ -1922,9 +1942,20 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
(void) printf("\tdnode maxblkid: %llu\n",
(longlong_t)dn->dn_phys->dn_maxblkid);

object_viewer[ZDB_OT_TYPE(doi.doi_bonus_type)](os, object,
bonus, bsize);
object_viewer[ZDB_OT_TYPE(doi.doi_type)](os, object, NULL, 0);
if (!dnode_held) {
object_viewer[ZDB_OT_TYPE(doi.doi_bonus_type)](os,
object, bonus, bsize);
} else {
(void) printf("\t\t(bonus encrypted)\n");
}

if (!os->os_encrypted || !DMU_OT_IS_ENCRYPTED(doi.doi_type)) {
object_viewer[ZDB_OT_TYPE(doi.doi_type)](os, object,
NULL, 0);
} else {
(void) printf("\t\t(object encrypted)\n");
}

*print_header = 1;
}

Expand Down Expand Up @@ -1966,6 +1997,8 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)

if (db != NULL)
dmu_buf_rele(db, FTAG);
if (dnode_held)
dnode_rele(dn, FTAG);
}

static char *objset_types[DMU_OST_NUMTYPES] = {
Expand Down Expand Up @@ -2269,7 +2302,7 @@ dump_path(char *ds, char *path)
if (err != 0) {
(void) fprintf(stderr, "can't lookup root znode: %s\n",
strerror(err));
dmu_objset_disown(os, FTAG);
dmu_objset_disown(os, B_FALSE, FTAG);
return (EINVAL);
}

Expand Down Expand Up @@ -2842,7 +2875,8 @@ dump_block_stats(spa_t *spa)
zdb_cb_t zcb = { 0 };
zdb_blkstats_t *zb, *tzb;
uint64_t norm_alloc, norm_space, total_alloc, total_found;
int flags = TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA | TRAVERSE_HARD;
int flags = TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA |
TRAVERSE_NO_DECRYPT | TRAVERSE_HARD;
boolean_t leaks = B_FALSE;

(void) printf("\nTraversing all blocks %s%s%s%s%s...\n\n",
Expand Down Expand Up @@ -3141,8 +3175,8 @@ dump_simulated_ddt(spa_t *spa)

spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);

(void) traverse_pool(spa, 0, TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA,
zdb_ddt_add_cb, &t);
(void) traverse_pool(spa, 0, TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA |
TRAVERSE_NO_DECRYPT, zdb_ddt_add_cb, &t);

spa_config_exit(spa, SCL_CONFIG, FTAG);

Expand Down Expand Up @@ -4011,7 +4045,8 @@ main(int argc, char **argv)
}
}
} else {
error = open_objset(target, DMU_OST_ANY, FTAG, &os);
error = dmu_objset_own(target, DMU_OST_ANY,
B_TRUE, B_FALSE, FTAG, &os);
}
}
nvlist_free(policy);
Expand Down
11 changes: 8 additions & 3 deletions usr/src/cmd/zdb/zdb_il.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,13 @@ print_log_record(zilog_t *zilog, lr_t *lr, void *arg, uint64_t claim_txg)
(u_longlong_t)lr->lrc_txg,
(u_longlong_t)lr->lrc_seq);

if (txtype && verbose >= 3)
zil_rec_info[txtype].zri_print(zilog, txtype, lr);
if (txtype && verbose >= 3) {
if (!zilog->zl_os->os_encrypted) {
zil_rec_info[txtype].zri_print(zilog, txtype, lr);
} else {
(void) printf("%s(encrypted)\n", prefix);
}
}

zil_rec_info[txtype].zri_count++;
zil_rec_info[0].zri_count++;
Expand Down Expand Up @@ -394,7 +399,7 @@ dump_intent_log(zilog_t *zilog)
if (verbose >= 2) {
(void) printf("\n");
(void) zil_parse(zilog, print_log_block, print_log_record, NULL,
zh->zh_claim_txg);
zh->zh_claim_txg, B_FALSE);
print_log_stats(verbose);
}
}
Loading

0 comments on commit 5ad8304

Please sign in to comment.