Date: Wed, 18 Apr 2012 05:00:26 +0000 (UTC) From: "Andrey V. Elsukov" <ae@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org Subject: svn commit: r234407 - in stable/8/sys: conf geom/part modules/geom/geom_part modules/geom/geom_part/geom_part_ldm Message-ID: <201204180500.q3I50QsR015306@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ae Date: Wed Apr 18 05:00:25 2012 New Revision: 234407 URL: http://svn.freebsd.org/changeset/base/234407 Log: MFC r233176: Add new GEOM_PART_LDM module that implements the Logical Disk Manager scheme. The LDM is a logical volume manager for MS Windows NT and it is also known as dynamic volumes. It supports about 2000 partitions and also provides the capability for software RAID implementations. This version implements only partitioning scheme capability and based on the linux-ntfs project documentation and several publications across the Web. NOTE: JBOD, RAID0 and RAID5 volumes aren't supported. An access to the LDM metadata is read-only. When LDM is on the disk partitioned with MBR we can also destroy metadata. For the GPT partitioned disks destroy action is not supported. MFC r233177: Connect geom_part_ldm module to the build. MFC r233178: Connect geom_part_ldm to the kernel build. MFC r233181: Add CTLFLAG_TUN to sysctls. MFC r233651: Do proper cleanup for the GPT case when an error occurs. MFC r233652: VMDB offset should be greater than logical volume size only for MBR. Added: stable/8/sys/geom/part/g_part_ldm.c - copied, changed from r233176, head/sys/geom/part/g_part_ldm.c stable/8/sys/modules/geom/geom_part/geom_part_ldm/ - copied from r233177, head/sys/modules/geom/geom_part/geom_part_ldm/ Modified: stable/8/sys/conf/NOTES stable/8/sys/conf/files stable/8/sys/conf/options stable/8/sys/modules/geom/geom_part/Makefile Directory Properties: stable/8/sys/ (props changed) Modified: stable/8/sys/conf/NOTES ============================================================================== --- stable/8/sys/conf/NOTES Wed Apr 18 04:59:47 2012 (r234406) +++ stable/8/sys/conf/NOTES Wed Apr 18 05:00:25 2012 (r234407) @@ -150,6 +150,7 @@ options GEOM_PART_BSD # BSD disklabel options GEOM_PART_EBR # Extended Boot Records options GEOM_PART_EBR_COMPAT # Backward compatible partition names options GEOM_PART_GPT # GPT partitioning +options GEOM_PART_LDM # Logical Disk Manager options GEOM_PART_MBR # MBR partitioning options GEOM_PART_PC98 # PC-9800 disk partitioning options GEOM_PART_VTOC8 # SMI VTOC8 disk label Modified: stable/8/sys/conf/files ============================================================================== --- stable/8/sys/conf/files Wed Apr 18 04:59:47 2012 (r234406) +++ stable/8/sys/conf/files Wed Apr 18 05:00:25 2012 (r234407) @@ -2054,6 +2054,7 @@ geom/part/g_part_apm.c optional geom_pa geom/part/g_part_bsd.c optional geom_part_bsd geom/part/g_part_ebr.c optional geom_part_ebr geom/part/g_part_gpt.c optional geom_part_gpt +geom/part/g_part_ldm.c optional geom_part_ldm geom/part/g_part_mbr.c optional geom_part_mbr geom/part/g_part_pc98.c optional geom_part_pc98 geom/part/g_part_vtoc8.c optional geom_part_vtoc8 Modified: stable/8/sys/conf/options ============================================================================== --- stable/8/sys/conf/options Wed Apr 18 04:59:47 2012 (r234406) +++ stable/8/sys/conf/options Wed Apr 18 05:00:25 2012 (r234407) @@ -96,6 +96,7 @@ GEOM_PART_BSD opt_geom.h GEOM_PART_EBR opt_geom.h GEOM_PART_EBR_COMPAT opt_geom.h GEOM_PART_GPT opt_geom.h +GEOM_PART_LDM opt_geom.h GEOM_PART_MBR opt_geom.h GEOM_PART_PC98 opt_geom.h GEOM_PART_VTOC8 opt_geom.h Copied and modified: stable/8/sys/geom/part/g_part_ldm.c (from r233176, head/sys/geom/part/g_part_ldm.c) ============================================================================== --- head/sys/geom/part/g_part_ldm.c Mon Mar 19 13:14:44 2012 (r233176, copy source) +++ stable/8/sys/geom/part/g_part_ldm.c Wed Apr 18 05:00:25 2012 (r234407) @@ -56,8 +56,8 @@ static SYSCTL_NODE(_kern_geom_part, OID_ static u_int ldm_debug = 0; TUNABLE_INT("kern.geom.part.ldm.debug", &ldm_debug); -SYSCTL_UINT(_kern_geom_part_ldm, OID_AUTO, debug, CTLFLAG_RW, - &ldm_debug, 0, "Debug level"); +SYSCTL_UINT(_kern_geom_part_ldm, OID_AUTO, debug, + CTLFLAG_RW | CTLFLAG_TUN, &ldm_debug, 0, "Debug level"); /* * This allows access to mirrored LDM volumes. Since we do not @@ -65,8 +65,8 @@ SYSCTL_UINT(_kern_geom_part_ldm, OID_AUT */ static u_int show_mirrors = 0; TUNABLE_INT("kern.geom.part.ldm.show_mirrors", &show_mirrors); -SYSCTL_UINT(_kern_geom_part_ldm, OID_AUTO, show_mirrors, CTLFLAG_RW, - &show_mirrors, 0, "Show mirrored volumes"); +SYSCTL_UINT(_kern_geom_part_ldm, OID_AUTO, show_mirrors, + CTLFLAG_RW | CTLFLAG_TUN, &show_mirrors, 0, "Show mirrored volumes"); #define LDM_DEBUG(lvl, fmt, ...) do { \ if (ldm_debug >= (lvl)) { \ @@ -495,7 +495,7 @@ ldm_privhdr_check(struct ldm_db *db, str g_free(buf); if (hdr.start > last || hdr.start + hdr.size - 1 > last || - (hdr.start + hdr.size - 1 > hdr.db_offset && is_gpt) || + (hdr.start + hdr.size - 1 > hdr.db_offset && !is_gpt) || hdr.db_size != LDM_DB_SIZE || hdr.db_offset + LDM_DB_SIZE - 1 > last || hdr.th_offset[0] >= LDM_DB_SIZE || @@ -1371,14 +1371,15 @@ g_part_ldm_read(struct g_part_table *bas /* Read and parse LDM private headers. */ error = ldm_privhdr_check(&db, cp, table->is_gpt); if (error != 0) - return (error); + goto gpt_cleanup; basetable->gpt_first = table->is_gpt ? 0: db.ph.start; basetable->gpt_last = basetable->gpt_first + db.ph.size - 1; table->db_offset = db.ph.db_offset; /* Make additional checks for GPT */ if (table->is_gpt) { - if (ldm_gpt_check(&db, cp) != 0) - return (ENXIO); + error = ldm_gpt_check(&db, cp); + if (error != 0) + goto gpt_cleanup; /* * Now we should reset database offset to zero, because our * consumer cp is attached to the ms-ldm-metadata partition @@ -1389,12 +1390,25 @@ g_part_ldm_read(struct g_part_table *bas /* Read and parse LDM TOC headers. */ error = ldm_tochdr_check(&db, cp); if (error != 0) - return (error); + goto gpt_cleanup; /* Read and parse LDM VMDB header. */ error = ldm_vmdbhdr_check(&db, cp); if (error != 0) - return (error); + goto gpt_cleanup; error = ldm_vmdb_parse(&db, cp); + /* + * For the GPT case we must detach and destroy + * second consumer before return. + */ +gpt_cleanup: + if (table->is_gpt) { + g_topology_lock(); + g_access(cp, -1, 0, 0); + g_detach(cp); + g_destroy_consumer(cp); + g_topology_unlock(); + cp = cp2; + } if (error != 0) return (error); /* Search current disk in the disk list. */ @@ -1408,15 +1422,6 @@ g_part_ldm_read(struct g_part_table *bas ldm_vmdb_free(&db); return (ENXIO); } - if (table->is_gpt) { - /* Second consumer is no longer needed. */ - g_topology_lock(); - g_access(cp, -1, 0, 0); - g_detach(cp); - g_destroy_consumer(cp); - g_topology_unlock(); - cp = cp2; - } index = 1; LIST_FOREACH(vol, &db.volumes, entry) { LIST_FOREACH(comp, &vol->components, entry) { Modified: stable/8/sys/modules/geom/geom_part/Makefile ============================================================================== --- stable/8/sys/modules/geom/geom_part/Makefile Wed Apr 18 04:59:47 2012 (r234406) +++ stable/8/sys/modules/geom/geom_part/Makefile Wed Apr 18 05:00:25 2012 (r234407) @@ -4,6 +4,7 @@ SUBDIR= geom_part_apm \ geom_part_bsd \ geom_part_ebr \ geom_part_gpt \ + geom_part_ldm \ geom_part_mbr \ geom_part_pc98 \ geom_part_vtoc8
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204180500.q3I50QsR015306>