All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gilad Ben-Yossef <gilad@benyossef.com>
To: Herbert Xu <herbert@gondor.apana.org.au>,
	"David S. Miller" <davem@davemloft.net>,
	Jonathan Corbet <corbet@lwn.net>,
	David Howells <dhowells@redhat.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Gary Hook <gary.hook@amd.com>,
	Boris Brezillon <boris.brezillon@free-electrons.com>,
	Arnaud Ebalard <arno@natisbad.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Alasdair Kergon <agk@redhat.com>,
	Mike Snitzer <snitzer@redhat.com>,
	dm-devel@redhat.com, Shaohua Li <shli@kernel.org>,
	Steve French <sfrench@samba.org>,
	"Theodore Y. Ts'o" <tytso@mit.edu>,
	Jaegeuk Kim <jaegeuk@kernel.org>,
	Steffen Klassert <steffen.klassert@secunet.com>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Mimi Zohar <zohar@linux.vnet.ibm.com>,
Cc: Ofir Drang <ofir.drang@arm.com>
Subject: [PATCH v8 20/20] crypto: adapt api sample to use async. op wait
Date: Tue,  5 Sep 2017 15:38:59 +0300	[thread overview]
Message-ID: <1504615144-29770-21-git-send-email-gilad__32649.5913010605$1504615535$gmane$org@benyossef.com> (raw)
In-Reply-To: <1504615144-29770-1-git-send-email-gilad@benyossef.com>

The code sample is waiting for an async. crypto op completion.
Adapt sample to use the new generic infrastructure to do the same.

This also fixes a possible data coruption bug created by the
use of wait_for_completion_interruptible() without dealing
correctly with an interrupt aborting the wait prior to the
async op finishing.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
---
 Documentation/crypto/api-samples.rst | 52 +++++++-----------------------------
 1 file changed, 10 insertions(+), 42 deletions(-)

diff --git a/Documentation/crypto/api-samples.rst b/Documentation/crypto/api-samples.rst
index 2531948..006827e 100644
--- a/Documentation/crypto/api-samples.rst
+++ b/Documentation/crypto/api-samples.rst
@@ -7,59 +7,27 @@ Code Example For Symmetric Key Cipher Operation
 ::
 
 
-    struct tcrypt_result {
-        struct completion completion;
-        int err;
-    };
-
     /* tie all data structures together */
     struct skcipher_def {
         struct scatterlist sg;
         struct crypto_skcipher *tfm;
         struct skcipher_request *req;
-        struct tcrypt_result result;
+        struct crypto_wait wait;
     };
 
-    /* Callback function */
-    static void test_skcipher_cb(struct crypto_async_request *req, int error)
-    {
-        struct tcrypt_result *result = req->data;
-
-        if (error == -EINPROGRESS)
-            return;
-        result->err = error;
-        complete(&result->completion);
-        pr_info("Encryption finished successfully\n");
-    }
-
     /* Perform cipher operation */
     static unsigned int test_skcipher_encdec(struct skcipher_def *sk,
                          int enc)
     {
-        int rc = 0;
+        int rc;
 
         if (enc)
-            rc = crypto_skcipher_encrypt(sk->req);
+            rc = crypto_wait_req(crypto_skcipher_encrypt(sk->req), &sk->wait);
         else
-            rc = crypto_skcipher_decrypt(sk->req);
-
-        switch (rc) {
-        case 0:
-            break;
-        case -EINPROGRESS:
-        case -EBUSY:
-            rc = wait_for_completion_interruptible(
-                &sk->result.completion);
-            if (!rc && !sk->result.err) {
-                reinit_completion(&sk->result.completion);
-                break;
-            }
-        default:
-            pr_info("skcipher encrypt returned with %d result %d\n",
-                rc, sk->result.err);
-            break;
-        }
-        init_completion(&sk->result.completion);
+            rc = crypto_wait_req(crypto_skcipher_decrypt(sk->req), &sk->wait);
+
+	if (rc)
+		pr_info("skcipher encrypt returned with result %d\n", rc);
 
         return rc;
     }
@@ -89,8 +57,8 @@ Code Example For Symmetric Key Cipher Operation
         }
 
         skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
-                          test_skcipher_cb,
-                          &sk.result);
+                          crypto_req_done,
+                          &sk.wait);
 
         /* AES 256 with random key */
         get_random_bytes(&key, 32);
@@ -122,7 +90,7 @@ Code Example For Symmetric Key Cipher Operation
         /* We encrypt one block */
         sg_init_one(&sk.sg, scratchpad, 16);
         skcipher_request_set_crypt(req, &sk.sg, &sk.sg, 16, ivdata);
