]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - fs/exofs/ios.c
exofs: unindent exofs_sbi_read
[net-next-2.6.git] / fs / exofs / ios.c
index 5bad01fa1f9fad6cbe74b2afe500c14c95221a57..4f679317ca54a39b49d45bf8446895993b620d7b 100644 (file)
@@ -26,6 +26,9 @@
 
 #include "exofs.h"
 
+#define EXOFS_DBGMSG2(M...) do {} while (0)
+/* #define EXOFS_DBGMSG2 EXOFS_DBGMSG */
+
 void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], const struct osd_obj_id *obj)
 {
        osd_sec_init_nosec_doall_caps(cred_a, obj, false, true);
@@ -64,21 +67,24 @@ out:
        return ret;
 }
 
-int exofs_get_io_state(struct exofs_sb_info *sbi, struct exofs_io_state** pios)
+int exofs_get_io_state(struct exofs_layout *layout,
+                      struct exofs_io_state **pios)
 {
        struct exofs_io_state *ios;
 
        /*TODO: Maybe use kmem_cach per sbi of size
-        * exofs_io_state_size(sbi->s_numdevs)
+        * exofs_io_state_size(layout->s_numdevs)
         */
-       ios = kzalloc(exofs_io_state_size(sbi->s_numdevs), GFP_KERNEL);
+       ios = kzalloc(exofs_io_state_size(layout->s_numdevs), GFP_KERNEL);
        if (unlikely(!ios)) {
+               EXOFS_DBGMSG("Faild kzalloc bytes=%d\n",
+                            exofs_io_state_size(layout->s_numdevs));
                *pios = NULL;
                return -ENOMEM;
        }
 
-       ios->sbi = sbi;
-       ios->obj.partition = sbi->s_pid;
+       ios->layout = layout;
+       ios->obj.partition = layout->s_pid;
        *pios = ios;
        return 0;
 }
@@ -168,6 +174,21 @@ static int exofs_io_execute(struct exofs_io_state *ios)
        return ret;
 }
 
