Whamcloud - gitweb
LU-14672 kernel: kernel update SLES12 SP5 [4.12.14-122.66.2]
[fs/lustre-release.git] / lustre / obdclass / local_storage.c
index 89b227b..2e2a0c4 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012, 2015, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
  */
 /*
  * lustre/obdclass/local_storage.c
@@ -47,7 +47,7 @@ static int ls_object_init(const struct lu_env *env, struct lu_object *o,
 
        ENTRY;
 
-       ls = container_of0(o->lo_dev, struct ls_device, ls_top_dev.dd_lu_dev);
+       ls = container_of(o->lo_dev, struct ls_device, ls_top_dev.dd_lu_dev);
        under = &ls->ls_osd->dd_lu_dev;
        below = under->ld_ops->ldo_object_alloc(env, o->lo_header, under);
        if (below == NULL)
@@ -65,10 +65,11 @@ static void ls_object_free(const struct lu_env *env, struct lu_object *o)
 
        dt_object_fini(&obj->ls_obj);
        lu_object_header_fini(h);
-       OBD_FREE_PTR(obj);
+       OBD_FREE_PRE(obj, sizeof(*obj), "kfreed");
+       kfree_rcu(obj, ls_header.loh_rcu);
 }
 
-static struct lu_object_operations ls_lu_obj_ops = {
+static const struct lu_object_operations ls_lu_obj_ops = {
        .loo_object_init  = ls_object_init,
        .loo_object_free  = ls_object_free,
 };
@@ -100,7 +101,7 @@ static struct lu_object *ls_object_alloc(const struct lu_env *env,
        }
 }
 
-static struct lu_device_operations ls_lu_dev_ops = {
+static const struct lu_device_operations ls_lu_dev_ops = {
        .ldo_object_alloc =     ls_object_alloc
 };
 
@@ -129,7 +130,7 @@ struct ls_device *ls_find_dev(struct dt_device *dev)
        return ls;
 }
 
-static struct lu_device_type_operations ls_device_type_ops = {
+static const struct lu_device_type_operations ls_device_type_ops = {
        .ldto_start = NULL,
        .ldto_stop  = NULL,
 };
@@ -371,7 +372,7 @@ static struct dt_object *__local_file_create(const struct lu_env *env,
        if (rc)
                GOTO(trans_stop, rc);
 
-       dt_write_lock(env, dto, LOS_CHILD);
+       dt_write_lock(env, dto, DT_SRC_CHILD);
        if (dt_object_exists(dto))
                GOTO(unlock, rc = 0);
 
@@ -388,23 +389,23 @@ static struct dt_object *__local_file_create(const struct lu_env *env,
                rec->rec_fid = fid;
                /* Add "." and ".." for newly created dir */
                rc = dt_insert(env, dto, (const struct dt_rec *)rec,
-                              (const struct dt_key *)".", th, 1);
+                              (const struct dt_key *)".", th);
                if (rc != 0)
                        GOTO(destroy, rc);
 
                dt_ref_add(env, dto, th);
                rec->rec_fid = lu_object_fid(&parent->do_lu);
                rc = dt_insert(env, dto, (const struct dt_rec *)rec,
-                              (const struct dt_key *)"..", th, 1);
+                              (const struct dt_key *)"..", th);
                if (rc != 0)
                        GOTO(destroy, rc);
        }
 
        rec->rec_fid = fid;
        rec->rec_type = dto->do_lu.lo_header->loh_attr;
-       dt_write_lock(env, parent, LOS_PARENT);
+       dt_write_lock(env, parent, DT_SRC_PARENT);
        rc = dt_insert(env, parent, (const struct dt_rec *)rec,
-                      (const struct dt_key *)name, th, 1);
+                      (const struct dt_key *)name, th);
        if (dti->dti_dof.dof_type == DFT_DIR)
                dt_ref_add(env, parent, th);
        dt_write_unlock(env, parent);
@@ -502,7 +503,7 @@ struct dt_object *local_file_find_or_create_with_fid(const struct lu_env *env,
 
                ls = ls_device_get(dt);
                if (IS_ERR(ls)) {
-                       dto = ERR_PTR(PTR_ERR(ls));
+                       dto = ERR_CAST(ls);
                } else {
                        /* create the object */
                        dti->dti_attr.la_valid  = LA_MODE;
@@ -597,7 +598,7 @@ local_index_find_or_create_with_fid(const struct lu_env *env,
 
                ls = ls_device_get(dt);
                if (IS_ERR(ls)) {
-                       dto = ERR_PTR(PTR_ERR(ls));
+                       dto = ERR_CAST(ls);
                } else {
                        /* create the object */
                        dti->dti_attr.la_valid          = LA_MODE;
@@ -633,6 +634,12 @@ static int local_object_declare_unlink(const struct lu_env *env,
        if (rc < 0)
                return rc;
 
+       if (S_ISDIR(p->do_lu.lo_header->loh_attr)) {
+               rc = dt_declare_ref_del(env, p, th);
+               if (rc < 0)
+                       return rc;
+       }
+
        rc = dt_declare_ref_del(env, c, th);
        if (rc < 0)
                return rc;
@@ -672,6 +679,14 @@ int local_object_unlink(const struct lu_env *env, struct dt_device *dt,
        if (rc < 0)
                GOTO(stop, rc);
 
+       if (S_ISDIR(dto->do_lu.lo_header->loh_attr)) {
+               dt_write_lock(env, parent, 0);
+               rc = dt_ref_del(env, parent, th);
+               dt_write_unlock(env, parent);
+               if (rc)
+                       GOTO(stop, rc);
+       }
+
        dt_write_lock(env, dto, 0);
        rc = dt_delete(env, parent, (struct dt_key *)name, th);
        if (rc < 0)
@@ -684,7 +699,7 @@ int local_object_unlink(const struct lu_env *env, struct dt_device *dt,
                rec->rec_fid = &dti->dti_fid;
                rec->rec_type = dto->do_lu.lo_header->loh_attr;
                rc = dt_insert(env, parent, (const struct dt_rec *)rec,
-                              (const struct dt_key *)name, th, 1);
+                              (const struct dt_key *)name, th);
                GOTO(unlock, rc);
        }
 
@@ -719,7 +734,6 @@ void dt_los_put(struct local_oid_storage *los)
                /* should never happen, only local_oid_storage_fini should
                 * drop refcount to zero */
                LBUG();
-       return;
 }
 
 /* after Lustre 2.3 release there may be old file to store last generated FID