Whamcloud - gitweb
LU-6142 lustre: no need to check debugfs return values
[fs/lustre-release.git] / lustre / obdclass / local_storage.c
index 2cc4afe..c5d8935 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
  */
 /*
  * lustre/obdclass/local_storage.c
@@ -35,7 +35,7 @@
 #include "local_storage.h"
 
 /* all initialized local storages on this node are linked on this */
-static struct list_head ls_list_head = LIST_HEAD_INIT(ls_list_head);
+static LIST_HEAD(ls_list_head);
 static DEFINE_MUTEX(ls_list_mutex);
 
 static int ls_object_init(const struct lu_env *env, struct lu_object *o,
@@ -65,7 +65,8 @@ 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 = {
@@ -339,17 +340,39 @@ static struct dt_object *__local_file_create(const struct lu_env *env,
        }
 
        rec->rec_fid = fid;
-       rec->rec_type = dto->do_lu.lo_header->loh_attr;
+       rec->rec_type = attr->la_mode & S_IFMT;
        rc = dt_declare_insert(env, parent, (const struct dt_rec *)rec,
                               (const struct dt_key *)name, th);
        if (rc)
                GOTO(trans_stop, rc);
 
+       if (dti->dti_dof.dof_type == DFT_DIR) {
+               if (!dt_try_as_dir(env, dto))
+                       GOTO(trans_stop, rc = -ENOTDIR);
+
+               rec->rec_type = S_IFDIR;
+               rec->rec_fid = fid;
+               rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
+                               (const struct dt_key *)".", th);
+               if (rc != 0)
+                       GOTO(trans_stop, rc);
+
+               rec->rec_fid = lu_object_fid(&parent->do_lu);
+               rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
+                               (const struct dt_key *)"..", th);
+               if (rc != 0)
+                       GOTO(trans_stop, rc);
+
+               rc = dt_declare_ref_add(env, dto, th);
+               if (rc != 0)
+                       GOTO(trans_stop, rc);
+       }
+
        rc = dt_trans_start_local(env, ls->ls_osd, th);
        if (rc)
                GOTO(trans_stop, rc);
 
-       dt_write_lock(env, dto, 0);
+       dt_write_lock(env, dto, DT_SRC_CHILD);
        if (dt_object_exists(dto))
                GOTO(unlock, rc = 0);
 
@@ -361,30 +384,28 @@ static struct dt_object *__local_file_create(const struct lu_env *env,
        LASSERT(dt_object_exists(dto));
 
        if (dti->dti_dof.dof_type == DFT_DIR) {
-               if (!dt_try_as_dir(env, dto))
-                       GOTO(destroy, rc = -ENOTDIR);
 
                rec->rec_type = S_IFDIR;
                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, BYPASS_CAPA, 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, BYPASS_CAPA, 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, 0);
+       dt_write_lock(env, parent, DT_SRC_PARENT);
        rc = dt_insert(env, parent, (const struct dt_rec *)rec,
-                      (const struct dt_key *)name, th, BYPASS_CAPA, 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);
@@ -399,12 +420,34 @@ trans_stop:
        dt_trans_stop(env, ls->ls_osd, th);
 out:
        if (rc) {
-               lu_object_put_nocache(env, &dto->do_lu);
+               dt_object_put_nocache(env, dto);
                dto = ERR_PTR(rc);
        }
        RETURN(dto);
 }
 
