119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * sparse.c --- find the groups in an ext2 filesystem with metadata backups 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2002 Andreas Dilger. 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library 98558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2. 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fsP.h" 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int test_root(int a, int b) 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (a == 0) 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (a == 1) 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (a % b) 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project a = a / b; 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_bg_has_super(ext2_filsys fs, int group_block) 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!(fs->super->s_feature_ro_compat & 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (test_root(group_block, 3) || (test_root(group_block, 5)) || 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_root(group_block, 7)) 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Iterate through the groups which hold BACKUP superblock/GDT copies in an 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * ext3 filesystem. The counters should be initialized to 1, 5, and 7 before 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * calling this for the first time. In a sparse filesystem it will be the 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * sequence of powers of 3, 5, and 7: 1, 3, 5, 7, 9, 25, 27, 49, 81, ... 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * For a non-sparse filesystem it will be every group: 1, 2, 3, 4, ... 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectunsigned int ext2fs_list_backups(ext2_filsys fs, unsigned int *three, 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int *five, unsigned int *seven) 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int *min = three; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int mult = 3; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int ret; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!(fs->super->s_feature_ro_compat & 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) { 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = *min; 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *min += 1; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ret; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*five < *min) { 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project min = five; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mult = 5; 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*seven < *min) { 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project min = seven; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mult = 7; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = *min; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *min *= mult; 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ret; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 79