From patchwork Mon Jan 15 18:38:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suren Baghdasaryan X-Patchwork-Id: 13520081 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A08E3C4707C for ; Mon, 15 Jan 2024 18:38:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 251686B0087; Mon, 15 Jan 2024 13:38:48 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 1DA416B0088; Mon, 15 Jan 2024 13:38:48 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 02CD36B0089; Mon, 15 Jan 2024 13:38:47 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id E34536B0087 for ; Mon, 15 Jan 2024 13:38:47 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id BCAE41C11AA for ; Mon, 15 Jan 2024 18:38:47 +0000 (UTC) X-FDA: 81682406694.23.AF499AE Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf27.hostedemail.com (Postfix) with ESMTP id F125C4001D for ; Mon, 15 Jan 2024 18:38:45 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=Kzn107eS; spf=pass (imf27.hostedemail.com: domain of 3tXulZQYKCHYmolYhVaiiafY.Wigfchor-ggepUWe.ila@flex--surenb.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3tXulZQYKCHYmolYhVaiiafY.Wigfchor-ggepUWe.ila@flex--surenb.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1705343926; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ch6T6Lsnf4fqmqV9A6xFsxD4eG+jCeNRaJgu+LlgQig=; b=hn/w+AmxGUwBkuBx+0pKnJ4bvWK4W1ndMFUe5OxyQ4eaV2Om3S2R3qek5qVzrTHgLbYWir U9F3CRQ4YDMgdmqu8ioXp+a856J//44tlQ32FnHWQn40D8f/ERyL8k43Qcen1HFSVDM9mq vkTSs9Sches3oXqQ4bxL3DwcIRc5ktc= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=Kzn107eS; spf=pass (imf27.hostedemail.com: domain of 3tXulZQYKCHYmolYhVaiiafY.Wigfchor-ggepUWe.ila@flex--surenb.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3tXulZQYKCHYmolYhVaiiafY.Wigfchor-ggepUWe.ila@flex--surenb.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1705343926; a=rsa-sha256; cv=none; b=ZQlmzJ9mVWZVB+5Sk9DmwUEF8j/oXpUUAkbmdwLWwyY/+Kd79uXvlrZUwLup7C18/D2Oz9 YdDw1qAeTq+nYeiRKI8YIK5W0gssN2xfhmc9BF2QBMMOTNGcPRJuUnjurYbf4E8n6M2GEx cPrXnK6TpinBv4icKhlkd9LxZZyBwkU= Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dbe9ef2422cso10926485276.0 for ; Mon, 15 Jan 2024 10:38:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1705343925; x=1705948725; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ch6T6Lsnf4fqmqV9A6xFsxD4eG+jCeNRaJgu+LlgQig=; b=Kzn107eSkT/Mtb4VptUlPYU/0Y184JHhufSAwykSoF5FWoX5kay9vbLMRWSrM28PMb weCQ/V3vzM2xAdNFvMpNYcOnKdX4kPI5P1uVyEqD7I0cavu/k+mEOfq//qQJVYrvezhY 2+b4FupuHyYtCzGJvMjL6f+D5Jza/ikyEBVYxFFVAU9RRsu2F81lxgxwcLrkfBFUtDS6 0aDBm4+m5W8UfrTyd+NBWNS2NAtPIupPBMO5rCfGByItyD6JSLRGe7s8VKiLUkd72NMP /9r3/0fm1BhznID/JuK+El+fbg3hPGcNuLgiSahx6qNg9iX6dZPtYNSmXbbt08Z9TiKX hTiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705343925; x=1705948725; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ch6T6Lsnf4fqmqV9A6xFsxD4eG+jCeNRaJgu+LlgQig=; b=qmnZPPl7+V6j/IAqySCGBw1tVao3Jhc6qz8yPuYnBC0/LwGphLe5DYds7gZWl3Jdy1 Ms+W7lASk/k8a2+5QmZuIeUXn7FyILp04HJF8Lrvgb7u6bP+A+JfaJAlh49DeqWxUZDS /Gx6KmfKMUbT+iLE/p4/aTDK1DhOE04XO0H0X/aFewMVX//3vdkRWP4KG0+HmXc1Ds2G SQF/AjgSXUOQ37snjqzHN2mnQsZhhg6yKMlaB+pLIz9StNuueG4DnxCAetf5jqyj86kD kJHB5KUl+KUtuqlTQEJWRYrNNY+YIBigmuIVOkBxxuKuiH0ll8ayRqkQPccQR056vvmr 5v7g== X-Gm-Message-State: AOJu0Yx2uFIouB7AbUanwlYD4ReACEJQ8+1efYRgAkm82LOdHdD6jD9T fxAZb0mzFBR1kv7jbBH+lXpe4PTNCVvShOWYUg== X-Google-Smtp-Source: AGHT+IGN2VvUUxNx3HDpn+LUP1maSJ793VbScOs1XRHuqJsGhFfM1RNtInfsiW1wKVri/L8s95oaaZe3g/g= X-Received: from surenb-desktop.mtv.corp.google.com ([2620:15c:211:201:3af2:e48e:2785:270]) (user=surenb job=sendgmr) by 2002:a05:6902:1364:b0:dbd:7149:a389 with SMTP id bt4-20020a056902136400b00dbd7149a389mr269675ybb.11.1705343925137; Mon, 15 Jan 2024 10:38:45 -0800 (PST) Date: Mon, 15 Jan 2024 10:38:35 -0800 In-Reply-To: <20240115183837.205694-1-surenb@google.com> Mime-Version: 1.0 References: <20240115183837.205694-1-surenb@google.com> X-Mailer: git-send-email 2.43.0.381.gb435a96ce8-goog Message-ID: <20240115183837.205694-3-surenb@google.com> Subject: [RFC 2/3] seq_file: add validate() operation to seq_operations From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: viro@zeniv.linux.org.uk, brauner@kernel.org, jack@suse.cz, dchinner@redhat.com, casey@schaufler-ca.com, ben.wolsieffer@hefring.com, paulmck@kernel.org, david@redhat.com, avagin@google.com, usama.anjum@collabora.com, peterx@redhat.com, hughd@google.com, ryan.roberts@arm.com, wangkefeng.wang@huawei.com, Liam.Howlett@Oracle.com, yuzhao@google.com, axelrasmussen@google.com, lstoakes@gmail.com, talumbau@google.com, willy@infradead.org, vbabka@suse.cz, mgorman@techsingularity.net, jhubbard@nvidia.com, vishal.moola@gmail.com, mathieu.desnoyers@efficios.com, dhowells@redhat.com, jgg@ziepe.ca, sidhartha.kumar@oracle.com, andriy.shevchenko@linux.intel.com, yangxingui@huawei.com, keescook@chromium.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, kernel-team@android.com, surenb@google.com X-Rspamd-Queue-Id: F125C4001D X-Rspam-User: X-Stat-Signature: ntfpbpqkjiigii7z9prgi7xkrkeetxry X-Rspamd-Server: rspam01 X-HE-Tag: 1705343925-843216 X-HE-Meta: U2FsdGVkX19KhnAl0c+aaKMDdPLD+sjCAZnlcUrC13nW6613/XyUUvBdHywMFzr22BIHbx42XhBIj5kO62eO4TWOhdePxTVxzVHKzQ5bzK2pk1248zB0bAzUyZ6PcKnZwDuZnkruICPk1iefxwprvswo4xICBXPpHevRcsEptcjB4oeLQLDK5DX7J8CmkBcA0ApIQGTFunuDecJL5R45bAEerWW2/GJPLJJ+R8FbW0WvqJEC7N5/wVQxpF5tSLucJvFrpLNK5IdLmuoph9j5+3WQGemApNDJraatJwe8eygEPunOL7QAFVT2V/V3nyglY2MgusRx01QR4WtjKyujsRFe+O+UPRxchLKAu6NqhWdCJtBgyigCZnnFzJxYOYMnHfMM4u79eKOZ7KXGEwgl5/6hwlSr9CxIZXnWgeGyRNUdQ5O2k0IdhG71w5cgBWy81XuiC6FvVDV6HAqX/N9z44j0/2mEUeCHXy9v24TRwRECYm/Cfh2q+VQbVjHg8jrJ7uxEjU2nA1E3vqd8oq9UJEpvedwEkuwM9PdHnZe5FFMWfsCvNbLWsPLn/XaTptpGM2s7aXv+mqEmIy+AaEnVk+areMhDo+Elat5//f+50/sv9lNpFUH7edQE6+p56PoVblREw1Qw/dlSQWQAc0QSmi8e3qoxNX0VDAa1jPs1qrnu6t6aN2ud0OE3OmUlbUwvn8O5SnXNG6rmh9OjIDV/tyohTupAqzMk731w2VUM5NVjdrw9SjFrHomXhA9HVGJMZdpGrNLV4tNnologA2Qt6F+1k6Z8IwdegCQJK2I7J5dA39xks9OVj8FL2HMqD6p0kdQBtbdS+SJNMJKvrmywtbrE8Pod3Ql1DNZkKtFU8fFmIW2/2wMRMRnJ3MlLDZksLcGqWH8eaf2ZV2F0cAVxfi+k6fPz0nQ7EToBKNUqvevSDNO0NtY0N0Hb51xDBqXjoHGCO6ctG0s6WiXjD1Z FzFGUK50 lBHy+JhVJG4VTKje79eJGalp4dU87JU8ZHSrzRC0g5u7pbf7x1JPgAx+Siw2cMRyyofFjrkyhSfBvJkUmlW8I5OqXeTSma3Bp3oNYH4nhF6KCRdiJZKyue7xvEMkipfarTSxx/QUsp3Hm/t19Cv72OmQa3MQ1yWIyvO3OYzHmjlPtsRj+ZgaW53cJsaDlVgPQRH4NWb0jvMr2YizHvkbBdi5Fg+7pDvEkYHtXrLXJkW9ekKOT1WI3D3luy6LGvYW7EbihwE8tl/J7mjv+Xs2L+8b1whcv4vdfa4q2bJPGXWOek3egwQfhveWvuy/49ae6LUw2HHG86PFbsKUPltghGLgrgB+GV/y+fSQgYVwYo5pAlh51qFTbyjOshatLHVHauK2HRggUWRBuiNbRTLVbp2ndinkjsDjRPbBDEav9kJbdYbMP5+XnZ1EnG4YMeJZoxCHBfi/LjCMHNmGXAvK3NYPEdfN09pwc3QgT+6X4pwyUM/ivnoxw9WiLYJcvVlvl4UBV8kxO7GBzML+WYJn0ARtGkopn617hEIGgKTSq9OvA/MgEWICHsQxFSlYeup93dfNKbUoiaFdsg7KvZ5X1+DhLm+QXzXy9X9mLHEMFXwhf2WlVmy/WcCaIet9NA4pNNGcA1tjgFcjvctrdMdWG0lohskYRQdUgp0LbNOL//xK2YCJVkeEMSCa3SBYLpZRifWWhcUnemwOYaLh3yIAWQu1iA46yKOp0ljgG X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: seq_file outputs data in chunks using seq_file.buf as the intermediate storage before outputting the generated data for the current chunk. It is possible for already buffered data to become stale before it gets reported. In certain situations it is desirable to regenerate that data instead of reporting the stale one. Provide a validate() operation called before outputting the buffered data to allow users to validate buffered data. To indicate valid data, user's validate callback should return 0, to request regeneration of the stale data it should return -EAGAIN, any other error will be considered fatal and read operation will be aborted. Signed-off-by: Suren Baghdasaryan --- fs/seq_file.c | 24 +++++++++++++++++++++++- include/linux/seq_file.h | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index f5fdaf3b1572..77833bbe5909 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -172,6 +172,8 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter) { struct seq_file *m = iocb->ki_filp->private_data; size_t copied = 0; + loff_t orig_index; + size_t orig_count; size_t n; void *p; int err = 0; @@ -220,6 +222,10 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter) if (m->count) // hadn't managed to copy everything goto Done; } + + orig_index = m->index; + orig_count = m->count; +Again: // get a non-empty record in the buffer m->from = 0; p = m->op->start(m, &m->index); @@ -278,6 +284,22 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter) } } m->op->stop(m, p); + /* Note: we validate even if err<0 to prevent publishing copied data */ + if (m->op->validate) { + int val_err = m->op->validate(m, p); + + if (val_err) { + if (val_err == -EAGAIN) { + m->index = orig_index; + m->count = orig_count; + // data is stale, retry + goto Again; + } + // data is invalid, return the last error + err = val_err; + goto Done; + } + } n = copy_to_iter(m->buf, m->count, iter); copied += n; m->count -= n; @@ -572,7 +594,7 @@ static void single_stop(struct seq_file *p, void *v) int single_open(struct file *file, int (*show)(struct seq_file *, void *), void *data) { - struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL_ACCOUNT); + struct seq_operations *op = kzalloc(sizeof(*op), GFP_KERNEL_ACCOUNT); int res = -ENOMEM; if (op) { diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 234bcdb1fba4..d0fefac2990f 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -34,6 +34,7 @@ struct seq_operations { void (*stop) (struct seq_file *m, void *v); void * (*next) (struct seq_file *m, void *v, loff_t *pos); int (*show) (struct seq_file *m, void *v); + int (*validate)(struct seq_file *m, void *v); }; #define SEQ_SKIP 1