+struct dt_object *local_file_find(const struct lu_env *env,
+                                 struct local_oid_storage *los,
+                                 struct dt_object *parent,
+                                 const char *name)
+{
+       struct dt_thread_info   *dti = dt_info(env);
+       struct dt_object        *dto;
+       int                      rc;
+
+       LASSERT(parent);
+
+       rc = dt_lookup_dir(env, parent, name, &dti->dti_fid);
+       if (!rc)
+               dto = ls_locate(env, dt2ls_dev(los->los_dev),
+                               &dti->dti_fid, NULL);
+       else
+               dto = ERR_PTR(rc);
+
+       return dto;
+}
+EXPORT_SYMBOL(local_file_find);
+
 /*
  * Look up and create (if it does not exist) a local named file or directory in
  * parent directory.
@@ -418,30 +461,21 @@ struct dt_object *local_file_find_or_create(const struct lu_env *env,
        struct dt_object        *dto;
        int                      rc;
 
-       LASSERT(parent);
+       dto = local_file_find(env, los, parent, name);
+       if (!IS_ERR(dto) || PTR_ERR(dto) != -ENOENT)
+               return dto;
 
-       rc = dt_lookup_dir(env, parent, name, &dti->dti_fid);
-       if (rc == 0)
-               /* name is found, get the object */
-               dto = ls_locate(env, dt2ls_dev(los->los_dev),
-                               &dti->dti_fid, NULL);
-       else if (rc != -ENOENT)
-               dto = ERR_PTR(rc);
-       else {
-               rc = local_object_fid_generate(env, los, &dti->dti_fid);
-               if (rc < 0) {
-                       dto = ERR_PTR(rc);
-               } else {
-                       /* create the object */
-                       dti->dti_attr.la_valid  = LA_MODE;
-                       dti->dti_attr.la_mode   = mode;
-                       dti->dti_dof.dof_type   = dt_mode_to_dft(mode & S_IFMT);
-                       dto = __local_file_create(env, &dti->dti_fid, los,
-                                                 dt2ls_dev(los->los_dev),
-                                                 parent, name, &dti->dti_attr,
-                                                 &dti->dti_dof);
-               }
-       }
+       rc = local_object_fid_generate(env, los, &dti->dti_fid);
+       if (rc)
+               return ERR_PTR(rc);
+
+       /* create the object */
+       dti->dti_attr.la_valid = LA_MODE;
+       dti->dti_attr.la_mode = mode;
+       dti->dti_dof.dof_type = dt_mode_to_dft(mode & S_IFMT);
+       dto = __local_file_create(env, &dti->dti_fid, los,
+                                 dt2ls_dev(los->los_dev), parent, name,
+                                 &dti->dti_attr, &dti->dti_dof);
        return dto;
 }
 EXPORT_SYMBOL(local_file_find_or_create);
@@ -482,7 +516,7 @@ struct dt_object *local_file_find_or_create_with_fid(const struct lu_env *env,
                         * have to open the object in other device stack */
                        if (!IS_ERR(dto)) {
                                dti->dti_fid = dto->do_lu.lo_header->loh_fid;
-                               lu_object_put_nocache(env, &dto->do_lu);
+                               dt_object_put_nocache(env, dto);
                                dto = dt_locate(env, dt, &dti->dti_fid);
                        }
                        ls_device_put(env, ls);
@@ -578,7 +612,7 @@ local_index_find_or_create_with_fid(const struct lu_env *env,
                         * have to open the object in other device stack */
                        if (!IS_ERR(dto)) {
                                dti->dti_fid = dto->do_lu.lo_header->loh_fid;
-                               lu_object_put_nocache(env, &dto->do_lu);
+                               dt_object_put_nocache(env, dto);
                                dto = dt_locate(env, dt, &dti->dti_fid);
                        }
                        ls_device_put(env, ls);
@@ -640,7 +674,7 @@ int local_object_unlink(const struct lu_env *env, struct dt_device *dt,
                GOTO(stop, rc);
 
        dt_write_lock(env, dto, 0);
-       rc = dt_delete(env, parent, (struct dt_key *)name, th, BYPASS_CAPA);
+       rc = dt_delete(env, parent, (struct dt_key *)name, th);
        if (rc < 0)
                GOTO(unlock, rc);
 
@@ -651,7 +685,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, BYPASS_CAPA, 1);
+                              (const struct dt_key *)name, th);
                GOTO(unlock, rc);
        }
 
@@ -661,7 +695,7 @@ unlock:
 stop:
        dt_trans_stop(env, dt, th);
 out:
-       lu_object_put_nocache(env, &dto->do_lu);
+       dt_object_put_nocache(env, dto);
        return rc;
 }
 EXPORT_SYMBOL(local_object_unlink);
