本文整理汇总了C++中read_dev_sector函数的典型用法代码示例。如果您正苦于以下问题:C++ read_dev_sector函数的具体用法?C++ read_dev_sector怎么用?C++ read_dev_sector使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了read_dev_sector函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: do_bsd_partition
/*
* Create devices for BSD partitions listed in a disklabel, under a
* dos-like partition. See extended_partition() for more information.
*/
static void do_bsd_partition(struct gendisk *hd, struct block_device *bdev,
int minor, int *current_minor, char *name, int max_partitions)
{
long offset = hd->part[minor].start_sect;
Sector sect;
struct bsd_disklabel *l;
struct bsd_partition *p;
int mask = (1 << hd->minor_shift) - 1;
char buf[40];
l = (struct bsd_disklabel *)read_dev_sector(bdev, offset+1, §);
if (!l)
return;
if (le32_to_cpu(l->d_magic) != BSD_DISKMAGIC) {
put_dev_sector(sect);
return;
}
printk(" %s: <%s", partition_name(hd, minor, buf), name);
if (le16_to_cpu(l->d_npartitions) < max_partitions)
max_partitions = le16_to_cpu(l->d_npartitions);
for (p = l->d_partitions; p - l->d_partitions < max_partitions; p++) {
if ((*current_minor & mask) == 0)
break;
if (p->p_fstype == BSD_FS_UNUSED)
continue;
check_and_add_bsd_partition(hd, p, minor, current_minor);
}
put_dev_sector(sect);
printk(" >\n");
}
开发者ID:liexusong,项目名称:Linux-2.4.16,代码行数:35,代码来源:msdos.c
示例2: read_lba
/**
* read_lba(): Read bytes from disk, starting at given LBA
* @bdev
* @lba
* @buffer
* @size_t
*
* Description: Reads @count bytes from @bdev into @buffer.
* Returns number of bytes read on success, 0 on error.
*/
static size_t
read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count)
{
size_t totalreadcount = 0;
sector_t n = lba * (bdev_hardsect_size(bdev) / 512);
if (!bdev || !buffer || lba > last_lba(bdev))
return 0;
while (count) {
int copied = 512;
Sector sect;
unsigned char *data = read_dev_sector(bdev, n++, §);
if (!data)
break;
if (copied > count)
copied = count;
memcpy(buffer, data, copied);
put_dev_sector(sect);
buffer += copied;
totalreadcount +=copied;
count -= copied;
}
return totalreadcount;
}
开发者ID:OpenHMR,项目名称:Open-HMR600,代码行数:35,代码来源:efi.c
示例3: parse_unixware
/*
* Create devices for Unixware partitions listed in a disklabel, under a
* dos-like partition. See parse_extended() for more information.
*/
static void
parse_unixware(struct parsed_partitions *state, struct block_device *bdev,
u32 offset, u32 size, int origin)
{
#ifdef CONFIG_UNIXWARE_DISKLABEL
Sector sect;
struct unixware_disklabel *l;
struct unixware_slice *p;
l = (struct unixware_disklabel *)read_dev_sector(bdev, offset+29, §);
if (!l)
return;
if (le32_to_cpu(l->d_magic) != UNIXWARE_DISKMAGIC ||
le32_to_cpu(l->vtoc.v_magic) != UNIXWARE_DISKMAGIC2) {
put_dev_sector(sect);
return;
}
printk(" %s%d: <unixware:", state->name, origin);
p = &l->vtoc.v_slice[1];
/* I omit the 0th slice as it is the same as whole disk. */
while (p - &l->vtoc.v_slice[0] < UNIXWARE_NUMSLICE) {
if (state->next == state->limit)
break;
if (p->s_label != UNIXWARE_FS_UNUSED)
put_partition(state, state->next++,
START_SECT(p), NR_SECTS(p));
p++;
}
put_dev_sector(sect);
printk(" >\n");
#endif
}
开发者ID:WiseMan787,项目名称:ralink_sdk,代码行数:37,代码来源:msdos.c
示例4: aix_magic_present
static int aix_magic_present(unsigned char *p, struct block_device *bdev)
{
struct partition *pt = (struct partition *) (p + 0x1be);
Sector sect;
unsigned char *d;
int slot, ret = 0;
if (!(p[0] == AIX_LABEL_MAGIC1 &&
p[1] == AIX_LABEL_MAGIC2 &&
p[2] == AIX_LABEL_MAGIC3 &&
p[3] == AIX_LABEL_MAGIC4))
return 0;
/* Assume the partition table is valid if Linux partitions exists */
for (slot = 1; slot <= 4; slot++, pt++) {
if (pt->sys_ind == LINUX_SWAP_PARTITION ||
pt->sys_ind == LINUX_RAID_PARTITION ||
pt->sys_ind == LINUX_DATA_PARTITION ||
pt->sys_ind == LINUX_LVM_PARTITION ||
is_extended_partition(pt))
return 0;
}
d = read_dev_sector(bdev, 7, §);
if (d) {
if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M')
ret = 1;
put_dev_sector(sect);
};
return ret;
}
开发者ID:WiseMan787,项目名称:ralink_sdk,代码行数:29,代码来源:msdos.c
示例5: emmc_read
static int emmc_read(struct mmc_emergency_info *emmc, void *holder,
char *buffer, off_t offset, int count, bool to_user)
{
unsigned char *read_ptr;
unsigned int sector_no;
off_t sector_offset;
Sector sect;
int rc;
if (!emmc) {
pr_err("%s:invalid emmc infomation\n", __func__);
return 0;
}
if (!emmc->bdev) {
pr_err("%s:invalid emmc block device\n", __func__);
return 0;
}
sector_no = offset >> SECTOR_SIZE_SHIFT;
sector_offset = offset & (SECTOR_SIZE - 1);
if (sector_no >= emmc->block_count) {
pr_err("%s: reading an invalid address\n", __func__);
return -EINVAL;
}
/* make sure the block device is open rw */
rc = blkdev_get(emmc->bdev, FMODE_READ | FMODE_WRITE, holder);
if (rc < 0) {
pr_err("%s: blk_dev_get failed!\n", __func__);
return 0;
}
read_ptr = read_dev_sector(emmc->bdev, sector_no + emmc->start_block,
§);
if (!read_ptr) {
put_dev_sector(sect);
return -EINVAL;
}
/* count and read_ptr are updated to match flash page size */
if (count + sector_offset > SECTOR_SIZE)
count = SECTOR_SIZE - sector_offset;
if (sector_offset)
read_ptr += sector_offset;
if (to_user) {
if (copy_to_user(buffer, read_ptr, count)) {
pr_err( "%s: Failed to copy buffer to User\n",
__func__);
return 0;
}
}
else
memcpy(buffer, read_ptr, count);
put_dev_sector(sect);
return count;
}
开发者ID:Katarzynasrom,项目名称:android_kernel_lenovo_spark,代码行数:59,代码来源:emmc_ipanic.c
示例6: sysv68_partition
int sysv68_partition(struct parsed_partitions *state, struct block_device *bdev)
{
int i, slices;
int slot = 1;
Sector sect;
unsigned char *data;
struct dkblk0 *b;
struct slice *slice;
data = read_dev_sector(bdev, 0, §);
if (!data)
return -1;
b = (struct dkblk0 *)data;
if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) {
put_dev_sector(sect);
return 0;
}
slices = be16_to_cpu(b->dk_ios.ios_slccnt);
i = be32_to_cpu(b->dk_ios.ios_slcblk);
put_dev_sector(sect);
data = read_dev_sector(bdev, i, §);
if (!data)
return -1;
slices -= 1; /* last slice is the whole disk */
printk("sysV68: %s(s%u)", state->name, slices);
slice = (struct slice *)data;
for (i = 0; i < slices; i++, slice++) {
if (slot == state->limit)
break;
if (be32_to_cpu(slice->nblocks)) {
put_partition(state, slot,
be32_to_cpu(slice->blkoff),
be32_to_cpu(slice->nblocks));
printk("(s%u)", i);
}
slot++;
}
printk("\n");
put_dev_sector(sect);
return 1;
}
开发者ID:johnny,项目名称:CobraDroidBeta,代码行数:44,代码来源:sysv68.c
示例7: sgi_partition
int sgi_partition(struct parsed_partitions *state, struct block_device *bdev)
{
int i, csum;
__be32 magic;
int slot = 1;
unsigned int start, blocks;
__be32 *ui, cs;
Sector sect;
struct sgi_disklabel *label;
struct sgi_partition *p;
char b[BDEVNAME_SIZE];
label = (struct sgi_disklabel *) read_dev_sector(bdev, 0, §);
if (!label)
return -1;
p = &label->partitions[0];
magic = label->magic_mushroom;
if(be32_to_cpu(magic) != SGI_LABEL_MAGIC) {
/*printk("Dev %s SGI disklabel: bad magic %08x\n",
bdevname(bdev, b), be32_to_cpu(magic));*/
put_dev_sector(sect);
return 0;
}
ui = ((__be32 *) (label + 1)) - 1;
for(csum = 0; ui >= ((__be32 *) label);) {
cs = *ui--;
csum += be32_to_cpu(cs);
}
if(csum) {
printk(KERN_WARNING "Dev %s SGI disklabel: csum bad, label corrupted\n",
bdevname(bdev, b));
put_dev_sector(sect);
return 0;
}
/* All SGI disk labels have 16 partitions, disks under Linux only
* have 15 minor's. Luckily there are always a few zero length
* partitions which we don't care about so we never overflow the
* current_minor.
*/
for(i = 0; i < 16; i++, p++) {
blocks = be32_to_cpu(p->num_blocks);
start = be32_to_cpu(p->first_block);
if (blocks) {
put_partition(state, slot, start, blocks);
if (be32_to_cpu(p->type) == LINUX_RAID_PARTITION)
state->parts[slot].flags = ADDPART_FLAG_RAID;
}
slot++;
}
printk("\n");
put_dev_sector(sect);
return 1;
}
开发者ID:325116067,项目名称:semc-qsd8x50,代码行数:53,代码来源:sgi.c
示例8: emmc_panic_erase
static void emmc_panic_erase(unsigned char *buffer, Sector *sect)
{
struct emmc_ipanic_data *ctx = &drv_ctx;
struct mmc_emergency_info *emmc = ctx->emmc;
unsigned char *read_buf_ptr = buffer;
Sector new_sect;
int rc;
if (!emmc) {
pr_err("%s:invalid emmc infomation\n", __func__);
return;
}
if (!read_buf_ptr || !sect) {
sect = &new_sect;
if (!emmc->bdev) {
pr_err("%s:invalid emmc block device\n",
__func__);
goto out;
}
/* make sure the block device is open rw */
rc = blkdev_get(emmc->bdev, FMODE_READ | FMODE_WRITE, emmc_panic_erase);
if (rc < 0) {
pr_err("%s: blk_dev_get failed!\n", __func__);
goto out;
}
/*read panic header */
read_buf_ptr =
read_dev_sector(emmc->bdev, emmc->start_block, sect);
if (!read_buf_ptr) {
pr_err("%s: read sector error(%llu)!\n",
__func__, (u64) emmc->start_block);
goto out;
}
}
/*write all zero to panic header */
lock_page(sect->v);
memset(read_buf_ptr, 0, SECTOR_SIZE);
set_page_dirty(sect->v);
unlock_page(sect->v);
sync_blockdev(emmc->bdev);
if (!read_buf_ptr)
put_dev_sector(*sect);
out:
memset(&ctx->hdr, 0, SECTOR_SIZE);
return;
}
开发者ID:Katarzynasrom,项目名称:android_kernel_lenovo_spark,代码行数:50,代码来源:emmc_ipanic.c
示例9: solaris_x86_partition
static void
solaris_x86_partition(struct gendisk *hd, struct block_device *bdev,
int minor, int *current_minor)
{
#ifdef CONFIG_SOLARIS_X86_PARTITION
long offset = hd->part[minor].start_sect;
Sector sect;
struct solaris_x86_vtoc *v;
struct solaris_x86_slice *s;
int mask = (1 << hd->minor_shift) - 1;
int i;
char buf[40];
v = (struct solaris_x86_vtoc *)read_dev_sector(bdev, offset+1, §);
if (!v)
return;
if (le32_to_cpu(v->v_sanity) != SOLARIS_X86_VTOC_SANE) {
put_dev_sector(sect);
return;
}
printk(" %s: <solaris:", partition_name(hd, minor, buf));
if (le32_to_cpu(v->v_version) != 1) {
printk(" cannot handle version %d vtoc>\n",
le32_to_cpu(v->v_version));
put_dev_sector(sect);
return;
}
for (i=0; i<SOLARIS_X86_NUMSLICE; i++) {
if ((*current_minor & mask) == 0)
break;
s = &v->v_slice[i];
if (s->s_size == 0)
continue;
printk(" [s%d]", i);
/* solaris partitions are relative to current MS-DOS
* one but add_gd_partition starts relative to sector
* zero of the disk. Therefore, must add the offset
* of the current partition */
add_gd_partition(hd, *current_minor,
le32_to_cpu(s->s_start)+offset,
le32_to_cpu(s->s_size));
(*current_minor)++;
}
put_dev_sector(sect);
printk(" >\n");
#endif
}
开发者ID:liexusong,项目名称:Linux-2.4.16,代码行数:49,代码来源:msdos.c
示例10: read_block
/*
* Uses kernel's function to read sector's data to read the requested block
*/
void read_block(char *dest, size_t size, sector_t block)
{
// Sector size is 512, so we calculate the block's sector index
sector_t sector = block * (dedup_get_block_size() / 512);
Sector sect;
// Read data
void *tmp = read_dev_sector(dedup_bdev, sector, §);
if (!tmp) {
printk(KERN_ERR "failed to read sector.\n");
return;
}
// Copy and release sector
memcpy(dest, (char *)tmp, size);
put_dev_sector(sect);
}
开发者ID:davidsaOpenu,项目名称:dedup,代码行数:20,代码来源:dedup_sysfs.c
示例11: karma_partition
int karma_partition(struct parsed_partitions *state, struct block_device *bdev)
{
int i;
int slot = 1;
Sector sect;
unsigned char *data;
struct disklabel {
u8 d_reserved[270];
struct d_partition {
__le32 p_res;
u8 p_fstype;
u8 p_res2[3];
__le32 p_offset;
__le32 p_size;
} d_partitions[2];
u8 d_blank[208];
__le16 d_magic;
} __attribute__((packed)) *label;
struct d_partition *p;
data = read_dev_sector(bdev, 0, §);
if (!data)
return -1;
label = (struct disklabel *)data;
if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) {
put_dev_sector(sect);
return 0;
}
p = label->d_partitions;
for (i = 0 ; i < 2; i++, p++) {
if (slot == state->limit)
break;
if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) {
put_partition(state, slot, le32_to_cpu(p->p_offset),
le32_to_cpu(p->p_size));
}
slot++;
}
printk("\n");
put_dev_sector(sect);
return 1;
}
开发者ID:274914765,项目名称:C,代码行数:45,代码来源:karma.c
示例12: parse_bsd
/*
* Create devices for BSD partitions listed in a disklabel, under a
* dos-like partition. See parse_extended() for more information.
*/
static void
parse_bsd(struct parsed_partitions *state, struct block_device *bdev,
u32 offset, u32 size, int origin, char *flavour,
int max_partitions)
{
Sector sect;
struct bsd_disklabel *l;
struct bsd_partition *p;
l = (struct bsd_disklabel *)read_dev_sector(bdev, offset+1, §);
if (!l)
return;
if (le32_to_cpu(l->d_magic) != BSD_DISKMAGIC) {
put_dev_sector(sect);
return;
}
printk(" %s%d: <%s:", state->name, origin, flavour);
if (le16_to_cpu(l->d_npartitions) < max_partitions)
max_partitions = le16_to_cpu(l->d_npartitions);
for (p = l->d_partitions; p - l->d_partitions < max_partitions; p++) {
u32 bsd_start, bsd_size;
if (state->next == state->limit)
break;
if (p->p_fstype == BSD_FS_UNUSED)
continue;
bsd_start = le32_to_cpu(p->p_offset);
bsd_size = le32_to_cpu(p->p_size);
if (offset == bsd_start && size == bsd_size)
/* full parent partition, we have it already */
continue;
if (offset > bsd_start || offset+size < bsd_start+bsd_size) {
printk("bad subpartition - ignored\n");
continue;
}
put_partition(state, state->next++, bsd_start, bsd_size);
}
put_dev_sector(sect);
if (le16_to_cpu(l->d_npartitions) > max_partitions)
printk(" (ignored %d more)",
le16_to_cpu(l->d_npartitions) - max_partitions);
printk(" >\n");
}
开发者ID:WiseMan787,项目名称:ralink_sdk,代码行数:48,代码来源:msdos.c
示例13: minix_partition
/*
* Minix 2.0.0/2.0.2 subpartition support.
* Anand Krishnamurthy <[email protected]>
* Rajeev V. Pillai <[email protected]>
*/
static void minix_partition(struct gendisk *hd, struct block_device *bdev,
int minor, int *current_minor)
{
#ifdef CONFIG_MINIX_SUBPARTITION
long offset = hd->part[minor].start_sect;
Sector sect;
unsigned char *data;
struct partition *p;
int mask = (1 << hd->minor_shift) - 1;
int i;
char buf[40];
data = read_dev_sector(bdev, offset, §);
if (!data)
return;
p = (struct partition *)(data + 0x1be);
/* The first sector of a Minix partition can have either
* a secondary MBR describing its subpartitions, or
* the normal boot sector. */
if (msdos_magic_present (data + 510) &&
SYS_IND(p) == MINIX_PARTITION) { /* subpartition table present */
printk(" %s: <minix:", partition_name(hd, minor, buf));
for (i = 0; i < MINIX_NR_SUBPARTITIONS; i++, p++) {
if ((*current_minor & mask) == 0)
break;
/* add each partition in use */
if (SYS_IND(p) == MINIX_PARTITION) {
add_gd_partition(hd, *current_minor,
START_SECT(p), NR_SECTS(p));
(*current_minor)++;
}
}
printk(" >\n");
}
put_dev_sector(sect);
#endif /* CONFIG_MINIX_SUBPARTITION */
}
开发者ID:liexusong,项目名称:Linux-2.4.16,代码行数:45,代码来源:msdos.c
示例14: ultrix_partition
int ultrix_partition(struct parsed_partitions *state, struct block_device *bdev)
{
int i;
Sector sect;
unsigned char *data;
struct ultrix_disklabel {
s32 pt_magic; /* magic no. indicating part. info exits */
s32 pt_valid; /* set by driver if pt is current */
struct pt_info {
s32 pi_nblocks; /* no. of sectors */
u32 pi_blkoff; /* block offset for start */
} pt_part[8];
} *label;
#define PT_MAGIC 0x032957 /* Partition magic number */
#define PT_VALID 1 /* Indicates if struct is valid */
data = read_dev_sector(bdev, (16384 - sizeof(*label))/512, §);
if (!data)
return -1;
label = (struct ultrix_disklabel *)(data + 512 - sizeof(*label));
if (label->pt_magic == PT_MAGIC && label->pt_valid == PT_VALID) {
for (i=0; i<8; i++)
if (label->pt_part[i].pi_nblocks)
put_partition(state, i+1,
label->pt_part[i].pi_blkoff,
label->pt_part[i].pi_nblocks);
put_dev_sector(sect);
printk ("\n");
return 1;
} else {
put_dev_sector(sect);
return 0;
}
}
开发者ID:Antonio-Zhou,项目名称:Linux-2.6.11,代码行数:37,代码来源:ultrix.c
示例15: unixware_partition
/*
* Create devices for Unixware partitions listed in a disklabel, under a
* dos-like partition. See extended_partition() for more information.
*/
static void unixware_partition(struct gendisk *hd, struct block_device *bdev,
int minor, int *current_minor)
{
#ifdef CONFIG_UNIXWARE_DISKLABEL
long offset = hd->part[minor].start_sect;
Sector sect;
struct unixware_disklabel *l;
struct unixware_slice *p;
int mask = (1 << hd->minor_shift) - 1;
char buf[40];
l = (struct unixware_disklabel *)read_dev_sector(bdev, offset+29, §);
if (!l)
return;
if (le32_to_cpu(l->d_magic) != UNIXWARE_DISKMAGIC ||
le32_to_cpu(l->vtoc.v_magic) != UNIXWARE_DISKMAGIC2) {
put_dev_sector(sect);
return;
}
printk(" %s: <unixware:", partition_name(hd, minor, buf));
p = &l->vtoc.v_slice[1];
/* I omit the 0th slice as it is the same as whole disk. */
while (p - &l->vtoc.v_slice[0] < UNIXWARE_NUMSLICE) {
if ((*current_minor & mask) == 0)
break;
if (p->s_label != UNIXWARE_FS_UNUSED) {
add_gd_partition(hd, *current_minor, START_SECT(p),
NR_SECTS(p));
(*current_minor)++;
}
p++;
}
put_dev_sector(sect);
printk(" >\n");
#endif
}
开发者ID:liexusong,项目名称:Linux-2.4.16,代码行数:41,代码来源:msdos.c
示例16: parse_minix
/*
* Minix 2.0.0/2.0.2 subpartition support.
* Anand Krishnamurthy <[email protected]om>
* Rajeev V. Pillai <[email protected]>
*/
static void
parse_minix(struct parsed_partitions *state, struct block_device *bdev,
u32 offset, u32 size, int origin)
{
#ifdef CONFIG_MINIX_SUBPARTITION
Sector sect;
unsigned char *data;
struct partition *p;
int i;
data = read_dev_sector(bdev, offset, §);
if (!data)
return;
p = (struct partition *)(data + 0x1be);
/* The first sector of a Minix partition can have either
* a secondary MBR describing its subpartitions, or
* the normal boot sector. */
if (msdos_magic_present (data + 510) &&
SYS_IND(p) == MINIX_PARTITION) { /* subpartition table present */
printk(" %s%d: <minix:", state->name, origin);
for (i = 0; i < MINIX_NR_SUBPARTITIONS; i++, p++) {
if (state->next == state->limit)
break;
/* add each partition in use */
if (SYS_IND(p) == MINIX_PARTITION)
put_partition(state, state->next++,
START_SECT(p), NR_SECTS(p));
}
printk(" >\n");
}
put_dev_sector(sect);
#endif /* CONFIG_MINIX_SUBPARTITION */
}
开发者ID:WiseMan787,项目名称:ralink_sdk,代码行数:41,代码来源:msdos.c
示例17: parse_extended
static void
parse_extended(struct parsed_partitions *state, struct block_device *bdev,
u32 first_sector, u32 first_size)
{
struct partition *p;
Sector sect;
unsigned char *data;
u32 this_sector, this_size;
int sector_size = bdev_hardsect_size(bdev) / 512;
int loopct = 0; /* number of links followed
without finding a data partition */
int i;
this_sector = first_sector;
this_size = first_size;
while (1) {
if (++loopct > 100)
return;
if (state->next == state->limit)
return;
data = read_dev_sector(bdev, this_sector, §);
if (!data)
return;
if (!msdos_magic_present(data + 510))
goto done;
p = (struct partition *) (data + 0x1be);
/*
* Usually, the first entry is the real data partition,
* the 2nd entry is the next extended partition, or empty,
* and the 3rd and 4th entries are unused.
* However, DRDOS sometimes has the extended partition as
* the first entry (when the data partition is empty),
* and OS/2 seems to use all four entries.
*/
/*
* First process the data partition(s)
*/
for (i=0; i<4; i++, p++) {
u32 offs, size, next;
if (!NR_SECTS(p) || is_extended_partition(p))
continue;
/* Check the 3rd and 4th entries -
these sometimes contain random garbage */
offs = START_SECT(p)*sector_size;
size = NR_SECTS(p)*sector_size;
next = this_sector + offs;
if (i >= 2) {
if (offs + size > this_size)
continue;
if (next < first_sector)
continue;
if (next + size > first_sector + first_size)
continue;
}
put_partition(state, state->next, next, size);
if (SYS_IND(p) == LINUX_RAID_PARTITION)
state->parts[state->next].flags = ADDPART_FLAG_RAID;
loopct = 0;
if (++state->next == state->limit)
goto done;
}
/*
* Next, process the (first) extended partition, if present.
* (So far, there seems to be no reason to make
* parse_extended() recursive and allow a tree
* of extended partitions.)
* It should be a link to the next logical partition.
*/
p -= 4;
for (i=0; i<4; i++, p++)
if (NR_SECTS(p) && is_extended_partition(p))
break;
if (i == 4)
goto done; /* nothing left to do */
this_sector = first_sector + START_SECT(p) * sector_size;
this_size = NR_SECTS(p) * sector_size;
put_dev_sector(sect);
}
done:
put_dev_sector(sect);
}
开发者ID:WiseMan787,项目名称:ralink_sdk,代码行数:89,代码来源:msdos.c
示例18: osf_partition
int osf_partition(struct parsed_partitions *state, struct block_device *bdev)
{
int i;
int slot = 1;
unsigned int npartitions;
Sector sect;
unsigned char *data;
struct disklabel {
__le32 d_magic;
__le16 d_type,d_subtype;
u8 d_typename[16];
u8 d_packname[16];
__le32 d_secsize;
__le32 d_nsectors;
__le32 d_ntracks;
__le32 d_ncylinders;
__le32 d_secpercyl;
__le32 d_secprtunit;
__le16 d_sparespertrack;
__le16 d_sparespercyl;
__le32 d_acylinders;
__le16 d_rpm, d_interleave, d_trackskew, d_cylskew;
__le32 d_headswitch, d_trkseek, d_flags;
__le32 d_drivedata[5];
__le32 d_spare[5];
__le32 d_magic2;
__le16 d_checksum;
__le16 d_npartitions;
__le32 d_bbsize, d_sbsize;
struct d_partition {
__le32 p_size;
__le32 p_offset;
__le32 p_fsize;
u8 p_fstype;
u8 p_frag;
__le16 p_cpg;
} d_partitions[MAX_OSF_PARTITIONS];
} * label;
struct d_partition * partition;
data = read_dev_sector(bdev, 0, §);
if (!data)
return -1;
label = (struct disklabel *) (data+64);
partition = label->d_partitions;
if (le32_to_cpu(label->d_magic) != DISKLABELMAGIC) {
put_dev_sector(sect);
return 0;
}
if (le32_to_cpu(label->d_magic2) != DISKLABELMAGIC) {
put_dev_sector(sect);
return 0;
}
npartitions = le16_to_cpu(label->d_npartitions);
if (npartitions > MAX_OSF_PARTITIONS) {
put_dev_sector(sect);
return 0;
}
for (i = 0 ; i < npartitions; i++, partition++) {
if (slot == state->limit)
break;
if (le32_to_cpu(partition->p_size))
put_partition(state, slot,
le32_to_cpu(partition->p_offset),
le32_to_cpu(partition->p_size));
slot++;
}
printk("\n");
put_dev_sector(sect);
return 1;
}
开发者ID:3null,项目名称:fastsocket,代码行数:72,代码来源:osf.c
示例19: amiga_partition
int
amiga_partition(struct parsed_partitions *state, struct block_device *bdev)
{
Sector sect;
unsigned char *data;
struct RigidDiskBlock *rdb;
struct PartitionBlock *pb;
int start_sect, nr_sects, blk, part, res = 0;
int slot = 1;
char b[BDEVNAME_SIZE];
for (blk = 0; ; blk++, put_dev_sector(sect)) {
if (blk == RDB_ALLOCATION_LIMIT)
goto rdb_done;
data = read_dev_sector(bdev, blk, §);
if (!data) {
if (warn_no_part)
printk("Dev %s: unable to read RDB block %d\n",
bdevname(bdev, b), blk);
goto rdb_done;
}
if (*(u32 *)data != cpu_to_be32(IDNAME_RIGIDDISK))
continue;
rdb = (struct RigidDiskBlock *)data;
if (checksum_block((u32 *)data, be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F) == 0)
break;
/* Try again with 0xdc..0xdf zeroed, Windows might have
* trashed it.
*/
*(u32 *)(data+0xdc) = 0;
if (checksum_block((u32 *)data,
be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F)==0) {
printk("Warning: Trashed word at 0xd0 in block %d "
"ignored in checksum calculation\n",blk);
break;
}
printk("Dev %s: RDB in block %d has bad checksum\n",
bdevname(bdev, b), blk);
}
printk(" RDSK");
blk = be32_to_cpu(rdb->rdb_PartitionList);
put_dev_sector(sect);
for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
data = read_dev_sector(bdev, blk, §);
if (!data) {
if (warn_no_part)
printk("Dev %s: unable to read partition block %d\n",
bdevname(bdev, b), blk);
goto rdb_done;
}
pb = (struct PartitionBlock *)data;
blk = be32_to_cpu(pb->pb_Next);
if (pb->pb_ID != cpu_to_be32(IDNAME_PARTITION))
continue;
if (checksum_block((u32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 )
continue;
/* Tell Kernel about it */
nr_sects = (be32_to_cpu(pb->pb_Environment[10]) + 1 -
be32_to_cpu(pb->pb_Environment[9])) *
be32_to_cpu(pb->pb_Environment[3]) *
be32_to_cpu(pb->pb_Environment[5]);
if (!nr_sects)
continue;
start_sect = be32_to_cpu(pb->pb_Environment[9]) *
be32_to_cpu(pb->pb_Environment[3]) *
be32_to_cpu(pb->pb_Environment[5]);
put_partition(state,slot++,start_sect,nr_sects);
res = 1;
}
printk("\n");
rdb_done:
return res;
}
开发者ID:FelipeFernandes1988,项目名称:Alice-1121-Modem,代码行数:79,代码来源:amiga.c
示例20: handle_ide_mess
/*
* Look for various forms of IDE disk geometry translation
*/
static int handle_ide_mess(struct block_device *bdev)
{
#ifdef CONFIG_BLK_DEV_IDE
Sector sect;
unsigned char *data;
kdev_t dev = to_kdev_t(bdev->bd_dev);
unsigned int sig;
int heads = 0;
struct partition *p;
int i;
/*
* The i386 partition handling programs very often
* make partitions end on cylinder boundaries.
* There is no need to do so, and Linux fdisk doesnt always
* do this, and Windows NT on Alpha doesnt do this either,
* but still, this helps to guess #heads.
*/
data = read_dev_sector(bdev, 0, §);
if (!data)
return -1;
if (!msdos_magic_present(data + 510)) {
put_dev_sector(sect);
return 0;
}
sig = le16_to_cpu(*(unsigned short *)(data + 2));
p = (struct partition *) (data + 0x1be);
for (i = 0; i < 4; i++) {
struct partition *q = &p[i];
if (NR_SECTS(q)) {
if ((q->sector & 63) == 1 &&
(q->end_sector & 63) == 63)
heads = q->end_head + 1;
break;
}
}
if (SYS_IND(p) == EZD_PARTITION) {
/*
* Accesses to sector 0 must go to sector 1 instead.
*/
if (ide_xlate_1024(dev, -1, heads, " [EZD]"))
goto reread;
} else if (SYS_IND(p) == DM6_PARTITION) {
/*
* Everything on the disk is offset by 63 sectors,
* including a "new" MBR with its own partition table.
*/
if (ide_xlate_1024(dev, 1, heads, " [DM6:DDO]"))
goto reread;
} else if (sig <= 0x1ae &&
data[sig] == 0xAA && data[sig+1] == 0x55 &&
(data[sig+2] & 1)) {
/* DM6 signature in MBR, courtesy of OnTrack */
(void) ide_xlate_1024 (dev, 0, heads, " [DM6:MBR]");
} else if (SYS_IND(p) == DM6_AUX1PARTITION ||
SYS_IND(p) == DM6_AUX3PARTITION) {
/*
* DM6 on other than the first (boot) drive
*/
(void) ide_xlate_1024(dev, 0, heads, " [DM6:AUX]");
} else {
(void) ide_xlate_1024(dev, 2, heads, " [PTBL]");
}
put_dev_sector(sect);
return 1;
reread:
put_dev_sector(sect);
/* Flush the cache */
invalidate_bdev(bdev, 1);
truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
#endif /* CONFIG_BLK_DEV_IDE */
return 1;
}
开发者ID:liexusong,项目名称:Linux-2.4.16,代码行数:77,代码来源:msdos.c
注:本文中的read_dev_sector函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论