diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2011-09-28 07:43:09 -0400 |
---|---|---|
committer | Boaz Harrosh <bharrosh@panasas.com> | 2011-10-04 06:13:59 -0400 |
commit | d866d875f68fdeae63df334d291fe138dc636d96 (patch) | |
tree | 9606674db2311ab869640526ef245aaa7fbf4ea8 /include/scsi | |
parent | eb507bc18969f63b8968034144fd69706c492516 (diff) |
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>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/osd_ore.h | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h index e4d550faa7c9..8fefdfbb1ced 100644 --- a/include/scsi/osd_ore.h +++ b/include/scsi/osd_ore.h | |||
@@ -44,6 +44,10 @@ struct ore_layout { | |||
44 | unsigned group_count; | 44 | unsigned group_count; |
45 | }; | 45 | }; |
46 | 46 | ||
47 | struct ore_dev { | ||
48 | struct osd_dev *od; | ||
49 | }; | ||
50 | |||
47 | struct ore_components { | 51 | struct ore_components { |
48 | unsigned numdevs; /* Num of devices in array */ | 52 | unsigned numdevs; /* Num of devices in array */ |
49 | /* If @single_comp == EC_SINGLE_COMP, @comps points to a single | 53 | /* If @single_comp == EC_SINGLE_COMP, @comps points to a single |
@@ -53,9 +57,29 @@ struct ore_components { | |||
53 | EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff | 57 | EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff |
54 | } single_comp; | 58 | } single_comp; |
55 | struct ore_comp *comps; | 59 | struct ore_comp *comps; |
56 | struct osd_dev **ods; /* osd_dev array */ | 60 | |
61 | /* Array of pointers to ore_dev-* . User will usually have these pointed | ||
62 | * too a bigger struct which contain an "ore_dev ored" member and use | ||
63 | * container_of(oc->ods[i], struct foo_dev, ored) to access the bigger | ||
64 | * structure. | ||
65 | */ | ||
66 | struct ore_dev **ods; | ||
57 | }; | 67 | }; |
58 | 68 | ||
69 | /* ore_comp_dev Recievies a logical device index */ | ||
70 | static inline struct osd_dev *ore_comp_dev( | ||
71 | const struct ore_components *oc, unsigned i) | ||
72 | { | ||
73 | BUG_ON(oc->numdevs <= i); | ||
74 | return oc->ods[i]->od; | ||
75 | } | ||
76 | |||
77 | static inline void ore_comp_set_dev( | ||
78 | struct ore_components *oc, unsigned i, struct osd_dev *od) | ||
79 | { | ||
80 | oc->ods[i]->od = od; | ||
81 | } | ||
82 | |||
59 | struct ore_striping_info { | 83 | struct ore_striping_info { |
60 | u64 obj_offset; | 84 | u64 obj_offset; |
61 | u64 group_length; | 85 | u64 group_length; |