Whamcloud - gitweb
LU-1154 clio: rename coo_attr_set to coo_attr_update
[fs/lustre-release.git] / lustre / lov / lov_object.c
index 13ed111..aff9328 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -79,6 +79,29 @@ struct lov_layout_operations {
 
 static int lov_layout_wait(const struct lu_env *env, struct lov_object *lov);
 
+struct lov_stripe_md *lov_lsm_get(struct cl_object *clobj)
+{
+       struct lu_object *luobj;
+       struct lov_stripe_md *lsm = NULL;
+
+       if (clobj == NULL)
+               return NULL;
+
+       luobj = lu_object_locate(&cl_object_header(clobj)->coh_lu,
+                                &lov_device_type);
+       if (luobj != NULL)
+               lsm = lov_lsm_addref(lu2lov(luobj));
+       return lsm;
+}
+EXPORT_SYMBOL(lov_lsm_get);
+
+void lov_lsm_put(struct cl_object *unused, struct lov_stripe_md *lsm)
+{
+       if (lsm != NULL)
+               lov_free_memmd(&lsm);
+}
+EXPORT_SYMBOL(lov_lsm_put);
+
 /*****************************************************************************
  *
  * Lov object layout operations.
@@ -198,6 +221,10 @@ static int lov_page_slice_fixup(struct lov_object *lov,
        struct cl_object_header *hdr = cl_object_header(&lov->lo_cl);
        struct cl_object *o;
 
+       if (stripe == NULL)
+               return hdr->coh_page_bufsize - lov->lo_cl.co_slice_off -
+                      cfs_size_round(sizeof(struct lov_page));
+
        cl_object_for_each(o, stripe)
                o->co_slice_off += hdr->coh_page_bufsize;
 
@@ -249,6 +276,9 @@ static int lov_init_raid0(const struct lu_env *env,
                         struct lov_oinfo *oinfo = lsm->lsm_oinfo[i];
                         int ost_idx = oinfo->loi_ost_idx;
 
+                       if (lov_oinfo_is_dummy(oinfo))
+                               continue;
+
                        result = ostid_to_fid(ofid, &oinfo->loi_oi,
                                              oinfo->loi_ost_idx);
                        if (result != 0)
@@ -307,8 +337,6 @@ static int lov_delete_empty(const struct lu_env *env, struct lov_object *lov,
        LASSERT(lov->lo_type == LLT_EMPTY || lov->lo_type == LLT_RELEASED);
 
        lov_layout_wait(env, lov);
-
-       cl_locks_prune(env, &lov->lo_cl, 0);
        return 0;
 }
 
@@ -376,7 +404,7 @@ static int lov_delete_raid0(const struct lu_env *env, struct lov_object *lov,
                         struct lovsub_object *los = r0->lo_sub[i];
 
                         if (los != NULL) {
-                               cl_locks_prune(env, &los->lso_cl, 1);
+                               cl_object_prune(env, &los->lso_cl);
                                 /*
                                  * If top-level object is to be evicted from
                                  * the cache, so are its sub-objects.
@@ -385,7 +413,6 @@ static int lov_delete_raid0(const struct lu_env *env, struct lov_object *lov,
                        }
                }
        }
-       cl_locks_prune(env, &lov->lo_cl, 0);
        RETURN(0);
 }
 
@@ -438,7 +465,7 @@ static int lov_print_raid0(const struct lu_env *env, void *cookie,
 
        (*p)(env, cookie, "stripes: %d, %s, lsm{%p 0x%08X %d %u %u}:\n",
                r0->lo_nr, lov->lo_layout_invalid ? "invalid" : "valid", lsm,
-               lsm->lsm_magic, cfs_atomic_read(&lsm->lsm_refc),
+               lsm->lsm_magic, atomic_read(&lsm->lsm_refc),
                lsm->lsm_stripe_count, lsm->lsm_layout_gen);
        for (i = 0; i < r0->lo_nr; ++i) {
                struct lu_object *sub;
@@ -462,7 +489,7 @@ static int lov_print_released(const struct lu_env *env, void *cookie,
        (*p)(env, cookie,
                "released: %s, lsm{%p 0x%08X %d %u %u}:\n",
                lov->lo_layout_invalid ? "invalid" : "valid", lsm,
-               lsm->lsm_magic, cfs_atomic_read(&lsm->lsm_refc),
+               lsm->lsm_magic, atomic_read(&lsm->lsm_refc),
                lsm->lsm_stripe_count, lsm->lsm_layout_gen);
        return 0;
 }
@@ -499,7 +526,7 @@ static int lov_attr_get_raid0(const struct lu_env *env, struct cl_object *obj,
         * hit this assertion.
         * Anyway, it's still okay to call attr_get w/o type guard as layout
         * can't go if locks exist. */
-       /* LASSERT(cfs_atomic_read(&lsm->lsm_refc) > 1); */
+       /* LASSERT(atomic_read(&lsm->lsm_refc) > 1); */
 
        if (!r0->lo_attr_valid) {
                struct lov_stripe_md    *lsm = lov->lo_lsm;
@@ -600,7 +627,7 @@ const static struct lov_layout_operations lov_dispatch[] = {
 /**
  * Return lov_layout_type associated with a given lsm
  */
-enum lov_layout_type lov_type(struct lov_stripe_md *lsm)
+static enum lov_layout_type lov_type(struct lov_stripe_md *lsm)
 {
        if (lsm == NULL)
                return LLT_EMPTY;
@@ -672,13 +699,13 @@ static int lov_layout_wait(const struct lu_env *env, struct lov_object *lov)
        struct l_wait_info lwi = { 0 };
        ENTRY;
 
-       while (cfs_atomic_read(&lov->lo_active_ios) > 0) {
+       while (atomic_read(&lov->lo_active_ios) > 0) {
                CDEBUG(D_INODE, "file:"DFID" wait for active IO, now: %d.\n",
                        PFID(lu_object_fid(lov2lu(lov))),
-                       cfs_atomic_read(&lov->lo_active_ios));
+                       atomic_read(&lov->lo_active_ios));
 
                l_wait_event(lov->lo_waitq,
-                            cfs_atomic_read(&lov->lo_active_ios) == 0, &lwi);
+                            atomic_read(&lov->lo_active_ios) == 0, &lwi);
        }
        RETURN(0);
 }
@@ -718,15 +745,21 @@ static int lov_layout_change(const struct lu_env *unused,
        old_ops = &lov_dispatch[lov->lo_type];
        new_ops = &lov_dispatch[llt];
 
-       cl_object_prune(env, &lov->lo_cl);
+       result = cl_object_prune(env, &lov->lo_cl);
+       if (result != 0)
+               GOTO(out, result);
 
        result = old_ops->llo_delete(env, lov, &lov->u);
        if (result == 0) {
                old_ops->llo_fini(env, lov, &lov->u);
 
-               LASSERT(cfs_atomic_read(&lov->lo_active_ios) == 0);
+               LASSERT(atomic_read(&lov->lo_active_ios) == 0);
 
                lov->lo_type = LLT_EMPTY;
+               /* page bufsize fixup */
+               cl_object_header(&lov->lo_cl)->coh_page_bufsize -=
+                       lov_page_slice_fixup(lov, NULL);
+
                result = new_ops->llo_init(env,
                                        lu2lov_dev(lov->lo_cl.co_lu.lo_dev),
                                        lov, conf, state);
@@ -740,6 +773,7 @@ static int lov_layout_change(const struct lu_env *unused,
                }
        }
 
+out:
        cl_env_put(env, &refcheck);
        cl_env_reexit(cookie);
        RETURN(result);
@@ -762,7 +796,7 @@ int lov_object_init(const struct lu_env *env, struct lu_object *obj,
 
         ENTRY;
        init_rwsem(&lov->lo_type_guard);
-       cfs_atomic_set(&lov->lo_active_ios, 0);
+       atomic_set(&lov->lo_active_ios, 0);
        init_waitqueue_head(&lov->lo_waitq);
 
        cl_object_page_init(lu2cl(obj), sizeof(struct lov_page));
@@ -792,7 +826,7 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj,
 
        if (conf->coc_opc == OBJECT_CONF_WAIT) {
                if (lov->lo_layout_invalid &&
-                   cfs_atomic_read(&lov->lo_active_ios) > 0) {
+                   atomic_read(&lov->lo_active_ios) > 0) {
                        lov_conf_unlock(lov);
                        result = lov_layout_wait(env, lov);
                        lov_conf_lock(lov);
@@ -814,12 +848,13 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj,
        }
 
        /* will change layout - check if there still exists active IO. */
-       if (cfs_atomic_read(&lov->lo_active_ios) > 0) {
+       if (atomic_read(&lov->lo_active_ios) > 0) {
                lov->lo_layout_invalid = true;
                GOTO(out, result = -EBUSY);
        }
 
-       lov->lo_layout_invalid = lov_layout_change(env, lov, conf);
+       result = lov_layout_change(env, lov, conf);
+       lov->lo_layout_invalid = result != 0;
        EXIT;
 
 out:
@@ -887,13 +922,13 @@ static int lov_attr_get(const struct lu_env *env, struct cl_object *obj,
         return LOV_2DISPATCH_NOLOCK(cl2lov(obj), llo_getattr, env, obj, attr);
 }
 
-static int lov_attr_set(const struct lu_env *env, struct cl_object *obj,
-                        const struct cl_attr *attr, unsigned valid)
+static int lov_attr_update(const struct lu_env *env, struct cl_object *obj,
+                          const struct cl_attr *attr, unsigned valid)
 {
-        /*
-         * No dispatch is required here, as no layout implements this.
-         */
-        return 0;
+       /*
+        * No dispatch is required here, as no layout implements this.
+        */
+       return 0;
 }
 
 int lov_lock_init(const struct lu_env *env, struct cl_object *obj,
@@ -904,13 +939,31 @@ int lov_lock_init(const struct lu_env *env, struct cl_object *obj,
                                    io);
 }
 
+static int lov_object_getstripe(const struct lu_env *env, struct cl_object *obj,
+                               struct lov_user_md __user *lum)
+{
+       struct lov_object       *lov = cl2lov(obj);
+       struct lov_stripe_md    *lsm;
+       int                     rc = 0;
+       ENTRY;
+
+       lsm = lov_lsm_addref(lov);
+       if (lsm == NULL)
+               RETURN(-ENODATA);
+
+       rc = lov_getstripe(cl2lov(obj), lsm, lum);
+       lov_lsm_put(obj, lsm);
+       RETURN(rc);
+}
+
 static const struct cl_object_operations lov_ops = {
-        .coo_page_init = lov_page_init,
-        .coo_lock_init = lov_lock_init,
-        .coo_io_init   = lov_io_init,
-        .coo_attr_get  = lov_attr_get,
-        .coo_attr_set  = lov_attr_set,
-        .coo_conf_set  = lov_conf_set
+       .coo_page_init    = lov_page_init,
+       .coo_lock_init    = lov_lock_init,
+       .coo_io_init      = lov_io_init,
+       .coo_attr_get     = lov_attr_get,
+       .coo_attr_update  = lov_attr_update,
+       .coo_conf_set     = lov_conf_set,
+       .coo_getstripe    = lov_object_getstripe
 };
 
 static const struct lu_object_operations lov_lu_obj_ops = {
@@ -955,36 +1008,13 @@ struct lov_stripe_md *lov_lsm_addref(struct lov_object *lov)
        if (lov->lo_lsm != NULL) {
                lsm = lsm_addref(lov->lo_lsm);
                CDEBUG(D_INODE, "lsm %p addref %d/%d by %p.\n",
-                       lsm, cfs_atomic_read(&lsm->lsm_refc),
+                       lsm, atomic_read(&lsm->lsm_refc),
                        lov->lo_layout_invalid, current);
        }
        lov_conf_thaw(lov);
        return lsm;
 }
 
-struct lov_stripe_md *lov_lsm_get(struct cl_object *clobj)
-{
-       struct lu_object *luobj;
-       struct lov_stripe_md *lsm = NULL;
-
-       if (clobj == NULL)
-               return NULL;
-
-       luobj = lu_object_locate(&cl_object_header(clobj)->coh_lu,
-                                &lov_device_type);
-       if (luobj != NULL)
-               lsm = lov_lsm_addref(lu2lov(luobj));
-       return lsm;
-}
-EXPORT_SYMBOL(lov_lsm_get);
-
-void lov_lsm_put(struct cl_object *unused, struct lov_stripe_md *lsm)
-{
-       if (lsm != NULL)
-               lov_free_memmd(&lsm);
-}
-EXPORT_SYMBOL(lov_lsm_put);
-
 int lov_read_and_clear_async_rc(struct cl_object *clob)
 {
        struct lu_object *luobj;
@@ -1006,6 +1036,10 @@ int lov_read_and_clear_async_rc(struct cl_object *clob)
                        LASSERT(lsm != NULL);
                        for (i = 0; i < lsm->lsm_stripe_count; i++) {
                                struct lov_oinfo *loi = lsm->lsm_oinfo[i];
+
+                               if (lov_oinfo_is_dummy(loi))
+                                       continue;
+
                                if (loi->loi_ar.ar_rc && !rc)
                                        rc = loi->loi_ar.ar_rc;
                                loi->loi_ar.ar_rc = 0;