Date: Wed, 4 Jul 2007 06:53:13 GMT From: Brian Chu <chub@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 122840 for review Message-ID: <200707040653.l646rDjs099499@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122840 Change 122840 by chub@chub-msdosfs on 2007/07/04 06:52:31 Removing geom/label's copy of msdosfs data structures. Affected files ... .. //depot/projects/soc2007/chub-msdosfs2/sys/fs/msdosfs/bootsect.h#2 edit .. //depot/projects/soc2007/chub-msdosfs2/sys/fs/msdosfs/direntry.h#2 edit .. //depot/projects/soc2007/chub-msdosfs2/sys/geom/label/g_label_msdosfs.c#2 edit .. //depot/projects/soc2007/chub-msdosfs2/sys/geom/label/g_label_msdosfs.h#2 delete Differences ... ==== //depot/projects/soc2007/chub-msdosfs2/sys/fs/msdosfs/bootsect.h#2 (text+ko) ==== @@ -73,21 +73,3 @@ struct bootsector50 bs50; struct bootsector710 bs710; }; - -#if 0 -/* - * Shorthand for fields in the bpb. - */ -#define bsBytesPerSec bsBPB.bpbBytesPerSec -#define bsSectPerClust bsBPB.bpbSectPerClust -#define bsResSectors bsBPB.bpbResSectors -#define bsFATS bsBPB.bpbFATS -#define bsRootDirEnts bsBPB.bpbRootDirEnts -#define bsSectors bsBPB.bpbSectors -#define bsMedia bsBPB.bpbMedia -#define bsFATsecs bsBPB.bpbFATsecs -#define bsSectPerTrack bsBPB.bpbSectPerTrack -#define bsHeads bsBPB.bpbHeads -#define bsHiddenSecs bsBPB.bpbHiddenSecs -#define bsHugeSectors bsBPB.bpbHugeSectors -#endif ==== //depot/projects/soc2007/chub-msdosfs2/sys/fs/msdosfs/direntry.h#2 (text+ko) ==== @@ -88,7 +88,7 @@ #define WIN_CNT 0x3f u_int8_t wePart1[10]; u_int8_t weAttributes; -#define ATTR_WIN95 0x0f +#define ATTR_WIN95 0x0f /* Long directory entryies */ u_int8_t weReserved1; u_int8_t weChksum; u_int8_t wePart2[12]; ==== //depot/projects/soc2007/chub-msdosfs2/sys/geom/label/g_label_msdosfs.c#2 (text+ko) ==== @@ -1,6 +1,7 @@ /*- * Copyright (c) 2004 Pawel Jakub Dawidek <pjd@FreeBSD.org> * Copyright (c) 2006 Tobias Reifenberger + * Copyright (c) 2007 Brian Chu <chub@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,20 +34,34 @@ #include <sys/kernel.h> #include <sys/malloc.h> +#include <fs/msdosfs/bootsect.h> +#include <fs/msdosfs/bpb.h> +#include <fs/msdosfs/direntry.h> + #include <geom/geom.h> #include <geom/label/g_label.h> -#include <geom/label/g_label_msdosfs.h> #define G_LABEL_MSDOSFS_DIR "msdosfs" #define LABEL_NO_NAME "NO NAME " +/* + * Conversion macros for little endian encoded unsigned integers + * in byte streams to the local unsigned integer format. + */ +#include <sys/types.h> +#define UINT16BYTES(p) ((uint32_t)((p)[0] + (256*(p)[1]))) +#define UINT32BYTES(p) ((uint32_t)((p)[0] + (256*(p)[1]) + \ + (65536*(p)[2]) + (16777216*(p)[3]))) + static void g_label_msdosfs_taste(struct g_consumer *cp, char *label, size_t size) { struct g_provider *pp; - FAT_BSBPB *pfat_bsbpb; - FAT32_BSBPB *pfat32_bsbpb; - FAT_DES *pfat_entry; + union bootsector *bsp; + struct byte_bpb50 *pfat_bpb50; + struct byte_bpb710 *pfat_bpb710; + struct extboot *pfat_extboot; + struct direntry* pfat_entry; uint8_t *sector0, *sector; uint32_t i; @@ -74,10 +89,17 @@ if (sector0 == NULL) return; + /* Set the bootsector/boot parameter block to a struct. */ + bsp = (union bootsector *)sector0; + pfat_bpb50 = (struct byte_bpb50 *) bsp->bs50.bsBPB; + pfat_bpb710 = (struct byte_bpb710 *) bsp->bs710.bsBPB; + /* Check for the FAT boot sector signature. */ - if (sector0[510] != 0x55 || sector0[511] != 0xaa) { - G_LABEL_DEBUG(1, "MSDOSFS: %s: no FAT signature found.", - pp->name); + if (bsp->bs50.bsBootSectSig0 != BOOTSIG0 || + bsp->bs50.bsBootSectSig1 != BOOTSIG1) { + G_LABEL_DEBUG(1, + "MSDOSFS: %s: no FAT signature found.", + pp->name); goto error; } @@ -85,42 +107,56 @@ /* * Test if this is really a FAT volume and determine the FAT type. */ + if (UINT16BYTES(pfat_bpb50->bpbFATsecs) != 0) { + /* The extended boot record is one place for FAT12/FAT16 + * and another for FAT32. + */ - pfat_bsbpb = (FAT_BSBPB *)sector0; - pfat32_bsbpb = (FAT32_BSBPB *)sector0; + pfat_extboot = (struct extboot *) bsp->bs50.bsExt; - if (UINT16BYTES(pfat_bsbpb->BPB_FATSz16) != 0) { /* - * If the BPB_FATSz16 field is not zero and the string "FAT" is - * at the right place, this should be a FAT12 or FAT16 volume. + * If the BPB_FATSz16/bpbFATsecs field is not zero and + * the string "FAT" is at the right place, this should + * be a FAT12 or FAT16 volume. */ - if (strncmp(pfat_bsbpb->BS_FilSysType, "FAT", 3) != 0) { + + if (strncmp(pfat_extboot->exFileSysType, "FAT", 3) != 0) { G_LABEL_DEBUG(1, "MSDOSFS: %s: FAT12/16 volume not valid.", pp->name); goto error; } - G_LABEL_DEBUG(1, "MSDOSFS: %s: FAT12/FAT16 volume detected.", - pp->name); + G_LABEL_DEBUG(1, + "MSDOSFS: %s: FAT12/FAT16 volume detected.", + pp->name); /* A volume with no name should have "NO NAME " as label. */ - if (strncmp(pfat_bsbpb->BS_VolLab, LABEL_NO_NAME, - sizeof(pfat_bsbpb->BS_VolLab)) == 0) { + if (strncmp(pfat_extboot->exVolumeLabel, LABEL_NO_NAME, + sizeof(pfat_extboot->exVolumeLabel)) == 0) { G_LABEL_DEBUG(1, "MSDOSFS: %s: FAT12/16 volume has no name.", pp->name); goto error; } - strlcpy(label, pfat_bsbpb->BS_VolLab, - MIN(size, sizeof(pfat_bsbpb->BS_VolLab) + 1)); - } else if (UINT32BYTES(pfat32_bsbpb->BPB_FATSz32) != 0) { + strlcpy(label, pfat_extboot->exVolumeLabel, + MIN(size, sizeof(pfat_extboot->exVolumeLabel) + 1)); + } + else if (UINT32BYTES(pfat_bpb710->bpbBigFATsecs) != 0) { uint32_t fat_FirstDataSector, fat_BytesPerSector, offset; + /* The extended boot record is one place for FAT12/FAT16 + * and another for FAT32. + */ + + pfat_extboot = (struct extboot *) bsp->bs710.bsExt; + /* - * If the BPB_FATSz32 field is not zero and the string "FAT" is - * at the right place, this should be a FAT32 volume. + * If the BPB_FATSz32/bpbBigFATsecs field is not zero + * and the string "FAT" is at the right place, this + * should be a FAT32 volume. */ - if (strncmp(pfat32_bsbpb->BS_FilSysType, "FAT", 3) != 0) { + + if (strncmp(pfat_extboot->exFileSysType, "FAT", 3) != 0) { G_LABEL_DEBUG(1, "MSDOSFS: %s: FAT32 volume not valid.", pp->name); goto error; @@ -131,10 +167,10 @@ /* * If the volume label is not "NO NAME " we're done. */ - if (strncmp(pfat32_bsbpb->BS_VolLab, LABEL_NO_NAME, - sizeof(pfat32_bsbpb->BS_VolLab)) != 0) { - strlcpy(label, pfat32_bsbpb->BS_VolLab, - MIN(size, sizeof(pfat32_bsbpb->BS_VolLab) + 1)); + if (strncmp(pfat_extboot->exVolumeLabel, LABEL_NO_NAME, + sizeof(pfat_extboot->exVolumeLabel)) == 0) { + strlcpy(label, pfat_extboot->exVolumeLabel, + MIN(size, sizeof(pfat_extboot->exVolumeLabel) + 1)); goto endofchecks; } @@ -144,10 +180,10 @@ * the root directory. */ fat_FirstDataSector = - UINT16BYTES(pfat32_bsbpb->BPB_RsvdSecCnt) + - (pfat32_bsbpb->BPB_NumFATs * - UINT32BYTES(pfat32_bsbpb->BPB_FATSz32)); - fat_BytesPerSector = UINT16BYTES(pfat32_bsbpb->BPB_BytsPerSec); + UINT16BYTES(pfat_bpb710->bpbResSectors) + + (pfat_bpb710->bpbFATs * + UINT32BYTES(pfat_bpb710->bpbBigFATsecs)); + fat_BytesPerSector = UINT16BYTES(pfat_bpb710->bpbBytesPerSec); G_LABEL_DEBUG(2, "MSDOSFS: FAT_FirstDataSector=0x%x, FAT_BytesPerSector=%d", @@ -160,10 +196,10 @@ if (sector == NULL) goto error; - pfat_entry = (FAT_DES *)sector; + pfat_entry = (struct direntry *)sector; do { /* No more entries available. */ - if (pfat_entry->DIR_Name[0] == 0) { + if (pfat_entry->deName[0] == 0) { G_LABEL_DEBUG(1, "MSDOSFS: %s: " "FAT32 volume has no name.", pp->name); @@ -171,10 +207,9 @@ } /* Skip empty or long name entries. */ - if (pfat_entry->DIR_Name[0] == 0xe5 || - (pfat_entry->DIR_Attr & - FAT_DES_ATTR_LONG_NAME) == - FAT_DES_ATTR_LONG_NAME) { + if (pfat_entry->deName[0] == 0xe5 || + (pfat_entry->deAttributes & + ATTR_WIN95) == ATTR_WIN95) { continue; } @@ -182,11 +217,11 @@ * The name of the entry is the volume label if * ATTR_VOLUME_ID is set. */ - if (pfat_entry->DIR_Attr & - FAT_DES_ATTR_VOLUME_ID) { - strlcpy(label, pfat_entry->DIR_Name, + if (pfat_entry->deAttributes & + ATTR_DIRECTORY) { + strlcpy(label, pfat_entry->deName, MIN(size, - sizeof(pfat_bsbpb->BS_VolLab) + 1)); + sizeof(pfat_extboot->exVolumeLabel) + 1)); goto endofchecks; } } while((uint8_t *)(++pfat_entry) <
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707040653.l646rDjs099499>