Whamcloud - gitweb
LU-7782 scrub: handle slave obj of striped directory
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 299c30b..fc4f980 100644 (file)
@@ -934,7 +934,16 @@ again:
        fops->release(inode, filp);
 
 out:
-       RETURN(rc >= 0 ? 0 : rc);
+       if (rc < 0)
+               CDEBUG(D_LFSCK, "%.16s: fail to check LMV EA, inode = %lu/%u,"
+                      DFID": rc = %d\n",
+                      LDISKFS_SB(inode->i_sb)->s_es->s_volume_name,
+                      inode->i_ino, inode->i_generation,
+                      PFID(&oic->oic_fid), rc);
+       else
+               rc = 0;
+
+       RETURN(rc);
 }
 
 static int osd_fid_lookup(const struct lu_env *env, struct osd_object *obj,
@@ -1160,10 +1169,8 @@ found:
        obj->oo_compat_dot_created = 1;
        obj->oo_compat_dotdot_created = 1;
 
-       if (!S_ISDIR(inode->i_mode))
-               GOTO(out, result = 0);
-
-       if (flags & SS_AUTO_PARTIAL)
+       if (S_ISDIR(inode->i_mode) &&
+           (flags & SS_AUTO_PARTIAL || sf->sf_status == SS_SCANNING))
                osd_check_lmv(info, dev, inode, oic);
 
        if (!ldiskfs_pdo)
@@ -4204,6 +4211,7 @@ static const struct dt_object_operations osd_obj_ea_ops = {
         .do_xattr_del         = osd_xattr_del,
         .do_xattr_list        = osd_xattr_list,
         .do_object_sync       = osd_object_sync,
+       .do_invalidate        = osd_invalidate,
 };
 
 static const struct dt_object_operations osd_obj_otable_it_ops = {
@@ -4401,7 +4409,7 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt,
         }
 
         bh = osd_ldiskfs_find_entry(dir, &dentry->d_name, &de, NULL, hlock);
-        if (bh) {
+       if (!IS_ERR(bh)) {
                /* If this is not the ".." entry, it might be a remote DNE
                 * entry and  we need to check if the FID is for a remote
                 * MDT.  If the FID is  not in the directory entry (e.g.
@@ -4430,11 +4438,11 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt,
                                                le32_to_cpu(de->inode));
                        }
                }
-                rc = ldiskfs_delete_entry(oh->ot_handle, dir, de, bh);
-                brelse(bh);
-        } else {
-                rc = -ENOENT;
-        }
+               rc = ldiskfs_delete_entry(oh->ot_handle, dir, de, bh);
+               brelse(bh);
+       } else {
+               rc = PTR_ERR(bh);
+       }
         if (hlock != NULL)
                 ldiskfs_htree_unlock(hlock);
         else
@@ -4660,7 +4668,7 @@ static int __osd_ea_add_rec(struct osd_thread_info *info,
 
                bh = osd_ldiskfs_find_entry(pobj->oo_inode, &child->d_name, &de,
                                            NULL, hlock);
-               if (bh != NULL) {
+               if (!IS_ERR(bh)) {
                        rc1 = ldiskfs_journal_get_write_access(oth->ot_handle,
                                                               bh);
                        if (rc1 == 0) {
@@ -4672,8 +4680,8 @@ static int __osd_ea_add_rec(struct osd_thread_info *info,
                                                        LDISKFS_FT_DIR;
                                ldiskfs_handle_dirty_metadata(oth->ot_handle,
                                                              NULL, bh);
-                               brelse(bh);
                        }
+                       brelse(bh);
                }
        }
 
@@ -4803,12 +4811,13 @@ static int
 osd_consistency_check(struct osd_thread_info *oti, struct osd_device *dev,
                      struct osd_idmap_cache *oic)
 {
-       struct osd_scrub    *scrub = &dev->od_scrub;
-       struct lu_fid       *fid   = &oic->oic_fid;
-       struct osd_inode_id *id    = &oic->oic_lid;
-       struct inode        *inode = NULL;
-       int                  once  = 0;
-       int                  rc;
+       struct osd_scrub *scrub = &dev->od_scrub;
+       struct lu_fid *fid = &oic->oic_fid;
+       struct osd_inode_id *id = &oic->oic_lid;
+       struct inode *inode = NULL;
+       int once  = 0;
+       bool insert;
+       int rc;
        ENTRY;
 
        if (!fid_is_norm(fid) && !fid_is_igif(fid))
@@ -4822,6 +4831,7 @@ again:
        if (rc == -ENOENT) {
                __u32 gen = id->oii_gen;
 
+               insert = true;
                if (inode != NULL)
                        goto trigger;
 
@@ -4843,18 +4853,12 @@ again:
                RETURN(0);
        } else if (rc != 0 || osd_id_eq(id, &oti->oti_id)) {
                RETURN(rc);
+       } else {
+               insert = false;
        }
 
 trigger:
        if (thread_is_running(&scrub->os_thread)) {
-               rc = osd_oii_insert(dev, oic, rc == -ENOENT);
-               /* There is race condition between osd_oi_lookup and OI scrub.
-                * The OI scrub finished just after osd_oi_lookup() failure.
-                * Under such case, it is unnecessary to trigger OI scrub again,
-                * but try to call osd_oi_lookup() again. */
-               if (unlikely(rc == -EAGAIN))
-                       goto again;
-
                if (inode == NULL) {
                        inode = osd_iget(oti, dev, id);
                        /* The inode has been removed (by race maybe). */
@@ -4865,6 +4869,14 @@ trigger:
                        }
                }
 
+               rc = osd_oii_insert(dev, oic, insert);
+               /* There is race condition between osd_oi_lookup and OI scrub.
+                * The OI scrub finished just after osd_oi_lookup() failure.
+                * Under such case, it is unnecessary to trigger OI scrub again,
+                * but try to call osd_oi_lookup() again. */
+               if (unlikely(rc == -EAGAIN))
+                       goto again;
+
                if (!S_ISDIR(inode->i_mode))
                        rc = 0;
                else
@@ -5040,7 +5052,7 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj,
        }
 
        bh = osd_ldiskfs_find_entry(dir, &dentry->d_name, &de, NULL, hlock);
-       if (bh) {
+       if (!IS_ERR(bh)) {
                struct osd_thread_info *oti = osd_oti_get(env);
                struct osd_inode_id *id = &oti->oti_id;
                struct osd_idmap_cache *oic = &oti->oti_cache;
@@ -5086,7 +5098,7 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj,
                if (rc != 0)
                        fid_zero(&oic->oic_fid);
        } else {
-               rc = -ENOENT;
+               rc = PTR_ERR(bh);
        }
 
        GOTO(out, rc);
@@ -6071,7 +6083,7 @@ again:
         * For the whole directory, only dot/dotdot entry have no FID-in-dirent
         * and needs to get FID from LMA when readdir, it will not affect the
         * performance much. */
-       if ((bh == NULL) || (le32_to_cpu(de->inode) != inode->i_ino) ||
+       if (IS_ERR(bh) || (le32_to_cpu(de->inode) != inode->i_ino) ||
            (dot_dotdot != 0 && !osd_dot_dotdot_has_space(de, dot_dotdot))) {
                *attr |= LUDA_IGNORE;
 
@@ -6239,7 +6251,8 @@ again:
        GOTO(out, rc);
 
 out:
-       brelse(bh);
+       if (!IS_ERR(bh))
+               brelse(bh);
        if (hlock != NULL) {
                ldiskfs_htree_unlock(hlock);
        } else {
@@ -6722,7 +6735,7 @@ static int osd_mount(const struct lu_env *env,
        /* Glom up mount options */
        if (*options != '\0')
                strcat(options, ",");
-       strlcat(options, "no_mbcache", PAGE_CACHE_SIZE);
+       strlcat(options, "no_mbcache", PAGE_SIZE);
 
        type = get_fs_type("ldiskfs");
        if (!type) {