Whamcloud - gitweb
LU-1154 clio: rename coo_attr_set to coo_attr_update
[fs/lustre-release.git] / lustre / lov / lov_object.c
index 19a9bcf..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.
@@ -314,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;
 }
 
@@ -383,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.
@@ -392,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);
 }
 
@@ -607,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;
@@ -725,7 +745,9 @@ 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) {
@@ -751,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);
@@ -830,7 +853,8 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj,
                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:
@@ -898,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,
@@ -915,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 = {
@@ -973,29 +1015,6 @@ struct lov_stripe_md *lov_lsm_addref(struct lov_object *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;