[Btrfs-devel] [PATCH 0/2] make root directory writeable
Josef Bacik
jwhiter at redhat.com
Fri Jun 29 05:28:21 PDT 2007
On Fri, Jun 29, 2007 at 08:05:37AM -0400, Chris Mason wrote:
> On Thu, Jun 28, 2007 at 11:36:59PM -0400, Josef Bacik wrote:
> > Hello,
> >
> > Not really sure why but when you do a mkfs it creates a default directory and
> > the root directory is read-only. The first patch makes the root directory
> > writeable, and the second patch fixes mkfs so it sets the root directoryy's
> > permission properly and doesn't create the default directory. I tested this on
> > my box and ran iozone and it worked fine. Thank you,
>
> Thanks for sending these along, but the top level directory is special.
> It is meant to only have snapshots and subvolumes. As we refine the way
> that subvolumes and snapshots are presented, the top level directory
> won't be needed anymore (at least won't need to be visible), but for
> right now, it does need to be read only.
>
> The 'default' directory is a subvolume, where all the tree blocks and
> file extents inside are reference counted. You can make more subvolumes
> appear in the root directory with the btrfsctl command:
>
> btrfsctl -s new_subvol mount_point
>
> The btree that makes up the root directory is written via copy-on-write,
> but it is not reference counted. It is a special index of the
> subvolumes and snapshots on the FS, so we don't want to create files
> there.
>
Ahh ok, I couldn't see any explanation as to why you did it that way so I
figured it was just to make it easier to show off snapshots/subvolumes early on.
Thanks for the explanation.
> Here are a few ideas of things that won't conflict too much with my
> current enospc work. But, if you have other ideas or bits you would
> like to improve, please feel free to suggest them, I'm happy to get all
> the help I can.
>
> 1) On fsync, ext3 and reiserfs have code to let more writers try and
> come into the current transaction before a commit is forced (this is
> called let_transaction_grow in reiserfs). btrfs needs something
> similar. It's fairly simple, you look at the count of procs currently
> in the transaction, and if it is non-zero you sleep for a bit before
> forcing the commit.
>
> It's important to sleep without any locks held and without being in the
> transaction. Once coded, you can benchmark with Ric Wheeler's fs_mark:
>
> http://developer.osdl.org/dev/doubt/fs_mark/index.html
>
> If you're comparing btrfs to ext3 on a sata or ide drive, make sure to
> mount ext3 with -o barrier=1
>
> 2) The in ram portion of the inode needs a field to indicate which
> transaction number last changed the inode. This field can be checked by
> fsync to decide if a commit is actually required.
>
> You would have to an index (use a radix tree) of the in memory
> transaction structs so that you can check to make sure a given
> transaction is actually done.
>
> 3) struct btrfs_root_item has fields for block use accounting, but they
> currently don't get updated. When blocks are allocated for a given
> root, we need to reflect that in struct btrfs_root_item and send it down
> to disk when the transaction commits.
>
> The in memory struct btrfs_root has a duplicate of the root item, so the
> updates can be stored in the in memory version and then put into the
> tree once right before commit.
>
Awesome I will start working on these when I get home. Thanks much,
Josef
More information about the Btrfs-devel
mailing list