/*__u64 lba_offset[0]; LBA offset in each phys. Note extents in a
bvd are always the same size */
};
+#define LBA_OFFSET(ddf, vd) ((__u64 *) &(vd)->phys_refnum[(ddf)->mppe])
/* vd_config.cache_pol[7] is a bitmap */
#define DDF_cache_writeback 1 /* else writethrough */
char space[512];
struct {
struct vcl *next;
- __u64 *lba_offset; /* location in 'conf' of
- * the lba table */
unsigned int vcnum; /* index into ->virt */
struct vd_config **other_bvds;
__u64 *block_sizes; /* NULL if all the same */
dl->vlist[vnum++] = vcl;
}
memcpy(&vcl->conf, vd, super->conf_rec_len*512);
- vcl->lba_offset = (__u64*)
- &vcl->conf.phys_refnum[super->mppe];
-
for (i=0; i < max_virt_disks ; i++)
if (memcmp(super->virt->entries[i].guid,
vcl->conf.guid, DDF_GUID_LEN)==0)
info->custom_array_size = 0;
if (cd >= 0 && (unsigned)cd < ddf->mppe) {
- info->data_offset = __be64_to_cpu(vc->lba_offset[cd]);
+ info->data_offset =
+ __be64_to_cpu(LBA_OFFSET(ddf, &vc->conf)[cd]);
if (vc->block_sizes)
info->component_size = vc->block_sizes[cd];
else
for (j = 0; j < v->conf.prim_elmnt_count; j++)
if (v->conf.phys_refnum[j] == dl->disk.refnum) {
/* This device plays role 'j' in 'v'. */
- rv[n].start = __be64_to_cpu(v->lba_offset[j]);
+ rv[n].start = __be64_to_cpu(
+ LBA_OFFSET(ddf, &v->conf)[j]);
rv[n].size = __be64_to_cpu(v->conf.blocks);
n++;
break;
pr_err("%s could not allocate vd_config\n", __func__);
return 0;
}
- vcl->lba_offset = (__u64*) &vcl->conf.phys_refnum[ddf->mppe];
vcl->vcnum = venum;
vcl->block_sizes = NULL; /* FIXME not for CONCAT */
vc = &vcl->conf;
return;
vc = &ddf->currentconf->conf;
- lba_offset = ddf->currentconf->lba_offset;
+ lba_offset = LBA_OFFSET(ddf, &ddf->currentconf->conf);
ex = get_extents(ddf, dl);
if (!ex)
struct dl *d;
const struct vd_config *bvd;
unsigned int iphys;
- __u64 *lba_offset;
int stt;
if (ddf->phys->entries[pd].refnum == 0xFFFFFFFF)
dev->recovery_start = MaxSector;
dev->events = __be32_to_cpu(ddf->primary.seq);
- lba_offset = (__u64 *)&bvd->phys_refnum[ddf->mppe];
- dev->data_offset = __be64_to_cpu(lba_offset[iphys]);
+ dev->data_offset =
+ __be64_to_cpu(LBA_OFFSET(ddf, bvd)[iphys]);
dev->component_size = __be64_to_cpu(bvd->blocks);
if (d->devname)
strcpy(dev->name, d->devname);
free(vl1);
return 3;
}
- vl1->lba_offset = (__u64 *)
- &vl1->conf.phys_refnum[first->mppe];
for (vd = 0; vd < max_vds; vd++)
if (!memcmp(first->virt->entries[vd].guid,
vl1->conf.guid, DDF_GUID_LEN))
dprintf("%s: array %u disk %u ref %08x pd %d\n",
__func__, inst, n_bvd, vc->phys_refnum[n_bvd], pd);
if ((state & DS_INSYNC) && ! (state & DS_FAULTY)) {
- __u64 *lba_offset;
pd = dl->pdnum; /* FIXME: is this really correct ? */
vc->phys_refnum[n_bvd] = dl->disk.refnum;
- lba_offset = (__u64 *)&vc->phys_refnum[ddf->mppe];
- lba_offset[n_bvd] = mdi->data_offset;
+ LBA_OFFSET(ddf, vc)[n_bvd] =
+ __cpu_to_be64(mdi->data_offset);
ddf->phys->entries[pd].type &=
~__cpu_to_be16(DDF_Global_Spare);
ddf->phys->entries[pd].type |=
update->space = NULL;
vcl->next = ddf->conflist;
memcpy(&vcl->conf, vc, update->len);
- vcl->lba_offset = (__u64*)
- &vcl->conf.phys_refnum[mppe];
ent = find_vde_by_guid(ddf, vc->guid);
if (ent == DDF_NOTFOUND)
return;
int i;
struct vcl *vcl;
struct vd_config *vc;
- __u64 *lba;
unsigned int n_bvd;
for (d = a->info.devs ; d ; d = d->next) {
memcpy(mu->buf, vc, ddf->conf_rec_len * 512);
vc = (struct vd_config*)mu->buf;
- lba = (__u64*)&vc->phys_refnum[ddf->mppe];
for (di = rv ; di ; di = di->next) {
vc->phys_refnum[di->disk.raid_disk] =
ddf->phys->entries[dl->pdnum].refnum;
- lba[di->disk.raid_disk] = di->data_offset;
+ LBA_OFFSET(ddf, vc)[di->disk.raid_disk]
+ = __cpu_to_be64(di->data_offset);
}
*updates = mu;
return rv;