/*TODO: Maybe use kmem_cach per sbi of size
* exofs_io_state_size(sbi->s_numdevs)
*/
- ios = kzalloc(exofs_io_state_size(1), GFP_KERNEL);
+ ios = kzalloc(exofs_io_state_size(sbi->s_numdevs), GFP_KERNEL);
if (unlikely(!ios)) {
*pios = NULL;
return -ENOMEM;
{
int i, ret;
- for (i = 0; i < 1; i++) {
+ for (i = 0; i < ios->sbi->s_numdevs; i++) {
struct osd_request *or;
- or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL);
+ or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
if (unlikely(!or)) {
EXOFS_ERR("%s: osd_start_request failed\n", __func__);
ret = -ENOMEM;
{
int i, ret;
- for (i = 0; i < 1; i++) {
+ for (i = 0; i < ios->sbi->s_numdevs; i++) {
struct osd_request *or;
- or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL);
+ or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
if (unlikely(!or)) {
EXOFS_ERR("%s: osd_start_request failed\n", __func__);
ret = -ENOMEM;
{
int i, ret;
- for (i = 0; i < 1; i++) {
+ for (i = 0; i < ios->sbi->s_numdevs; i++) {
struct osd_request *or;
- or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL);
+ or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
if (unlikely(!or)) {
EXOFS_ERR("%s: osd_start_request failed\n", __func__);
ret = -ENOMEM;
if (ios->bio) {
struct bio *bio;
- bio = ios->bio;
+ if (i != 0) {
+ bio = bio_kmalloc(GFP_KERNEL,
+ ios->bio->bi_max_vecs);
+ if (unlikely(!bio)) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ __bio_clone(bio, ios->bio);
+ bio->bi_bdev = NULL;
+ bio->bi_next = NULL;
+ ios->per_dev[i].bio = bio;
+ } else {
+ bio = ios->bio;
+ }
osd_req_write(or, &ios->obj, ios->offset, bio,
ios->length);
for (i = 0; i < 1; i++) {
struct osd_request *or;
+ unsigned first_dev = (unsigned)ios->obj.id;
- or = osd_start_request(ios->sbi->s_dev, GFP_KERNEL);
+ first_dev %= ios->sbi->s_numdevs;
+ or = osd_start_request(ios->sbi->s_ods[first_dev], GFP_KERNEL);
if (unlikely(!or)) {
EXOFS_ERR("%s: osd_start_request failed\n", __func__);
ret = -ENOMEM;
attr = g_attr_logical_length;
attr.val_ptr = &newsize;
- for (i = 0; i < 1; i++) {
+ for (i = 0; i < sbi->s_numdevs; i++) {
struct osd_request *or;
- or = osd_start_request(sbi->s_dev, GFP_KERNEL);
+ or = osd_start_request(sbi->s_ods[i], GFP_KERNEL);
if (unlikely(!or)) {
EXOFS_ERR("%s: osd_start_request failed\n", __func__);
ret = -ENOMEM;