dblist.c revision b5abe6fac9c9e7caf4710501d1657d30e4857ef6
121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * dblist.c -- directory block list functions 321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * 421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Copyright 1997 by Theodore Ts'o 521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * 621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %Begin-Header% 721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * License. 921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %End-Header% 1021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * 1121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 1221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 1321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <stdio.h> 144cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#if HAVE_UNISTD_H 1521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <unistd.h> 164cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#endif 1721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h> 1821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <time.h> 1921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 20b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#if EXT2_FLAT_INCLUDES 21b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_fs.h" 22b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#else 2321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <linux/ext2_fs.h> 24b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#endif 2521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "ext2fsP.h" 2721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int dir_block_cmp(const void *a, const void *b); 2921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 3021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 3121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Returns the number of directories in the filesystem as reported by 3221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * the group descriptors. Of course, the group descriptors could be 3321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * wrong! 3421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 3521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oerrcode_t ext2fs_get_num_dirs(ext2_filsys fs, ino_t *ret_num_dirs) 3621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 3721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int i; 385be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o ino_t num_dirs, max_dirs; 3921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 4121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o num_dirs = 0; 435be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o max_dirs = 8 * fs->blocksize; 445be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o for (i = 0; i < fs->group_desc_count; i++) { 455be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o if (fs->group_desc[i].bg_used_dirs_count > max_dirs) 465be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o num_dirs += max_dirs; 475be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o else 485be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o num_dirs += fs->group_desc[i].bg_used_dirs_count; 495be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o } 505be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o if (num_dirs > fs->super->s_inodes_count) 515be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o num_dirs = fs->super->s_inodes_count; 5221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 5321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o *ret_num_dirs = num_dirs; 5421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 5521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 5621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 5721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 5821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 59a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o * helper function for making a new directory block list (for 60a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o * initialize and copy). 6121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 62a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'ostatic errcode_t make_dblist(ext2_filsys fs, ino_t size, ino_t count, 63a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o struct ext2_db_entry *list, 64a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o ext2_dblist *ret_dblist) 6521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 6621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ext2_dblist dblist; 6721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o errcode_t retval; 68a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o size_t len; 6921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 7021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); 7121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 7221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if ((ret_dblist == 0) && fs->dblist && 7321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o (fs->dblist->magic == EXT2_ET_MAGIC_DBLIST)) 7421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 7521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 767b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o retval = ext2fs_get_mem(sizeof(struct ext2_struct_dblist), 777b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o (void **) &dblist); 787b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o if (retval) 797b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o return retval; 8021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o memset(dblist, 0, sizeof(struct ext2_struct_dblist)); 8121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 8221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->magic = EXT2_ET_MAGIC_DBLIST; 8321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->fs = fs; 84a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (size) 85a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o dblist->size = size; 86a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o else { 87a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o retval = ext2fs_get_num_dirs(fs, &dblist->size); 88a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (retval) 89a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o goto cleanup; 901e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o dblist->size = (dblist->size * 2) + 12; 91a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 923cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o len = (size_t) sizeof(struct ext2_db_entry) * dblist->size; 93a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o dblist->count = count; 947b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o retval = ext2fs_get_mem(len, (void **) &dblist->list); 957b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o if (retval) 9621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o goto cleanup; 977b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o 98a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (list) 99a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o memcpy(dblist->list, list, len); 10021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o else 101a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o memset(dblist->list, 0, len); 102a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o *ret_dblist = dblist; 10321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 10421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ocleanup: 10521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (dblist) 1067b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o ext2fs_free_mem((void **) &dblist); 10721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return retval; 10821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 10921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 11021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 111a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o * Initialize a directory block list 112a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o */ 113a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oerrcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist) 114a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o{ 115a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o ext2_dblist dblist; 116a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o errcode_t retval; 117a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 118a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o retval = make_dblist(fs, 0, 0, 0, &dblist); 119a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (retval) 120a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o return retval; 121a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 122a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o dblist->sorted = 1; 123a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (ret_dblist) 124a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o *ret_dblist = dblist; 125a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o else 126a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o fs->dblist = dblist; 127a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 128a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o return 0; 129a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o} 130a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 131a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o/* 132a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o * Copy a directory block list 133a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o */ 134a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oerrcode_t ext2fs_copy_dblist(ext2_dblist src, ext2_dblist *dest) 135a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o{ 136a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o ext2_dblist dblist; 137a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o errcode_t retval; 138a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 139a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o retval = make_dblist(src->fs, src->size, src->count, src->list, 140a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o &dblist); 141a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (retval) 142a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o return retval; 143a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o dblist->sorted = src->sorted; 144a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o *dest = dblist; 145a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o return 0; 146a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o} 147a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 148a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o/* 14921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Close a directory block list 15021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * 15121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * (moved to closefs.c) 15221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 15321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 15421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 15521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 15621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Add a directory block to the directory block list 15721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 15821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oerrcode_t ext2fs_add_dir_block(ext2_dblist dblist, ino_t ino, blk_t blk, 15921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int blockcnt) 16021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 161b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o struct ext2_db_entry *new_entry; 1627b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o errcode_t retval; 16321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 16421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 16521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 16621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (dblist->count >= dblist->size) { 16721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->size += 100; 1687b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o retval = ext2fs_resize_mem((size_t) dblist->size * 1697b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o sizeof(struct ext2_db_entry), 1707b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o (void **) &dblist->list); 1717b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o if (retval) { 17221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->size -= 100; 1737b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o return retval; 17421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o } 17521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o } 176b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o new_entry = dblist->list + ( (int) dblist->count++); 177b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o new_entry->blk = blk; 178b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o new_entry->ino = ino; 179b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o new_entry->blockcnt = blockcnt; 18021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 18121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->sorted = 0; 18221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 18321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 18421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 18521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 18621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/* 187521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o * Change the directory block to the directory block list 188521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o */ 189521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'oerrcode_t ext2fs_set_dir_block(ext2_dblist dblist, ino_t ino, blk_t blk, 190521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o int blockcnt) 191521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o{ 192521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o int i; 193521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o 194521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 195521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o 196521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o for (i=0; i < dblist->count; i++) { 197521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if ((dblist->list[i].ino != ino) || 198521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o (dblist->list[i].blockcnt != blockcnt)) 199521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o continue; 200521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o dblist->list[i].blk = blk; 201521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o dblist->sorted = 0; 202521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o return 0; 203521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 2041f0b6c1f895d189fea6999d0c07a7fee936a4baaTheodore Ts'o return EXT2_ET_DB_NOT_FOUND; 205521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o} 206521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o 207521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o/* 20821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * This function iterates over the directory block list 20921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 21021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oerrcode_t ext2fs_dblist_iterate(ext2_dblist dblist, 21121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int (*func)(ext2_filsys fs, 21221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct ext2_db_entry *db_info, 213b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o void *priv_data), 214b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o void *priv_data) 21521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 21621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ino_t i; 21721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int ret; 21821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 21921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 22021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 22121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (!dblist->sorted) { 2223cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o qsort(dblist->list, (size_t) dblist->count, 22321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o sizeof(struct ext2_db_entry), dir_block_cmp); 22421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o dblist->sorted = 1; 22521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o } 22621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o for (i=0; i < dblist->count; i++) { 227b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o ret = (*func)(dblist->fs, &dblist->list[(int)i], priv_data); 22821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (ret & DBLIST_ABORT) 22921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 23021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o } 23121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return 0; 23221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 23321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 23421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 23521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int dir_block_cmp(const void *a, const void *b) 23621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 23721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o const struct ext2_db_entry *db_a = 23821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o (const struct ext2_db_entry *) a; 23921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o const struct ext2_db_entry *db_b = 24021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o (const struct ext2_db_entry *) b; 24121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 24221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (db_a->blk != db_b->blk) 2433cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o return (int) (db_a->blk - db_b->blk); 24421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 24521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (db_a->ino != db_b->ino) 2463cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o return (int) (db_a->ino - db_b->ino); 24721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2483cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o return (int) (db_a->blockcnt - db_b->blockcnt); 24921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 25021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 251549860c5c7a5a2974c103a55d881fbd5701aff13Theodore Ts'oint ext2fs_dblist_count(ext2_dblist dblist) 252549860c5c7a5a2974c103a55d881fbd5701aff13Theodore Ts'o{ 253549860c5c7a5a2974c103a55d881fbd5701aff13Theodore Ts'o return (int) dblist->count; 254549860c5c7a5a2974c103a55d881fbd5701aff13Theodore Ts'o} 255