On Wed, Jul 07, 2010 at 08:03:59PM +0200, Aurelien Jarno wrote:
> Package: parted
> Version: 2.3-1
> Severity: wishlist
> Tags: patch
> 
> Up to now, the GNU/kFreeBSD installer used a patched version of parted to 
> create UFS partition. This patch was a quick and dirty hack and was for
> example not able to detect already existing partitions.
> 
> I have just written a better patch, that correctly create UFS partition and
> which is also able to detect them. Please find attached a patch for that. It
> just needs to be put in debian/patches and added to debian/patches/series.
> 

Please find below an updated version of the patch which also adds a
test. This patch has already been submitted upstream:

http://lists.alioth.debian.org/pipermail/parted-devel/2010-August/003722.html

--- parted-2.3.orig/libparted/labels/dos.c
+++ parted-2.3/libparted/labels/dos.c
@@ -87,6 +87,7 @@
 #define PARTITION_LINUX                0x83
 #define PARTITION_LINUX_EXT    0x85
 #define PARTITION_LINUX_LVM    0x8e
+#define PARTITION_FREEBSD_UFS  0xa5
 #define PARTITION_HFS          0xaf
 #define PARTITION_SUN_UFS      0xbf
 #define PARTITION_DELL_DIAG    0xde
@@ -1377,6 +1378,8 @@
                dos_data->system = PARTITION_HFS;
        else if (!strcmp (fs_type->name, "sun-ufs"))
                dos_data->system = PARTITION_SUN_UFS;
+       else if (!strcmp (fs_type->name, "freebsd-ufs"))
+               dos_data->system = PARTITION_FREEBSD_UFS;
        else if (is_linux_swap (fs_type->name))
                dos_data->system = PARTITION_LINUX_SWAP;
        else
--- parted-2.3.orig/libparted/labels/gpt.c
+++ parted-2.3/libparted/labels/gpt.c
@@ -139,6 +139,10 @@
     ((efi_guid_t) { PED_CPU_TO_LE32 (0x5265636F), PED_CPU_TO_LE16 (0x7665), \
                     PED_CPU_TO_LE16 (0x11AA), 0xaa, 0x11, \
                     { 0x00, 0x30, 0x65, 0x43, 0xEC, 0xAC }})
+#define PARTITION_FREEBSD_UFS_GUID \
+    ((efi_guid_t) { PED_CPU_TO_LE32 (0x516e7cb6), PED_CPU_TO_LE16 (0x6ecf), \
+                    PED_CPU_TO_LE16 (0x11d6), 0x8f, 0xf8, \
+                    { 0x00, 0x02, 0x2d, 0x09, 0x71, 0x2b }})
 
 struct __attribute__ ((packed)) _GuidPartitionTableHeader_t
 {
@@ -1425,6 +1429,11 @@
           gpt_part_data->type = PARTITION_SWAP_GUID;
           return 1;
         }
+      if (strstr (fs_type->name, "freebsd-ufs"))
+        {
+          gpt_part_data->type = PARTITION_FREEBSD_UFS_GUID;
+          return 1;
+        }
     }
 
   gpt_part_data->type = PARTITION_BASIC_DATA_GUID;
--- parted-2.3.orig/libparted/fs/ufs/ufs.c
+++ parted-2.3/libparted/fs/ufs/ufs.c
@@ -48,6 +48,7 @@
 #define UFS_MAGIC_LFN  0x00095014
 #define UFS_MAGIC_FEA  0x00195612
 #define UFS_MAGIC_4GB  0x05231994
