int filter_correctness(int filter_error, tommy_arrayblkof* infoarr, struct snapraid_disk* disk, struct snapraid_file* file) { unsigned i; if (!filter_error) return 0; /* check each block of the file */ for (i = 0; i < file->blockmax; ++i) { block_off_t parity_pos = fs_file2par_get(disk, file, i); snapraid_info info = info_get(infoarr, parity_pos); /* if the file has a bad block, don't exclude it */ if (info_get_bad(info)) return 0; } /* the file is correct, so we filter it out */ return 1; }
void parity_overflow(struct snapraid_state* state, data_off_t size) { tommy_node* i; block_off_t blockalloc; int first = 1; char esc_buffer[ESC_MAX]; /* don't report if everything is outside or if the file is not accessible */ if (size == 0) { return; } blockalloc = size / state->block_size; /* for all disks */ for (i = state->disklist; i != 0; i = i->next) { struct snapraid_disk* disk = i->data; tommy_node* j; /* for all files */ for (j = disk->filelist; j != 0; j = j->next) { struct snapraid_file* file = j->data; if (file->blockmax > 0) { block_off_t parity_pos = fs_file2par_get(disk, file, file->blockmax - 1); if (parity_pos >= blockalloc) { log_tag("outofparity:%s:%s\n", disk->name, esc(file->sub, esc_buffer)); if (first) { first = 0; log_fatal("\nYour data requires more parity than the available space.\n"); log_fatal("Please move the files 'outofparity' to another data disk:\n"); } log_fatal("outofparity %s%s\n", disk->dir, file->sub); } } } } }