Hi,
On Fri, 30 Jan 2009 23:18:53 +0900 (JST), Ryusuke Konishi wrote:
> Hi Reinoud,
> On Wed, 28 Jan 2009 21:52:23 +0100, Reinoud Zandijk wrote:
> > Dear folks, dear Ryusuke,
> >
> > I've found a bug in the cleanerd/nilfs interaction that might give rise to
> > the
> > various problems we've seen recently with the cleanerd. It comes down to the
> > wrong counting of the number of dirty segments and the wrong counting of the
> > number of checkpoints.
> >
> > I created this disc using the NiLFS version 2.05 with 2.06 userland (AFAIK)
> > with mkfs.nilfs and created a sparse file on it with my sparse file
> > generator
> > I created for UDF testing. It dismounted fine giving a nilfs_dump
> > `vnd0e-dump-3'. When i remounted it again, the cleanerd started after a
> > while
> > and after unmounting it gives `vnd03-dump-3-cleanerd'. A diff shows:
> <snip>
> > And the su and cp files give:
> >
> > @@ -30743,34 +31480,34 @@
> > Reading file `SU.out` for 1 blocks (4 Kb)
> >
> > SU file dump
> > - nclean 491
> > - ndirty 8
> > + nclean 496
> > + ndirty 21474836483
> > last alloced 7
> >
> > Segment 0
> > - Last modified Sun Jan 25 17:05:28 2009
> > - Containing nblks 2047
> > - Flags 0x2<DIRTY>
> > + Last modified Thu Jan 1 01:00:00 1970
> > + Containing nblks 0
> > + Flags 0x0
> >
> > ......
> >
> > @@ -30789,136 +31526,72 @@
> >
> > Reading file `CP.out` for 1 blocks (4 Kb)
> > CP file dump
> > - Number of checkpoints 8
> > + Number of checkpoints 8589934596
> > Number of snapshots 0
> >
> > Checkpoint number 1
> > - Flags 0x0
> > + Flags 0x2<INVALID>
> > Checkpoints in block 0
> > Created at Sun Jan 25 17:05:10 2009
> > Blocks incremented 11
> > Inodes count 3
> > Blocks count (red.) 9
> >
> > ny idea as to if and why this can happen?
>
> looks underflow or collision of updates.
This turn out to be the bug of counter operations on the cpfile and
sufile.
Here, I attach a test patch to fix the problem.
After some tests and submission to -mm tree, I'll push it to the git
repo.
Reinoud, thank you for finding this problem.
Regards,
Ryusuke Konishi
---
fs/cpfile.c | 2 +-
fs/sufile.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/cpfile.c b/fs/cpfile.c
index 1e9ce4c..45bfe82 100644
--- a/fs/cpfile.c
+++ b/fs/cpfile.c
@@ -357,7 +357,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
header = nilfs_cpfile_block_get_header(cpfile, header_bh,
kaddr);
- le64_add_cpu(&header->ch_ncheckpoints, -tnicps);
+ le64_add_cpu(&header->ch_ncheckpoints, -(u64)tnicps);
nilfs_mdt_mark_buffer_dirty(header_bh);
nilfs_mdt_mark_dirty(cpfile);
kunmap_atomic(kaddr, KM_USER0);
diff --git a/fs/sufile.c b/fs/sufile.c
index 7b73a5f..9f0a988 100644
--- a/fs/sufile.c
+++ b/fs/sufile.c
@@ -331,7 +331,7 @@ int nilfs_sufile_freev(struct inode *sufile, __u64 *segnum,
size_t nsegs)
kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
le64_add_cpu(&header->sh_ncleansegs, nsegs);
- le64_add_cpu(&header->sh_ndirtysegs, -nsegs);
+ le64_add_cpu(&header->sh_ndirtysegs, -(u64)nsegs);
kunmap_atomic(kaddr, KM_USER0);
nilfs_mdt_mark_buffer_dirty(header_bh);
nilfs_mdt_mark_dirty(sufile);
--
1.5.6.5
_______________________________________________
users mailing list
[email protected]
https://www.nilfs.org/mailman/listinfo/users