119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * read_bb --- read the bad blocks inode 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1994 Theodore Ts'o. 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_STAT_H 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_TYPES_H 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct read_bb_record { 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_badblocks_list bb_list; 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t err; 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Helper function for ext2fs_read_bb_inode() 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef __TURBOC__ 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project #pragma argsused 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int mark_bad_block(ext2_filsys fs, blk_t *block_nr, 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t ref_block EXT2FS_ATTR((unused)), 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int ref_offset EXT2FS_ATTR((unused)), 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data) 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct read_bb_record *rb = (struct read_bb_record *) priv_data; 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blockcnt < 0) 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((*block_nr < fs->super->s_first_data_block) || 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (*block_nr >= fs->super->s_blocks_count)) 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; /* Ignore illegal blocks */ 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rb->err = ext2fs_badblocks_list_add(rb->bb_list, *block_nr); 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (rb->err) 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return BLOCK_ABORT; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Reads the current bad blocks from the bad blocks inode. 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_read_bb_inode(ext2_filsys fs, ext2_badblocks_list *bb_list) 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct read_bb_record rb; 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t numblocks; 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!*bb_list) { 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_inode(fs, EXT2_BAD_INO, &inode); 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode.i_blocks < 500) 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project numblocks = (inode.i_blocks / 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (fs->blocksize / 512)) + 20; 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project numblocks = 500; 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_badblocks_list_create(bb_list, numblocks); 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rb.bb_list = *bb_list; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rb.err = 0; 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_block_iterate2(fs, EXT2_BAD_INO, 0, 0, 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mark_bad_block, &rb); 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return rb.err; 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 98