Whamcloud - gitweb
LU-1876 hsm: revise ll_setattr_raw to not check stripe data
[fs/lustre-release.git] / lustre / osp / osp_object.c
index 337b710..3c59035 100644 (file)
@@ -94,7 +94,8 @@ static int osp_declare_attr_set(const struct lu_env *env, struct dt_object *dt,
        if (attr == NULL)
                RETURN(0);
 
-       if (attr->la_valid & LA_SIZE && attr->la_size > 0) {
+       if (attr->la_valid & LA_SIZE && attr->la_size > 0 &&
+           fid_is_zero(lu_object_fid(&o->opo_obj.do_lu))) {
                LASSERT(!dt_object_exists(dt));
                osp_object_assign_fid(env, d, o);
                rc = osp_object_truncate(env, dt, attr->la_size);
@@ -348,14 +349,37 @@ struct dt_object_operations osp_obj_ops = {
        .do_destroy             = osp_object_destroy,
 };
 
-static int osp_object_init(const struct lu_env *env, struct lu_object *o,
-                          const struct lu_object_conf *unused)
+static int is_ost_obj(struct lu_object *lo)
 {
-       struct osp_object *po = lu2osp_obj(o);
+       struct osp_device  *osp  = lu2osp_dev(lo->lo_dev);
 
-       po->opo_obj.do_ops = &osp_obj_ops;
+       return !osp->opd_connect_mdt;
+}
 
-       return 0;
+static int osp_object_init(const struct lu_env *env, struct lu_object *o,
+                          const struct lu_object_conf *conf)
+{
+       struct osp_object       *po = lu2osp_obj(o);
+       int                     rc = 0;
+       ENTRY;
+
+       if (is_ost_obj(o)) {
+               po->opo_obj.do_ops = &osp_obj_ops;
+       } else {
+               struct lu_attr          *la = &osp_env_info(env)->osi_attr;
+
+               po->opo_obj.do_ops = &osp_md_obj_ops;
+               o->lo_header->loh_attr |= LOHA_REMOTE;
+               po->opo_obj.do_lock_ops = &osp_md_lock_ops;
+               rc = po->opo_obj.do_ops->do_attr_get(env, lu2dt_obj(o),
+                                                    la, NULL);
+               if (rc == 0)
+                       o->lo_header->loh_attr |=
+                               LOHA_EXISTS | (la->la_mode & S_IFMT);
+               if (rc == -ENOENT)
+                       rc = 0;
+       }
+       RETURN(rc);
 }
 
 static void osp_object_free(const struct lu_env *env, struct lu_object *o)