Whamcloud - gitweb
LU-7782 scrub: handle slave obj of striped directory
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_compat.c
index cec04db..76c6483 100644 (file)
@@ -288,9 +288,9 @@ int osd_delete_from_remote_parent(const struct lu_env *env,
        mutex_lock(&parent->d_inode->i_mutex);
        bh = osd_ldiskfs_find_entry(parent->d_inode, &dentry->d_name, &de,
                                    NULL, NULL);
-       if (bh == NULL) {
+       if (IS_ERR(bh)) {
                mutex_unlock(&parent->d_inode->i_mutex);
-               RETURN(-ENOENT);
+               RETURN(PTR_ERR(bh));
        }
        CDEBUG(D_INODE, "%s: el %s:%lu to remote parent %lu.\n", osd_name(osd),
               name, obj->oo_inode->i_ino, parent->d_inode->i_ino);
@@ -329,12 +329,22 @@ int osd_lookup_in_remote_parent(struct osd_thread_info *oti,
        mutex_lock(&parent->d_inode->i_mutex);
        bh = osd_ldiskfs_find_entry(parent->d_inode, &dentry->d_name, &de,
                                    NULL, NULL);
-       if (bh == NULL) {
-               rc = -ENOENT;
+       if (IS_ERR(bh)) {
+               rc = PTR_ERR(bh);
        } else {
-               rc = 0;
+               struct inode *inode;
+
                osd_id_gen(id, le32_to_cpu(de->inode), OSD_OII_NOGEN);
                brelse(bh);
+               inode = osd_iget(oti, osd, id);
+               if (IS_ERR(inode)) {
+                       rc = PTR_ERR(inode);
+                       if (rc == -ESTALE)
+                               rc = -ENOENT;
+               } else {
+                       iput(inode);
+                       rc = 0;
+               }
        }
        mutex_unlock(&parent->d_inode->i_mutex);
        if (rc == 0)
@@ -549,8 +559,8 @@ static int osd_obj_update_entry(struct osd_thread_info *info,
        ll_vfs_dq_init(parent);
        mutex_lock(&parent->i_mutex);
        bh = osd_ldiskfs_find_entry(parent, &child->d_name, &de, NULL, NULL);
-       if (bh == NULL)
-               GOTO(out, rc = -ENOENT);
+       if (IS_ERR(bh))
+               GOTO(out, rc = PTR_ERR(bh));
 
        if (le32_to_cpu(de->inode) == id->oii_ino)
                GOTO(out, rc = 1);
@@ -652,7 +662,8 @@ update:
        GOTO(out, rc);
 
 out:
-       brelse(bh);
+       if (!IS_ERR(bh))
+               brelse(bh);
        mutex_unlock(&parent->i_mutex);
        return rc;
 }
@@ -682,9 +693,10 @@ static int osd_obj_del_entry(struct osd_thread_info *info,
 
        ll_vfs_dq_init(dir);
        mutex_lock(&dir->i_mutex);
-       rc = -ENOENT;
        bh = osd_ldiskfs_find_entry(dir, &child->d_name, &de, NULL, NULL);
-       if (bh) {
+       if (IS_ERR(bh)) {
+               rc = PTR_ERR(bh);
+       } else {
                rc = ldiskfs_delete_entry(th, dir, de, bh);
                brelse(bh);
        }
@@ -953,8 +965,8 @@ int osd_obj_map_lookup(struct osd_thread_info *info, struct osd_device *dev,
        bh = osd_ldiskfs_find_entry(dir, &child->d_name, &de, NULL, NULL);
        mutex_unlock(&dir->i_mutex);
 
-       if (bh == NULL)
-               RETURN(-ENOENT);
+       if (IS_ERR(bh))
+               RETURN(PTR_ERR(bh));
 
        osd_id_gen(id, le32_to_cpu(de->inode), OSD_OII_NOGEN);
        brelse(bh);
@@ -1136,7 +1148,7 @@ int osd_obj_map_recover(struct osd_thread_info *info,
        mutex_lock(&src_parent->i_mutex);
        mutex_lock(&dir->i_mutex);
        bh = osd_ldiskfs_find_entry(dir, &tgt_child->d_name, &de, NULL, NULL);
-       if (bh != NULL) {
+       if (!IS_ERR(bh)) {
                /* XXX: If some other object occupied the same slot. And If such
                 *      inode is zero-sized and with SUID+SGID, then means it is
                 *      a new created one. Maybe we can remove it and insert the
@@ -1172,8 +1184,8 @@ int osd_obj_map_recover(struct osd_thread_info *info,
 
        bh = osd_ldiskfs_find_entry(src_parent, &src_child->d_name, &de,
                                    NULL, NULL);
-       if (unlikely(bh == NULL))
-               GOTO(unlock, rc = -ENOENT);
+       if (unlikely(IS_ERR(bh)))
+               GOTO(unlock, rc = PTR_ERR(bh));
 
        rc = ldiskfs_delete_entry(jh, src_parent, de, bh);
        brelse(bh);