-        init_completion(&sk.result.completion);
+        crypto_init_wait(&sk.wait);
 
         /* encrypt data */
         ret = test_skcipher_encdec(&sk, 1);
-- 
2.1.4

  parent reply	other threads:[~2017-09-05 12:44 UTC|newest]

Thread overview: 240+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-05 12:38 [PATCH v8 00/20] simplify crypto wait for async op Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 01/20] crypto: change transient busy return code to -EAGAIN Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
     [not found]   ` <1504615144-29770-2-git-send-email-gilad-6S/DczAoZh3WXxRugSxzZg@public.gmane.org>
2017-10-07  3:05     ` Herbert Xu
2017-10-07  3:05       ` Herbert Xu
2017-10-07  3:05       ` Herbert Xu
2017-10-07  3:05       ` Herbert Xu
2017-10-07  3:05       ` Herbert Xu
2017-10-07  3:05       ` Herbert Xu
2017-10-07  7:51       ` Gilad Ben-Yossef
2017-10-07  7:51         ` Gilad Ben-Yossef
2017-10-07  7:51         ` Gilad Ben-Yossef
2017-10-07  7:51         ` Gilad Ben-Yossef
2017-10-07  7:51         ` Gilad Ben-Yossef
2017-10-07  7:51         ` Gilad Ben-Yossef
2017-10-11  6:26         ` Herbert Xu
2017-10-11  6:26           ` Herbert Xu
2017-10-11  6:26           ` Herbert Xu
2017-10-11  6:26           ` Herbert Xu
2017-10-11  6:26           ` Herbert Xu
2017-10-11  6:26           ` Herbert Xu
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 02/20] crypto: ccp: use -EAGAIN for transient busy indication Gilad Ben-Yossef
     [not found] ` <1504615144-29770-1-git-send-email-gilad-6S/DczAoZh3WXxRugSxzZg@public.gmane.org>
2017-09-05 12:38   ` [PATCH v8 01/20] crypto: change transient busy return code to -EAGAIN Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 02/20] crypto: ccp: use -EAGAIN for transient busy indication Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 03/20] net: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 04/20] crypto: remove redundant backlog checks on EBUSY Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 05/20] crypto: marvell/cesa: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 06/20] crypto: introduce crypto wait for async op Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 07/20] crypto: move algif to generic async completion Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 08/20] crypto: move pub key " Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 09/20] crypto: move drbg " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 10/20] crypto: move gcm " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 11/20] crypto: move testmgr " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 12/20] fscrypt: move " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 13/20] dm: move dm-verity " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 14/20] cifs: move " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 15/20] ima: " Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 16/20] crypto: tcrypt: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 17/20] crypto: talitos: " Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 18/20] crypto: qce: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 19/20] crypto: mediatek: " Gilad Ben-Yossef
2017-09-05 12:38   ` [PATCH v8 20/20] crypto: adapt api sample to use async. op wait Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 02/20] crypto: ccp: use -EAGAIN for transient busy indication Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 03/20] net: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 04/20] crypto: remove redundant backlog checks on EBUSY Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 05/20] crypto: marvell/cesa: " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 06/20] crypto: introduce crypto wait for async op Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 07/20] crypto: move algif to generic async completion Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 08/20] crypto: move pub key " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 09/20] crypto: move drbg " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 10/20] crypto: move gcm " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 11/20] crypto: move testmgr " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 12/20] fscrypt: move " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 13/20] dm: move dm-verity " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 14/20] cifs: move " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 15/20] ima: " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 16/20] crypto: tcrypt: " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 17/20] crypto: talitos: " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 18/20] crypto: qce: " Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 19/20] crypto: mediatek: " Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` [PATCH v8 20/20] crypto: adapt api sample to use async. op wait Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38   ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef [this message]
2017-09-05 12:38 ` Gilad Ben-Yossef
2017-09-05 12:38 ` Gilad Ben-Yossef

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='1504615144-29770-21-git-send-email-gilad__32649.5913010605$1504615535$gmane$org@benyossef.com' \
    --to=gilad@benyossef.com \
    --cc=agk@redhat.com \
    --cc=arno@natisbad.org \
    --cc=boris.brezillon@free-electrons.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=dhowells@redhat.com \
    --cc=dm-devel@redhat.com \
    --cc=gary.hook@amd.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jaegeuk@kernel.org \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=matthias.bgg@gmail.com \
    --cc=ofir.drang@arm.com \
    --cc=sfrench@samba.org \
    --cc=shli@kernel.org \
    --cc=snitzer@redhat.com \
    --cc=steffen.klassert@secunet.com \
    --cc=thomas.lendacky@amd.com \
    --cc=tytso@mit.edu \
    --cc=yoshfuji@linux-ipv6.org \
    --cc=zohar@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.