+static void _clear_bio(struct bio *bio)
+{
+       struct bio_vec *bv;
+       unsigned i;
+
+       __bio_for_each_segment(bv, bio, i, 0) {
+               unsigned this_count = bv->bv_len;
+
+               if (likely(PAGE_SIZE == this_count))
+                       clear_highpage(bv->bv_page);
+               else
+                       zero_user(bv->bv_page, bv->bv_offset, this_count);
+       }
+}
+
 int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
 {
        enum osd_err_priority acumulated_osd_err = 0;
@@ -176,16 +197,25 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
 
        for (i = 0; i < ios->numdevs; i++) {
                struct osd_sense_info osi;
-               int ret = osd_req_decode_sense(ios->per_dev[i].or, &osi);
+               struct osd_request *or = ios->per_dev[i].or;
+               int ret;
+
+               if (unlikely(!or))
+                       continue;
 
+               ret = osd_req_decode_sense(or, &osi);
                if (likely(!ret))
                        continue;
 
-               if (unlikely(ret == -EFAULT)) {
-                       EXOFS_DBGMSG("%s: EFAULT Need page clear\n", __func__);
-                       /*FIXME: All the pages in this device range should:
-                        *      clear_highpage(page);
-                        */
+               if (OSD_ERR_PRI_CLEAR_PAGES == osi.osd_err_pri) {
+                       /* start read offset passed endof file */
+                       _clear_bio(ios->per_dev[i].bio);
+                       EXOFS_DBGMSG("start read offset passed end of file "
+                               "offset=0x%llx, length=0x%llx\n",
+                               _LLU(ios->offset),
+                               _LLU(ios->length));
+
+                       continue; /* we recovered */
                }
 
                if (osi.osd_err_pri >= acumulated_osd_err) {
@@ -209,10 +239,10 @@ int exofs_sbi_create(struct exofs_io_state *ios)
 {
        int i, ret;
 
-       for (i = 0; i < ios->sbi->s_numdevs; i++) {
+       for (i = 0; i < ios->layout->s_numdevs; i++) {
                struct osd_request *or;
 
-               or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
+               or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL);
                if (unlikely(!or)) {
                        EXOFS_ERR("%s: osd_start_request failed\n", __func__);
                        ret = -ENOMEM;
@@ -233,10 +263,10 @@ int exofs_sbi_remove(struct exofs_io_state *ios)
 {
        int i, ret;
 
-       for (i = 0; i < ios->sbi->s_numdevs; i++) {
+       for (i = 0; i < ios->layout->s_numdevs; i++) {
                struct osd_request *or;
 
-               or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
+               or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL);
                if (unlikely(!or)) {
                        EXOFS_ERR("%s: osd_start_request failed\n", __func__);
                        ret = -ENOMEM;
@@ -257,10 +287,10 @@ int exofs_sbi_write(struct exofs_io_state *ios)
 {
        int i, ret;
 
-       for (i = 0; i < ios->sbi->s_numdevs; i++) {
+       for (i = 0; i < ios->layout->s_numdevs; i++) {
                struct osd_request *or;
 
-               or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL);
+               or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL);
                if (unlikely(!or)) {
                        EXOFS_ERR("%s: osd_start_request failed\n", __func__);
                        ret = -ENOMEM;
@@ -276,6 +306,9 @@ int exofs_sbi_write(struct exofs_io_state *ios)
                                bio = bio_kmalloc(GFP_KERNEL,
                                                  ios->bio->bi_max_vecs);
                                if (unlikely(!bio)) {
+                                       EXOFS_DBGMSG(
+                                             "Faild to allocate BIO size=%u\n",
+                                             ios->bio->bi_max_vecs);
                                        ret = -ENOMEM;
                                        goto out;
                                }
@@ -290,14 +323,21 @@ int exofs_sbi_write(struct exofs_io_state *ios)
 
                        osd_req_write(or, &ios->obj, ios->offset, bio,
                                      ios->length);
-/*                     EXOFS_DBGMSG("write sync=%d\n", sync);*/
+                       EXOFS_DBGMSG("write(0x%llx) offset=0x%llx "
+                                     "length=0x%llx dev=%d\n",
+                                    _LLU(ios->obj.id), _LLU(ios->offset),
+                                    _LLU(ios->length), i);
                } else if (ios->kern_buff) {
                        osd_req_write_kern(or, &ios->obj, ios->offset,
                                           ios->kern_buff, ios->length);
-/*                     EXOFS_DBGMSG("write_kern sync=%d\n", sync);*/
+                       EXOFS_DBGMSG2("write_kern(0x%llx) offset=0x%llx "
+                                     "length=0x%llx dev=%d\n",
+                                    _LLU(ios->obj.id), _LLU(ios->offset),
+                                    _LLU(ios->length), i);
                } else {
                        osd_req_set_attributes(or, &ios->obj);
-/*                     EXOFS_DBGMSG("set_attributes sync=%d\n", sync);*/
+                       EXOFS_DBGMSG2("obj(0x%llx) set_attributes=%d dev=%d\n",
+                                    _LLU(ios->obj.id), ios->out_attr_len, i);
                }
 
                if (ios->out_attr)
@@ -316,47 +356,48 @@ out:
 
 int exofs_sbi_read(struct exofs_io_state *ios)
 {
-       int i, ret;
-
-       for (i = 0; i < 1; i++) {
-               struct osd_request *or;
-               unsigned first_dev = (unsigned)ios->obj.id;
-
-               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;
-                       goto out;
-               }
-               ios->per_dev[i].or = or;
-               ios->numdevs++;
+       struct osd_request *or;
+       struct exofs_per_dev_state *per_dev = &ios->per_dev[0];
+       unsigned first_dev = (unsigned)ios->obj.id;
 
-               if (ios->bio) {
-                       osd_req_read(or, &ios->obj, ios->offset, ios->bio,
-                                    ios->length);
-/*                     EXOFS_DBGMSG("read sync=%d\n", sync);*/
-               } else if (ios->kern_buff) {
-                       osd_req_read_kern(or, &ios->obj, ios->offset,
-                                          ios->kern_buff, ios->length);
-/*                     EXOFS_DBGMSG("read_kern sync=%d\n", sync);*/
-               } else {
-                       osd_req_get_attributes(or, &ios->obj);
-/*                     EXOFS_DBGMSG("get_attributes sync=%d\n", sync);*/
-               }
+       first_dev %= ios->layout->s_numdevs;
+       or = osd_start_request(ios->layout->s_ods[first_dev], GFP_KERNEL);
+       if (unlikely(!or)) {
+               EXOFS_ERR("%s: osd_start_request failed\n", __func__);
+               return -ENOMEM;
+       }
+       per_dev->or = or;
+       ios->numdevs++;
+
+       if (ios->bio) {
+               osd_req_read(or, &ios->obj, ios->offset, ios->bio, ios->length);
+               EXOFS_DBGMSG("read(0x%llx) offset=0x%llx length=0x%llx"
+                            " dev=%d\n", _LLU(ios->obj.id),
+                            _LLU(ios->offset), _LLU(ios->length),
+                            first_dev);
+       } else if (ios->kern_buff) {
+               int ret = osd_req_read_kern(or, &ios->obj, ios->offset,
+                                           ios->kern_buff, ios->length);
+
+               EXOFS_DBGMSG2("read_kern(0x%llx) offset=0x%llx "
+                             "length=0x%llx dev=%d ret=>%d\n",
+                             _LLU(ios->obj.id), _LLU(ios->offset),
+                             _LLU(ios->length), first_dev, ret);
+               if (unlikely(ret))
+                       return ret;
+       } else {
+               osd_req_get_attributes(or, &ios->obj);
+               EXOFS_DBGMSG2("obj(0x%llx) get_attributes=%d dev=%d\n",
+                             _LLU(ios->obj.id), ios->in_attr_len, first_dev);
+       }
 
-               if (ios->out_attr)
-                       osd_req_add_set_attr_list(or, ios->out_attr,
-                                                 ios->out_attr_len);
+       if (ios->out_attr)
+               osd_req_add_set_attr_list(or, ios->out_attr, ios->out_attr_len);
 
-               if (ios->in_attr)
-                       osd_req_add_get_attr_list(or, ios->in_attr,
-                                                 ios->in_attr_len);
-       }
-       ret = exofs_io_execute(ios);
+       if (ios->in_attr)
+               osd_req_add_get_attr_list(or, ios->in_attr, ios->in_attr_len);
 
-out:
-       return ret;
+       return exofs_io_execute(ios);
 }
 
 int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr)
@@ -388,7 +429,7 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
        __be64 newsize;
        int i, ret;
 
-       if (exofs_get_io_state(sbi, &ios))
+       if (exofs_get_io_state(&sbi->layout, &ios))
                return -ENOMEM;
 
        ios->obj.id = exofs_oi_objno(oi);
@@ -398,10 +439,10 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
        attr = g_attr_logical_length;
        attr.val_ptr = &newsize;
 
-       for (i = 0; i < sbi->s_numdevs; i++) {
+       for (i = 0; i < sbi->layout.s_numdevs; i++) {
                struct osd_request *or;
 
-               or = osd_start_request(sbi->s_ods[i], GFP_KERNEL);
+               or = osd_start_request(sbi->layout.s_ods[i], GFP_KERNEL);
                if (unlikely(!or)) {
                        EXOFS_ERR("%s: osd_start_request failed\n", __func__);
                        ret = -ENOMEM;