You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
ore/exofs: Change the type of the devices array (API change)
In the pNFS obj-LD the device table at the layout level needs to point to a device_cache node, where it is possible and likely that many layouts will point to the same device-nodes. In Exofs we have a more orderly structure where we have a single array of devices that repeats twice for a round-robin view of the device table This patch moves to a model that can be used by the pNFS obj-LD where struct ore_components holds an array of ore_dev-pointers. (ore_dev is newly defined and contains a struct osd_dev *od member) Each pointer in the array of pointers will point to a bigger user-defined dev_struct. That can be accessed by use of the container_of macro. In Exofs an __alloc_dev_table() function allocates the ore_dev-pointers array as well as an exofs_dev array, in one allocation and does the addresses dance to set everything pointing correctly. It still keeps the double allocation trick for the inodes round-robin view of the table. The device table is always allocated dynamically, also for the single device case. So it is unconditionally freed at umount. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
+25
-1
@@ -44,6 +44,10 @@ struct ore_layout {
|
||||
unsigned group_count;
|
||||
};
|
||||
|
||||
struct ore_dev {
|
||||
struct osd_dev *od;
|
||||
};
|
||||
|
||||
struct ore_components {
|
||||
unsigned numdevs; /* Num of devices in array */
|
||||
/* If @single_comp == EC_SINGLE_COMP, @comps points to a single
|
||||
@@ -53,9 +57,29 @@ struct ore_components {
|
||||
EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff
|
||||
} single_comp;
|
||||
struct ore_comp *comps;
|
||||
struct osd_dev **ods; /* osd_dev array */
|
||||
|
||||
/* Array of pointers to ore_dev-* . User will usually have these pointed
|
||||
* too a bigger struct which contain an "ore_dev ored" member and use
|
||||
* container_of(oc->ods[i], struct foo_dev, ored) to access the bigger
|
||||
* structure.
|
||||
*/
|
||||
struct ore_dev **ods;
|
||||
};
|
||||
|
||||
/* ore_comp_dev Recievies a logical device index */
|
||||
static inline struct osd_dev *ore_comp_dev(
|
||||
const struct ore_components *oc, unsigned i)
|
||||
{
|
||||
BUG_ON(oc->numdevs <= i);
|
||||
return oc->ods[i]->od;
|
||||
}
|
||||
|
||||
static inline void ore_comp_set_dev(
|
||||
struct ore_components *oc, unsigned i, struct osd_dev *od)
|
||||
{
|
||||
oc->ods[i]->od = od;
|
||||
}
|
||||
|
||||
struct ore_striping_info {
|
||||
u64 obj_offset;
|
||||
u64 group_length;
|
||||
|
||||
Reference in New Issue
Block a user