summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-05-25 18:22:51 +0300
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-05-27 15:55:07 +0300
commit80a3b730e9b1044d689997e8d68e3b6acb71c7a3 (patch)
tree8132f474f7c12b76df9f0360efdcb70eff328359
parentacd00a418ef8203fe34809fdd8891dbc5271512c (diff)
fs-tests: integck: make directory checking work
This patch makes the directory checking in case of power cut emulation actually work. There were many bugs. Basically, we cannot rely on anything unless the directory is marked as clean. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--tests/fs-tests/integrity/integck.c101
1 files changed, 45 insertions, 56 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
index 437922e..748b6cb 100644
--- a/tests/fs-tests/integrity/integck.c
+++ b/tests/fs-tests/integrity/integck.c
@@ -1702,65 +1702,54 @@ static void dir_check(struct dir_info *dir)
int link_count = 2; /* Parent and dot */
struct stat st;
- /* Create an array of entries */
- sz = sizeof(struct dir_entry_info *);
- n = dir->number_of_entries;
- entry_array = malloc(sz * n);
- CHECK(entry_array != NULL);
-
- entry = dir->first;
- p = entry_array;
- while (entry) {
- *p++ = entry;
- entry->checked = 0;
- entry = entry->next;
- }
+ path = dir_path(dir->parent, dir->entry->name);
- /* Sort it by name */
- qsort(entry_array, n, sz, sort_comp);
+ if (!args.power_cut_mode || dir->clean) {
+ v("checking dir %s", path);
- /* Go through directory on file system checking entries match */
- path = dir_path(dir->parent, dir->entry->name);
+ /* Create an array of entries */
+ sz = sizeof(struct dir_entry_info *);
+ n = dir->number_of_entries;
+ entry_array = malloc(sz * n);
+ CHECK(entry_array != NULL);
- v("checking dir %s", path);
+ entry = dir->first;
+ p = entry_array;
+ while (entry) {
+ *p++ = entry;
+ entry->checked = 0;
+ entry = entry->next;
+ }
- d = opendir(path);
- if (!d) {
- if (args.power_cut_mode && !dir->clean)
- /*
- * We are doing power cut testing and the directory
- * was not synchronized, which means it might not
- * exist.
- */
- return;
+ /* Sort it by name */
+ qsort(entry_array, n, sz, sort_comp);
- errmsg("cannot open directory %s", path);
- CHECK(0);
- }
+ /* Go through directory on file system checking entries match */
+ d = opendir(path);
+ if (!d) {
+ errmsg("cannot open directory %s", path);
+ CHECK(0);
+ }
- for (;;) {
- errno = 0;
- ent = readdir(d);
- if (ent) {
- if (strcmp(".",ent->d_name) != 0 &&
- strcmp("..",ent->d_name) != 0) {
- dir_entry_check(entry_array, n, ent);
- checked += 1;
+ for (;;) {
+ errno = 0;
+ ent = readdir(d);
+ if (ent) {
+ if (strcmp(".",ent->d_name) != 0 &&
+ strcmp("..",ent->d_name) != 0) {
+ dir_entry_check(entry_array, n, ent);
+ checked += 1;
+ }
+ } else {
+ CHECK(errno == 0);
+ break;
}
- } else {
- CHECK(errno == 0);
- break;
}
- }
- CHECK(closedir(d) == 0);
+ free(entry_array);
+ CHECK(closedir(d) == 0);
- /*
- * In power cut mode the file-system may miss some directory entries
- * because it is possible that they have not reached the media by the
- * time of the emulated power cut.
- */
- if (!args.power_cut_mode || dir->clean)
CHECK(checked == dir->number_of_entries);
+ }
/* Now check each entry */
entry = dir->first;
@@ -1777,15 +1766,15 @@ static void dir_check(struct dir_info *dir)
entry = entry->next;
}
- CHECK(stat(path, &st) == 0);
-
- if (link_count != st.st_nlink) {
- errmsg("calculated link count %d, FS reports %d for dir %s",
- link_count, (int)st.st_nlink, path);
- CHECK(0);
+ if (!args.power_cut_mode || dir->clean) {
+ CHECK(stat(path, &st) == 0);
+ if (link_count != st.st_nlink) {
+ errmsg("calculated link count %d, FS reports %d for dir %s",
+ link_count, (int)st.st_nlink, path);
+ CHECK(0);
+ }
}
- free(entry_array);
free(path);
}