Whamcloud - gitweb
LU-2789 lod: sidestep setstripe vs rename race
[fs/lustre-release.git] / lustre / lod / lod_object.c
index 4bd2aa2..8fa06a6 100644 (file)
@@ -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;
+                       ostid_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 {
                /*
@@ -914,8 +930,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_ostid(lu_object_fid(&dt->do_lu), &v3->lmm_oi);
+               ostid_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);
@@ -1099,6 +1115,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 +1159,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)