From d948d10f0d68f8675cd8f80032642382c7811846 Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Thu, 9 Aug 2012 20:59:02 -0700 Subject: [PATCH] LU-957 scrub: disable OI Scrub for osd-zfs ZFS is not supported by OI Scrub. Signed-off-by: Jinshan Xiong Change-Id: I7a2f90298f37edab870edf28008a1a140260c99b Reviewed-on: http://review.whamcloud.com/3594 Reviewed-by: Fan Yong Tested-by: Hudson Reviewed-by: Andreas Dilger Tested-by: Maloo --- lustre/mdd/mdd_lfsck.c | 8 ++++++++ lustre/osd-zfs/osd_index.c | 7 ++++++- lustre/osd-zfs/osd_object.c | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lustre/mdd/mdd_lfsck.c b/lustre/mdd/mdd_lfsck.c index 5cb24d3..e3b2d3e 100644 --- a/lustre/mdd/mdd_lfsck.c +++ b/lustre/mdd/mdd_lfsck.c @@ -212,6 +212,9 @@ int mdd_lfsck_start(const struct lu_env *env, struct md_lfsck *lfsck, __u16 flags = 0; ENTRY; + if (lfsck->ml_it_obj == NULL) + RETURN(-ENOTSUPP); + cfs_mutex_lock(&lfsck->ml_mutex); cfs_spin_lock(&lfsck->ml_lock); if (thread_is_running(thread)) { @@ -315,6 +318,11 @@ int mdd_lfsck_setup(const struct lu_env *env, struct mdd_device *mdd) rc = obj->do_ops->do_index_try(env, obj, &dt_otable_features); if (rc != 0) { lu_object_put(env, &obj->do_lu); + if (rc == -ENOTSUPP) { + CERROR("%s: Lustre LFSCK unsupported on this device.\n", + mdd->mdd_obd_dev->obd_name); + rc = 0; + } return rc; } diff --git a/lustre/osd-zfs/osd_index.c b/lustre/osd-zfs/osd_index.c index 0cb3bca..8bc19ec 100644 --- a/lustre/osd-zfs/osd_index.c +++ b/lustre/osd-zfs/osd_index.c @@ -902,7 +902,7 @@ int osd_index_try(const struct lu_env *env, struct dt_object *dt, struct osd_object *obj = osd_dt_obj(dt); ENTRY; - LASSERT(obj->oo_db != NULL); + LASSERT(dt_object_exists(dt)); /* * XXX: implement support for fixed-size keys sorted with natural @@ -911,6 +911,11 @@ int osd_index_try(const struct lu_env *env, struct dt_object *dt, if (feat->dif_flags & DT_IND_RANGE) RETURN(-ERANGE); + if (unlikely(feat == &dt_otable_features)) + /* do not support oi scrub yet. */ + RETURN(-ENOTSUPP); + + LASSERT(obj->oo_db != NULL); if (likely(feat == &dt_directory_features)) { if (udmu_object_is_zap(obj->oo_db)) dt->do_index_ops = &osd_dir_ops; diff --git a/lustre/osd-zfs/osd_object.c b/lustre/osd-zfs/osd_object.c index a241376..bd12851 100644 --- a/lustre/osd-zfs/osd_object.c +++ b/lustre/osd-zfs/osd_object.c @@ -77,6 +77,7 @@ static char *osd_obj_tag = "osd_object"; static struct dt_object_operations osd_obj_ops; 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; @@ -372,6 +373,11 @@ static int osd_object_init(const struct lu_env *env, struct lu_object *l, osd->od_svname, PFID(lu_object_fid(l)), oid, rc); } } else if (rc == -ENOENT) { + if (fid_is_otable_it(&l->lo_header->loh_fid)) { + obj->oo_dt.do_ops = &osd_obj_otable_it_ops; + /* LFSCK iterator object is special without inode */ + l->lo_header->loh_attr |= LOHA_EXISTS; + } rc = 0; } LASSERT(osd_invariant(obj)); @@ -1601,3 +1607,17 @@ static struct lu_object_operations osd_lu_obj_ops = { .loo_object_invariant = osd_object_invariant, }; +static int osd_otable_it_attr_get(const struct lu_env *env, + struct dt_object *dt, + struct lu_attr *attr, + struct lustre_capa *capa) +{ + attr->la_valid = 0; + return 0; +} + +static struct dt_object_operations osd_obj_otable_it_ops = { + .do_attr_get = osd_otable_it_attr_get, + .do_index_try = osd_index_try, +}; + -- 1.8.3.1