From 3db7eb2e447633c7e2adb656125e69ce6b28cd9a Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Fri, 5 Sep 2014 15:08:18 -0500 Subject: [PATCH] staging/lustre/obdclass: remove local_storage.[ch] Remove the unused files lustre/obdclass/local_storage.[ch]. Signed-off-by: John L. Hammond Signed-off-by: Greg Kroah-Hartman --- drivers/staging/lustre/lustre/obdclass/Makefile | 2 +- .../staging/lustre/lustre/obdclass/local_storage.c | 894 --------------------- .../staging/lustre/lustre/obdclass/local_storage.h | 91 --- 3 files changed, 1 insertion(+), 986 deletions(-) delete mode 100644 drivers/staging/lustre/lustre/obdclass/local_storage.c delete mode 100644 drivers/staging/lustre/lustre/obdclass/local_storage.h diff --git a/drivers/staging/lustre/lustre/obdclass/Makefile b/drivers/staging/lustre/lustre/obdclass/Makefile index 77fd94c..bf77532 100644 --- a/drivers/staging/lustre/lustre/obdclass/Makefile +++ b/drivers/staging/lustre/lustre/obdclass/Makefile @@ -4,6 +4,6 @@ obdclass-y := linux/linux-module.o linux/linux-obdo.o linux/linux-sysctl.o \ llog.o llog_cat.o llog_obd.o llog_swab.o class_obd.o debug.o \ genops.o uuid.o lprocfs_status.o \ lustre_handles.o lustre_peer.o \ - local_storage.o statfs_pack.o obdo.o obd_config.o obd_mount.o\ + statfs_pack.o obdo.o obd_config.o obd_mount.o \ lu_object.o dt_object.o capa.o cl_object.o \ cl_page.o cl_lock.o cl_io.o lu_ref.o acl.o diff --git a/drivers/staging/lustre/lustre/obdclass/local_storage.c b/drivers/staging/lustre/lustre/obdclass/local_storage.c deleted file mode 100644 index 6e0f6f2..0000000 --- a/drivers/staging/lustre/lustre/obdclass/local_storage.c +++ /dev/null @@ -1,894 +0,0 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. A copy is - * included in the COPYING file that accompanied this code. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * GPL HEADER END - */ -/* - * Copyright (c) 2012, Intel Corporation. - */ -/* - * lustre/obdclass/local_storage.c - * - * Local storage for file/objects with fid generation. Works on top of OSD. - * - * Author: Mikhail Pershin - */ - -#define DEBUG_SUBSYSTEM S_CLASS - -#include "local_storage.h" - -/* all initialized local storages on this node are linked on this */ -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, - const struct lu_object_conf *unused) -{ - struct ls_device *ls; - struct lu_object *below; - struct lu_device *under; - - ls = container_of0(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) - return -ENOMEM; - - lu_object_add(o, below); - - return 0; -} - -static void ls_object_free(const struct lu_env *env, struct lu_object *o) -{ - struct ls_object *obj = lu2ls_obj(o); - struct lu_object_header *h = o->lo_header; - - dt_object_fini(&obj->ls_obj); - lu_object_header_fini(h); - OBD_FREE_PTR(obj); -} - -struct lu_object_operations ls_lu_obj_ops = { - .loo_object_init = ls_object_init, - .loo_object_free = ls_object_free, -}; - -struct lu_object *ls_object_alloc(const struct lu_env *env, - const struct lu_object_header *_h, - struct lu_device *d) -{ - struct lu_object_header *h; - struct ls_object *o; - struct lu_object *l; - - LASSERT(_h == NULL); - - OBD_ALLOC_PTR(o); - if (o != NULL) { - l = &o->ls_obj.do_lu; - h = &o->ls_header; - - lu_object_header_init(h); - dt_object_init(&o->ls_obj, h, d); - lu_object_add_top(h, l); - - l->lo_ops = &ls_lu_obj_ops; - - return l; - } else { - return NULL; - } -} - -static struct lu_device_operations ls_lu_dev_ops = { - .ldo_object_alloc = ls_object_alloc -}; - -static struct ls_device *__ls_find_dev(struct dt_device *dev) -{ - struct ls_device *ls, *ret = NULL; - - list_for_each_entry(ls, &ls_list_head, ls_linkage) { - if (ls->ls_osd == dev) { - atomic_inc(&ls->ls_refcount); - ret = ls; - break; - } - } - return ret; -} - -struct ls_device *ls_find_dev(struct dt_device *dev) -{ - struct ls_device *ls; - - mutex_lock(&ls_list_mutex); - ls = __ls_find_dev(dev); - mutex_unlock(&ls_list_mutex); - - return ls; -} - -static struct lu_device_type_operations ls_device_type_ops = { - .ldto_start = NULL, - .ldto_stop = NULL, -}; - -static struct lu_device_type ls_lu_type = { - .ldt_name = "local_storage", - .ldt_ops = &ls_device_type_ops, -}; - -struct ls_device *ls_device_get(struct dt_device *dev) -{ - struct ls_device *ls; - - mutex_lock(&ls_list_mutex); - ls = __ls_find_dev(dev); - if (ls) - GOTO(out_ls, ls); - - /* not found, then create */ - OBD_ALLOC_PTR(ls); - if (ls == NULL) - GOTO(out_ls, ls = ERR_PTR(-ENOMEM)); - - atomic_set(&ls->ls_refcount, 1); - INIT_LIST_HEAD(&ls->ls_los_list); - mutex_init(&ls->ls_los_mutex); - - ls->ls_osd = dev; - - LASSERT(dev->dd_lu_dev.ld_site); - lu_device_init(&ls->ls_top_dev.dd_lu_dev, &ls_lu_type); - ls->ls_top_dev.dd_lu_dev.ld_ops = &ls_lu_dev_ops; - ls->ls_top_dev.dd_lu_dev.ld_site = dev->dd_lu_dev.ld_site; - - /* finally add ls to the list */ - list_add(&ls->ls_linkage, &ls_list_head); -out_ls: - mutex_unlock(&ls_list_mutex); - return ls; -} - -void ls_device_put(const struct lu_env *env, struct ls_device *ls) -{ - LASSERT(env); - if (!atomic_dec_and_test(&ls->ls_refcount)) - return; - - mutex_lock(&ls_list_mutex); - if (atomic_read(&ls->ls_refcount) == 0) { - LASSERT(list_empty(&ls->ls_los_list)); - list_del(&ls->ls_linkage); - lu_site_purge(env, ls->ls_top_dev.dd_lu_dev.ld_site, ~0); - lu_device_fini(&ls->ls_top_dev.dd_lu_dev); - OBD_FREE_PTR(ls); - } - mutex_unlock(&ls_list_mutex); -} - -/** - * local file fid generation - */ -int local_object_fid_generate(const struct lu_env *env, - struct local_oid_storage *los, - struct lu_fid *fid) -{ - LASSERT(los->los_dev); - LASSERT(los->los_obj); - - /* take next OID */ - - /* to make it unique after reboot we store - * the latest generated fid atomically with - * object creation see local_object_create() */ - - mutex_lock(&los->los_id_lock); - fid->f_seq = los->los_seq; - fid->f_oid = ++los->los_last_oid; - fid->f_ver = 0; - mutex_unlock(&los->los_id_lock); - - return 0; -} - -int local_object_declare_create(const struct lu_env *env, - struct local_oid_storage *los, - struct dt_object *o, struct lu_attr *attr, - struct dt_object_format *dof, - struct thandle *th) -{ - struct dt_thread_info *dti = dt_info(env); - int rc; - - /* update fid generation file */ - if (los != NULL) { - LASSERT(dt_object_exists(los->los_obj)); - rc = dt_declare_record_write(env, los->los_obj, - sizeof(struct los_ondisk), 0, th); - if (rc) - return rc; - } - - rc = dt_declare_create(env, o, attr, NULL, dof, th); - if (rc) - return rc; - - dti->dti_lb.lb_buf = NULL; - dti->dti_lb.lb_len = sizeof(dti->dti_lma); - rc = dt_declare_xattr_set(env, o, &dti->dti_lb, XATTR_NAME_LMA, 0, th); - - return rc; -} - -int local_object_create(const struct lu_env *env, - struct local_oid_storage *los, - struct dt_object *o, struct lu_attr *attr, - struct dt_object_format *dof, struct thandle *th) -{ - struct dt_thread_info *dti = dt_info(env); - __le64 lastid; - int rc; - - rc = dt_create(env, o, attr, NULL, dof, th); - if (rc) - return rc; - - if (los == NULL) - return rc; - - LASSERT(los->los_obj); - LASSERT(dt_object_exists(los->los_obj)); - - /* many threads can be updated this, serialize - * them here to avoid the race where one thread - * takes the value first, but writes it last */ - mutex_lock(&los->los_id_lock); - - /* update local oid number on disk so that - * we know the last one used after reboot */ - lastid = cpu_to_le64(los->los_last_oid); - - dti->dti_off = 0; - dti->dti_lb.lb_buf = &lastid; - dti->dti_lb.lb_len = sizeof(lastid); - rc = dt_record_write(env, los->los_obj, &dti->dti_lb, &dti->dti_off, - th); - mutex_unlock(&los->los_id_lock); - - return rc; -} - -/* - * Create local named object (file, directory or index) in parent directory. - */ -struct dt_object *__local_file_create(const struct lu_env *env, - const struct lu_fid *fid, - struct local_oid_storage *los, - struct ls_device *ls, - struct dt_object *parent, - const char *name, struct lu_attr *attr, - struct dt_object_format *dof) -{ - struct dt_thread_info *dti = dt_info(env); - struct dt_object *dto; - struct thandle *th; - int rc; - - dto = ls_locate(env, ls, fid); - if (unlikely(IS_ERR(dto))) - return dto; - - LASSERT(dto != NULL); - if (dt_object_exists(dto)) - GOTO(out, rc = -EEXIST); - - th = dt_trans_create(env, ls->ls_osd); - if (IS_ERR(th)) - GOTO(out, rc = PTR_ERR(th)); - - rc = local_object_declare_create(env, los, dto, attr, dof, th); - if (rc) - GOTO(trans_stop, rc); - - if (dti->dti_dof.dof_type == DFT_DIR) { - dt_declare_ref_add(env, dto, th); - dt_declare_ref_add(env, parent, th); - } - - rc = dt_declare_insert(env, parent, (void *)fid, (void *)name, th); - if (rc) - 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); - if (dt_object_exists(dto)) - GOTO(unlock, rc = 0); - - CDEBUG(D_OTHER, "create new object "DFID"\n", - PFID(lu_object_fid(&dto->do_lu))); - rc = local_object_create(env, los, dto, attr, dof, th); - if (rc) - GOTO(unlock, rc); - LASSERT(dt_object_exists(dto)); - - if (dti->dti_dof.dof_type == DFT_DIR) { - if (!dt_try_as_dir(env, dto)) - GOTO(destroy, rc = -ENOTDIR); - /* Add "." and ".." for newly created dir */ - rc = dt_insert(env, dto, (void *)fid, (void *)".", th, - BYPASS_CAPA, 1); - if (rc) - GOTO(destroy, rc); - dt_ref_add(env, dto, th); - rc = dt_insert(env, dto, (void *)lu_object_fid(&parent->do_lu), - (void *)"..", th, BYPASS_CAPA, 1); - if (rc) - GOTO(destroy, rc); - } - - dt_write_lock(env, parent, 0); - rc = dt_insert(env, parent, (const struct dt_rec *)fid, - (const struct dt_key *)name, th, BYPASS_CAPA, 1); - if (dti->dti_dof.dof_type == DFT_DIR) - dt_ref_add(env, parent, th); - dt_write_unlock(env, parent); - if (rc) - GOTO(destroy, rc); -destroy: - if (rc) - dt_destroy(env, dto, th); -unlock: - dt_write_unlock(env, dto); -trans_stop: - dt_trans_stop(env, ls->ls_osd, th); -out: - if (rc) { - lu_object_put_nocache(env, &dto->do_lu); - dto = ERR_PTR(rc); - } - return dto; -} - -/* - * Look up and create (if it does not exist) a local named file or directory in - * parent directory. - */ -struct dt_object *local_file_find_or_create(const struct lu_env *env, - struct local_oid_storage *los, - struct dt_object *parent, - const char *name, __u32 mode) -{ - 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 == 0) - /* name is found, get the object */ - dto = ls_locate(env, dt2ls_dev(los->los_dev), &dti->dti_fid); - 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); - } - } - return dto; -} -EXPORT_SYMBOL(local_file_find_or_create); - -struct dt_object *local_file_find_or_create_with_fid(const struct lu_env *env, - struct dt_device *dt, - const struct lu_fid *fid, - struct dt_object *parent, - const char *name, - __u32 mode) -{ - 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 == 0) { - dto = dt_locate(env, dt, &dti->dti_fid); - } else if (rc != -ENOENT) { - dto = ERR_PTR(rc); - } else { - struct ls_device *ls; - - ls = ls_device_get(dt); - if (IS_ERR(ls)) { - dto = ERR_CAST(ls); - } 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, fid, NULL, ls, parent, - name, &dti->dti_attr, - &dti->dti_dof); - /* ls_device_put() will finalize the ls device, we - * 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); - dto = dt_locate(env, dt, &dti->dti_fid); - } - ls_device_put(env, ls); - } - } - return dto; -} -EXPORT_SYMBOL(local_file_find_or_create_with_fid); - -/* - * Look up and create (if it does not exist) a local named index file in parent - * directory. - */ -struct dt_object *local_index_find_or_create(const struct lu_env *env, - struct local_oid_storage *los, - struct dt_object *parent, - const char *name, __u32 mode, - const struct dt_index_features *ft) -{ - 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 == 0) { - /* name is found, get the object */ - dto = ls_locate(env, dt2ls_dev(los->los_dev), &dti->dti_fid); - } 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 = DFT_INDEX; - dti->dti_dof.u.dof_idx.di_feat = ft; - 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_index_find_or_create); - -struct dt_object * -local_index_find_or_create_with_fid(const struct lu_env *env, - struct dt_device *dt, - const struct lu_fid *fid, - struct dt_object *parent, - const char *name, __u32 mode, - const struct dt_index_features *ft) -{ - 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 == 0) { - /* name is found, get the object */ - if (!lu_fid_eq(fid, &dti->dti_fid)) - dto = ERR_PTR(-EINVAL); - else - dto = dt_locate(env, dt, fid); - } else if (rc != -ENOENT) { - dto = ERR_PTR(rc); - } else { - struct ls_device *ls; - - ls = ls_device_get(dt); - if (IS_ERR(ls)) { - dto = ERR_CAST(ls); - } else { - /* create the object */ - dti->dti_attr.la_valid = LA_MODE; - dti->dti_attr.la_mode = mode; - dti->dti_dof.dof_type = DFT_INDEX; - dti->dti_dof.u.dof_idx.di_feat = ft; - dto = __local_file_create(env, fid, NULL, ls, parent, - name, &dti->dti_attr, - &dti->dti_dof); - /* ls_device_put() will finalize the ls device, we - * 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); - dto = dt_locate(env, dt, &dti->dti_fid); - } - ls_device_put(env, ls); - } - } - return dto; -} -EXPORT_SYMBOL(local_index_find_or_create_with_fid); - -static int local_object_declare_unlink(const struct lu_env *env, - struct dt_device *dt, - struct dt_object *p, - struct dt_object *c, const char *name, - struct thandle *th) -{ - int rc; - - rc = dt_declare_delete(env, p, (const struct dt_key *)name, th); - if (rc < 0) - return rc; - - rc = dt_declare_ref_del(env, c, th); - if (rc < 0) - return rc; - - return dt_declare_destroy(env, c, th); -} - -int local_object_unlink(const struct lu_env *env, struct dt_device *dt, - struct dt_object *parent, const char *name) -{ - struct dt_thread_info *dti = dt_info(env); - struct dt_object *dto; - struct thandle *th; - int rc; - - rc = dt_lookup_dir(env, parent, name, &dti->dti_fid); - if (rc == -ENOENT) - return 0; - else if (rc < 0) - return rc; - - dto = dt_locate(env, dt, &dti->dti_fid); - if (unlikely(IS_ERR(dto))) - return PTR_ERR(dto); - - th = dt_trans_create(env, dt); - if (IS_ERR(th)) - GOTO(out, rc = PTR_ERR(th)); - - rc = local_object_declare_unlink(env, dt, parent, dto, name, th); - if (rc < 0) - GOTO(stop, rc); - - rc = dt_trans_start_local(env, dt, th); - if (rc < 0) - GOTO(stop, rc); - - dt_write_lock(env, dto, 0); - rc = dt_delete(env, parent, (struct dt_key *)name, th, BYPASS_CAPA); - if (rc < 0) - GOTO(unlock, rc); - - rc = dt_ref_del(env, dto, th); - if (rc < 0) { - rc = dt_insert(env, parent, - (const struct dt_rec *)&dti->dti_fid, - (const struct dt_key *)name, th, BYPASS_CAPA, 1); - GOTO(unlock, rc); - } - - rc = dt_destroy(env, dto, th); -unlock: - dt_write_unlock(env, dto); -stop: - dt_trans_stop(env, dt, th); -out: - lu_object_put_nocache(env, &dto->do_lu); - return rc; -} -EXPORT_SYMBOL(local_object_unlink); - -struct local_oid_storage *dt_los_find(struct ls_device *ls, __u64 seq) -{ - struct local_oid_storage *los, *ret = NULL; - - list_for_each_entry(los, &ls->ls_los_list, los_list) { - if (los->los_seq == seq) { - atomic_inc(&los->los_refcount); - ret = los; - break; - } - } - return ret; -} - -void dt_los_put(struct local_oid_storage *los) -{ - if (atomic_dec_and_test(&los->los_refcount)) - /* 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 - * If such file exists then we have to read its content - */ -int lastid_compat_check(const struct lu_env *env, struct dt_device *dev, - __u64 lastid_seq, __u32 *first_oid, struct ls_device *ls) -{ - struct dt_thread_info *dti = dt_info(env); - struct dt_object *root = NULL; - struct los_ondisk losd; - struct dt_object *o = NULL; - int rc = 0; - - rc = dt_root_get(env, dev, &dti->dti_fid); - if (rc) - return rc; - - root = ls_locate(env, ls, &dti->dti_fid); - if (IS_ERR(root)) - return PTR_ERR(root); - - /* find old last_id file */ - 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); - if (rc == -ENOENT) { - /* old llog lastid accessed by FID only */ - if (lastid_seq != FID_SEQ_LLOG) - return 0; - dti->dti_fid.f_seq = FID_SEQ_LLOG; - dti->dti_fid.f_oid = 1; - dti->dti_fid.f_ver = 0; - o = ls_locate(env, ls, &dti->dti_fid); - if (IS_ERR(o)) - return PTR_ERR(o); - - if (!dt_object_exists(o)) { - lu_object_put_nocache(env, &o->do_lu); - 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 %#llx\n", - lastid_seq); - o = ls_locate(env, ls, &dti->dti_fid); - if (IS_ERR(o)) - return PTR_ERR(o); - } - /* let's read seq-NNNNNN-lastid file value */ - LASSERT(dt_object_exists(o)); - dti->dti_off = 0; - dti->dti_lb.lb_buf = &losd; - dti->dti_lb.lb_len = sizeof(losd); - dt_read_lock(env, o, 0); - rc = dt_record_read(env, o, &dti->dti_lb, &dti->dti_off); - dt_read_unlock(env, o); - lu_object_put_nocache(env, &o->do_lu); - if (rc == 0 && le32_to_cpu(losd.lso_magic) != LOS_MAGIC) { - 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)); - return -EINVAL; - } else if (rc < 0) { - CERROR("%s: failed to read seq-%#llx-lastid: rc = %d\n", - o->do_lu.lo_dev->ld_obd->obd_name, lastid_seq, rc); - return rc; - } - *first_oid = le32_to_cpu(losd.lso_next_oid); - return rc; -} - -/** - * Initialize local OID storage for required sequence. - * That may be needed for services that uses local files and requires - * dynamic OID allocation for them. - * - * Per each sequence we have an object with 'first_fid' identificator - * containing the counter for OIDs of locally created files with that - * sequence. - * - * It is used now by llog subsystem and MGS for NID tables - * - * Function gets first_fid to create counter object. - * All dynamic fids will be generated with the same sequence and incremented - * OIDs - * - * Returned local_oid_storage is in-memory representation of OID storage - */ -int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, - const struct lu_fid *first_fid, - struct local_oid_storage **los) -{ - struct dt_thread_info *dti = dt_info(env); - struct ls_device *ls; - u64 lastid; - struct dt_object *o = NULL; - struct thandle *th; - __u32 first_oid = fid_oid(first_fid); - int rc = 0; - - ls = ls_device_get(dev); - if (IS_ERR(ls)) - return PTR_ERR(ls); - - mutex_lock(&ls->ls_los_mutex); - *los = dt_los_find(ls, fid_seq(first_fid)); - if (*los != NULL) - GOTO(out, rc = 0); - - /* not found, then create */ - OBD_ALLOC_PTR(*los); - if (*los == NULL) - GOTO(out, rc = -ENOMEM); - - atomic_set(&(*los)->los_refcount, 1); - mutex_init(&(*los)->los_id_lock); - (*los)->los_dev = &ls->ls_top_dev; - atomic_inc(&ls->ls_refcount); - list_add(&(*los)->los_list, &ls->ls_los_list); - - /* Use {seq, 0, 0} to create the LAST_ID file for every - * sequence. OIDs start at LUSTRE_FID_INIT_OID. - */ - dti->dti_fid.f_seq = fid_seq(first_fid); - dti->dti_fid.f_oid = LUSTRE_FID_LASTID_OID; - dti->dti_fid.f_ver = 0; - o = ls_locate(env, ls, &dti->dti_fid); - if (IS_ERR(o)) - GOTO(out_los, rc = PTR_ERR(o)); - - if (!dt_object_exists(o)) { - rc = lastid_compat_check(env, dev, fid_seq(first_fid), - &first_oid, ls); - if (rc < 0) - GOTO(out_los, rc); - - th = dt_trans_create(env, dev); - if (IS_ERR(th)) - GOTO(out_los, rc = PTR_ERR(th)); - - dti->dti_attr.la_valid = LA_MODE | LA_TYPE; - dti->dti_attr.la_mode = S_IFREG | S_IRUGO | S_IWUSR; - dti->dti_dof.dof_type = dt_mode_to_dft(S_IFREG); - - rc = dt_declare_create(env, o, &dti->dti_attr, NULL, - &dti->dti_dof, th); - if (rc) - GOTO(out_trans, rc); - - rc = dt_declare_record_write(env, o, sizeof(lastid), 0, th); - if (rc) - GOTO(out_trans, rc); - - rc = dt_trans_start_local(env, dev, th); - if (rc) - GOTO(out_trans, rc); - - dt_write_lock(env, o, 0); - if (dt_object_exists(o)) - GOTO(out_lock, rc = 0); - - rc = dt_create(env, o, &dti->dti_attr, NULL, &dti->dti_dof, - th); - if (rc) - GOTO(out_lock, rc); - - lastid = cpu_to_le64(first_oid); - - dti->dti_off = 0; - dti->dti_lb.lb_buf = &lastid; - dti->dti_lb.lb_len = sizeof(lastid); - rc = dt_record_write(env, o, &dti->dti_lb, &dti->dti_off, th); - if (rc) - GOTO(out_lock, rc); -out_lock: - dt_write_unlock(env, o); -out_trans: - dt_trans_stop(env, dev, th); - } else { - dti->dti_off = 0; - dti->dti_lb.lb_buf = &lastid; - dti->dti_lb.lb_len = sizeof(lastid); - dt_read_lock(env, o, 0); - 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 %llu is read from LAST_ID\n", - o->do_lu.lo_dev->ld_obd->obd_name, - le64_to_cpu(lastid)); - rc = -EINVAL; - } - } -out_los: - if (rc != 0) { - list_del(&(*los)->los_list); - atomic_dec(&ls->ls_refcount); - OBD_FREE_PTR(*los); - *los = NULL; - if (o != NULL && !IS_ERR(o)) - lu_object_put_nocache(env, &o->do_lu); - } else { - (*los)->los_seq = fid_seq(first_fid); - (*los)->los_last_oid = le64_to_cpu(lastid); - (*los)->los_obj = o; - /* Read value should not be less than initial one - * but possible after upgrade from older fs. - * In this case just switch to the first_oid in memory and - * it will be updated on disk with first object generated */ - if ((*los)->los_last_oid < first_oid) - (*los)->los_last_oid = first_oid; - } -out: - mutex_unlock(&ls->ls_los_mutex); - ls_device_put(env, ls); - return rc; -} -EXPORT_SYMBOL(local_oid_storage_init); - -void local_oid_storage_fini(const struct lu_env *env, - struct local_oid_storage *los) -{ - struct ls_device *ls; - - if (!atomic_dec_and_test(&los->los_refcount)) - return; - - LASSERT(env); - LASSERT(los->los_dev); - ls = dt2ls_dev(los->los_dev); - - mutex_lock(&ls->ls_los_mutex); - if (atomic_read(&los->los_refcount) == 0) { - if (los->los_obj) - lu_object_put_nocache(env, &los->los_obj->do_lu); - list_del(&los->los_list); - OBD_FREE_PTR(los); - } - mutex_unlock(&ls->ls_los_mutex); - ls_device_put(env, ls); -} -EXPORT_SYMBOL(local_oid_storage_fini); diff --git a/drivers/staging/lustre/lustre/obdclass/local_storage.h b/drivers/staging/lustre/lustre/obdclass/local_storage.h deleted file mode 100644 index 0b9ad33..0000000 --- a/drivers/staging/lustre/lustre/obdclass/local_storage.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License version 2 for more details. A copy is - * included in the COPYING file that accompanied this code. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * GPL HEADER END - */ -/* - * Copyright (c) 2012, Intel Corporation. - */ -/* - * lustre/obdclass/local_storage.c - * - * Local storage for file/objects with fid generation. Works on top of OSD. - * - * Author: Mikhail Pershin - */ -#ifndef __LOCAL_STORAGE_H -#define __LOCAL_STORAGE_H - -#include "../include/dt_object.h" -#include "../include/obd.h" -#include "../include/lustre_fid.h" -#include "../include/lustre_disk.h" - -struct ls_device { - struct dt_device ls_top_dev; - /* all initialized ls_devices on this node linked by this */ - struct list_head ls_linkage; - /* how many handle's reference this local storage */ - atomic_t ls_refcount; - /* underlaying OSD device */ - struct dt_device *ls_osd; - /* list of all local OID storages */ - struct list_head ls_los_list; - struct mutex ls_los_mutex; -}; - -static inline struct ls_device *dt2ls_dev(struct dt_device *d) -{ - return container_of0(d, struct ls_device, ls_top_dev); -} - -struct ls_object { - struct lu_object_header ls_header; - struct dt_object ls_obj; -}; - -static inline struct ls_object *lu2ls_obj(struct lu_object *o) -{ - return container_of0(o, struct ls_object, ls_obj.do_lu); -} - -static inline struct dt_object *ls_locate(const struct lu_env *env, - struct ls_device *ls, - const struct lu_fid *fid) -{ - return dt_locate_at(env, ls->ls_osd, fid, &ls->ls_top_dev.dd_lu_dev); -} - -struct ls_device *ls_device_get(struct dt_device *dev); -void ls_device_put(const struct lu_env *env, struct ls_device *ls); -struct local_oid_storage *dt_los_find(struct ls_device *ls, __u64 seq); -void dt_los_put(struct local_oid_storage *los); - -/* Lustre 2.3 on-disk structure describing local object OIDs storage - * the structure to be used with any sequence managed by - * local object library. - * Obsoleted since 2.4 but is kept for compatibility reasons, - * see lastid_compat_check() in obdclass/local_storage.c */ -struct los_ondisk { - __u32 lso_magic; - __u32 lso_next_oid; -}; - -#define LOS_MAGIC 0xdecafbee -#endif -- 2.7.4