Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  *  fs/partitions/sysv68.c
0004  *
0005  *  Copyright (C) 2007 Philippe De Muyter <phdm@macqel.be>
0006  */
0007 
0008 #include "check.h"
0009 
0010 /*
0011  *  Volume ID structure: on first 256-bytes sector of disk
0012  */
0013 
0014 struct volumeid {
0015     u8  vid_unused[248];
0016     u8  vid_mac[8]; /* ASCII string "MOTOROLA" */
0017 };
0018 
0019 /*
0020  *  config block: second 256-bytes sector on disk
0021  */
0022 
0023 struct dkconfig {
0024     u8  ios_unused0[128];
0025     __be32  ios_slcblk; /* Slice table block number */
0026     __be16  ios_slccnt; /* Number of entries in slice table */
0027     u8  ios_unused1[122];
0028 };
0029 
0030 /*
0031  *  combined volumeid and dkconfig block
0032  */
0033 
0034 struct dkblk0 {
0035     struct volumeid dk_vid;
0036     struct dkconfig dk_ios;
0037 };
0038 
0039 /*
0040  *  Slice Table Structure
0041  */
0042 
0043 struct slice {
0044     __be32  nblocks;        /* slice size (in blocks) */
0045     __be32  blkoff;         /* block offset of slice */
0046 };
0047 
0048 
0049 int sysv68_partition(struct parsed_partitions *state)
0050 {
0051     int i, slices;
0052     int slot = 1;
0053     Sector sect;
0054     unsigned char *data;
0055     struct dkblk0 *b;
0056     struct slice *slice;
0057     char tmp[64];
0058 
0059     data = read_part_sector(state, 0, &sect);
0060     if (!data)
0061         return -1;
0062 
0063     b = (struct dkblk0 *)data;
0064     if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) {
0065         put_dev_sector(sect);
0066         return 0;
0067     }
0068     slices = be16_to_cpu(b->dk_ios.ios_slccnt);
0069     i = be32_to_cpu(b->dk_ios.ios_slcblk);
0070     put_dev_sector(sect);
0071 
0072     data = read_part_sector(state, i, &sect);
0073     if (!data)
0074         return -1;
0075 
0076     slices -= 1; /* last slice is the whole disk */
0077     snprintf(tmp, sizeof(tmp), "sysV68: %s(s%u)", state->name, slices);
0078     strlcat(state->pp_buf, tmp, PAGE_SIZE);
0079     slice = (struct slice *)data;
0080     for (i = 0; i < slices; i++, slice++) {
0081         if (slot == state->limit)
0082             break;
0083         if (be32_to_cpu(slice->nblocks)) {
0084             put_partition(state, slot,
0085                 be32_to_cpu(slice->blkoff),
0086                 be32_to_cpu(slice->nblocks));
0087             snprintf(tmp, sizeof(tmp), "(s%u)", i);
0088             strlcat(state->pp_buf, tmp, PAGE_SIZE);
0089         }
0090         slot++;
0091     }
0092     strlcat(state->pp_buf, "\n", PAGE_SIZE);
0093     put_dev_sector(sect);
0094     return 1;
0095 }