aboutsummaryrefslogtreecommitdiffstats
path: root/fs/exofs/ios.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/exofs/ios.c')
-rw-r--r--fs/exofs/ios.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/fs/exofs/ios.c b/fs/exofs/ios.c
index bb2f9d341fdf..5bad01fa1f9f 100644
--- a/fs/exofs/ios.c
+++ b/fs/exofs/ios.c
@@ -71,7 +71,7 @@ int exofs_get_io_state(struct exofs_sb_info *sbi, struct exofs_io_state** pios)
71 /*TODO: Maybe use kmem_cach per sbi of size 71 /*TODO: Maybe use kmem_cach per sbi of size
72 * exofs_io_state_size(sbi->s_numdevs) 72 * exofs_io_state_size(sbi->s_numdevs)
73 */ 73 */
74 ios = kzalloc(exofs_io_state_size(1), GFP_KERNEL); 74 ios = kzalloc(exofs_io_state_size(sbi->s_numdevs), GFP_KERNEL);
75 if (unlikely(!ios)) { 75 if (unlikely(!ios)) {
76 *pios = NULL; 76 *pios = NULL;
77 return -ENOMEM; 77 return -ENOMEM;
@@ -209,10 +209,10 @@ int exofs_sbi_create(struct exofs_io_state *ios)
209{ 209{
210 int i, ret; 210 int i, ret;
211 211
212 for (i = 0; i < 1; i++) { 212 for (i = 0; i < ios->sbi->s_numdevs; i++) {
213 struct osd_request *or; 213 struct osd_request *or;
214 214
215 or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL); 215 or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
216 if (unlikely(!or)) { 216 if (unlikely(!or)) {
217 EXOFS_ERR("%s: osd_start_request failed\n", __func__); 217 EXOFS_ERR("%s: osd_start_request failed\n", __func__);
218 ret = -ENOMEM; 218 ret = -ENOMEM;
@@ -233,10 +233,10 @@ int exofs_sbi_remove(struct exofs_io_state *ios)
233{ 233{
234 int i, ret; 234 int i, ret;
235 235
236 for (i = 0; i < 1; i++) { 236 for (i = 0; i < ios->sbi->s_numdevs; i++) {
237 struct osd_request *or; 237 struct osd_request *or;
238 238
239 or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL); 239 or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
240 if (unlikely(!or)) { 240 if (unlikely(!or)) {
241 EXOFS_ERR("%s: osd_start_request failed\n", __func__); 241 EXOFS_ERR("%s: osd_start_request failed\n", __func__);
242 ret = -ENOMEM; 242 ret = -ENOMEM;
@@ -257,10 +257,10 @@ int exofs_sbi_write(struct exofs_io_state *ios)
257{ 257{
258 int i, ret; 258 int i, ret;
259 259
260 for (i = 0; i < 1; i++) { 260 for (i = 0; i < ios->sbi->s_numdevs; i++) {
261 struct osd_request *or; 261 struct osd_request *or;
262 262
263 or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL); 263 or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
264 if (unlikely(!or)) { 264 if (unlikely(!or)) {
265 EXOFS_ERR("%s: osd_start_request failed\n", __func__); 265 EXOFS_ERR("%s: osd_start_request failed\n", __func__);
266 ret = -ENOMEM; 266 ret = -ENOMEM;
@@ -272,7 +272,21 @@ int exofs_sbi_write(struct exofs_io_state *ios)
272 if (ios->bio) { 272 if (ios->bio) {
273 struct bio *bio; 273 struct bio *bio;
274 274
275 bio = ios->bio; 275 if (i != 0) {
276 bio = bio_kmalloc(GFP_KERNEL,
277 ios->bio->bi_max_vecs);
278 if (unlikely(!bio)) {
279 ret = -ENOMEM;
280 goto out;
281 }
282
283 __bio_clone(bio, ios->bio);
284 bio->bi_bdev = NULL;
285 bio->bi_next = NULL;
286 ios->per_dev[i].bio = bio;
287 } else {
288 bio = ios->bio;
289 }
276 290
277 osd_req_write(or, &ios->obj, ios->offset, bio, 291 osd_req_write(or, &ios->obj, ios->offset, bio,
278 ios->length); 292 ios->length);
@@ -306,8 +320,10 @@ int exofs_sbi_read(struct exofs_io_state *ios)
306 320
307 for (i = 0; i < 1; i++) { 321 for (i = 0; i < 1; i++) {
308 struct osd_request *or; 322 struct osd_request *or;
323 unsigned first_dev = (unsigned)ios->obj.id;
309 324
310 or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL); 325 first_dev %= ios->sbi->s_numdevs;
326 or = osd_start_request(ios->sbi->s_ods[first_dev], GFP_KERNEL);
311 if (unlikely(!or)) { 327 if (unlikely(!or)) {
312 EXOFS_ERR("%s: osd_start_request failed\n", __func__); 328 EXOFS_ERR("%s: osd_start_request failed\n", __func__);
313 ret = -ENOMEM; 329 ret = -ENOMEM;
@@ -382,10 +398,10 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
382 attr = g_attr_logical_length; 398 attr = g_attr_logical_length;
383 attr.val_ptr = &newsize; 399 attr.val_ptr = &newsize;
384 400
385 for (i = 0; i < 1; i++) { 401 for (i = 0; i < sbi->s_numdevs; i++) {
386 struct osd_request *or; 402 struct osd_request *or;
387 403
388 or = osd_start_request(sbi->s_dev, GFP_KERNEL); 404 or = osd_start_request(sbi->s_ods[i], GFP_KERNEL);
389 if (unlikely(!or)) { 405 if (unlikely(!or)) {
390 EXOFS_ERR("%s: osd_start_request failed\n", __func__); 406 EXOFS_ERR("%s: osd_start_request failed\n", __func__);
391 ret = -ENOMEM; 407 ret = -ENOMEM;