Whamcloud - gitweb
LU-1330 obdclass: add obd_target.h
[fs/lustre-release.git] / lustre / osd-zfs / osd_object.c
index 1265475..37706e2 100644 (file)
@@ -28,7 +28,7 @@
  * Use is subject to license terms.
  */
 /*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2013, Intel Corporation.
  * Use is subject to license terms.
  */
 /*
@@ -49,7 +49,6 @@
 
 #include <lustre_ver.h>
 #include <libcfs/libcfs.h>
-#include <lustre_fsfilt.h>
 #include <obd_support.h>
 #include <lustre_net.h>
 #include <obd.h>
@@ -79,7 +78,7 @@ static struct lu_object_operations osd_lu_obj_ops;
 extern struct dt_body_operations osd_body_ops;
 static struct dt_object_operations osd_obj_otable_it_ops;
 
-extern cfs_mem_cache_t *osd_object_kmem;
+extern struct kmem_cache *osd_object_kmem;
 
 static void
 osd_object_sa_fini(struct osd_object *obj)
@@ -234,7 +233,7 @@ int __osd_object_attr_get(const struct lu_env *env, udmu_objset_t *uos,
        la->la_uid = osa->uid;
        la->la_gid = osa->gid;
        la->la_nlink = osa->nlink;
-       la->la_flags = osa->flags;
+       la->la_flags = attrs_zfs2fs(osa->flags);
        la->la_size = osa->size;
 
        if (S_ISCHR(la->la_mode) || S_ISBLK(la->la_mode)) {
@@ -290,7 +289,7 @@ struct lu_object *osd_object_alloc(const struct lu_env *env,
 {
        struct osd_object *mo;
 
-       OBD_SLAB_ALLOC_PTR_GFP(mo, osd_object_kmem, CFS_ALLOC_IO);
+       OBD_SLAB_ALLOC_PTR_GFP(mo, osd_object_kmem, __GFP_IO);
        if (mo != NULL) {
                struct lu_object *l;
 
@@ -349,6 +348,39 @@ int osd_object_init0(const struct lu_env *env, struct osd_object *obj)
        RETURN(0);
 }
 
+static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
+{
+       struct osd_thread_info  *info = osd_oti_get(env);
+       struct lu_buf           buf;
+       int                     rc;
+       struct lustre_mdt_attrs *lma;
+       ENTRY;
+
+       CLASSERT(sizeof(info->oti_buf) >= sizeof(*lma));
+       lma = (struct lustre_mdt_attrs *)info->oti_buf;
+       buf.lb_buf = lma;
+       buf.lb_len = sizeof(info->oti_buf);
+
+       rc = osd_xattr_get(env, &obj->oo_dt, &buf, XATTR_NAME_LMA, BYPASS_CAPA);
+       if (rc > 0) {
+               rc = 0;
+               lustre_lma_swab(lma);
+               if (unlikely((lma->lma_incompat & ~LMA_INCOMPAT_SUPP) ||
+                            CFS_FAIL_CHECK(OBD_FAIL_OSD_LMA_INCOMPAT))) {
+                       CWARN("%s: unsupported incompat LMA feature(s) %#x for "
+                             "fid = "DFID"\n", osd_obj2dev(obj)->od_svname,
+                             lma->lma_incompat & ~LMA_INCOMPAT_SUPP,
+                             PFID(lu_object_fid(&obj->oo_dt.do_lu)));
+                       rc = -EOPNOTSUPP;
+               }
+       } else if (rc == -ENODATA) {
+               /* haven't initialize LMA xattr */
+               rc = 0;
+       }
+
+       RETURN(rc);
+}
+
 /*
  * Concurrency: no concurrent access is possible that early in object
  * life-cycle.
@@ -375,17 +407,24 @@ static int osd_object_init(const struct lu_env *env, struct lu_object *l,
                LASSERT(obj->oo_db == NULL);
                rc = __osd_obj2dbuf(env, osd->od_objset.os, oid,
                                        &obj->oo_db, osd_obj_tag);
-               if (rc == 0) {
-                       LASSERT(obj->oo_db);
-                       rc = osd_object_init0(env, obj);
-               } else {
+               if (rc != 0) {
                        CERROR("%s: lookup "DFID"/"LPX64" failed: rc = %d\n",
                               osd->od_svname, PFID(lu_object_fid(l)), oid, rc);
+                       GOTO(out, rc);
                }
+               LASSERT(obj->oo_db);
+               rc = osd_object_init0(env, obj);
+               if (rc != 0)
+                       GOTO(out, rc);
+
+               rc = osd_check_lma(env, obj);
+               if (rc != 0)
+                       GOTO(out, rc);
        } else if (rc == -ENOENT) {
                rc = 0;
        }
        LASSERT(osd_invariant(obj));
+out:
        RETURN(rc);
 }
 
@@ -988,7 +1027,10 @@ static int osd_attr_set(const struct lu_env *env, struct dt_object *dt,
                                 &osa->rdev, 8);
        }
        if (la->la_valid & LA_FLAGS) {
-               osa->flags = obj->oo_attr.la_flags = la->la_flags;
+               osa->flags = attrs_fs2zfs(la->la_flags);
+               /* many flags are not supported by zfs, so ensure a good cached
+                * copy */
+               obj->oo_attr.la_flags = attrs_zfs2fs(osa->flags);
                SA_ADD_BULK_ATTR(bulk, cnt, SA_ZPL_FLAGS(uos), NULL,
                                 &osa->flags, 8);
        }
@@ -1125,7 +1167,7 @@ int __osd_attr_init(const struct lu_env *env, udmu_objset_t *uos, uint64_t oid,
        osa->gid = la->la_gid;
        osa->rdev = la->la_rdev;
        osa->nlink = la->la_nlink;
-       osa->flags = la->la_flags;
+       osa->flags = attrs_fs2zfs(la->la_flags);
        osa->size  = la->la_size;
 
        /* Now add in all of the "SA" attributes */