+1998-03-23 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * debugfs.c, ls.c, lsdel.c: Add support for large files. (The
+ high 32 bits share space with the i_dir_acl field.)
+
Sun Mar 8 22:53:04 1998 Theodore Ts'o <tytso@rsts-11.mit.edu>
* ls.c (list_dir_proc): Mask off high 8 bits from
fprintf(out, "Inode: %ld Type: %s ", inode_num, i_type);
fprintf(out, "Mode: %04o Flags: 0x%x Version: %d\n",
inode.i_mode & 0777, inode.i_flags, inode.i_version);
- fprintf(out, "User: %5d Group: %5d Size: %d\n",
- inode.i_uid, inode.i_gid, inode.i_size);
+ fprintf(out, "User: %5d Group: %5d Size: ",
+ inode.i_uid, inode.i_gid);
+ if (LINUX_S_ISDIR(inode.i_mode))
+ fprintf(out, "%d\n", inode.i_size);
+ else {
+ __u64 i_size = (inode.i_size |
+ ((unsigned long long)inode.i_size_high << 32));
+
+ fprintf(out, "%lld\n", i_size);
+ }
if (current_fs->super->s_creator_os == EXT2_OS_HURD)
fprintf(out,
"File ACL: %d Directory ACL: %d Translator: %d\n",
- inode.i_file_acl, inode.i_dir_acl,
+ inode.i_file_acl, LINUX_S_ISDIR(inode.i_mode) ? inode.i_dir_acl : 0,
inode.osd1.hurd1.h_i_translator);
else
fprintf(out, "File ACL: %d Directory ACL: %d\n",
- inode.i_file_acl, inode.i_dir_acl);
+ inode.i_file_acl, LINUX_S_ISDIR(inode.i_mode) ? inode.i_dir_acl : 0);
fprintf(out, "Links: %d Blockcount: %d\n", inode.i_links_count,
inode.i_blocks);
switch (os) {
modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1);
#endif
modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl);
- modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl);
+ if (LINUX_S_ISDIR(inode.i_mode))
+ modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl);
+ else
+ modify_u32(argv[0], "High 32bits of size", decimal_format, &inode.i_size_high);
if (current_fs->super->s_creator_os == EXT2_OS_HURD)
modify_u32(argv[0], "Translator Block",
sprintf(datestr, "%2d-%s-%2d %02d:%02d",
tm_p->tm_mday, monstr[tm_p->tm_mon], tm_p->tm_year,
tm_p->tm_hour, tm_p->tm_min);
- fprintf(ls->f, "%6ld %6o %5d %5d %5d %s %s\n", ino, inode.i_mode,
- inode.i_uid, inode.i_gid, inode.i_size, datestr, name);
+ fprintf(ls->f, "%6ld %6o %5d %5d ", ino, inode.i_mode,
+ inode.i_uid, inode.i_gid);
+ if (LINUX_S_ISDIR(inode.i_mode))
+ fprintf(ls->f, "%5d", inode.i_size);
+ else
+ fprintf(ls->f, "%5lld", inode.i_size |
+ ((__u64)inode.i_size_high << 32));
+ fprintf (ls->f, " %s %s\n", datestr, name);
}
static void ls_file(struct list_dir_struct *ls, char *name,
ino_t ino;
unsigned short mode;
unsigned short uid;
- unsigned long size;
+ __u64 size;
time_t dtime;
int num_blocks;
int free_blocks;
delarray[num_delarray].mode = inode.i_mode;
delarray[num_delarray].uid = inode.i_uid;
delarray[num_delarray].size = inode.i_size;
+ if (!LINUX_S_ISDIR(inode.i_mode))
+ delarray[num_delarray].size |=
+ ((__u64) inode.i_size_high << 32);
delarray[num_delarray].dtime = inode.i_dtime;
delarray[num_delarray].num_blocks = lsd.num_blocks;
delarray[num_delarray].free_blocks = lsd.free_blocks;
deleted_info_compare);
for (i = 0; i < num_delarray; i++) {
- printf("%6lu %6d %6o %6lu %4d/%4d %s", delarray[i].ino,
+ printf("%6lu %6d %6o %6llu %4d/%4d %s", delarray[i].ino,
delarray[i].uid, delarray[i].mode, delarray[i].size,
delarray[i].free_blocks, delarray[i].num_blocks,
time_to_string(delarray[i].dtime));
+1998-03-23 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * block.c (ext2fs_block_iterate3): Make the ref_offset field
+ contain the offset into the inode.i_blocks array when
+ ref_block is zero. Since we haven't done a formal
+ release of e2fsprogs since block_iterate2 was first
+ introduced, I removed block_iterate2, and renamed
+ block_iterate3 to be block_iterate2.
+
+ * bb_inode.c, bmove.c, dblist_dir.c, dir_iterate.c,
+ expanddir.c, ext2fs.h, ext2fsP.h, read_bb.c: Change
+ use of block_iterate and block_iterate2 to
+ block_iterate2 with the new prototype for the
+ interator function. (using blkcnt_t forr blockcount)
+
1998-03-21 Theodore Ts'o <tytso@rsts-11.mit.edu>
* ext2fs.h: Add new superblock fields (s_algorithm_usage_bitmap,
errcode_t err;
};
-static int set_bad_block_proc(ext2_filsys fs, blk_t *block_nr, int blockcnt,
+static int set_bad_block_proc(ext2_filsys fs, blk_t *block_nr,
+ blkcnt_t blockcnt,
blk_t ref_block, int ref_offset,
void *priv_data);
-static int clear_bad_block_proc(ext2_filsys fs, blk_t *block_nr, int blockcnt,
+static int clear_bad_block_proc(ext2_filsys fs, blk_t *block_nr,
+ blkcnt_t blockcnt,
blk_t ref_block, int ref_offset,
void *priv_data);
#ifdef __TURBOC__
#pragma argsused
#endif
-static int clear_bad_block_proc(ext2_filsys fs, blk_t *block_nr, int blockcnt,
+static int clear_bad_block_proc(ext2_filsys fs, blk_t *block_nr,
+ blkcnt_t blockcnt,
blk_t ref_block, int ref_offset,
void *priv_data)
{
#pragma argsused
#endif
static int set_bad_block_proc(ext2_filsys fs, blk_t *block_nr,
- int blockcnt, blk_t ref_block,
+ blkcnt_t blockcnt, blk_t ref_block,
int ref_offset, void *priv_data)
{
struct set_badblock_record *rec = (struct set_badblock_record *)
return ret;
}
-errcode_t ext2fs_block_iterate3(ext2_filsys fs,
+errcode_t ext2fs_block_iterate2(ext2_filsys fs,
ino_t ino,
int flags,
char *block_buf,
for (i = 0; i < EXT2_NDIR_BLOCKS ; i++, ctx.bcount++) {
if (blocks[i] || (flags & BLOCK_FLAG_APPEND)) {
ret |= (*ctx.func)(fs, &blocks[i],
- ctx.bcount, 0, 0, priv_data);
+ ctx.bcount, 0, i, priv_data);
if (ret & BLOCK_ABORT)
goto abort;
}
}
if (*(blocks + EXT2_IND_BLOCK) || (flags & BLOCK_FLAG_APPEND)) {
ret |= block_iterate_ind(blocks + EXT2_IND_BLOCK,
- 0, 0, &ctx);
+ 0, EXT2_IND_BLOCK, &ctx);
if (ret & BLOCK_ABORT)
goto abort;
} else
ctx.bcount += limit;
if (*(blocks + EXT2_DIND_BLOCK) || (flags & BLOCK_FLAG_APPEND)) {
ret |= block_iterate_dind(blocks + EXT2_DIND_BLOCK,
- 0, 0, &ctx);
+ 0, EXT2_DIND_BLOCK, &ctx);
if (ret & BLOCK_ABORT)
goto abort;
} else
ctx.bcount += limit * limit;
if (*(blocks + EXT2_TIND_BLOCK) || (flags & BLOCK_FLAG_APPEND)) {
ret |= block_iterate_tind(blocks + EXT2_TIND_BLOCK,
- 0, 0, &ctx);
+ 0, EXT2_TIND_BLOCK, &ctx);
if (ret & BLOCK_ABORT)
goto abort;
}
xl.real_private = priv_data;
xl.func = func;
- return ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_NO_LARGE | flags,
+ return ext2fs_block_iterate2(fs, ino, BLOCK_FLAG_NO_LARGE | flags,
block_buf, xlate_func, &xl);
}
-/*
- * Emulate the old ext2fs_block_iterate2 function!
- */
-
-struct xlate2 {
- int (*func)(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- blk_t ref_blk,
- int ref_offset,
- void *priv_data);
- void *real_private;
-};
-
-#ifdef __TURBOC__
-#pragma argsused
-#endif
-static int xlate_func2(ext2_filsys fs, blk_t *blocknr, blkcnt_t blockcnt,
- blk_t ref_block, int ref_offset, void *priv_data)
-{
- struct xlate2 *xl = (struct xlate2 *) priv_data;
-
- return (*xl->func)(fs, blocknr, (int) blockcnt, ref_block,
- ref_offset, xl->real_private);
-}
-
-errcode_t ext2fs_block_iterate2(ext2_filsys fs,
- ino_t ino,
- int flags,
- char *block_buf,
- int (*func)(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- blk_t ref_blk,
- int ref_offset,
- void *priv_data),
- void *priv_data)
-{
- struct xlate2 xl;
-
- xl.real_private = priv_data;
- xl.func = func;
-
- return ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_NO_LARGE | flags,
- block_buf, xlate_func2, &xl);
-}
-
};
static int process_block(ext2_filsys fs, blk_t *block_nr,
- int blockcnt, blk_t ref_block,
+ blkcnt_t blockcnt, blk_t ref_block,
int ref_offset, void *priv_data)
{
struct process_block_struct *pb;
ext2fs_mark_block_bitmap(pb->alloc_map, block);
ret = BLOCK_CHANGED;
if (pb->flags & EXT2_BMOVE_DEBUG)
- printf("ino=%ld, blockcnt=%d, %d->%d\n", pb->ino,
+ printf("ino=%ld, blockcnt=%ld, %d->%d\n", pb->ino,
blockcnt, orig, block);
}
if (pb->add_dir) {
retval = ext2fs_add_dir_block(fs->dblist, pb->ino,
- block, blockcnt);
+ block, (int) blockcnt);
if (retval) {
pb->error = retval;
ret |= BLOCK_ABORT;
ctx->dir = db_info->ino;
return ext2fs_process_dir_block(fs, &db_info->blk,
- db_info->blockcnt, priv_data);
+ db_info->blockcnt, 0, 0, priv_data);
}
ctx.func2 = 0;
ctx.priv_data = priv_data;
ctx.errcode = 0;
- retval = ext2fs_block_iterate(fs, dir, 0, 0,
- ext2fs_process_dir_block, &ctx);
+ retval = ext2fs_block_iterate2(fs, dir, 0, 0,
+ ext2fs_process_dir_block, &ctx);
if (!block_buf)
ext2fs_free_mem((void **) &ctx.buf);
if (retval)
*/
extern int ext2fs_process_dir_block(ext2_filsys fs,
blk_t *blocknr,
- int blockcnt,
+ blkcnt_t blockcnt,
+ blk_t ref_block,
+ int ref_offset,
void *priv_data)
{
struct dir_context *ctx = (struct dir_context *) priv_data;
if (blockcnt < 0)
return 0;
+ entry = blockcnt ? DIRENT_OTHER_FILE : DIRENT_DOT_FILE;
+
ctx->errcode = ext2fs_read_dir_block(fs, *blocknr, ctx->buf);
if (ctx->errcode)
return BLOCK_ABORT;
- entry = blockcnt ? DIRENT_OTHER_FILE : DIRENT_DOT_FILE;
-
while (offset < fs->blocksize) {
dirent = (struct ext2_dir_entry *) (ctx->buf + offset);
if (!dirent->inode &&
00000000 T _ext2fs_get_mem libext2fs inline
00000000 T _ext2fs_free_mem libext2fs inline
00000000 T _ext2fs_resize_mem libext2fs inline
-00000000 T _ext2fs_block_iterate3 libext2fs block
errcode_t err;
};
-static int expand_dir_proc(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- void *priv_data)
+static int expand_dir_proc(ext2_filsys fs,
+ blk_t *blocknr,
+ blkcnt_t blockcnt,
+ blk_t ref_block,
+ int ref_offset,
+ void *priv_data)
{
struct expand_dir_struct *es = (struct expand_dir_struct *) priv_data;
blk_t new_blk;
es.done = 0;
es.err = 0;
- retval = ext2fs_block_iterate(fs, dir, BLOCK_FLAG_APPEND,
- 0, expand_dir_proc, &es);
+ retval = ext2fs_block_iterate2(fs, dir, BLOCK_FLAG_APPEND,
+ 0, expand_dir_proc, &es);
if (es.err)
return es.err;
* called for data blocks only.
*
* BLOCK_FLAG_NO_LARGE is for internal use only. It informs
- * ext2fs_block_iterate3 that large files won't be accepted.
+ * ext2fs_block_iterate2 that large files won't be accepted.
*/
#define BLOCK_FLAG_APPEND 1
#define BLOCK_FLAG_HOLE 1
int blockcnt,
void *priv_data),
void *priv_data);
-
errcode_t ext2fs_block_iterate2(ext2_filsys fs,
ino_t ino,
int flags,
char *block_buf,
int (*func)(ext2_filsys fs,
blk_t *blocknr,
- int blockcnt,
- blk_t ref_blk,
- int ref_offset,
- void *priv_data),
- void *priv_data);
-errcode_t ext2fs_block_iterate3(ext2_filsys fs,
- ino_t ino,
- int flags,
- char *block_buf,
- int (*func)(ext2_filsys fs,
- blk_t *blocknr,
blkcnt_t blockcnt,
blk_t ref_blk,
int ref_offset,
char *buf,
void *priv_data),
void *priv_data);
- /* priv_data to library */
-extern int ext2fs_process_dir_block(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- void *priv_data);
/* dupfs.c */
extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
/* Function prototypes */
-extern int ext2_process_dir_block(ext2_filsys fs,
- blk_t *blocknr,
- int blockcnt,
- void *priv_data);
+extern int ext2fs_process_dir_block(ext2_filsys fs,
+ blk_t *blocknr,
+ blkcnt_t blockcnt,
+ blk_t ref_block,
+ int ref_offset,
+ void *priv_data);
+
#pragma argsused
#endif
static int mark_bad_block(ext2_filsys fs, blk_t *block_nr,
- int blockcnt, void *priv_data)
+ blkcnt_t blockcnt, blk_t ref_block,
+ int ref_offset, void *priv_data)
{
struct read_bb_record *rb = (struct read_bb_record *) priv_data;
rb.bb_list = *bb_list;
rb.err = 0;
- retval = ext2fs_block_iterate(fs, EXT2_BAD_INO, 0, 0,
+ retval = ext2fs_block_iterate2(fs, EXT2_BAD_INO, 0, 0,
mark_bad_block, &rb);
if (retval)
return retval;