Whamcloud - gitweb
LU-2990 osd-zfs: locate cursor to specified pos via load API
authorFan Yong <yong.fan@whamcloud.com>
Thu, 28 Feb 2013 03:25:48 +0000 (11:25 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 9 Apr 2013 05:59:16 +0000 (01:59 -0400)
There was defect for zfs-based backend when traverse directory:
the dt_iteration API ::load() did not locate the cursor to the
specified position, then caused non-first directory readpage
RPC obtained repeated entries, and then caused readdir() loop
or unexpected dir hash collision.

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I9c159f0f80677590869246dd9f30f0dfb9cc2fbc
Reviewed-on: http://review.whamcloud.com/5894
Tested-by: Hudson
Reviewed-by: Li Wei <wei.g.li@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-zfs/osd_index.c

index f88958c..2c02470 100644 (file)
@@ -998,14 +998,10 @@ static int osd_dir_it_load(const struct lu_env *env,
        int                rc;
        ENTRY;
 
-       if (it->ozi_pos != 0) {
-               /* the cursor wasn't at the beginning
-                * so we should reset ZAP cursor as well */
-               udmu_zap_cursor_fini(it->ozi_zc);
-               if (udmu_zap_cursor_init(&it->ozi_zc, &osd->od_objset,
-                                        obj->oo_db->db_object, hash))
-                       RETURN(-ENOMEM);
-       }
+       udmu_zap_cursor_fini(it->ozi_zc);
+       if (udmu_zap_cursor_init(&it->ozi_zc, &osd->od_objset,
+                                obj->oo_db->db_object, hash))
+               RETURN(-ENOMEM);
 
        if (hash <= 2) {
                it->ozi_pos = hash;