diff options
Diffstat (limited to 'fs/nfs/objlayout/objio_osd.c')
-rw-r--r-- | fs/nfs/objlayout/objio_osd.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c index 55d01280a609..4bff4a3dab46 100644 --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c | |||
@@ -137,6 +137,7 @@ static int objio_devices_lookup(struct pnfs_layout_hdr *pnfslay, | |||
137 | struct objio_dev_ent *ode; | 137 | struct objio_dev_ent *ode; |
138 | struct osd_dev *od; | 138 | struct osd_dev *od; |
139 | struct osd_dev_info odi; | 139 | struct osd_dev_info odi; |
140 | bool retry_flag = true; | ||
140 | int err; | 141 | int err; |
141 | 142 | ||
142 | ode = _dev_list_find(NFS_SERVER(pnfslay->plh_inode), d_id); | 143 | ode = _dev_list_find(NFS_SERVER(pnfslay->plh_inode), d_id); |
@@ -171,10 +172,18 @@ static int objio_devices_lookup(struct pnfs_layout_hdr *pnfslay, | |||
171 | goto out; | 172 | goto out; |
172 | } | 173 | } |
173 | 174 | ||
175 | retry_lookup: | ||
174 | od = osduld_info_lookup(&odi); | 176 | od = osduld_info_lookup(&odi); |
175 | if (unlikely(IS_ERR(od))) { | 177 | if (unlikely(IS_ERR(od))) { |
176 | err = PTR_ERR(od); | 178 | err = PTR_ERR(od); |
177 | dprintk("%s: osduld_info_lookup => %d\n", __func__, err); | 179 | dprintk("%s: osduld_info_lookup => %d\n", __func__, err); |
180 | if (err == -ENODEV && retry_flag) { | ||
181 | err = objlayout_autologin(deviceaddr); | ||
182 | if (likely(!err)) { | ||
183 | retry_flag = false; | ||
184 | goto retry_lookup; | ||
185 | } | ||
186 | } | ||
178 | goto out; | 187 | goto out; |
179 | } | 188 | } |
180 | 189 | ||
@@ -205,25 +214,36 @@ static void copy_single_comp(struct ore_components *oc, unsigned c, | |||
205 | int __alloc_objio_seg(unsigned numdevs, gfp_t gfp_flags, | 214 | int __alloc_objio_seg(unsigned numdevs, gfp_t gfp_flags, |
206 | struct objio_segment **pseg) | 215 | struct objio_segment **pseg) |
207 | { | 216 | { |
208 | struct __alloc_objio_segment { | 217 | /* This is the in memory structure of the objio_segment |
209 | struct objio_segment olseg; | 218 | * |
210 | struct ore_dev *ods[numdevs]; | 219 | * struct __alloc_objio_segment { |
211 | struct ore_comp comps[numdevs]; | 220 | * struct objio_segment olseg; |
212 | } *aolseg; | 221 | * struct ore_dev *ods[numdevs]; |
213 | 222 | * struct ore_comp comps[numdevs]; | |
214 | aolseg = kzalloc(sizeof(*aolseg), gfp_flags); | 223 | * } *aolseg; |
215 | if (unlikely(!aolseg)) { | 224 | * NOTE: The code as above compiles and runs perfectly. It is elegant, |
225 | * type safe and compact. At some Past time Linus has decided he does not | ||
226 | * like variable length arrays, For the sake of this principal we uglify | ||
227 | * the code as below. | ||
228 | */ | ||
229 | struct objio_segment *lseg; | ||
230 | size_t lseg_size = sizeof(*lseg) + | ||
231 | numdevs * sizeof(lseg->oc.ods[0]) + | ||
232 | numdevs * sizeof(*lseg->oc.comps); | ||
233 | |||
234 | lseg = kzalloc(lseg_size, gfp_flags); | ||
235 | if (unlikely(!lseg)) { | ||
216 | dprintk("%s: Faild allocation numdevs=%d size=%zd\n", __func__, | 236 | dprintk("%s: Faild allocation numdevs=%d size=%zd\n", __func__, |
217 | numdevs, sizeof(*aolseg)); | 237 | numdevs, lseg_size); |
218 | return -ENOMEM; | 238 | return -ENOMEM; |
219 | } | 239 | } |
220 | 240 | ||
221 | aolseg->olseg.oc.numdevs = numdevs; | 241 | lseg->oc.numdevs = numdevs; |
222 | aolseg->olseg.oc.single_comp = EC_MULTPLE_COMPS; | 242 | lseg->oc.single_comp = EC_MULTPLE_COMPS; |
223 | aolseg->olseg.oc.comps = aolseg->comps; | 243 | lseg->oc.ods = (void *)(lseg + 1); |
224 | aolseg->olseg.oc.ods = aolseg->ods; | 244 | lseg->oc.comps = (void *)(lseg->oc.ods + numdevs); |
225 | 245 | ||
226 | *pseg = &aolseg->olseg; | 246 | *pseg = lseg; |
227 | return 0; | 247 | return 0; |
228 | } | 248 | } |
229 | 249 | ||
@@ -582,10 +602,10 @@ objlayout_init(void) | |||
582 | 602 | ||
583 | if (ret) | 603 | if (ret) |
584 | printk(KERN_INFO | 604 | printk(KERN_INFO |
585 | "%s: Registering OSD pNFS Layout Driver failed: error=%d\n", | 605 | "NFS: %s: Registering OSD pNFS Layout Driver failed: error=%d\n", |
586 | __func__, ret); | 606 | __func__, ret); |
587 | else | 607 | else |
588 | printk(KERN_INFO "%s: Registered OSD pNFS Layout Driver\n", | 608 | printk(KERN_INFO "NFS: %s: Registered OSD pNFS Layout Driver\n", |
589 | __func__); | 609 | __func__); |
590 | return ret; | 610 | return ret; |
591 | } | 611 | } |
@@ -594,7 +614,7 @@ static void __exit | |||
594 | objlayout_exit(void) | 614 | objlayout_exit(void) |
595 | { | 615 | { |
596 | pnfs_unregister_layoutdriver(&objlayout_type); | 616 | pnfs_unregister_layoutdriver(&objlayout_type); |
597 | printk(KERN_INFO "%s: Unregistered OSD pNFS Layout Driver\n", | 617 | printk(KERN_INFO "NFS: %s: Unregistered OSD pNFS Layout Driver\n", |
598 | __func__); | 618 | __func__); |
599 | } | 619 | } |
600 | 620 | ||