aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2011-09-28 07:43:09 -0400
committerBoaz Harrosh <bharrosh@panasas.com>2011-10-04 06:13:59 -0400
commitd866d875f68fdeae63df334d291fe138dc636d96 (patch)
tree9606674db2311ab869640526ef245aaa7fbf4ea8 /include/scsi
parenteb507bc18969f63b8968034144fd69706c492516 (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.h26
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
47struct ore_dev {
48 struct osd_dev *od;
49};
50
47struct ore_components { 51struct 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 */
70static 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
77static 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
59struct ore_striping_info { 83struct ore_striping_info {
60 u64 obj_offset; 84 u64 obj_offset;
61 u64 group_length; 85 u64 group_length;