@@ -686,7 +720,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
@@ -711,10 +744,10 @@ static int lastid_compat_check(const struct lu_env *env, struct dt_device *dev,
                return PTR_ERR(root);
 
        /* find old last_id file */
-       snprintf(dti->dti_buf, sizeof(dti->dti_buf), "seq-"LPX64"-lastid",
+       snprintf(dti->dti_buf, sizeof(dti->dti_buf), "seq-%#llx-lastid",
                 lastid_seq);
        rc = dt_lookup_dir(env, root, dti->dti_buf, &dti->dti_fid);
-       lu_object_put_nocache(env, &root->do_lu);
+       dt_object_put_nocache(env, root);
        if (rc == -ENOENT) {
                /* old llog lastid accessed by FID only */
                if (lastid_seq != FID_SEQ_LLOG)
@@ -727,14 +760,14 @@ static int lastid_compat_check(const struct lu_env *env, struct dt_device *dev,
                        return PTR_ERR(o);
 
                if (!dt_object_exists(o)) {
-                       lu_object_put_nocache(env, &o->do_lu);
+                       dt_object_put_nocache(env, o);
                        return 0;
                }
                CDEBUG(D_INFO, "Found old llog lastid file\n");
        } else if (rc < 0) {
                return rc;
        } else {
-               CDEBUG(D_INFO, "Found old lastid file for sequence "LPX64"\n",
+               CDEBUG(D_INFO, "Found old lastid file for sequence %#llx\n",
                       lastid_seq);
                o = ls_locate(env, ls, &dti->dti_fid, NULL);
                if (IS_ERR(o))
@@ -749,15 +782,15 @@ static int lastid_compat_check(const struct lu_env *env, struct dt_device *dev,
        rc = dt_record_read(env, o, &dti->dti_lb, &dti->dti_off);
        dt_read_unlock(env, o);
        if (rc == 0 && le32_to_cpu(losd.lso_magic) != LOS_MAGIC) {
-               CERROR("%s: wrong content of seq-"LPX64"-lastid file, magic %x\n",
+               CERROR("%s: wrong content of seq-%#llx-lastid file, magic %x\n",
                       o->do_lu.lo_dev->ld_obd->obd_name, lastid_seq,
                       le32_to_cpu(losd.lso_magic));
                rc = -EINVAL;
        } else if (rc < 0) {
-               CERROR("%s: failed to read seq-"LPX64"-lastid: rc = %d\n",
+               CERROR("%s: failed to read seq-%#llx-lastid: rc = %d\n",
                       o->do_lu.lo_dev->ld_obd->obd_name, lastid_seq, rc);
        }
-       lu_object_put_nocache(env, &o->do_lu);
+       dt_object_put_nocache(env, o);
        if (rc == 0)
                *first_oid = le32_to_cpu(losd.lso_next_oid);
        return rc;
@@ -881,7 +914,7 @@ out_trans:
                rc = dt_record_read(env, o, &dti->dti_lb, &dti->dti_off);
                dt_read_unlock(env, o);
                if (rc == 0 && le64_to_cpu(lastid) > OBIF_MAX_OID) {
-                       CERROR("%s: bad oid "LPU64" is read from LAST_ID\n",
+                       CERROR("%s: bad oid %llu is read from LAST_ID\n",
                               o->do_lu.lo_dev->ld_obd->obd_name,
                               le64_to_cpu(lastid));
                        rc = -EINVAL;
@@ -894,7 +927,7 @@ out_los:
                OBD_FREE_PTR(*los);
                *los = NULL;
                if (o != NULL && !IS_ERR(o))
-                       lu_object_put_nocache(env, &o->do_lu);
+                       dt_object_put_nocache(env, o);
        } else {
                (*los)->los_seq = fid_seq(first_fid);
                (*los)->los_last_oid = le64_to_cpu(lastid);
@@ -931,7 +964,7 @@ void local_oid_storage_fini(const struct lu_env *env,
        }
 
        if (los->los_obj)
-               lu_object_put_nocache(env, &los->los_obj->do_lu);
+               dt_object_put_nocache(env, los->los_obj);
        list_del(&los->los_list);
        OBD_FREE_PTR(los);
        mutex_unlock(&ls->ls_los_mutex);