From f0e902969b30fbc88cda5c98393aa7d13b9e03f6 Mon Sep 17 00:00:00 2001 From: Johann Lombardi Date: Fri, 13 Apr 2012 01:29:49 +0200 Subject: [PATCH] LU-1371 ldiskfs: fix osd_it_iam_rec() to support binary keys osd_it_iam_rec() assumes a string key and does not support binary key. Signed-off-by: Johann Lombardi Change-Id: I1a09c9b9ad53e593cad642b6ae8a7d417ea83c9d Reviewed-on: http://review.whamcloud.com/2647 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Liang Zhen Reviewed-by: wangdi Reviewed-by: Andreas Dilger --- lustre/osd-ldiskfs/osd_handler.c | 55 ++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index de725c6..f71b522 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -3471,37 +3471,44 @@ static int osd_it_iam_rec(const struct lu_env *env, const struct dt_it *di, struct dt_rec *dtrec, __u32 attr) { - struct osd_it_iam *it = (struct osd_it_iam *)di; - struct osd_thread_info *info = osd_oti_get(env); - struct lu_fid *fid = &info->oti_fid; - const struct osd_fid_pack *rec; - struct lu_dirent *lde = (struct lu_dirent *)dtrec; - char *name; - int namelen; - __u64 hash; - int rc; + struct osd_it_iam *it = (struct osd_it_iam *)di; + struct osd_thread_info *info = osd_oti_get(env); + ENTRY; - name = (char *)iam_it_key_get(&it->oi_it); - if (IS_ERR(name)) - RETURN(PTR_ERR(name)); + if (S_ISDIR(it->oi_obj->oo_inode->i_mode)) { + const struct osd_fid_pack *rec; + struct lu_fid *fid = &info->oti_fid; + struct lu_dirent *lde = (struct lu_dirent *)dtrec; + char *name; + int namelen; + __u64 hash; + int rc; - namelen = iam_it_key_size(&it->oi_it); + name = (char *)iam_it_key_get(&it->oi_it); + if (IS_ERR(name)) + RETURN(PTR_ERR(name)); - rec = (const struct osd_fid_pack *) iam_it_rec_get(&it->oi_it); - if (IS_ERR(rec)) - RETURN(PTR_ERR(rec)); + namelen = iam_it_key_size(&it->oi_it); - rc = osd_fid_unpack(fid, rec); - if (rc) - RETURN(rc); + rec = (const struct osd_fid_pack *)iam_it_rec_get(&it->oi_it); + if (IS_ERR(rec)) + RETURN(PTR_ERR(rec)); - hash = iam_it_store(&it->oi_it); + rc = osd_fid_unpack(fid, rec); + if (rc) + RETURN(rc); - /* IAM does not store object type in IAM index (dir) */ - osd_it_pack_dirent(lde, fid, hash, name, namelen, - 0, LUDA_FID); + hash = iam_it_store(&it->oi_it); - return 0; + /* IAM does not store object type in IAM index (dir) */ + osd_it_pack_dirent(lde, fid, hash, name, namelen, + 0, LUDA_FID); + } else { + iam_reccpy(&it->oi_it.ii_path.ip_leaf, + (struct iam_rec *)dtrec); + } + + RETURN(0); } /** -- 1.8.3.1