| /* |
| * Copyright 2000-2004 by Hans Reiser, licensing governed by |
| * reiserfsprogs/README |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| #endif |
| |
| #include "util/badblock.h" |
| |
| int util_badblock_load (reiserfs_filsys_t * fs, char * badblocks_file) { |
| FILE * fd; |
| char buf[128]; |
| __u32 blocknr; |
| int count; |
| |
| fs->fs_badblocks_bm = |
| reiserfs_bitmap_create(reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); |
| |
| reiserfs_bitmap_zero (fs->fs_badblocks_bm); |
| |
| if (!badblocks_file) |
| return 0; |
| |
| fd = fopen (badblocks_file, "r"); |
| |
| if (fd == NULL) { |
| fprintf (stderr, "%s: Failed to open the given badblock file '%s'.\n\n", |
| __FUNCTION__, badblocks_file); |
| return 1; |
| } |
| |
| |
| while (!feof (fd)) { |
| if (fgets(buf, sizeof(buf), fd) == NULL) |
| break; |
| count = sscanf(buf, "%u", &blocknr); |
| |
| if (count <= 0) |
| continue; |
| |
| if (blocknr >= reiserfs_sb_get_blocks (fs->fs_ondisk_sb)) { |
| fprintf (stderr, "%s: block number (%u) points out of fs size " |
| "(%u).\n", __FUNCTION__, blocknr, |
| reiserfs_sb_get_blocks(fs->fs_ondisk_sb)); |
| } else if (reiserfs_fs_block(fs, blocknr) != BT_UNKNOWN) { |
| fprintf (stderr, "%s: block number (%u) belongs to system " |
| "reiserfs area. It cannot be relocated.\n", |
| __FUNCTION__, blocknr); |
| return 1; |
| } else { |
| reiserfs_bitmap_set_bit (fs->fs_badblocks_bm, blocknr); |
| } |
| } |
| |
| fclose (fd); |
| |
| return 0; |
| } |
| |
| |