git: sys/vfs/hammer2: Add initial multi-volumes support for HAMMER2

Tomohiro Kusumi tkusumi at crater.dragonflybsd.org
Sat Dec 26 06:29:39 PST 2020


commit 0b7381572b131c74051832dc251604e7f77b5a54
Author: Tomohiro Kusumi <tkusumi at netbsd.org>
Date:   Sat Dec 26 01:36:00 2020 +0900

    sys/vfs/hammer2: Add initial multi-volumes support for HAMMER2
    
    This commit adds initial multi-volumes support for HAMMER2. Maximum
    supported volumes is 64. The feature and implementation is similar to
    multi-volumes support in HAMMER1.
    
    1. ondisk changes
    =================
    This commit bumps volume header version from 1 to 2, and adds four new
    volume header fields using reserved fields in version 1. Other ondisk
    structures are unchanged.
    * "volu_id" - volume id from 0 to 63, where 0 represents root volume.
    * "nvolumes" - number of volumes. All volumes have same the same value.
    * "total_size" - sum of "volu_size" in volumes. All volumes have the
      same value.
    * "volu_loff[HAMMER2_MAX_VOLUMES]" - A 512 bytes table which contains
      start offset of max 64 volumes within "total_size". All volumes have
      the same value.
    
    Version 1 volume header has 0 for above fields, so HAMMER2 internally
    treats "nvolumes" as 1, and "total_size" as "volu_size" to be able to
    handle version 1 and 2 transparently.
    
    All volumes have 4 headers, but only root volume ones are relevant.
    Non-root volume headers have their own unique "volu_id" and "volu_size",
    but other fields are unimportant and never used. Non-root volume headers
    have sroot blockset[i] whose type is HAMMER2_BREF_TYPE_INVALID. Non-root
    volume headers don't have boot/aux area, so freemap area start from
    offset 0. Non-root volume headers are readonly and never updated after
    creation. This means non-root volumes are just extra storage to extend
    fs size and internally make up a single virtual volume whose size is
    "total_size".
    
    It currently doesn't automatically upgrade an existing version 1 fs to
    version 2. Only newly created fs becomes version 2 for now.
    
    2. volumes layout
    =================
    Basically similar to HAMMER1. A first block device argument provided for
    newfs_hammer2(8) becomes the root volume, and if specified remaining
    devices extend "total_size" as non-root volumes. All volumes except for
    the last one have 1GiB (freemap level1) aligned "volu_size".
    
    This means each volume's start offset within "total_size" is also 1GiB
    (freemap level1) aligned. The start offsets of volumes are stored in
    volu_loff[HAMMER2_MAX_VOLUMES]. Each volu_loff[n] (0 <= n < nvolumes)
    represents start offset of volume n within "total_size". Unused volumes
    have -1 for volu_loff[n].
    e.g. If a fs consists of 1 volume, volu_loff[0] has 0 and rests have -1.
    e.g. If a fs consists of 3 volumes, x GiB root volume, y GiB volume,
      and z GiB volume, volu_loff[0] has 0, volu_loff[1] has x, volu_loff[2]
      has x+y, and rests have -1.
    
    Low level I/O function in HAMMER2 uses this linear offsets table to
    determine a device vnode to use and relative offset within the device
    vnode, for a given blockref's "data_off". This is different from HAMMER1
    where logical offset had embedded volume id bits (i.e. there were holes
    in logical address space). HAMMER2 needs this table to support multi-
    volumes without changing current logical offset mechanism.
    
    Unless all volumes are specified and mountable, mount_hammer2(8) fails
    like it failed in HAMMER1. This also applies to other userspace commands
    which require volumes specification, except for fstyp(8).
    
    3. userspace commands
    =====================
    Basically same as or similar to HAMMER1.
    * newfs_hammer2(8) takes a list of block device paths as argv[].
    * mount_hammer2(8) takes block device paths or names in "a:b:c:..."
      format.
    * hammer2(8) takes block device paths or names in "a:b:c:..." format for
      directives which require volumes specification. This commit also adds
      "volume-list" directive and an ioctl command HAMMER2IOC_VOLUME_LIST,
      which are similar to the one in HAMMER1.
    * fsck_hammer2(8) takes device paths or names in "a:b:c:..." format.
    * fstyp(8) takes device paths in "path1:path2:path3:..." format.
    
    4. limitations
    ==============
    * hammer2(8) "info" directive ignores multi-volumes block devices.
    * hammer2(8) "growfs" directive doesn't support multi-volumes fs.
    * fstyp(8) is unable to find PFS label via -l option if the PFS inode or
      its parent indirect blocks are located beyond root volume.
    * hammer2(8) doesn't support "volume-add" and "volume-del" directives
      which existed in HAMMER1, and there is currently no plan to support.

Summary of changes:
 sbin/fsck_hammer2/Makefile                  |   2 +-
 sbin/fsck_hammer2/destroy.c                 | 104 ++--
 sbin/fsck_hammer2/reconstruct.c             | 110 +++--
 sbin/fsck_hammer2/test.c                    | 178 +++----
 sbin/hammer2/Makefile                       |   4 +-
 sbin/hammer2/cmd_debug.c                    | 108 +++--
 sbin/hammer2/cmd_info.c                     |  22 +-
 sbin/hammer2/{cmd_growfs.c => cmd_volume.c} |  87 ++--
 sbin/hammer2/hammer2.8                      |  11 +-
 sbin/hammer2/hammer2.h                      |   1 +
 sbin/hammer2/hammer2_subs.h                 |  43 ++
 sbin/hammer2/main.c                         |  12 +
 sbin/hammer2/ondisk.c                       | 654 +++++++++++++++++++++++++
 sbin/hammer2/subs.c                         |  44 ++
 sbin/mount_hammer2/mount_hammer2.c          |   6 +-
 sbin/newfs_hammer2/Makefile                 |   2 +-
 sbin/newfs_hammer2/newfs_hammer2.8          |   4 +-
 sbin/newfs_hammer2/newfs_hammer2.c          | 322 +++++++------
 sys/conf/files                              |   1 +
 sys/vfs/hammer2/Makefile                    |   2 +-
 sys/vfs/hammer2/hammer2.h                   |  51 +-
 sys/vfs/hammer2/hammer2_bulkfree.c          |  28 +-
 sys/vfs/hammer2/hammer2_disk.h              |  36 +-
 sys/vfs/hammer2/hammer2_flush.c             |  18 +-
 sys/vfs/hammer2/hammer2_freemap.c           |  12 +-
 sys/vfs/hammer2/hammer2_io.c                |  27 +-
 sys/vfs/hammer2/hammer2_ioctl.c             |  53 +++
 sys/vfs/hammer2/hammer2_ioctl.h             |  22 +
 sys/vfs/hammer2/hammer2_ondisk.c            | 707 ++++++++++++++++++++++++++++
 sys/vfs/hammer2/hammer2_subr.c              |   2 +
 sys/vfs/hammer2/hammer2_vfsops.c            | 346 ++++++--------
 usr.sbin/fstyp/fstyp.c                      |   2 +
 usr.sbin/fstyp/fstyp.h                      |   2 +
 usr.sbin/fstyp/hammer2.c                    | 206 +++++++-
 34 files changed, 2532 insertions(+), 697 deletions(-)
 copy sbin/hammer2/{cmd_growfs.c => cmd_volume.c} (53%)
 create mode 100644 sbin/hammer2/ondisk.c
 create mode 100644 sys/vfs/hammer2/hammer2_ondisk.c

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/0b7381572b131c74051832dc251604e7f77b5a54


-- 
DragonFly BSD source repository


More information about the Commits mailing list