X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Flocal_storage.c;h=3672f01fd8e503f14dff0bdfab2a34744954f725;hb=e0ece89e1ac014a8443fe95860c4a43b88f16f63;hp=75e36a8fc70ba1efeb893555f9c45bf2bfb1a948;hpb=8931d9070415e808e09bb4befd7cd38ef2431149;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/local_storage.c b/lustre/obdclass/local_storage.c index 75e36a8..3672f01 100644 --- a/lustre/obdclass/local_storage.c +++ b/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 CFS_LIST_HEAD(ls_list_head); +static struct list_head ls_list_head = LIST_HEAD_INIT(ls_list_head); static DEFINE_MUTEX(ls_list_mutex); static int ls_object_init(const struct lu_env *env, struct lu_object *o, @@ -68,14 +68,14 @@ static void ls_object_free(const struct lu_env *env, struct lu_object *o) OBD_FREE_PTR(obj); } -struct lu_object_operations ls_lu_obj_ops = { +static 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) +static 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; @@ -108,7 +108,7 @@ static struct ls_device *__ls_find_dev(struct dt_device *dev) { struct ls_device *ls, *ret = NULL; - cfs_list_for_each_entry(ls, &ls_list_head, ls_linkage) { + list_for_each_entry(ls, &ls_list_head, ls_linkage) { if (ls->ls_osd == dev) { atomic_inc(&ls->ls_refcount); ret = ls; @@ -156,7 +156,7 @@ struct ls_device *ls_device_get(struct dt_device *dev) GOTO(out_ls, ls = ERR_PTR(-ENOMEM)); atomic_set(&ls->ls_refcount, 1); - CFS_INIT_LIST_HEAD(&ls->ls_los_list); + INIT_LIST_HEAD(&ls->ls_los_list); mutex_init(&ls->ls_los_mutex); ls->ls_osd = dev; @@ -167,7 +167,7 @@ struct ls_device *ls_device_get(struct dt_device *dev) ls->ls_top_dev.dd_lu_dev.ld_site = dev->dd_lu_dev.ld_site; /* finally add ls to the list */ - cfs_list_add(&ls->ls_linkage, &ls_list_head); + list_add(&ls->ls_linkage, &ls_list_head); out_ls: mutex_unlock(&ls_list_mutex); RETURN(ls); @@ -181,8 +181,8 @@ void ls_device_put(const struct lu_env *env, struct ls_device *ls) mutex_lock(&ls_list_mutex); if (atomic_read(&ls->ls_refcount) == 0) { - LASSERT(cfs_list_empty(&ls->ls_los_list)); - cfs_list_del(&ls->ls_linkage); + 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); @@ -229,8 +229,10 @@ int local_object_declare_create(const struct lu_env *env, /* update fid generation file */ if (los != NULL) { LASSERT(dt_object_exists(los->los_obj)); + dti->dti_lb.lb_buf = NULL; + dti->dti_lb.lb_len = sizeof(struct los_ondisk); rc = dt_declare_record_write(env, los->los_obj, - sizeof(struct los_ondisk), 0, th); + &dti->dti_lb, 0, th); if (rc) RETURN(rc); } @@ -289,16 +291,18 @@ int local_object_create(const struct lu_env *env, /* * 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) +static 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 lu_object_conf *conf = &dti->dti_conf; + struct dt_insert_rec *rec = &dti->dti_dt_rec; struct dt_object *dto; struct thandle *th; int rc; @@ -325,11 +329,19 @@ struct dt_object *__local_file_create(const struct lu_env *env, 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_ref_add(env, dto, th); + if (rc < 0) + GOTO(trans_stop, rc); + + rc = dt_declare_ref_add(env, parent, th); + if (rc < 0) + GOTO(trans_stop, rc); } - rc = dt_declare_insert(env, parent, (void *)fid, (void *)name, th); + rec->rec_fid = fid; + rec->rec_type = dto->do_lu.lo_header->loh_attr; + rc = dt_declare_insert(env, parent, (const struct dt_rec *)rec, + (const struct dt_key *)name, th); if (rc) GOTO(trans_stop, rc); @@ -351,20 +363,27 @@ struct dt_object *__local_file_create(const struct lu_env *env, 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, (void *)fid, (void *)".", th, - BYPASS_CAPA, 1); - if (rc) + rc = dt_insert(env, dto, (const struct dt_rec *)rec, + (const struct dt_key *)".", th, BYPASS_CAPA, 1); + if (rc != 0) 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) + 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); + 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); - rc = dt_insert(env, parent, (const struct dt_rec *)fid, + rc = dt_insert(env, parent, (const struct dt_rec *)rec, (const struct dt_key *)name, th, BYPASS_CAPA, 1); if (dti->dti_dof.dof_type == DFT_DIR) dt_ref_add(env, parent, th); @@ -627,8 +646,11 @@ int local_object_unlink(const struct lu_env *env, struct dt_device *dt, rc = dt_ref_del(env, dto, th); if (rc < 0) { - rc = dt_insert(env, parent, - (const struct dt_rec *)&dti->dti_fid, + struct dt_insert_rec *rec = &dti->dti_dt_rec; + + 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); GOTO(unlock, rc); } @@ -648,7 +670,7 @@ struct local_oid_storage *dt_los_find(struct ls_device *ls, __u64 seq) { struct local_oid_storage *los, *ret = NULL; - cfs_list_for_each_entry(los, &ls->ls_los_list, los_list) { + list_for_each_entry(los, &ls->ls_los_list, los_list) { if (los->los_seq == seq) { atomic_inc(&los->los_refcount); ret = los; @@ -670,8 +692,9 @@ void dt_los_put(struct local_oid_storage *los) /* 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) +static 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; @@ -693,17 +716,13 @@ int lastid_compat_check(const struct lu_env *env, struct dt_device *dev, rc = dt_lookup_dir(env, root, dti->dti_buf, &dti->dti_fid); lu_object_put_nocache(env, &root->do_lu); if (rc == -ENOENT) { - struct lu_object_conf *conf = &dti->dti_conf; - /* 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; - memset(conf, 0, sizeof(*conf)); - conf->loc_flags = LOC_F_NEW; - o = ls_locate(env, ls, &dti->dti_fid, conf); + o = ls_locate(env, ls, &dti->dti_fid, NULL); if (IS_ERR(o)) return PTR_ERR(o); @@ -729,18 +748,18 @@ int lastid_compat_check(const struct lu_env *env, struct dt_device *dev, 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-"LPX64"-lastid file, magic %x\n", o->do_lu.lo_dev->ld_obd->obd_name, lastid_seq, le32_to_cpu(losd.lso_magic)); - return -EINVAL; + rc = -EINVAL; } else if (rc < 0) { CERROR("%s: failed to read seq-"LPX64"-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); + lu_object_put_nocache(env, &o->do_lu); + if (rc == 0) + *first_oid = le32_to_cpu(losd.lso_next_oid); return rc; } @@ -793,7 +812,7 @@ int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, mutex_init(&(*los)->los_id_lock); (*los)->los_dev = &ls->ls_top_dev; atomic_inc(&ls->ls_refcount); - cfs_list_add(&(*los)->los_list, &ls->ls_los_list); + 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. @@ -824,7 +843,13 @@ int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, if (rc) GOTO(out_trans, rc); - rc = dt_declare_record_write(env, o, sizeof(lastid), 0, th); + 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_declare_record_write(env, o, &dti->dti_lb, dti->dti_off, + th); if (rc) GOTO(out_trans, rc); @@ -841,11 +866,6 @@ int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, 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); @@ -869,7 +889,7 @@ out_trans: } out_los: if (rc != 0) { - cfs_list_del(&(*los)->los_list); + list_del(&(*los)->los_list); atomic_dec(&ls->ls_refcount); OBD_FREE_PTR(*los); *los = NULL; @@ -894,26 +914,25 @@ out: EXPORT_SYMBOL(local_oid_storage_init); void local_oid_storage_fini(const struct lu_env *env, - struct local_oid_storage *los) + 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); + /* Take the mutex before decreasing the reference to avoid race + * conditions as described in LU-4721. */ mutex_lock(&ls->ls_los_mutex); - if (atomic_read(&los->los_refcount) > 0) { + if (!atomic_dec_and_test(&los->los_refcount)) { mutex_unlock(&ls->ls_los_mutex); return; } if (los->los_obj) lu_object_put_nocache(env, &los->los_obj->do_lu); - cfs_list_del(&los->los_list); + list_del(&los->los_list); OBD_FREE_PTR(los); mutex_unlock(&ls->ls_los_mutex); ls_device_put(env, ls);