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 9ac3fca..31b01fa 100644 (file)
@@ -2022,7 +2022,7 @@ 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));
@@ -2096,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));
 
@@ -2144,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));
 
@@ -2166,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;
@@ -2177,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));
 
@@ -2227,7 +2231,8 @@ 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)
@@ -2317,11 +2322,44 @@ 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));
-       if (IS_ERR(child) && PTR_ERR(child) != -ENOENT) {
-               rc = PTR_ERR(child);
-       } else if (IS_ERR(child) || !child->d_inode) {
+       child = osd_lookup_one_len_unlocked(dev, dot_lustre_name, dentry,
+                                           strlen(dot_lustre_name));
+       if (IS_ERR(child)) {
+               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,
@@ -2331,41 +2369,11 @@ osd_ios_ROOT_scan(struct osd_thread_info *info, struct osd_device *dev,
                } else {
                        rc = 0;
                }
-               if (!IS_ERR(child))
-                       dput(child);
-       } 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);
 }
@@ -2387,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,
@@ -2460,9 +2466,9 @@ 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);
+               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,