Re: [PATCH 1/6] hfsplus: prevent btree data loss on root split

Dave Chinner
2018-09-03T03:50:09Z

On Sun, Sep 02, 2018 at 01:33:09AM -0300, Ernesto A. Fernï¿½ndez wrote:
> On Sat, Sep 01, 2018 at 02:49:26PM +1000, Dave Chinner wrote:
> > On Fri, Aug 31, 2018 at 11:55:54AM -0300, Ernesto A. Fernï¿½ndez wrote:
> > > On Thu, Aug 30, 2018 at 10:36:42PM -0700, Christoph Hellwig wrote:
> > > > On Fri, Aug 31, 2018 at 12:58:19AM -0300, Ernesto A. Fernï¿½ndez wrote:
> > > > > Creating, renaming or deleting a file may cause catalog corruption and
> > > > > data loss. This bug is randomly triggered by xfstests generic/027, but
> > > > > here is a faster reproducer:
> > > > >
> > > > > truncate -s 50M fs.iso
> > > > > mkfs.hfsplus fs.iso
> > > > > mount fs.iso /mnt
> > > > > i=100
> > > > > while [ $i -le 150 ]; do
> > > > > touch /mnt/$i &>/dev/null
> > > > > ((++i))
> > > > > done
> > > > > i=100
> > > > > while [ $i -le 150 ]; do
> > > > > mv /mnt/$i /mnt/$(perl -e "print $i x82") &>/dev/null
> > > > > ((++i))
> > > > > done
> > > > > umount /mnt
> > > > > fsck.hfsplus -n fs.iso
> > > >
> > > > It would be good to wire up this short reproducer as well for xfstests.
> > >
> > > Yes, that's my intention. The problem is that mkfs.hfsplus does not allow
> > > setting the size of the filesystem for scratch_mkfs_sized(); you need a
> > > workaround with the device mapper. I think I should submit that patch first
> > > and see if there is a problem with it.
> >
> > You don't need to do that. We use loop devices like this w/ mkfs_dev
> > quite a lot in fstests. For example, generic/361 has pretty much the
> > exact code pattern you need....
>
> I see what you mean in this case, but I really want to run every test that
> uses _scratch_mkfs_sized(); generic/027 in particular, since it's the one
> that found these bugs for me.

Trying to hack around SCRATCH_DEV to be some other device set up by
_scratch_mkfs_sized is likely to break things in unexpected ways.
Lots of library routines directly access SCRATCH_DEV or manipulate
it in interesting ways (e.g. build their own dm constructs on it).

IMO the right thing to do is implement the size parameter in
mkfs.hfsplus. I note that it has a dry-run capability (-N <size>)
already allows it to simulate making a filesystem of any size, so it
looks to me that most of what you need it to do is already in the
mkfs code. Then you can test for the mkfs parameter in
_scratch_mkfs_sized....

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com