Whamcloud - gitweb
LU-12137 osd-ldiskfs: create locked and unlocked versions of osd lookup code
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_scrub.c
index 2619087..31b01fa 100644 (file)
@@ -163,13 +163,13 @@ static int
 osd_scrub_convert_ff(struct osd_thread_info *info, struct osd_device *dev,
                     struct inode *inode, const struct lu_fid *fid)
 {
-       struct filter_fid_old   *ff      = &info->oti_ff;
-       struct dentry           *dentry  = &info->oti_obj_dentry;
-       struct lu_fid           *tfid    = &info->oti_fid;
-       handle_t                *jh;
-       int                      size    = 0;
-       int                      rc;
-       bool                     reset   = false;
+       struct filter_fid_18_23 *ff = &info->oti_ff_old;
+       struct dentry *dentry = &info->oti_obj_dentry;
+       struct lu_fid *tfid = &info->oti_fid;
+       bool fid_18_23 = false;
+       handle_t *jh;
+       int size = 0;
+       int rc;
        ENTRY;
 
        if (dev->od_scrub.os_scrub.os_file.sf_param & SP_DRYRUN)
@@ -207,19 +207,19 @@ osd_scrub_convert_ff(struct osd_thread_info *info, struct osd_device *dev,
        rc = __osd_xattr_get(inode, dentry, XATTR_NAME_FID, ff, sizeof(*ff));
        if (rc == sizeof(*ff)) {
                /* 2) delete the old XATTR_NAME_FID */
-               ll_vfs_dq_init(inode);
-               rc = inode->i_op->removexattr(dentry, XATTR_NAME_FID);
+               dquot_initialize(inode);
+               rc = osd_removexattr(dentry, inode, XATTR_NAME_FID);
                if (rc)
                        GOTO(stop, rc);
 
-               reset = true;
-       } else if (rc != -ENODATA && rc != sizeof(struct filter_fid)) {
+               fid_18_23 = true;
+       } else if (rc != -ENODATA && rc < (int)sizeof(struct filter_fid_24_29)) {
                GOTO(stop, rc = -EINVAL);
        }
 
        /* 3) make new LMA and add it */
        rc = osd_ea_fid_set(info, inode, tfid, LMAC_FID_ON_OST, 0);
-       if (reset) {
+       if (fid_18_23) {
                if (rc)
                        /* If failed, we should try to add the old back. */
                        size = sizeof(*ff);
@@ -472,8 +472,7 @@ static int osd_scrub_prep(const struct lu_env *env, struct osd_device *dev)
        }
 
        if (flags & SS_RESET)
-               scrub_file_reset(scrub,
-                       LDISKFS_SB(osd_sb(dev))->s_es->s_uuid, 0);
+               scrub_file_reset(scrub, dev->od_uuid, 0);
 
        if (flags & SS_AUTO_FULL) {
                scrub->os_full_speed = 1;
@@ -627,8 +626,8 @@ static int osd_scrub_check_local_fldb(struct osd_thread_info *info,
         *      quite possible for FID-on-MDT. */
        if (dev->od_is_ost)
                return SCRUB_NEXT_OSTOBJ_OLD;
-       else
-               return 0;
+
+       return 0;
 }
 
 static int osd_scrub_get_fid(struct osd_thread_info *info,
@@ -636,8 +635,8 @@ static int osd_scrub_get_fid(struct osd_thread_info *info,
                             struct lu_fid *fid, bool scrub)
 {
        struct lustre_mdt_attrs *lma = &info->oti_ost_attrs.loa_lma;
-       int rc;
        bool has_lma = false;
+       int rc;
 
        rc = osd_get_lma(info, inode, &info->oti_obj_dentry,
                         &info->oti_ost_attrs);
@@ -674,7 +673,7 @@ static int osd_scrub_get_fid(struct osd_thread_info *info,
                rc = osd_get_idif(info, inode, &info->oti_obj_dentry, fid);
                if (rc == 0) {
                        if (scrub)
-                               /* It is old 2.x (x <= 3) or 1.8 OST-object. */
+                               /* It is 2.3 or older OST-object. */
                                rc = SCRUB_NEXT_OSTOBJ_OLD;
                        return rc;
                }
@@ -685,7 +684,7 @@ static int osd_scrub_get_fid(struct osd_thread_info *info,
                                 * to generate its FID, ignore it directly. */
                                rc = SCRUB_NEXT_CONTINUE;
                        else
-                               /* It is 2.4 OST-object. */
+                               /* It is 2.4 or newer OST-object. */
                                rc = SCRUB_NEXT_OSTOBJ_OLD;
                        return rc;
                }
@@ -730,8 +729,15 @@ static int osd_iit_iget(struct osd_thread_info *info, struct osd_device *dev,
        /* Not handle the backend root object and agent parent object.
         * They are neither visible to namespace nor have OI mappings. */
        if (unlikely(pos == osd_sb(dev)->s_root->d_inode->i_ino ||
-                    pos == osd_remote_parent_ino(dev)))
+                    is_remote_parent_ino(dev, pos)))
+               RETURN(SCRUB_NEXT_CONTINUE);
+
+        /* Skip project quota inode since it is greater than s_first_ino. */
+#ifdef HAVE_PROJECT_QUOTA
+       if (ldiskfs_has_feature_project(sb) &&
+           pos == le32_to_cpu(LDISKFS_SB(sb)->s_es->s_prj_quota_inum))
                RETURN(SCRUB_NEXT_CONTINUE);
+#endif
 
        osd_id_gen(lid, pos, OSD_OII_NOGEN);
        inode = osd_iget(info, dev, lid);
@@ -982,8 +988,8 @@ static void osd_scrub_join(const struct lu_env *env, struct osd_device *dev,
                sf->sf_param &= ~SP_DRYRUN;
 
        if (flags & SS_RESET) {
-               scrub_file_reset(scrub, LDISKFS_SB(osd_sb(dev))->s_es->s_uuid,
-                       inconsistent ? SF_INCONSISTENT : 0);
+               scrub_file_reset(scrub, dev->od_uuid,
+                                inconsistent ? SF_INCONSISTENT : 0);
                sf->sf_status = SS_SCANNING;
        }
 
@@ -1419,8 +1425,8 @@ static const struct osd_lf_map osd_lf_maps[] = {
 
        /* PENDING */
        {
-               .olm_name       = "PENDING",
-               .olm_namelen    = sizeof("PENDING") - 1,
+               .olm_name       = MDT_ORPHAN_DIR,
+               .olm_namelen    = sizeof(MDT_ORPHAN_DIR) - 1,
        },
 
        /* ROOT */
@@ -1735,32 +1741,6 @@ struct osd_ios_filldir_buf {
        int                      oifb_items;
 };
 
-static inline struct dentry *
-osd_ios_lookup_one_len(const char *name, struct dentry *parent, int namelen)
-{
-       struct dentry *dentry;
-
-       dentry = ll_lookup_one_len(name, parent, namelen);
-       if (IS_ERR(dentry)) {
-               int rc = PTR_ERR(dentry);
-
-               if (rc != -ENOENT)
-                       CERROR("Fail to find %.*s in %.*s (%lu/%u): rc = %d\n",
-                              namelen, name, parent->d_name.len,
-                              parent->d_name.name, parent->d_inode->i_ino,
-                              parent->d_inode->i_generation, rc);
-
-               return dentry;
-       }
-
-       if (dentry->d_inode == NULL) {
-               dput(dentry);
-               return ERR_PTR(-ENOENT);
-       }
-
-       return dentry;
-}
-
 static int
 osd_ios_new_item(struct osd_device *dev, struct dentry *dentry,
                 scandir_t scandir, filldir_t filldir)
@@ -1916,6 +1896,12 @@ osd_ios_scan_one(struct osd_thread_info *info, struct osd_device *dev,
        int                      rc;
        ENTRY;
 
+       if (!inode) {
+               CDEBUG(D_INODE, "%s: child '%.*s' lacks inode: rc = -2\n",
+                      osd_name(dev), namelen, name);
+               RETURN(-ENOENT);
+       }
+
        rc = osd_get_lma(info, inode, &info->oti_obj_dentry,
                         &info->oti_ost_attrs);
        if (rc != 0 && rc != -ENODATA) {
@@ -1990,8 +1976,7 @@ osd_ios_scan_one(struct osd_thread_info *info, struct osd_device *dev,
                RETURN(0);
 
        if (!(sf->sf_flags & SF_INCONSISTENT)) {
-               scrub_file_reset(scrub, LDISKFS_SB(osd_sb(dev))->s_es->s_uuid,
-                                SF_INCONSISTENT);
+               scrub_file_reset(scrub, dev->od_uuid, SF_INCONSISTENT);
                rc = scrub_file_store(info->oti_env, scrub);
                if (rc != 0)
                        RETURN(rc);
@@ -2007,7 +1992,7 @@ osd_ios_scan_one(struct osd_thread_info *info, struct osd_device *dev,
 
 /**
  * It scans the /lost+found, and for the OST-object (with filter_fid
- * or filter_fid_old), move them back to its proper /O/<seq>/d<x>.
+ * or filter_fid_18_23), move them back to its proper /O/<seq>/d<x>.
  */
 #ifdef HAVE_FILLDIR_USE_CTX
 static int osd_ios_lf_fill(struct dir_context *buf,
@@ -2037,11 +2022,16 @@ static int osd_ios_lf_fill(void *buf,
                RETURN(0);
 
        scrub->os_lf_scanned++;
-       child = osd_ios_lookup_one_len(name, parent, namelen);
+       child = osd_lookup_one_len_unlocked(dev, name, parent, namelen);
        if (IS_ERR(child)) {
                CDEBUG(D_LFSCK, "%s: cannot lookup child '%.*s': rc = %d\n",
                      osd_name(dev), namelen, name, (int)PTR_ERR(child));
                RETURN(0);
+       } else if (!child->d_inode) {
+               dput(child);
+               CDEBUG(D_INODE, "%s: child '%.*s' lacks inode\n",
+                      osd_name(dev), namelen, name);
+               RETURN(0);
        }
 
        inode = child->d_inode;
@@ -2106,7 +2096,8 @@ static int osd_ios_varfid_fill(void *buf,
        if (name[0] == '.')
                RETURN(0);
 
-       child = osd_ios_lookup_one_len(name, fill_buf->oifb_dentry, namelen);
+       child = osd_lookup_one_len_unlocked(dev, name, fill_buf->oifb_dentry,
+                                           namelen);
        if (IS_ERR(child))
                RETURN(PTR_ERR(child));
 
@@ -2154,7 +2145,8 @@ static int osd_ios_dl_fill(void *buf,
        if (map->olm_name == NULL)
                RETURN(0);
 
-       child = osd_ios_lookup_one_len(name, fill_buf->oifb_dentry, namelen);
+       child = osd_lookup_one_len_unlocked(dev, name, fill_buf->oifb_dentry,
+                                           namelen);
        if (IS_ERR(child))
                RETURN(PTR_ERR(child));
 
@@ -2176,6 +2168,7 @@ static int osd_ios_uld_fill(void *buf,
 {
        struct osd_ios_filldir_buf *fill_buf =
                (struct osd_ios_filldir_buf *)buf;
+       struct osd_device *dev = fill_buf->oifb_dev;
        struct dentry              *child;
        struct lu_fid               tfid;
        int                         rc       = 0;
@@ -2187,7 +2180,8 @@ static int osd_ios_uld_fill(void *buf,
        if (name[0] != '[')
                RETURN(0);
 
-       child = osd_ios_lookup_one_len(name, fill_buf->oifb_dentry, namelen);
+       child = osd_lookup_one_len_unlocked(dev, name, fill_buf->oifb_dentry,
+                                           namelen);
        if (IS_ERR(child))
                RETURN(PTR_ERR(child));
 
@@ -2237,9 +2231,12 @@ static int osd_ios_root_fill(void *buf,
        if (map->olm_name == NULL)
                RETURN(0);
 
-       child = osd_ios_lookup_one_len(name, fill_buf->oifb_dentry, namelen);
+       child = osd_lookup_one_len_unlocked(dev, name, fill_buf->oifb_dentry,
+                                           namelen);
        if (IS_ERR(child))
                RETURN(PTR_ERR(child));
+       else if (!child->d_inode)
+               GOTO(out_put, rc = -ENOENT);
 
        if (!(map->olm_flags & OLF_NO_OI))
                rc = osd_ios_scan_one(fill_buf->oifb_info, dev,
@@ -2248,6 +2245,7 @@ static int osd_ios_root_fill(void *buf,
        if (rc == 0 && map->olm_flags & OLF_SCAN_SUBITEMS)
                rc = osd_ios_new_item(dev, child, map->olm_scandir,
                                      map->olm_filldir);
+out_put:
        dput(child);
 
        RETURN(rc);
@@ -2284,7 +2282,11 @@ osd_ios_general_scan(struct osd_thread_info *info, struct osd_device *dev,
                buf.oifb_items = 0;
 #ifdef HAVE_DIR_CONTEXT
                buf.ctx.pos = filp->f_pos;
+#ifdef HAVE_ITERATE_SHARED
+               rc = fops->iterate_shared(filp, &buf.ctx);
+#else
                rc = fops->iterate(filp, &buf.ctx);
+#endif
                filp->f_pos = buf.ctx.pos;
 #else
                rc = fops->readdir(filp, &buf, filldir);
@@ -2320,55 +2322,58 @@ osd_ios_ROOT_scan(struct osd_thread_info *info, struct osd_device *dev,
         *      OI mapping crashed or lost also, then we have to give up under
         *      double failure cases. */
        scrub->os_convert_igif = 1;
-       child = osd_ios_lookup_one_len(dot_lustre_name, dentry,
-                                      strlen(dot_lustre_name));
+       child = osd_lookup_one_len_unlocked(dev, dot_lustre_name, dentry,
+                                           strlen(dot_lustre_name));
        if (IS_ERR(child)) {
-               rc = PTR_ERR(child);
-               if (rc == -ENOENT) {
-                       /* It is 1.8 MDT device. */
-                       if (!(sf->sf_flags & SF_UPGRADE)) {
-                               scrub_file_reset(scrub,
-                                       LDISKFS_SB(osd_sb(dev))->s_es->s_uuid,
-                                       SF_UPGRADE);
-                               sf->sf_internal_flags &= ~SIF_NO_HANDLE_OLD_FID;
-                               rc = scrub_file_store(info->oti_env, scrub);
-                       } else {
-                               rc = 0;
-                       }
+               if (PTR_ERR(child) != -ENOENT)
+                       RETURN(PTR_ERR(child));
+               goto out_scrub;
+       }
+
+       /* For lustre-2.x (x <= 3), the ".lustre" has NO FID-in-LMA,
+        * so the client will get IGIF for the ".lustre" object when
+        * the MDT restart.
+        *
+        * From the OI scrub view, when the MDT upgrade to Lustre-2.4,
+        * it does not know whether there are some old clients cached
+        * the ".lustre" IGIF during the upgrading. Two choices:
+        *
+        * 1) Generate IGIF-in-LMA and IGIF-in-OI for the ".lustre".
+        *    It will allow the old connected clients to access the
+        *    ".lustre" with cached IGIF. But it will cause others
+        *    on the MDT failed to check "fid_is_dot_lustre()".
+        *
+        * 2) Use fixed FID {FID_SEQ_DOT_LUSTRE, FID_OID_DOT_LUSTRE, 0}
+        *    for ".lustre" in spite of whether there are some clients
+        *    cached the ".lustre" IGIF or not. It enables the check
+        *    "fid_is_dot_lustre()" on the MDT, although it will cause
+        *    that the old connected clients cannot access the ".lustre"
+        *    with the cached IGIF.
+        *
+        * Usually, it is rare case for the old connected clients
+        * to access the ".lustre" with cached IGIF. So we prefer
+        * to the solution 2).
+        */
+       rc = osd_ios_scan_one(info, dev, dentry->d_inode,
+                             child->d_inode, &LU_DOT_LUSTRE_FID,
+                             dot_lustre_name,
+                             strlen(dot_lustre_name), 0);
+       if (rc == -ENOENT) {
+out_scrub:
+               /* It is 1.8 MDT device. */
+               if (!(sf->sf_flags & SF_UPGRADE)) {
+                       scrub_file_reset(scrub, dev->od_uuid,
+                                        SF_UPGRADE);
+                       sf->sf_internal_flags &= ~SIF_NO_HANDLE_OLD_FID;
+                       rc = scrub_file_store(info->oti_env, scrub);
+               } else {
+                       rc = 0;
                }
-       } else {
-               /* For lustre-2.x (x <= 3), the ".lustre" has NO FID-in-LMA,
-                * so the client will get IGIF for the ".lustre" object when
-                * the MDT restart.
-                *
-                * From the OI scrub view, when the MDT upgrade to Lustre-2.4,
-                * it does not know whether there are some old clients cached
-                * the ".lustre" IGIF during the upgrading. Two choices:
-                *
-                * 1) Generate IGIF-in-LMA and IGIF-in-OI for the ".lustre".
-                *    It will allow the old connected clients to access the
-                *    ".lustre" with cached IGIF. But it will cause others
-                *    on the MDT failed to check "fid_is_dot_lustre()".
-                *
-                * 2) Use fixed FID {FID_SEQ_DOT_LUSTRE, FID_OID_DOT_LUSTRE, 0}
-                *    for ".lustre" in spite of whether there are some clients
-                *    cached the ".lustre" IGIF or not. It enables the check
-                *    "fid_is_dot_lustre()" on the MDT, although it will cause
-                *    that the old connected clients cannot access the ".lustre"
-                *    with the cached IGIF.
-                *
-                * Usually, it is rare case for the old connected clients
-                * to access the ".lustre" with cached IGIF. So we prefer
-                * to the solution 2). */
-               rc = osd_ios_scan_one(info, dev, dentry->d_inode,
-                                     child->d_inode, &LU_DOT_LUSTRE_FID,
-                                     dot_lustre_name,
-                                     strlen(dot_lustre_name), 0);
-               if (rc == 0)
-                       rc = osd_ios_new_item(dev, child, osd_ios_general_scan,
-                                             osd_ios_dl_fill);
-               dput(child);
+       } else if (rc == 0) {
+               rc = osd_ios_new_item(dev, child, osd_ios_general_scan,
+                                     osd_ios_dl_fill);
        }
+       dput(child);
 
        RETURN(rc);
 }
@@ -2390,33 +2395,31 @@ osd_ios_OBJECTS_scan(struct osd_thread_info *info, struct osd_device *dev,
                        RETURN(rc);
        }
 
-       child = osd_ios_lookup_one_len(ADMIN_USR, dentry, strlen(ADMIN_USR));
-       if (!IS_ERR(child)) {
+       child = osd_lookup_one_len_unlocked(dev, ADMIN_USR, dentry,
+                                           strlen(ADMIN_USR));
+       if (IS_ERR(child)) {
+               rc = PTR_ERR(child);
+       } else {
                rc = osd_ios_scan_one(info, dev, dentry->d_inode,
                                      child->d_inode, NULL, ADMIN_USR,
                                      strlen(ADMIN_USR), 0);
                dput(child);
-       } else {
-               rc = PTR_ERR(child);
        }
 
        if (rc != 0 && rc != -ENOENT)
-               RETURN(rc);
-
-       child = osd_ios_lookup_one_len(ADMIN_GRP, dentry, strlen(ADMIN_GRP));
-       if (!IS_ERR(child)) {
-               rc = osd_ios_scan_one(info, dev, dentry->d_inode,
-                                     child->d_inode, NULL, ADMIN_GRP,
-                                     strlen(ADMIN_GRP), 0);
-               dput(child);
-       } else {
-               rc = PTR_ERR(child);
-       }
+               GOTO(out, rc);
 
-       if (rc == -ENOENT)
-               rc = 0;
+       child = osd_lookup_one_len_unlocked(dev, ADMIN_GRP, dentry,
+                                           strlen(ADMIN_GRP));
+       if (IS_ERR(child))
+               GOTO(out, rc = PTR_ERR(child));
 
-       RETURN(rc);
+       rc = osd_ios_scan_one(info, dev, dentry->d_inode,
+                             child->d_inode, NULL, ADMIN_GRP,
+                             strlen(ADMIN_GRP), 0);
+       dput(child);
+out:
+       RETURN(rc == -ENOENT ? 0 : rc);
 }
 
 static void osd_initial_OI_scrub(struct osd_thread_info *info,
@@ -2463,15 +2466,16 @@ static void osd_initial_OI_scrub(struct osd_thread_info *info,
                        continue;
                }
 
-               child = osd_ios_lookup_one_len(map->olm_name,
-                                              osd_sb(dev)->s_root,
-                                              map->olm_namelen);
-               if (!IS_ERR(child))
-                       dput(child);
-               else if (PTR_ERR(child) == -ENOENT)
+               child = osd_lookup_one_len_unlocked(dev, map->olm_name,
+                                                   osd_sb(dev)->s_root,
+                                                   map->olm_namelen);
+               if (PTR_ERR(child) == -ENOENT ||
+                   (!IS_ERR(child) && !child->d_inode))
                        osd_scrub_refresh_mapping(info, dev, &map->olm_fid,
                                                  NULL, DTO_INDEX_DELETE,
                                                  true, 0, NULL);
+               if (!IS_ERR(child))
+                       dput(child);
                map++;
        }
 
@@ -2549,7 +2553,7 @@ int osd_scrub_start(const struct lu_env *env, struct osd_device *dev,
        RETURN(rc);
 }
 
-static void osd_scrub_stop(struct osd_device *dev)
+void osd_scrub_stop(struct osd_device *dev)
 {
        struct lustre_scrub *scrub = &dev->od_scrub.os_scrub;
 
@@ -2571,7 +2575,6 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        struct lvfs_run_ctxt *ctxt = &dev->od_scrub.os_ctxt;
        struct scrub_file *sf = &scrub->os_file;
        struct super_block *sb = osd_sb(dev);
-       struct ldiskfs_super_block *es = LDISKFS_SB(sb)->s_es;
        struct lvfs_run_ctxt saved;
        struct file *filp;
        struct inode *inode;
@@ -2587,7 +2590,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        OBD_SET_CTXT_MAGIC(ctxt);
        ctxt->pwdmnt = dev->od_mnt;
        ctxt->pwd = dev->od_mnt->mnt_root;
-       ctxt->fs = get_ds();
+       ctxt->fs = KERNEL_DS;
 
        init_waitqueue_head(&scrub->os_thread.t_ctl_waitq);
        init_rwsem(&scrub->os_rwsem);
@@ -2625,10 +2628,15 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        if (IS_ERR_OR_NULL(obj))
                RETURN(obj ? PTR_ERR(obj) : -ENOENT);
 
+#ifndef HAVE_S_UUID_AS_UUID_T
+       memcpy(dev->od_uuid.b, sb->s_uuid, UUID_SIZE);
+#else
+       uuid_copy(&dev->od_uuid, &sb->s_uuid);
+#endif
        scrub->os_obj = obj;
        rc = scrub_file_load(env, scrub);
        if (rc == -ENOENT || rc == -EFAULT) {
-               scrub_file_init(scrub, es->s_uuid);
+               scrub_file_init(scrub, dev->od_uuid);
                /* If the "/O" dir does not exist when mount (indicated by
                 * osd_device::od_maybe_new), neither for the "/OI_scrub",
                 * then it is quite probably that the device is a new one,
@@ -2638,7 +2646,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
                 * an old device, it can be found and cleared later.
                 *
                 * For the system with "SIF_NO_HANDLE_OLD_FID", we do not
-                * need to check "filter_fid_old" and to convert it to
+                * need to check "filter_fid_18_23" and to convert it to
                 * "filter_fid" for each object, and all the IGIF should
                 * have their FID mapping in OI files already. */
                if (dev->od_maybe_new && rc == -ENOENT)
@@ -2647,30 +2655,13 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        } else if (rc < 0) {
                GOTO(cleanup_obj, rc);
        } else {
-               if (memcmp(sf->sf_uuid, es->s_uuid, 16) != 0) {
-                       struct obd_uuid *old_uuid;
-                       struct obd_uuid *new_uuid;
-
-                       OBD_ALLOC_PTR(old_uuid);
-                       OBD_ALLOC_PTR(new_uuid);
-                       if (old_uuid == NULL || new_uuid == NULL) {
-                               CERROR("%s: UUID has been changed, but"
-                                      "failed to allocate RAM for report\n",
-                                      osd_dev2name(dev));
-                       } else {
-                               class_uuid_unparse(sf->sf_uuid, old_uuid);
-                               class_uuid_unparse(es->s_uuid, new_uuid);
-                               CDEBUG(D_LFSCK, "%s: UUID has been changed "
-                                      "from %s to %s\n", osd_dev2name(dev),
-                                      old_uuid->uuid, new_uuid->uuid);
-                       }
-                       scrub_file_reset(scrub, es->s_uuid, SF_INCONSISTENT);
+               if (!uuid_equal(&sf->sf_uuid, &dev->od_uuid)) {
+                       CDEBUG(D_LFSCK,
+                              "%s: UUID has been changed from %pU to %pU\n",
+                              osd_dev2name(dev), &sf->sf_uuid, &dev->od_uuid);
+                       scrub_file_reset(scrub, dev->od_uuid, SF_INCONSISTENT);
                        dirty = true;
                        restored = true;
-                       if (old_uuid != NULL)
-                               OBD_FREE_PTR(old_uuid);
-                       if (new_uuid != NULL)
-                               OBD_FREE_PTR(new_uuid);
                } else if (sf->sf_status == SS_SCANNING) {
                        sf->sf_status = SS_CRASHED;
                        dirty = true;