2022-12-09 10:27:19

by Chen Zhongjin

[permalink] [raw]
Subject: [PATCH] fs: sysv: Fix sysv_nblocks() returns wrong value

sysv_nblocks() returns 'blocks' rather than 'res', which only counting
the number of triple-indirect blocks and causing sysv_getattr() gets a
wrong result.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Chen Zhongjin <[email protected]>
---
fs/sysv/itree.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c
index d4ec9bb97de9..3b8567564e7e 100644
--- a/fs/sysv/itree.c
+++ b/fs/sysv/itree.c
@@ -438,7 +438,7 @@ static unsigned sysv_nblocks(struct super_block *s, loff_t size)
res += blocks;
direct = 1;
}
- return blocks;
+ return res;
}

int sysv_getattr(struct user_namespace *mnt_userns, const struct path *path,
--
2.17.1


2022-12-10 20:07:42

by Al Viro

[permalink] [raw]
Subject: Re: [PATCH] fs: sysv: Fix sysv_nblocks() returns wrong value

On Fri, Dec 09, 2022 at 06:04:48PM +0800, Chen Zhongjin wrote:
> sysv_nblocks() returns 'blocks' rather than 'res', which only counting
> the number of triple-indirect blocks and causing sysv_getattr() gets a
> wrong result.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Chen Zhongjin <[email protected]>
> ---
> fs/sysv/itree.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c
> index d4ec9bb97de9..3b8567564e7e 100644
> --- a/fs/sysv/itree.c
> +++ b/fs/sysv/itree.c
> @@ -438,7 +438,7 @@ static unsigned sysv_nblocks(struct super_block *s, loff_t size)
> res += blocks;
> direct = 1;
> }
> - return blocks;
> + return res;
> }
>
> int sysv_getattr(struct user_namespace *mnt_userns, const struct path *path,

Argh...

To quote historical tree:
commit 0fcd426de9d02175c9771ea19f972389eeba7688
Author: Andries E. Brouwer <[email protected]>
Date: Sun Aug 22 00:07:46 2004 -0700

[PATCH] minix block usage counting fix

In 2.5.18 some minix-specific stuff was moved to the minix subdirectory
where it belonged. However, a typo crept in, causing inode disk usage
to be incorrectly reported. A few people have complained, but so far
not sufficiently loudly.

Signed-off-by: Andries Brouwer <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>

diff --git a/fs/minix/itree_common.c b/fs/minix/itree_common.c
index f8e9bd831c90..5a4b51dbfcb3 100644
--- a/fs/minix/itree_common.c
+++ b/fs/minix/itree_common.c
@@ -358,5 +358,5 @@ static inline unsigned nblocks(loff_t size)
res += blocks;
direct = 1;
}
- return blocks;
+ return res;
}


This is obviously the sysvfs counterpart, not noticed back then and
not caught in 18 years since then...

Mea culpa - the original bug (both in minixfs and sysvfs) is mine and
I should've thought to look for sysvfs counterpart when minixfs fix
got posted.

Applied.

2022-12-12 09:27:34

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH] fs: sysv: Fix sysv_nblocks() returns wrong value

On Sat, Dec 10, 2022 at 07:12:58PM +0000, Al Viro wrote:
> This is obviously the sysvfs counterpart, not noticed back then and
> not caught in 18 years since then...
>
> Mea culpa - the original bug (both in minixfs and sysvfs) is mine and
> I should've thought to look for sysvfs counterpart when minixfs fix
> got posted.

Btw, I have no way to actually test sysv anymore, so I'm tempted to
orphan it. Is there anyone actually still using it? With some
of the upcoming transitions in the folio, buffer_head and co APIs
it might be a good time to drop unmaintained file systems now,
and sysv is a hot candidate.