Merge tag 'x86_cache_for_6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux-block.git] / block / blk-crypto.c
index e800f305e9eda8712c3cf80cd580cf8e0b9cff3b..4d760b092deb93ab678365fb6acb3464a5f6df35 100644 (file)
@@ -400,15 +400,19 @@ int blk_crypto_start_using_key(struct block_device *bdev,
 }
 
 /**
- * blk_crypto_evict_key() - Evict a key from any inline encryption hardware
- *                         it may have been programmed into
- * @bdev: The block_device who's associated inline encryption hardware this key
- *     might have been programmed into
- * @key: The key to evict
+ * blk_crypto_evict_key() - Evict a blk_crypto_key from a block_device
+ * @bdev: a block_device on which I/O using the key may have been done
+ * @key: the key to evict
  *
- * Upper layers (filesystems) must call this function to ensure that a key is
- * evicted from any hardware that it might have been programmed into.  The key
- * must not be in use by any in-flight IO when this function is called.
+ * For a given block_device, this function removes the given blk_crypto_key from
+ * the keyslot management structures and evicts it from any underlying hardware
+ * keyslot(s) or blk-crypto-fallback keyslot it may have been programmed into.
+ *
+ * Upper layers must call this before freeing the blk_crypto_key.  It must be
+ * called for every block_device the key may have been used on.  The key must no
+ * longer be in use by any I/O when this function is called.
+ *
+ * Context: May sleep.
  */
 void blk_crypto_evict_key(struct block_device *bdev,
                          const struct blk_crypto_key *key)
@@ -420,6 +424,14 @@ void blk_crypto_evict_key(struct block_device *bdev,
                err = __blk_crypto_evict_key(q->crypto_profile, key);
        else
                err = blk_crypto_fallback_evict_key(key);
+       /*
+        * An error can only occur here if the key failed to be evicted from a
+        * keyslot (due to a hardware or driver issue) or is allegedly still in
+        * use by I/O (due to a kernel bug).  Even in these cases, the key is
+        * still unlinked from the keyslot management structures, and the caller
+        * is allowed and expected to free it right away.  There's nothing
+        * callers can do to handle errors, so just log them and return void.
+        */
        if (err)
                pr_warn_ratelimited("%pg: error %d evicting key\n", bdev, err);
 }