Merge remote-tracking branch 'staging/staging-next'
[deliverable/linux.git] / drivers / staging / lustre / lustre / lov / lov_io.c
index 84032a51025423aa78ee2786e307b2e3c183ea49..5d47a5ab97f7042e9057846f8709d03fb9b12075 100644 (file)
@@ -244,14 +244,12 @@ void lov_sub_put(struct lov_io_sub *sub)
 
 int lov_page_stripe(const struct cl_page *page)
 {
-       struct lovsub_object *subobj;
        const struct cl_page_slice *slice;
 
-       slice = cl_page_at(page, &lovsub_device_type);
+       slice = cl_page_at(page, &lov_device_type);
        LASSERT(slice->cpl_obj);
 
-       subobj = cl2lovsub(slice->cpl_obj);
-       return subobj->lso_index;
+       return cl2lov_page(slice)->lps_stripe;
 }
 
 struct lov_io_sub *lov_page_subio(const struct lu_env *env, struct lov_io *lio,
@@ -298,8 +296,8 @@ static int lov_io_subio_init(const struct lu_env *env, struct lov_io *lio,
        return result;
 }
 
-static void lov_io_slice_init(struct lov_io *lio,
-                             struct lov_object *obj, struct cl_io *io)
+static int lov_io_slice_init(struct lov_io *lio, struct lov_object *obj,
+                            struct cl_io *io)
 {
        io->ci_result = 0;
        lio->lis_object = obj;
@@ -314,6 +312,15 @@ static void lov_io_slice_init(struct lov_io *lio,
                lio->lis_io_endpos = lio->lis_endpos;
                if (cl_io_is_append(io)) {
                        LASSERT(io->ci_type == CIT_WRITE);
+
+                       /*
+                        * If there is LOV EA hole, then we may cannot locate
+                        * the current file-tail exactly.
+                        */
+                       if (unlikely(obj->lo_lsm->lsm_pattern &
+                                    LOV_PATTERN_F_HOLE))
+                               return -EIO;
+
                        lio->lis_pos = 0;
                        lio->lis_endpos = OBD_OBJECT_EOF;
                }
@@ -349,6 +356,7 @@ static void lov_io_slice_init(struct lov_io *lio,
        default:
                LBUG();
        }
+       return 0;
 }
 
 static void lov_io_fini(const struct lu_env *env, const struct cl_io_slice *ios)
@@ -870,7 +878,7 @@ int lov_io_init_raid0(const struct lu_env *env, struct cl_object *obj,
        struct lov_object   *lov = cl2lov(obj);
 
        INIT_LIST_HEAD(&lio->lis_active);
-       lov_io_slice_init(lio, lov, io);
+       io->ci_result = lov_io_slice_init(lio, lov, io);
        if (io->ci_result == 0) {
                io->ci_result = lov_io_subio_init(env, lio, io);
                if (io->ci_result == 0) {
This page took 0.026724 seconds and 5 git commands to generate.