~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/block/partitions/sun.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  *  fs/partitions/sun.c
  4  *
  5  *  Code extracted from drivers/block/genhd.c
  6  *
  7  *  Copyright (C) 1991-1998  Linus Torvalds
  8  *  Re-organised Feb 1998 Russell King
  9  */
 10 
 11 #include "check.h"
 12 
 13 #define SUN_LABEL_MAGIC          0xDABE
 14 #define SUN_VTOC_SANITY          0x600DDEEE
 15 
 16 enum {
 17         SUN_WHOLE_DISK = 5,
 18         LINUX_RAID_PARTITION = 0xfd,    /* autodetect RAID partition */
 19 };
 20 
 21 int sun_partition(struct parsed_partitions *state)
 22 {
 23         int i;
 24         __be16 csum;
 25         int slot = 1;
 26         __be16 *ush;
 27         Sector sect;
 28         struct sun_disklabel {
 29                 unsigned char info[128];   /* Informative text string */
 30                 struct sun_vtoc {
 31                     __be32 version;     /* Layout version */
 32                     char   volume[8];   /* Volume name */
 33                     __be16 nparts;      /* Number of partitions */
 34                     struct sun_info {           /* Partition hdrs, sec 2 */
 35                         __be16 id;
 36                         __be16 flags;
 37                     } infos[8];
 38                     __be16 padding;     /* Alignment padding */
 39                     __be32 bootinfo[3];  /* Info needed by mboot */
 40                     __be32 sanity;       /* To verify vtoc sanity */
 41                     __be32 reserved[10]; /* Free space */
 42                     __be32 timestamp[8]; /* Partition timestamp */
 43                 } vtoc;
 44                 __be32 write_reinstruct; /* sectors to skip, writes */
 45                 __be32 read_reinstruct;  /* sectors to skip, reads */
 46                 unsigned char spare[148]; /* Padding */
 47                 __be16 rspeed;     /* Disk rotational speed */
 48                 __be16 pcylcount;  /* Physical cylinder count */
 49                 __be16 sparecyl;   /* extra sects per cylinder */
 50                 __be16 obs1;       /* gap1 */
 51                 __be16 obs2;       /* gap2 */
 52                 __be16 ilfact;     /* Interleave factor */
 53                 __be16 ncyl;       /* Data cylinder count */
 54                 __be16 nacyl;      /* Alt. cylinder count */
 55                 __be16 ntrks;      /* Tracks per cylinder */
 56                 __be16 nsect;      /* Sectors per track */
 57                 __be16 obs3;       /* bhead - Label head offset */
 58                 __be16 obs4;       /* ppart - Physical Partition */
 59                 struct sun_partition {
 60                         __be32 start_cylinder;
 61                         __be32 num_sectors;
 62                 } partitions[8];
 63                 __be16 magic;      /* Magic number */
 64                 __be16 csum;       /* Label xor'd checksum */
 65         } * label;
 66         struct sun_partition *p;
 67         unsigned long spc;
 68         int use_vtoc;
 69         int nparts;
 70 
 71         label = read_part_sector(state, 0, &sect);
 72         if (!label)
 73                 return -1;
 74 
 75         p = label->partitions;
 76         if (be16_to_cpu(label->magic) != SUN_LABEL_MAGIC) {
 77 /*              printk(KERN_INFO "Dev %s Sun disklabel: bad magic %04x\n",
 78                        state->disk->disk_name, be16_to_cpu(label->magic)); */
 79                 put_dev_sector(sect);
 80                 return 0;
 81         }
 82         /* Look at the checksum */
 83         ush = ((__be16 *) (label+1)) - 1;
 84         for (csum = 0; ush >= ((__be16 *) label);)
 85                 csum ^= *ush--;
 86         if (csum) {
 87                 printk("Dev %s Sun disklabel: Csum bad, label corrupted\n",
 88                        state->disk->disk_name);
 89                 put_dev_sector(sect);
 90                 return 0;
 91         }
 92 
 93         /* Check to see if we can use the VTOC table */
 94         use_vtoc = ((be32_to_cpu(label->vtoc.sanity) == SUN_VTOC_SANITY) &&
 95                     (be32_to_cpu(label->vtoc.version) == 1) &&
 96                     (be16_to_cpu(label->vtoc.nparts) <= 8));
 97 
 98         /* Use 8 partition entries if not specified in validated VTOC */
 99         nparts = (use_vtoc) ? be16_to_cpu(label->vtoc.nparts) : 8;
100 
101         /*
102          * So that old Linux-Sun partitions continue to work,
103          * alow the VTOC to be used under the additional condition ...
104          */
105         use_vtoc = use_vtoc || !(label->vtoc.sanity ||
106                                  label->vtoc.version || label->vtoc.nparts);
107         spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect);
108         for (i = 0; i < nparts; i++, p++) {
109                 unsigned long st_sector;
110                 unsigned int num_sectors;
111 
112                 st_sector = be32_to_cpu(p->start_cylinder) * spc;
113                 num_sectors = be32_to_cpu(p->num_sectors);
114                 if (num_sectors) {
115                         put_partition(state, slot, st_sector, num_sectors);
116                         state->parts[slot].flags = 0;
117                         if (use_vtoc) {
118                                 if (be16_to_cpu(label->vtoc.infos[i].id) == LINUX_RAID_PARTITION)
119                                         state->parts[slot].flags |= ADDPART_FLAG_RAID;
120                                 else if (be16_to_cpu(label->vtoc.infos[i].id) == SUN_WHOLE_DISK)
121                                         state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
122                         }
123                 }
124                 slot++;
125         }
126         strlcat(state->pp_buf, "\n", PAGE_SIZE);
127         put_dev_sector(sect);
128         return 1;
129 }
130 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php