From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933129AbcK1PM4 (ORCPT ); Mon, 28 Nov 2016 10:12:56 -0500 Received: from mga01.intel.com ([192.55.52.88]:22153 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932342AbcK1PMt (ORCPT ); Mon, 28 Nov 2016 10:12:49 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,564,1473145200"; d="scan'208";a="10512329" From: Tomasz Majchrzak To: linux-kernel@vger.kernel.org Cc: dan.j.williams@intel.com, miklos@szeredi.hu, aleksey.obitotskiy@intel.com, pawel.baldysiak@intel.com, artur.paszkiewicz@intel.com, maksymilian.kunt@intel.com, viro@zeniv.linux.org.uk, Tomasz Majchrzak Subject: [PATCH v3] seq_file: reset iterator to first record for zero offset Date: Mon, 28 Nov 2016 16:11:59 +0100 Message-Id: <1480345919-30466-1-git-send-email-tomasz.majchrzak@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If kernfs file is empty on a first read, successive read operations using the same file descriptor will return no data, even when data is available. Default kernfs 'seq_next' implementation advances iterator position even when next object is not there. Kernfs 'seq_start' for following requests will not return iterator as position is already on the second object. This defect doesn't allow to monitor badblocks sysfs files from MD raid. They are initially empty but if data appears at some stage, userspace is not able to read it. Signed-off-by: Tomasz Majchrzak --- fs/seq_file.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/seq_file.c b/fs/seq_file.c index 368bfb9..ee21714 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -190,6 +190,9 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) */ m->version = file->f_version; + if (*ppos == 0) + m->index = 0; + /* Don't assume *ppos is where we left it */ if (unlikely(*ppos != m->read_pos)) { while ((err = traverse(m, *ppos)) == -EAGAIN) -- 1.8.3.1