X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flod%2Flod_object.c;h=787e461d3ec09924850adb244f27acac0fde375a;hb=614665d3201b4de385e3fab6d7d99e1468fde0d4;hp=fd36da571a77153b170162ffbd5413444a290cbf;hpb=e5a6d30afa60105a924f236a953b9c3c51510539;p=fs%2Flustre-release.git diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index fd36da5..787e461 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -23,7 +23,7 @@ * Copyright 2009 Sun Microsystems, Inc. All rights reserved * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * lustre/lod/lod_object.c @@ -291,6 +291,16 @@ static int lod_declare_attr_set(const struct lu_env *env, if (rc) RETURN(rc); + /* osp_declare_attr_set() ignores all attributes other than + * UID, GID, and size, and osp_attr_set() ignores all but UID + * and GID. Declaration of size attr setting happens through + * lod_declare_init_size(), and not through this function. + * Therefore we need not load striping unless ownership is + * changing. This should save memory and (we hope) speed up + * rename(). */ + if (!(attr->la_valid & (LA_UID | LA_GID))) + RETURN(rc); + /* * load striping information, notice we don't do this when object * is being initialized as we don't need this information till @@ -334,6 +344,9 @@ static int lod_attr_set(const struct lu_env *env, if (rc) RETURN(rc); + if (!(attr->la_valid & (LA_UID | LA_GID))) + RETURN(rc); + /* * if object is striped, apply changes to all the stripes */ @@ -380,7 +393,7 @@ static int lod_xattr_get(const struct lu_env *env, struct dt_object *dt, rc = sizeof(struct lov_user_md_v1); } else if (buf->lb_len >= sizeof(struct lov_user_md_v1)) { lum->lmm_magic = LOV_USER_MAGIC_V1; - lum->lmm_object_seq = FID_SEQ_LOV_DEFAULT; + lmm_oi_set_seq(&lum->lmm_oi, FID_SEQ_LOV_DEFAULT); lum->lmm_pattern = desc->ld_pattern; lum->lmm_stripe_size = desc->ld_default_stripe_size; lum->lmm_stripe_count = desc->ld_default_stripe_count; @@ -433,7 +446,7 @@ static int lod_declare_xattr_set(const struct lu_env *env, if (rc) RETURN(rc); } else { - memset(attr, 0, sizeof(attr)); + memset(attr, 0, sizeof(*attr)); attr->la_valid = LA_TYPE | LA_MODE; attr->la_mode = S_IFREG; } @@ -528,10 +541,13 @@ static int lod_xattr_set(const struct lu_env *env, * already have during req replay, declare_xattr_set() * defines striping, then create() does the work */ - if (fl & LU_XATTR_REPLACE) + if (fl & LU_XATTR_REPLACE) { + /* free stripes, then update disk */ + lod_object_free_striping(env, lod_dt_obj(dt)); rc = dt_xattr_set(env, next, buf, name, fl, th, capa); - else + } else { rc = lod_striping_create(env, dt, NULL, NULL, th); + } RETURN(rc); } else { /* @@ -554,6 +570,8 @@ static int lod_xattr_del(const struct lu_env *env, struct dt_object *dt, const char *name, struct thandle *th, struct lustre_capa *capa) { + if (!strcmp(name, XATTR_NAME_LOV)) + lod_object_free_striping(env, lod_dt_obj(dt)); return dt_xattr_del(env, dt_object_child(dt), name, th, capa); } @@ -914,8 +932,8 @@ static int lod_declare_object_create(const struct lu_env *env, v3->lmm_magic = cpu_to_le32(LOV_MAGIC_V3); v3->lmm_pattern = cpu_to_le32(LOV_PATTERN_RAID0); - v3->lmm_object_id = fid_oid(lu_object_fid(&dt->do_lu)); - v3->lmm_object_seq = fid_seq(lu_object_fid(&dt->do_lu)); + fid_to_lmm_oi(lu_object_fid(&dt->do_lu), &v3->lmm_oi); + lmm_oi_cpu_to_le(&v3->lmm_oi, &v3->lmm_oi); v3->lmm_stripe_size = cpu_to_le32(lo->ldo_def_stripe_size); v3->lmm_stripe_count = cpu_to_le32(lo->ldo_def_stripenr); v3->lmm_stripe_offset = cpu_to_le16(lo->ldo_def_stripe_offset); @@ -945,7 +963,7 @@ int lod_striping_create(const struct lu_env *env, struct dt_object *dt, ENTRY; LASSERT(lo->ldo_stripe); - LASSERT(lo->ldo_stripe > 0); + LASSERT(lo->ldo_stripenr > 0); LASSERT(lo->ldo_striping_cached == 0); /* create all underlying objects */ @@ -1099,6 +1117,23 @@ static int lod_object_sync(const struct lu_env *env, struct dt_object *dt) return dt_object_sync(env, dt_object_child(dt)); } +static int lod_object_lock(const struct lu_env *env, + struct dt_object *dt, struct lustre_handle *lh, + struct ldlm_enqueue_info *einfo, + void *policy) +{ + struct dt_object *next = dt_object_child(dt); + int rc; + ENTRY; + + /* + * declare setattr on the local object + */ + rc = dt_object_lock(env, next, lh, einfo, policy); + + RETURN(rc); +} + struct dt_object_operations lod_obj_ops = { .do_read_lock = lod_object_read_lock, .do_write_lock = lod_object_write_lock, @@ -1126,28 +1161,9 @@ struct dt_object_operations lod_obj_ops = { .do_ref_del = lod_ref_del, .do_capa_get = lod_capa_get, .do_object_sync = lod_object_sync, + .do_object_lock = lod_object_lock, }; -static int lod_object_lock(const struct lu_env *env, - struct dt_object *dt, struct lustre_handle *lh, - struct ldlm_enqueue_info *einfo, - void *policy) -{ - struct dt_object *next = dt_object_child(dt); - int rc; - ENTRY; - - /* - * declare setattr on the local object - */ - rc = dt_object_lock(env, next, lh, einfo, policy); - - RETURN(rc); -} - -struct dt_lock_operations lod_lock_ops = { - .do_object_lock = lod_object_lock, -}; static ssize_t lod_read(const struct lu_env *env, struct dt_object *dt, struct lu_buf *buf, loff_t *pos, struct lustre_capa *capa)