Whamcloud - gitweb
LU-3528 osd: check LOCAL sequence file in special directory 54/8354/8
authorwang di <di.wang@intel.com>
Mon, 18 Nov 2013 08:51:12 +0000 (00:51 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 20 Dec 2013 02:19:49 +0000 (02:19 +0000)
Check Local sequence file in special directory, otherwise
special file like fldb might be missing during upgrade.

Signed-off-by: wang di <di.wang@intel.com>
Change-Id: I483151510b943ae9b9d9ba0b13f5ce67c4bfa5bb
Reviewed-on: http://review.whamcloud.com/8354
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-ldiskfs/osd_oi.c

index d4684b9..6e690be 100644 (file)
@@ -553,14 +553,23 @@ int osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd,
        if (fid_is_on_ost(info, osd, fid, flags) || fid_is_llog(fid))
                return osd_obj_map_lookup(info, osd, fid, id);
 
-       if (fid_is_fs_root(fid)) {
-               osd_id_gen(id, osd_sb(osd)->s_root->d_inode->i_ino,
-                          osd_sb(osd)->s_root->d_inode->i_generation);
-               return 0;
-       }
 
-       if (unlikely(fid_is_acct(fid)))
-               return osd_acct_obj_lookup(info, osd, fid, id);
+       if (unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE)) {
+               int rc;
+               if (fid_is_fs_root(fid)) {
+                       osd_id_gen(id, osd_sb(osd)->s_root->d_inode->i_ino,
+                                  osd_sb(osd)->s_root->d_inode->i_generation);
+                       return 0;
+               }
+               if (unlikely(fid_is_acct(fid)))
+                       return osd_acct_obj_lookup(info, osd, fid, id);
+
+               /* For other special FIDs, try OI first, then do spec lookup */
+               rc = __osd_oi_lookup(info, osd, fid, id);
+               if (rc == -ENOENT)
+                       return osd_obj_spec_lookup(info, osd, fid, id);
+               return rc;
+       }
 
        if (!osd->od_igif_inoi && fid_is_igif(fid)) {
                osd_id_gen(id, lu_igif_ino(fid), lu_igif_gen(fid));