[Ocfs2-devel] [PATCH v3 3/4] ocfs2: nst_seq_ops should properly handle position index

Vasily Averin vvs at virtuozzo.com
Mon Apr 13 23:17:19 PDT 2020


Currently nst_seq_ops ignores position index argument,
and it leads to incorrect output in case of read with offset.

By design .start function should skip first *pos elements,
and .next function must update position index unconditionally.

Cc: stable at vger.kernel.org
Fixes: 1f4aace60b0e ("fs/seq_file.c: simplify seq_file iteration code ...")
Link: https://urldefense.com/v3/__https://bugzilla.kernel.org/show_bug.cgi?id=206283__;!!GqivPVa7Brio!McCQFYlmRnNmoAtY2bRAeiRzKSgC0c8B5r-Oy1meJpaRZaM5TbD5lECuzD96ZyERbIiA3Q$ 
Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
---
 fs/ocfs2/cluster/netdebug.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/fs/ocfs2/cluster/netdebug.c b/fs/ocfs2/cluster/netdebug.c
index 667a5c5e1f66..8ca8a407781b 100644
--- a/fs/ocfs2/cluster/netdebug.c
+++ b/fs/ocfs2/cluster/netdebug.c
@@ -60,7 +60,8 @@ void o2net_debug_del_nst(struct o2net_send_tracking *nst)
 }
 
 static struct o2net_send_tracking
-			*next_nst(struct o2net_send_tracking *nst_start)
+			*next_nst(struct o2net_send_tracking *nst_start,
+				  loff_t pos)
 {
 	struct o2net_send_tracking *nst, *ret = NULL;
 
@@ -73,7 +74,7 @@ static struct o2net_send_tracking
 			break;
 
 		/* use st_task to detect real nsts in the list */
-		if (nst->st_task != NULL) {
+		if ((nst->st_task != NULL) && (pos-- == 0)) {
 			ret = nst;
 			break;
 		}
@@ -87,7 +88,7 @@ static void *nst_seq_start(struct seq_file *seq, loff_t *pos)
 	struct o2net_send_tracking *nst, *dummy_nst = seq->private;
 
 	spin_lock(&o2net_debug_lock);
-	nst = next_nst(dummy_nst);
+	nst = next_nst(dummy_nst, *pos);
 	spin_unlock(&o2net_debug_lock);
 
 	return nst;
@@ -97,8 +98,9 @@ static void *nst_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
 	struct o2net_send_tracking *nst, *dummy_nst = seq->private;
 
+	(*pos)++;
 	spin_lock(&o2net_debug_lock);
-	nst = next_nst(dummy_nst);
+	nst = next_nst(dummy_nst, 0);
 	list_del_init(&dummy_nst->st_net_debug_item);
 	if (nst)
 		list_add(&dummy_nst->st_net_debug_item,
@@ -115,7 +117,7 @@ static int nst_seq_show(struct seq_file *seq, void *v)
 	s64 sock, send, status;
 
 	spin_lock(&o2net_debug_lock);
-	nst = next_nst(dummy_nst);
+	nst = next_nst(dummy_nst, 0);
 	if (!nst)
 		goto out;
 
-- 
2.17.1




More information about the Ocfs2-devel mailing list