Auto merged

2004/04/17 04:01:46+03:00 elisa-laajakaista.fi!szaka
Detached ntfs_fsck_t from ntfs_resize_t and use it for check_allocation_bitmap() [in progress]

(Logical change 1.377)
edge.strict_endians
elisa-laajakaista.fi!szaka 2004-04-17 01:02:42 +00:00
parent b87c41cea4
commit fbd9efac4e
1 changed files with 55 additions and 45 deletions

View File

@ -108,18 +108,25 @@ struct llcn_t {
};
typedef struct {
s64 new_volume_size; /* in clusters; 0 = --info w/o --size */
int shrink; /* shrink = 1, enlarge = 0 */
ntfs_inode *ni; /* inode being processed */
MFT_REF mref; /* mft reference */
MFT_RECORD *mrec; /* mft record */
ntfs_attr_search_ctx *ctx; /* inode attribute being processed */
u64 relocations; /* num of clusters to relocate */
s64 inuse; /* num of clusters in use */
int multi_ref; /* num of clusters ref'd many times */
runlist mftmir_rl; /* $MFTMirr AT_DATA's new position */
s64 mftmir_old; /* $MFTMirr AT_DATA's old LCN */
int dirty_inode; /* some inode data got relocated */
ntfs_inode *ni; /* inode being processed */
ntfs_attr_search_ctx *ctx; /* inode attribute being processed */
s64 inuse; /* num of clusters in use */
int multi_ref; /* num of clusters referenced many times */
struct bitmap lcn_bitmap;
} ntfs_fsck_t;
typedef struct {
s64 new_volume_size; /* in clusters; 0 = --info w/o --size */
int shrink; /* shrink = 1, enlarge = 0 */
ntfs_inode *ni; /* inode being processed */
MFT_REF mref; /* mft reference */
MFT_RECORD *mrec; /* mft record */
ntfs_attr_search_ctx *ctx; /* inode attribute being processed */
u64 relocations; /* num of clusters to relocate */
s64 inuse; /* num of clusters in use */
runlist mftmir_rl; /* $MFTMirr AT_DATA's new position */
s64 mftmir_old; /* $MFTMirr AT_DATA's old LCN */
int dirty_inode; /* some inode data got relocated */
struct progress_bar progress;
struct bitmap lcn_bitmap;
/* Temporary statistics until all case is supported */
@ -129,8 +136,8 @@ typedef struct {
struct llcn_t last_sparse;
struct llcn_t last_compressed;
struct llcn_t last_lcn;
s64 last_unsafe; /* last "unsafe-to-move" cluster */
s64 last_unsupp; /* last unsupported cluster */
s64 last_unsafe; /* last "unsafe-to-move" cluster */
s64 last_unsupp; /* last unsupported cluster */
} ntfs_resize_t;
@ -716,16 +723,16 @@ static void collect_relocation_info(ntfs_resize_t *resize, runlist *rl)
*
* This serves as a rudimentary "chkdsk" operation.
*/
static void build_lcn_usage_bitmap(ntfs_resize_t *resize)
static void build_lcn_usage_bitmap(ntfs_fsck_t *fsck)
{
s64 inode;
ATTR_RECORD *a;
runlist *rl;
int i, j;
struct bitmap *lcn_bitmap = &resize->lcn_bitmap;
struct bitmap *lcn_bitmap = &fsck->lcn_bitmap;
a = resize->ctx->attr;
inode = resize->ni->mft_no;
a = fsck->ctx->attr;
inode = fsck->ni->mft_no;
if (!a->non_resident)
return;
@ -757,7 +764,7 @@ static void build_lcn_usage_bitmap(ntfs_resize_t *resize)
u64 k = (u64)lcn + j;
if (ntfs_bit_get_and_set(lcn_bitmap->bm, k, 1)) {
if (++resize->multi_ref > 10)
if (++fsck->multi_ref > 10)
continue;
printf("Cluster %llu (0x%llx) referenced "
@ -766,7 +773,7 @@ static void build_lcn_usage_bitmap(ntfs_resize_t *resize)
(unsigned long long)k);
}
}
resize->inuse += lcn_length;
fsck->inuse += lcn_length;
}
free(rl);
}
@ -777,18 +784,18 @@ static void build_lcn_usage_bitmap(ntfs_resize_t *resize)
* For a given MFT Record, iterate through all its attributes. Any non-resident
* data runs will be marked in lcn_bitmap.
*/
static void walk_attributes(ntfs_resize_t *resize)
static void walk_attributes(ntfs_fsck_t *fsck)
{
if (!(resize->ctx = ntfs_attr_get_search_ctx(resize->ni, NULL)))
if (!(fsck->ctx = ntfs_attr_get_search_ctx(fsck->ni, NULL)))
perr_exit("ntfs_get_attr_search_ctx");
while (!ntfs_attrs_walk(resize->ctx)) {
if (resize->ctx->attr->type == AT_END)
while (!ntfs_attrs_walk(fsck->ctx)) {
if (fsck->ctx->attr->type == AT_END)
break;
build_lcn_usage_bitmap(resize);
build_lcn_usage_bitmap(fsck);
}
ntfs_attr_put_search_ctx(resize->ctx);
ntfs_attr_put_search_ctx(fsck->ctx);
}
/**
@ -904,7 +911,7 @@ static void progress_update(struct progress_bar *p, u64 current)
* Read each record in the MFT, skipping the unused ones, and build up a bitmap
* from all the non-resident attributes.
*/
static void build_allocation_bitmap(ntfs_resize_t *resize)
static void build_allocation_bitmap(ntfs_fsck_t *fsck)
{
s64 inode = 0;
ntfs_inode *ni;
@ -929,8 +936,8 @@ static void build_allocation_bitmap(ntfs_resize_t *resize)
if ((ni->mrec->base_mft_record) != 0)
goto close_inode;
resize->ni = ni;
walk_attributes(resize);
fsck->ni = ni;
walk_attributes(fsck);
close_inode:
if (ntfs_inode_close(ni))
perr_exit("ntfs_inode_close for inode %lld", inode);
@ -1903,12 +1910,12 @@ static void print_vol_size(const char *str, s64 bytes)
*
* Display the amount of disk space in use.
*/
static void print_disk_usage(ntfs_resize_t *resize)
static void print_disk_usage(s64 nr_used_clusters)
{
s64 total, used;
total = vol->nr_clusters * vol->cluster_size;
used = resize->inuse * vol->cluster_size;
used = nr_used_clusters * vol->cluster_size;
/* WARNING: don't modify the text, external tools grep for it */
printf("Space in use : %lld MB (%.1f%%)\n",
@ -2055,6 +2062,7 @@ static void check_shrink_constraints(ntfs_resize_t *resize)
int main(int argc, char **argv)
{
ntfs_fsck_t fsck;
ntfs_resize_t resize;
s64 new_size = 0; /* in clusters; 0 = --info w/o --size */
s64 device_size; /* in bytes */
@ -2106,26 +2114,28 @@ int main(int argc, char **argv)
exit(0);
}
memset(&resize, 0, sizeof(resize));
resize.new_volume_size = new_size;
memset(&fsck, 0, sizeof(fsck));
setup_lcn_bitmap(&fsck.lcn_bitmap);
setup_lcn_bitmap(&resize.lcn_bitmap);
/* This is also true if --info was used w/o --size (new_size = 0) */
if (new_size < vol->nr_clusters)
resize.shrink = 1;
build_allocation_bitmap(&resize);
if (resize.multi_ref) {
build_allocation_bitmap(&fsck);
if (fsck.multi_ref) {
err_printf("Filesystem check failed! Totally %d clusters "
"referenced multiply times.\n", resize.multi_ref);
"referenced multiply times.\n", fsck.multi_ref);
printf(corrupt_volume_msg);
exit(1);
}
compare_bitmaps(&resize.lcn_bitmap);
compare_bitmaps(&fsck.lcn_bitmap);
print_disk_usage(&resize);
print_disk_usage(fsck.inuse);
memset(&resize, 0, sizeof(resize));
resize.new_volume_size = new_size;
resize.inuse = fsck.inuse;
resize.lcn_bitmap = fsck.lcn_bitmap;
/* This is also true if --info was used w/o --size (new_size = 0) */
if (new_size < vol->nr_clusters)
resize.shrink = 1;
set_resize_constrains(&resize);
set_disk_usage_constraint(&resize);