Whamcloud - gitweb
LU-1538 tests: sanity/101d to check available space
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_scrub.c
index 18a0a2a..303d769 100644 (file)
@@ -1309,6 +1309,8 @@ static int osd_ios_varfid_fill(void *buf, const char *name, int namelen,
                               loff_t offset, __u64 ino, unsigned d_type);
 static int osd_ios_lf_fill(void *buf, const char *name, int namelen,
                           loff_t offset, __u64 ino, unsigned d_type);
+static int osd_ios_dl_fill(void *buf, const char *name, int namelen,
+                          loff_t offset, __u64 ino, unsigned d_type);
 
 static int
 osd_ios_general_scan(struct osd_thread_info *info, struct osd_device *dev,
@@ -1426,6 +1428,15 @@ static const struct osd_lf_map osd_lf_maps[] = {
        { NULL, { 0, 0, 0 }, 0, NULL, NULL }
 };
 
+/* Add the new introduced files under .lustre/ in the list in the future. */
+static const struct osd_lf_map osd_dl_maps[] = {
+       /* .lustre/fid */
+       { "fid", { FID_SEQ_DOT_LUSTRE, FID_OID_DOT_LUSTRE_OBF, 0 }, 0,
+               NULL, NULL },
+
+       { NULL, { 0, 0, 0 }, 0, NULL, NULL }
+};
+
 struct osd_ios_item {
        cfs_list_t       oii_list;
        struct dentry   *oii_dentry;
@@ -1649,6 +1660,42 @@ static int osd_ios_varfid_fill(void *buf, const char *name, int namelen,
        RETURN(rc);
 }
 
+static int osd_ios_dl_fill(void *buf, const char *name, int namelen,
+                          loff_t offset, __u64 ino, unsigned d_type)
+{
+       struct osd_ios_filldir_buf *fill_buf = buf;
+       struct osd_device          *dev      = fill_buf->oifb_dev;
+       const struct osd_lf_map    *map;
+       struct dentry              *child;
+       int                         rc       = 0;
+       ENTRY;
+
+       /* skip any '.' started names */
+       if (name[0] == '.')
+               RETURN(0);
+
+       for (map = osd_dl_maps; map->olm_name != NULL; map++) {
+               if (strlen(map->olm_name) != namelen)
+                       continue;
+
+               if (strncmp(map->olm_name, name, namelen) == 0)
+                       break;
+       }
+
+       if (map->olm_name == NULL)
+               RETURN(0);
+
+       child = osd_ios_lookup_one_len(name, fill_buf->oifb_dentry, namelen);
+       if (IS_ERR(child))
+               RETURN(PTR_ERR(child));
+
+       rc = osd_ios_scan_one(fill_buf->oifb_info, dev, child->d_inode,
+                             &map->olm_fid, map->olm_flags);
+       dput(child);
+
+       RETURN(rc);
+}
+
 static int osd_ios_root_fill(void *buf, const char *name, int namelen,
                             loff_t offset, __u64 ino, unsigned d_type)
 {
@@ -1782,6 +1829,9 @@ osd_ios_ROOT_scan(struct osd_thread_info *info, struct osd_device *dev,
                 * to the solution 2). */
                rc = osd_ios_scan_one(info, dev, child->d_inode,
                                      &LU_DOT_LUSTRE_FID, 0);
+               if (rc == 0)
+                       rc = osd_ios_new_item(dev, child, osd_ios_general_scan,
+                                             osd_ios_dl_fill);
                dput(child);
        }
 
@@ -2041,10 +2091,10 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        spin_lock_init(&scrub->os_lock);
        CFS_INIT_LIST_HEAD(&scrub->os_inconsistent_items);
 
-       push_ctxt(&saved, ctxt, NULL);
+       push_ctxt(&saved, ctxt);
        filp = filp_open(osd_scrub_name, O_RDWR | O_CREAT, 0644);
        if (IS_ERR(filp)) {
-               pop_ctxt(&saved, ctxt, NULL);
+               pop_ctxt(&saved, ctxt);
                RETURN(PTR_ERR(filp));
        }
 
@@ -2056,13 +2106,13 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev)
        rc = osd_ea_fid_set(info, inode, fid, LMAC_NOT_IN_OI, 0);
        if (rc != 0) {
                filp_close(filp, 0);
-               pop_ctxt(&saved, ctxt, NULL);
+               pop_ctxt(&saved, ctxt);
                RETURN(rc);
        }
 
        scrub->os_inode = igrab(inode);
        filp_close(filp, 0);
-       pop_ctxt(&saved, ctxt, NULL);
+       pop_ctxt(&saved, ctxt);
 
        rc = osd_scrub_file_load(scrub);
        if (rc == -ENOENT) {