+#define UFS2_MAGIC     0x19540119
 
 struct ufs_csum {
        uint32_t        cs_ndir;        /* number of directories */
@@ -132,13 +133,50 @@
        int8_t          fs_clean;       /* file system is clean flag */
        int8_t          fs_ronly;       /* mounted read-only flag */
        int8_t          fs_flags;       /* currently unused flag */
-       int8_t          fs_fsmnt[UFS_MAXMNTLEN];        /* name mounted on */
-/* these fields retain the current block allocation info */
-       uint32_t        fs_cgrotor;     /* last cg searched */
-       uint32_t        fs_csp[UFS_MAXCSBUFS];  /* list of fs_cs info buffers */
-       uint32_t        fs_maxcluster;
-       uint32_t        fs_cpc;         /* cyl per cycle in postbl */
-       uint16_t        fs_opostbl[16][8];      /* old rotation block list head 
*/
+       union {
+               struct {
+                       int8_t          fs_fsmnt[UFS_MAXMNTLEN];        /* name 
mounted on */
+                       /* these fields retain the current block allocation 
info */
+                       uint32_t        fs_cgrotor;     /* last cg searched */
+                       uint32_t        fs_csp[UFS_MAXCSBUFS];  /* list of 
fs_cs info buffers */
+                       uint32_t        fs_maxcluster;
+                       uint32_t        fs_cpc;         /* cyl per cycle in 
postbl */
+                       uint16_t        fs_opostbl[16][8];      /* old rotation 
block list head */
+               } fs_u1;
+               struct {
+                       int8_t          fs_fsmnt[468];
+                       uint8_t         fs_volname[32];
+                       uint64_t        fs_swuid;
+                       int32_t         fs_pad;
+                       uint32_t        fs_cgrotor;
+                       uint32_t        fs_ocsp[28];
+                       uint32_t        fs_contigdirs;
+                       uint32_t        fs_csp;
+                       uint32_t        fs_maxcluster;
+                       uint32_t        fs_active;
+                       int32_t         fs_old_cpc;
+                       int32_t         fs_maxbsize;
+                       int64_t         fs_sparecon64[17];
+                       int64_t         fs_sblockloc;
+                       struct ufs2_csum_total {
+                               uint64_t        cs_ndir;
+                               uint64_t        cs_nbfree;
+                               uint64_t        cs_nifree;
+                               uint64_t        cs_nffree;
+                               uint64_t        cs_numclusters;
+                               uint64_t        cs_spare[3];
+                       } fs_cstotal;
+                       struct ufs_timeval {
+                               int32_t  tv_sec;
+                               int32_t  tv_usec;
+                       } fs_time;
+                       int64_t         fs_size;
+                       int64_t         fs_dsize;
+                       uint64_t        fs_csaddr;
+                       int64_t         fs_pendingblocks;
+                       int32_t         fs_pendinginodes;
+               } __attribute__((packed)) fs_u2;
+       } fs_u11;
        union {
                struct {
                        int32_t         fs_sparecon[53];/* reserved for future 
constants */
@@ -242,6 +280,45 @@
        return NULL;
 }
 
+static PedGeometry*
+ufs_probe_freebsd (PedGeometry* geom)
+{
+       int offsets[] = { 0, 16, 128, 512 };
+       int8_t buf[512 * 3];
+       struct ufs_super_block *sb;
+       PedSector block_size;
+       PedSector block_count;
+       int i;
+
+       if (geom->length < 5)
+               return 0;
+       
+       /* The UFS superblock could be on four different positions */
+       for (i = 0; i < 4; i++) {
+               if (!ped_geometry_read (geom, buf, offsets[i], 3))
+                       return 0;
+
+               sb = (struct ufs_super_block *)buf;
+
+               /* Little endian is more likely on FreeBSD boxes */
+               if (PED_LE32_TO_CPU(sb->fs_magic) == UFS2_MAGIC) {
+                       block_size = PED_LE32_TO_CPU(sb->fs_fsize) / 512;
+                       block_count = PED_LE32_TO_CPU(sb->fs_u11.fs_u2.fs_size);
+                       return ped_geometry_new (geom->dev, geom->start,
+                                                block_size * block_count);
+               }
+
+               /* Then try big endian */
+               if (PED_BE32_TO_CPU(sb->fs_magic) == UFS2_MAGIC) {
+                       block_size = PED_BE32_TO_CPU(sb->fs_fsize) / 512;
+                       block_count = PED_BE32_TO_CPU(sb->fs_u11.fs_u2.fs_size);
+                       return ped_geometry_new (geom->dev, geom->start,
+                                                block_size * block_count);
+               }
+       }
+       return NULL;
+}
+
 #ifndef DISCOVER_ONLY
 static int
 ufs_clobber (PedGeometry* geom)
@@ -293,6 +370,24 @@
        get_copy_constraint:    NULL
 };
 
+static PedFileSystemOps ufs_ops_freebsd = {
+       probe:          ufs_probe_freebsd,
+#ifndef DISCOVER_ONLY
+       clobber:        ufs_clobber,
+#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
+};
+
 static PedFileSystemType ufs_type_sun = {
        next:   NULL,
        ops:    &ufs_ops_sun,
@@ -307,6 +402,12 @@
        block_sizes: HP_UFS_BLOCK_SIZES
 };
 
+static PedFileSystemType ufs_type_freebsd_ufs = {
+       next:   NULL,
+       ops:    &ufs_ops_freebsd,
+       name:   "freebsd-ufs"
+};
+
 void
 ped_file_system_ufs_init ()
 {
@@ -314,11 +415,13 @@
 
        ped_file_system_type_register (&ufs_type_sun);
        ped_file_system_type_register (&ufs_type_hp);
+       ped_file_system_type_register (&ufs_type_freebsd_ufs);
 }
 
 void
 ped_file_system_ufs_done ()
 {
+       ped_file_system_type_unregister (&ufs_type_freebsd_ufs);
        ped_file_system_type_unregister (&ufs_type_hp);
        ped_file_system_type_unregister (&ufs_type_sun);
 }
--- parted-2.3.orig/tests/Makefile.am
+++ parted-2.3/tests/Makefile.am
@@ -25,6 +25,7 @@
   t2300-dos-label-extended-bootcode.sh \
   t2310-dos-extended-2-sector-min-offset.sh \
   t2400-dos-hfs-partition-type.sh \
+  t2500-freebsd-ufs.sh \
   t3000-resize-fs.sh \
   t3200-type-change.sh \
   t3300-palo-prep.sh \
--- parted-2.3.orig/tests/t2500-freebsd-ufs.sh
+++ parted-2.3/tests/t2500-freebsd-ufs.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+# Probe FreeBSD UFS file system
+
+# Copyright (C) 2010 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/>.
+
+if test "$VERBOSE" = yes; then
+  set -x
+  parted --version
+fi
+
+: ${srcdir=.}
+. $srcdir/t-lib.sh
+require_512_byte_sector_size_
+
+dev=loop-file
+ss=$sector_size_
+n_sectors=8000
+
+fail=0
+
+( type mkfs.ufs ) >/dev/null 2>&1 || skip_test_ "no freebsd-ufs support"
+
+# create a freebsd-ufs file system
+dd if=/dev/zero of=$dev bs=1024 count=4096 >/dev/null || fail=1
+mkfs.ufs `pwd`/$dev >/dev/null || fail=1
+
+# probe the freebsd-ufs file system
+parted -m -s $dev u s print >out 2>&1 || fail=1
+grep '^1:.*:freebsd-ufs::;$' out || fail=1
+
+Exit $fail
--- parted-2.3.orig/tests/Makefile.in
+++ parted-2.3/tests/Makefile.in
@@ -937,6 +937,7 @@
   t2300-dos-label-extended-bootcode.sh \
   t2310-dos-extended-2-sector-min-offset.sh \
   t2400-dos-hfs-partition-type.sh \
+  t2500-freebsd-ufs.sh \
   t3000-resize-fs.sh \
   t3200-type-change.sh \
   t3300-palo-prep.sh \
@@ -1372,6 +1373,8 @@
        @p='t2310-dos-extended-2-sector-min-offset.sh'; $(am__check_pre) 
$(LOG_COMPILE) "$$tst" $(am__check_post)
 t2400-dos-hfs-partition-type.sh.log: t2400-dos-hfs-partition-type.sh
        @p='t2400-dos-hfs-partition-type.sh'; $(am__check_pre) $(LOG_COMPILE) 
"$$tst" $(am__check_post)
+t2500-freebsd-ufs.sh.log: t2500-freebsd-ufs.sh
+       @p='t2500-freebsd-ufs.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" 
$(am__check_post)
 t3000-resize-fs.sh.log: t3000-resize-fs.sh
        @p='t3000-resize-fs.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" 
$(am__check_post)
 t3200-type-change.sh.log: t3200-type-change.sh

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurel...@aurel32.net                 http://www.aurel32.net



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to