/*
* Primitives for index files using binary keys.
+ * XXX: only 64-bit keys are supported for now.
*/
-static int osd_prepare_key(struct osd_object *o, __u64 *dst,
- const struct dt_key *src)
-{
- int size;
-
- LASSERT(dst);
- LASSERT(src);
-
- /* align keysize to 64bit */
- size = (o->oo_keysize + sizeof(__u64) - 1) / sizeof(__u64);
- size *= sizeof(__u64);
-
- LASSERT(size <= MAXNAMELEN);
-
- if (unlikely(size > o->oo_keysize))
- memset(dst + o->oo_keysize, 0, size - o->oo_keysize);
- memcpy(dst, (const char *)src, o->oo_keysize);
-
- return size;
-}
-
static int osd_index_lookup(const struct lu_env *env, struct dt_object *dt,
struct dt_rec *rec, const struct dt_key *key,
struct lustre_capa *capa)
{
struct osd_object *obj = osd_dt_obj(dt);
struct osd_device *osd = osd_obj2dev(obj);
- __u64 *k = osd_oti_get(env)->oti_key64;
int rc;
ENTRY;
- rc = osd_prepare_key(obj, k, key);
-
rc = -zap_lookup_uint64(osd->od_objset.os, obj->oo_db->db_object,
- k, rc, obj->oo_recusize, obj->oo_recsize,
+ (const __u64 *)key, 1, 8, obj->oo_recsize,
(void *)rec);
RETURN(rc == 0 ? 1 : rc);
}
struct osd_object *obj = osd_dt_obj(dt);
struct osd_device *osd = osd_obj2dev(obj);
struct osd_thandle *oh;
- __u64 *k = osd_oti_get(env)->oti_key64;
int rc;
ENTRY;
oh = container_of0(th, struct osd_thandle, ot_super);
- rc = osd_prepare_key(obj, k, key);
-
/* Insert (key,oid) into ZAP */
rc = -zap_add_uint64(osd->od_objset.os, obj->oo_db->db_object,
- k, rc, obj->oo_recusize, obj->oo_recsize,
+ (const __u64 *)key, 1, 8, obj->oo_recsize,
(void *)rec, oh->ot_tx);
RETURN(rc);
}
struct osd_object *obj = osd_dt_obj(dt);
struct osd_device *osd = osd_obj2dev(obj);
struct osd_thandle *oh;
- __u64 *k = osd_oti_get(env)->oti_key64;
int rc;
ENTRY;
LASSERT(th != NULL);
oh = container_of0(th, struct osd_thandle, ot_super);
- rc = osd_prepare_key(obj, k, key);
-
/* Remove binary key from the ZAP */
rc = -zap_remove_uint64(osd->od_objset.os, obj->oo_db->db_object,
- k, rc, oh->ot_tx);
+ (const __u64 *)key, 1, oh->ot_tx);
RETURN(rc);
}
LASSERT(it);
LASSERT(it->ozi_zc);
- /*
- * XXX: we need a binary version of zap_cursor_move_to_key()
- * to implement this API */
- if (*((const __u64 *)key) != 0)
- CERROR("NOT IMPLEMETED YET (move to %Lx)\n", *((__u64 *)key));
+ /* XXX: API is broken at the moment */
+ LASSERT(*((const __u64 *)key) == 0);
zap_cursor_fini(it->ozi_zc);
memset(it->ozi_zc, 0, sizeof(*it->ozi_zc));
const struct dt_it *di)
{
struct osd_zap_it *it = (struct osd_zap_it *)di;
- struct osd_object *obj = it->ozi_obj;
zap_attribute_t *za = &osd_oti_get(env)->oti_za;
int rc = 0;
ENTRY;
RETURN(ERR_PTR(rc));
/* the binary key is stored in the name */
- memcpy(&it->ozi_key, za->za_name, obj->oo_keysize);
+ it->ozi_key = *((__u64 *)za->za_name);
RETURN((struct dt_key *)&it->ozi_key);
}
static int osd_index_it_key_size(const struct lu_env *env,
const struct dt_it *di)
{
- struct osd_zap_it *it = (struct osd_zap_it *)di;
- struct osd_object *obj = it->ozi_obj;
- RETURN(obj->oo_keysize);
+ /* we only support 64-bit binary keys for the time being */
+ RETURN(sizeof(__u64));
}
static int osd_index_it_rec(const struct lu_env *env, const struct dt_it *di,
struct osd_zap_it *it = (struct osd_zap_it *)di;
struct osd_object *obj = it->ozi_obj;
struct osd_device *osd = osd_obj2dev(obj);
- __u64 *k = osd_oti_get(env)->oti_key64;
int rc;
ENTRY;
if (rc)
RETURN(rc);
- rc = osd_prepare_key(obj, k, (const struct dt_key *)za->za_name);
-
rc = -zap_lookup_uint64(osd->od_objset.os, obj->oo_db->db_object,
- k, rc, obj->oo_recusize, obj->oo_recsize,
- (void *)rec);
+ (const __u64 *)za->za_name, 1, 8,
+ obj->oo_recsize, (void *)rec);
RETURN(rc);
}
if ((feat->dif_flags & ~DT_IND_UPDATE) != 0)
RETURN(-EINVAL);
- if (feat->dif_keysize_max > ZAP_MAXNAMELEN)
- RETURN(-E2BIG);
- if (feat->dif_keysize_max != feat->dif_keysize_min)
+ /* Although the zap_*_uint64() primitives support large keys, we
+ * limit ourselves to 64-bit keys for now */
+ if (feat->dif_keysize_max != sizeof(__u64) ||
+ feat->dif_keysize_min != sizeof(__u64))
RETURN(-EINVAL);
/* As for the record size, it should be a multiple of 8 bytes
*/
if (feat->dif_recsize_max > ZAP_MAXVALUELEN)
RETURN(-E2BIG);
- if (feat->dif_recsize_max != feat->dif_recsize_min)
+ if (feat->dif_recsize_max != feat->dif_recsize_min ||
+ (feat->dif_recsize_max & (sizeof(__u64) - 1)))
RETURN(-EINVAL);
- obj->oo_keysize = feat->dif_keysize_max;
- obj->oo_recsize = feat->dif_recsize_max;
- obj->oo_recusize = 1;
-
- /* ZFS prefers to work with array of 64bits */
- if ((obj->oo_recsize & 7) == 0) {
- obj->oo_recsize >>= 3;
- obj->oo_recusize = 8;
- }
+ obj->oo_recsize = feat->dif_recsize_max / sizeof(__u64);
dt->do_index_ops = &osd_index_ops;
}