]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
cmd_unlock: Add -k argument to specify keyring
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 19 May 2022 19:59:37 +0000 (15:59 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Thu, 19 May 2022 20:01:51 +0000 (16:01 -0400)
This adds a new argument (-k) to cmd_unlock for specifying the keyring
to add to. The default is user, but user_session and session can also be
specified.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
.bcachefs_revision
cmd_key.c
cmd_migrate.c
crypto.c
crypto.h
libbcachefs/checksum.c
libbcachefs/lru.c
libbcachefs/lru.h
libbcachefs/recovery.c

index 9aed74e1dad1daaa9b3f616b615fd6d83d67cdcc..c1cb5fdbb73093fdd4077755aa316297483293d7 100644 (file)
@@ -1 +1 @@
-c4ca278a540bd2f99864f198a6ec9b4cb1f1fd44
+40eaef7e8049b75ff7e5da42227295c754d9c906
index 6052cb0061762b8ed8d6a1f4c56dfc8c7e54ee41..b1d1bd029cd8419ba54882d6e436bff592417faa 100644 (file)
--- a/cmd_key.c
+++ b/cmd_key.c
@@ -14,20 +14,26 @@ static void unlock_usage(void)
             "\n"
             "Options:\n"
             "  -c                     Check if a device is encrypted\n"
+            "  -k (session|user|user_session)\n"
+            "                         Keyring to add to (default: user)\n"
             "  -h                     Display this help and exit\n"
             "Report bugs to <linux-bcache@vger.kernel.org>");
 }
 
 int cmd_unlock(int argc, char *argv[])
 {
+       const char *keyring = "user";
        bool check = false;
        int opt;
 
-       while ((opt = getopt(argc, argv, "ch")) != -1)
+       while ((opt = getopt(argc, argv, "ck:h")) != -1)
                switch (opt) {
                case 'c':
                        check = true;
                        break;
+               case 'k':
+                       keyring = strdup(optarg);
+                       break;
                case 'h':
                        unlock_usage();
                        exit(EXIT_SUCCESS);
@@ -59,7 +65,7 @@ int cmd_unlock(int argc, char *argv[])
 
        char *passphrase = read_passphrase("Enter passphrase: ");
 
-       bch2_add_key(sb.sb, passphrase);
+       bch2_add_key(sb.sb, "user", keyring, passphrase);
 
        bch2_free_super(&sb);
        memzero_explicit(passphrase, strlen(passphrase));
index b67fc02df994bdbaaead9db6901c64ed43265de7..a553319be2a7d500f3f132ce5003d65fd7c77187 100644 (file)
@@ -691,7 +691,7 @@ static int migrate_fs(const char            *fs_path,
        u64 sb_offset = le64_to_cpu(sb->layout.sb_offset[0]);
 
        if (format_opts.passphrase)
-               bch2_add_key(sb, format_opts.passphrase);
+               bch2_add_key(sb, "user", "user", format_opts.passphrase);
 
        free(sb);
 
index 43753a3e8902e019371d5258b37681ff320211b2..4e4d15a90fe90d7fdbf051cd122c85353c162f69 100644 (file)
--- a/crypto.c
+++ b/crypto.c
@@ -133,10 +133,23 @@ void bch2_passphrase_check(struct bch_sb *sb, const char *passphrase,
                die("incorrect passphrase");
 }
 
-void bch2_add_key(struct bch_sb *sb, const char *passphrase)
+void bch2_add_key(struct bch_sb *sb,
+                 const char *type,
+                 const char *keyring_str,
+                 const char *passphrase)
 {
        struct bch_key passphrase_key;
        struct bch_encrypted_key sb_key;
+       int keyring;
+
+       if (!strcmp(keyring_str, "session"))
+               keyring = KEY_SPEC_SESSION_KEYRING;
+       else if (!strcmp(keyring_str, "user"))
+               keyring = KEY_SPEC_USER_KEYRING;
+       else if (!strcmp(keyring_str, "user_session"))
+               keyring = KEY_SPEC_USER_SESSION_KEYRING;
+       else
+               die("unknown keyring %s", keyring_str);
 
        bch2_passphrase_check(sb, passphrase,
                              &passphrase_key,
@@ -147,12 +160,10 @@ void bch2_add_key(struct bch_sb *sb, const char *passphrase)
 
        char *description = mprintf("bcachefs:%s", uuid);
 
-       if (add_key("logon", description,
-                   &passphrase_key, sizeof(passphrase_key),
-                   KEY_SPEC_USER_KEYRING) < 0 ||
-           add_key("user", description,
+       if (add_key(type,
+                   description,
                    &passphrase_key, sizeof(passphrase_key),
-                   KEY_SPEC_USER_KEYRING) < 0)
+                   keyring) < 0)
                die("add_key error: %m");
 
        memzero_explicit(description, strlen(description));
index 7f523c057cbbf3c9ad6a0b8a57b16b2296d95c52..baea6d86e84a9f2005fb309afa7df59868c5ef06 100644 (file)
--- a/crypto.h
+++ b/crypto.h
@@ -15,7 +15,7 @@ struct bch_key derive_passphrase(struct bch_sb_field_crypt *, const char *);
 bool bch2_sb_is_encrypted(struct bch_sb *);
 void bch2_passphrase_check(struct bch_sb *, const char *,
                           struct bch_key *, struct bch_encrypted_key *);
-void bch2_add_key(struct bch_sb *, const char *);
+void bch2_add_key(struct bch_sb *, const char *, const char *, const char *);
 void bch_sb_crypt_init(struct bch_sb *sb, struct bch_sb_field_crypt *,
                       const char *);
 
index 425582f60d7a8f8092ed30807d2465f1ca6e2515..50157b4013a5d6b0d138d21cbee3a71d763be96d 100644 (file)
@@ -424,7 +424,7 @@ static int __bch2_request_key(char *key_description, struct bch_key *key)
        const struct user_key_payload *ukp;
        int ret;
 
-       keyring_key = request_key(&key_type_logon, key_description, NULL);
+       keyring_key = request_key(&key_type_user, key_description, NULL);
        if (IS_ERR(keyring_key))
                return PTR_ERR(keyring_key);
 
index ce23b38382f5270a94cb93f1ef01971fab4ffb92..d278331776dd9158ecce67ae25072854dda915bc 100644 (file)
@@ -130,7 +130,7 @@ int bch2_lru_change(struct btree_trans *trans, u64 id, u64 idx,
 }
 
 static int bch2_check_lru_key(struct btree_trans *trans,
-                             struct btree_iter *lru_iter, bool initial)
+                             struct btree_iter *lru_iter)
 {
        struct bch_fs *c = trans->c;
        struct btree_iter iter;
@@ -193,7 +193,7 @@ fsck_err:
        return ret;
 }
 
-int bch2_check_lrus(struct bch_fs *c, bool initial)
+int bch2_check_lrus(struct bch_fs *c)
 {
        struct btree_trans trans;
        struct btree_iter iter;
@@ -207,7 +207,7 @@ int bch2_check_lrus(struct bch_fs *c, bool initial)
                ret = __bch2_trans_do(&trans, NULL, NULL,
                                      BTREE_INSERT_NOFAIL|
                                      BTREE_INSERT_LAZY_RW,
-                       bch2_check_lru_key(&trans, &iter, initial));
+                       bch2_check_lru_key(&trans, &iter));
                if (ret)
                        break;
        }
index bfe38a67e5858445e8f3ca8e74db66051ddb7e14..3decb7b1dde23b9ac4cfa2e26af4fdd73f03e67d 100644 (file)
@@ -14,6 +14,6 @@ int bch2_lru_delete(struct btree_trans *, u64, u64, u64, struct bkey_s_c);
 int bch2_lru_set(struct btree_trans *, u64, u64, u64 *);
 int bch2_lru_change(struct btree_trans *, u64, u64, u64, u64 *, struct bkey_s_c);
 
-int bch2_check_lrus(struct bch_fs *, bool);
+int bch2_check_lrus(struct bch_fs *);
 
 #endif /* _BCACHEFS_LRU_H */
index ff483ff303da964c97f6c793b98f69a41ab9ffce..36ab2e3bbc6d361046fc6cdde71cf9142e6ef447 100644 (file)
@@ -1256,24 +1256,19 @@ use_clean:
 
                bch_info(c, "checking lrus");
                err = "error checking lrus";
-               ret = bch2_check_lrus(c, true);
+               ret = bch2_check_lrus(c);
                if (ret)
                        goto err;
                bch_verbose(c, "done checking lrus");
-
                set_bit(BCH_FS_CHECK_LRUS_DONE, &c->flags);
 
                bch_info(c, "checking alloc to lru refs");
                err = "error checking alloc to lru refs";
                ret = bch2_check_alloc_to_lru_refs(c);
-               if (ret)
-                       goto err;
-               set_bit(BCH_FS_CHECK_ALLOC_TO_LRU_REFS_DONE, &c->flags);
-
-               ret = bch2_check_lrus(c, true);
                if (ret)
                        goto err;
                bch_verbose(c, "done checking alloc to lru refs");
+               set_bit(BCH_FS_CHECK_ALLOC_TO_LRU_REFS_DONE, &c->flags);
        } else {
                set_bit(BCH_FS_MAY_GO_RW, &c->flags);
                set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags);