Whamcloud - gitweb
LU-4422 quota: fix s-q test_6
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_oi.c
index 54a016f..3cb6579 100644 (file)
@@ -228,7 +228,6 @@ static int osd_oi_open(struct osd_thread_info *info, struct osd_device *osd,
         if (IS_ERR(inode))
                 RETURN(PTR_ERR(inode));
 
-       ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI);
        /* 'What the @fid is' is not imporatant, because these objects
         * have no OI mappings, and only are visible inside the OSD.*/
        lu_igif_build(&info->oti_fid, inode->i_ino, inode->i_generation);
@@ -368,6 +367,7 @@ int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd)
        /* if previous failed then try found single OI from old filesystem */
        rc = osd_oi_open(info, osd, OSD_OI_NAME_BASE, &oi[0], false);
        if (rc == 0) { /* found single OI from old filesystem */
+               ldiskfs_clear_bit(0, sf->sf_oi_bitmap);
                if (sf->sf_success_count == 0)
                        /* XXX: There is one corner case that if the OI_scrub
                         *      file crashed or lost and we regard it upgrade,
@@ -513,9 +513,10 @@ int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd,
 
        rc = osd_fld_lookup(info->oti_env, osd, fid_seq(fid), range);
        if (rc != 0) {
-               CERROR("%s: "DFID" lookup failed: rc = %d\n", osd_name(osd),
-                      PFID(fid), rc);
-               RETURN(rc);
+               if (rc != -ENOENT)
+                       CERROR("%s: lookup FLD "DFID": rc = %d\n",
+                              osd_name(osd), PFID(fid), rc);
+               RETURN(0);
        }
 
        if (fld_range_is_ost(range))
@@ -552,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));