Jiro SEKIBA wrote: > Hi, > > This is a new fs module to provide following: > - probe nilfs2 filesystem partition > - clobber nilfs2 filesystem partition > > I bollowed a is_valid_nilfs_sb function from grub nilfs2 module, > which is written by me and assigned to FSF. > Therefore I added Copyright as FSF and thus GPL3 code. > > Signed-off-by: Jiro SEKIBA <[email protected]> > --- > configure.ac | 1 + > libparted/fs/Makefile.am | 6 +- > libparted/fs/nilfs2/Makefile.am | 8 ++ > libparted/fs/nilfs2/nilfs2.c | 199 > +++++++++++++++++++++++++++++++++++++++ > libparted/libparted.c | 4 + > 5 files changed, 216 insertions(+), 2 deletions(-) > create mode 100644 libparted/fs/nilfs2/Makefile.am > create mode 100644 libparted/fs/nilfs2/nilfs2.c
Thank you again. I've applied your patch with minor log adjustments, and added a test to exercise the new functionality. >From d463e7ded8d486c95977f4501969056600a73501 Mon Sep 17 00:00:00 2001 From: Jiro SEKIBA <[email protected]> Date: Fri, 9 Jul 2010 18:51:56 +0900 Subject: [PATCH 1/3] libparted: add nilfs2 module * libparted/fs/nilfs2/Makefile.am: New file. * libparted/fs/nilfs2/nilfs2.c: New file. (is_valid_nilfs_sb, nilfs2_probe, nilfs2_clobber): New functions. (ped_file_system_nilfs2_init, ped_file_system_nilfs2_done): Likewise. (nilfs2_ops, nilfs2_type): Define. * libparted/fs/Makefile.am (SUBDIRS): Add nilfs2. * configure.ac (AC_OUTPUT): Add the new Makefile. * libparted/libparted.c: Declare and use the _init and _done functions. Add a new fs module to provide following: - probe nilfs2 filesystem partition - clobber nilfs2 filesystem partition The is_valid_nilfs_sb function came from the grub nilfs2 module, which is written by me and assigned to FSF. --- configure.ac | 1 + libparted/fs/Makefile.am | 6 +- libparted/fs/nilfs2/Makefile.am | 8 ++ libparted/fs/nilfs2/nilfs2.c | 199 +++++++++++++++++++++++++++++++++++++++ libparted/libparted.c | 4 + 5 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 libparted/fs/nilfs2/Makefile.am create mode 100644 libparted/fs/nilfs2/nilfs2.c diff --git a/configure.ac b/configure.ac index 7548e26..1ed2712 100644 --- a/configure.ac +++ b/configure.ac @@ -634,6 +634,7 @@ libparted/fs/ntfs/Makefile libparted/fs/reiserfs/Makefile libparted/fs/ufs/Makefile libparted/fs/xfs/Makefile +libparted/fs/nilfs2/Makefile libparted/tests/Makefile libparted.pc parted/Makefile diff --git a/libparted/fs/Makefile.am b/libparted/fs/Makefile.am index 449e88f..f3ec7dc 100644 --- a/libparted/fs/Makefile.am +++ b/libparted/fs/Makefile.am @@ -3,7 +3,8 @@ # # This file may be modified and/or distributed without restriction. -SUBDIRS = amiga ext2 ufs fat ntfs hfs linux_swap xfs jfs reiserfs # bfs +SUBDIRS = amiga ext2 ufs fat ntfs hfs linux_swap xfs jfs reiserfs \ + nilfs2 # bfs partedincludedir = -I$(top_srcdir)/include noinst_LTLIBRARIES = libfs.la @@ -23,7 +24,8 @@ libfs_la_LIBADD = $(UUID_LIBS) \ linux_swap/liblinuxswap.la \ xfs/libxfs.la \ jfs/libjfs.la \ - reiserfs/libreiserfs.la + reiserfs/libreiserfs.la \ + nilfs2/libnilfs2.la # bfs/libbfs.la libfs_la_SOURCES = diff --git a/libparted/fs/nilfs2/Makefile.am b/libparted/fs/nilfs2/Makefile.am new file mode 100644 index 0000000..9bb87b6 --- /dev/null +++ b/libparted/fs/nilfs2/Makefile.am @@ -0,0 +1,8 @@ +partedincludedir = -I$(top_srcdir)/include + +noinst_LTLIBRARIES = libnilfs2.la +libnilfs2_la_SOURCES = nilfs2.c + +INCLUDES = $(partedincludedir) $(INTLINCS) + +MAINTAINERCLEANFILES = Makefile.in diff --git a/libparted/fs/nilfs2/nilfs2.c b/libparted/fs/nilfs2/nilfs2.c new file mode 100644 index 0000000..49634c0 --- /dev/null +++ b/libparted/fs/nilfs2/nilfs2.c @@ -0,0 +1,199 @@ +/* + * nilfs2.c - New Implementation of Log filesystem + * + * Written by Jiro SEKIBA <[email protected]> + * + * Copyright (C) 2011 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <config.h> + +#include <parted/parted.h> +#include <parted/crc32.h> +#include <parted/endian.h> + +/* Magic value for nilfs2 superblock. */ +#define NILFS2_SUPER_MAGIC 0x3434 + +/* primariy superblock offset in 512bytes blocks. */ +#define NILFS_SB_OFFSET 2 + +/* secondary superblock offset in 512byte blocks. */ +#define NILFS_SB2_OFFSET(devsize) ((((devsize)>>3) - 1) << 3) + +struct nilfs2_super_block +{ + uint32_t s_rev_level; + uint16_t s_minor_rev_level; + uint16_t s_magic; + uint16_t s_bytes; + uint16_t s_flags; + uint32_t s_crc_seed; + uint32_t s_sum; + uint32_t s_log_block_size; + uint64_t s_nsegments; + uint64_t s_dev_size; + uint64_t s_first_data_block; + uint32_t s_blocks_per_segment; + uint32_t s_r_segments_percentage; + uint64_t s_last_cno; + uint64_t s_last_pseg; + uint64_t s_last_seq; + uint64_t s_free_blocks_count; + uint64_t s_ctime; + uint64_t s_mtime; + uint64_t s_wtime; + uint16_t s_mnt_count; + uint16_t s_max_mnt_count; + uint16_t s_state; + uint16_t s_errors; + uint64_t s_lastcheck; + uint32_t s_checkinterval; + uint32_t s_creator_os; + uint16_t s_def_resuid; + uint16_t s_def_resgid; + uint32_t s_first_ino; + uint16_t s_inode_size; + uint16_t s_dat_entry_size; + uint16_t s_checkpoint_size; + uint16_t s_segment_usage_size; + uint8_t s_uuid[16]; + char s_volume_name[80]; + uint32_t s_c_interval; + uint32_t s_c_block_max; + uint32_t s_reserved[192]; +}; + +static int +is_valid_nilfs_sb(struct nilfs2_super_block *sb) +{ + static unsigned char sum[4]; + const int sumoff = offsetof (struct nilfs2_super_block, s_sum); + size_t bytes; + uint32_t crc; + + if (PED_LE16_TO_CPU(sb->s_magic) != NILFS2_SUPER_MAGIC) + return 0; + + bytes = PED_LE16_TO_CPU(sb->s_bytes); + if (bytes > 1024) + return 0; + + crc = __efi_crc32(sb, sumoff, PED_LE32_TO_CPU(sb->s_crc_seed)); + crc = __efi_crc32(sum, 4, crc); + crc = __efi_crc32((unsigned char *)sb + sumoff + 4, + bytes - sumoff - 4, crc); + + return crc == PED_LE32_TO_CPU(sb->s_sum); +} + +PedGeometry* +nilfs2_probe (PedGeometry* geom) +{ + void *sb_v; + void *sb2_v; + struct nilfs2_super_block *sb = NULL; + struct nilfs2_super_block *sb2 = NULL; + PedSector length = geom->length; + PedSector sb2off; + + /* ignore if sector size is not 512bytes for now */ + if (geom->dev->sector_size != PED_SECTOR_SIZE_DEFAULT) + return NULL; + + sb2off = NILFS_SB2_OFFSET(length); + + if (ped_geometry_read_alloc(geom, &sb_v, 2, 1)) + sb = sb_v; + + if (ped_geometry_read_alloc(geom, &sb2_v, sb2off, 1)) + sb2 = sb2_v; + + if ((!sb || !is_valid_nilfs_sb(sb)) && + (!sb2 || !is_valid_nilfs_sb(sb2)) ) { + free(sb); + free(sb2); + return NULL; + } + + /* reserve 4k bytes for secondary superblock */ + length = sb2off + 8; + + free(sb); + free(sb2); + return ped_geometry_new(geom->dev, geom->start, length); +} + +#ifndef DISCOVER_ONLY +static int +nilfs2_clobber (PedGeometry* geom) +{ + char buf[512]; + int ret[2]; + + printf("nilfs2_clobber\n"); + memset (buf, 0, 512); + + ret[0] = ped_geometry_write (geom, buf, NILFS_SB_OFFSET, 1); + ret[1] = ped_geometry_write (geom, buf, + NILFS_SB2_OFFSET(geom->length), 1); + + return ret[0]|ret[1]; +} +#endif /* !DISCOVER_ONLY */ + +static PedFileSystemOps nilfs2_ops = { + probe: nilfs2_probe, +#ifndef DISCOVER_ONLY + #if 0 + clobber: nilfs2_clobber, + #else + clobber: NULL, + #endif +#else + clobber: NULL, +#endif + open: NULL, + create: NULL, + close: NULL, + check: NULL, + copy: NULL, + resize: NULL, + get_create_constraint: NULL, + get_resize_constraint: NULL, + get_copy_constraint: NULL +}; + +#define NILFS2_BLOCK_SIZES ((int[5]){1024, 2048, 4096, 8192, 0}) + +static PedFileSystemType nilfs2_type = { + next: NULL, + ops: &nilfs2_ops, + name: "nilfs2", + block_sizes: NILFS2_BLOCK_SIZES +}; + +void +ped_file_system_nilfs2_init () +{ + ped_file_system_type_register (&nilfs2_type); +} + +void +ped_file_system_nilfs2_done () +{ + ped_file_system_type_unregister (&nilfs2_type); +} diff --git a/libparted/libparted.c b/libparted/libparted.c index 4218f90..db1c413 100644 --- a/libparted/libparted.c +++ b/libparted/libparted.c @@ -109,6 +109,7 @@ extern void ped_file_system_jfs_init (void); extern void ped_file_system_hfs_init (void); extern void ped_file_system_fat_init (void); extern void ped_file_system_ext2_init (void); +extern void ped_file_system_nilfs2_init (void); static void init_file_system_types () @@ -123,6 +124,7 @@ init_file_system_types () ped_file_system_hfs_init (); ped_file_system_fat_init (); ped_file_system_ext2_init (); + ped_file_system_nilfs2_init (); } #endif /* ENABLE_FS */ @@ -179,6 +181,7 @@ _init() } #ifdef ENABLE_FS +extern void ped_file_system_nilfs2_done (void); extern void ped_file_system_ext2_done (void); extern void ped_file_system_fat_done (void); extern void ped_file_system_hfs_done (void); @@ -193,6 +196,7 @@ extern void ped_file_system_amiga_done (void); static void done_file_system_types () { + ped_file_system_nilfs2_done (); ped_file_system_ext2_done (); ped_file_system_fat_done (); ped_file_system_hfs_done (); -- 1.7.4.1.299.ga459d >From f3335f16b523974b3ed3eb1242c2eb6fc34c429d Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Fri, 4 Mar 2011 08:23:01 +0100 Subject: [PATCH 2/3] tests: rename a test script, before extending it to handle nilfs * tests/t1700-probe-fs.sh: Rename from ... * tests/t1700-ext-probe.sh: ...this. * tests/Makefile.am (TESTS): Rename it here, too. --- tests/Makefile.am | 2 +- tests/{t1700-ext-probe.sh => t1700-probe-fs.sh} | 0 2 files changed, 1 insertions(+), 1 deletions(-) rename tests/{t1700-ext-probe.sh => t1700-probe-fs.sh} (100%) diff --git a/tests/Makefile.am b/tests/Makefile.am index ffea90c..feafbed 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -20,7 +20,7 @@ TESTS = \ t0500-dup-clobber.sh \ t1100-busy-label.sh \ t1101-busy-partition.sh \ - t1700-ext-probe.sh \ + t1700-probe-fs.sh \ t2100-mkswap.sh \ t2200-dos-label-recog.sh \ t2300-dos-label-extended-bootcode.sh \ diff --git a/tests/t1700-ext-probe.sh b/tests/t1700-probe-fs.sh similarity index 100% rename from tests/t1700-ext-probe.sh rename to tests/t1700-probe-fs.sh -- 1.7.4.1.299.ga459d >From 0bfe6ac65d42f11730943eeaee754e7749e55de1 Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Sat, 5 Mar 2011 19:47:05 +0100 Subject: [PATCH 3/3] tests: add a minimal nilfs2 test * tests/t1700-probe-fs.sh: Adapt to also test nilfs2. --- tests/t1700-probe-fs.sh | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/t1700-probe-fs.sh b/tests/t1700-probe-fs.sh index 00aba3e..749c9ea 100755 --- a/tests/t1700-probe-fs.sh +++ b/tests/t1700-probe-fs.sh @@ -21,19 +21,22 @@ require_512_byte_sector_size_ dev=loop-file ss=$sector_size_ -n_sectors=8000 -for type in ext2 ext3 ext4; do +for type in ext2 ext3 ext4 nilfs2; do - ( mkfs.$type -V ) >/dev/null 2>&1 || skip_ "no $type support" + ( mkfs.$type -V ) >/dev/null 2>&1 \ + || { warn_ "$ME: no $type support"; continue; } + + case $type in ext*) n_sectors=8000 force=-F;; + *) n_sectors=$((257*1024)) force=;; esac # create an $type file system - dd if=/dev/zero of=$dev bs=1024 count=4096 >/dev/null || fail=1 - mkfs.$type -F $dev >/dev/null || fail=1 + dd if=/dev/zero of=$dev bs=$ss count=$n_sectors >/dev/null || fail=1 + mkfs.$type $force $dev || { warn_ $ME: mkfs.$type failed; fail=1; continue; } # probe the $type file system parted -m -s $dev u s print >out 2>&1 || fail=1 - grep '^1:.*:'$type'::;$' out || fail=1 + grep '^1:.*:'$type'::;$' out || { cat out; fail=1; } done -- 1.7.4.1.299.ga459d _______________________________________________ parted-devel mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/parted-devel

