lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1457237696-13770-2-git-send-email-lixi@ddn.com>
Date:	Sun,  6 Mar 2016 13:14:51 +0900
From:	Li Xi <pkuelelixi@...il.com>
To:	linux-ext4@...r.kernel.org, tytso@....edu, adilger@...ger.ca,
	jack@...e.cz, viro@...iv.linux.org.uk, hch@...radead.org,
	dmonakhov@...nvz.org
Subject: [v4 1/6] Always read full inode structure

Project quota need use some extra field of inode for computing quota
accounting, this patch tries to use ext2fs_get_next_inode_full()
everywhere to read full inode into memeory.

It also fixes a bug that only copy small inode in the function.

Signed-off-by: Wang Shilong <wshilong@....com>
---
 debugfs/icheck.c       |   26 ++++++++++++++++++--------
 debugfs/lsdel.c        |   30 +++++++++++++++++++-----------
 debugfs/ncheck.c       |   20 ++++++++++++++------
 e2fsck/iscan.c         |   12 ++++++++++--
 e2fsck/pass1.c         |   12 +++++++-----
 e2fsck/pass1b.c        |   27 +++++++++++++++++++--------
 e2fsck/scantest.c      |   26 ++++++++++++++++++--------
 lib/ext2fs/bmove.c     |   37 +++++++++++++++++++++++++------------
 lib/ext2fs/tst_iscan.c |   17 ++++++++++++++---
 lib/support/mkquota.c  |   27 ++++++++++++++++++---------
 misc/e2image.c         |   41 ++++++++++++++++++++++++++---------------
 misc/tune2fs.c         |   28 ++++++++++++++++++----------
 resize/resize2fs.c     |    3 ++-
 13 files changed, 208 insertions(+), 98 deletions(-)

diff --git a/debugfs/icheck.c b/debugfs/icheck.c
index 3b9bd14..9f36d27 100644
--- a/debugfs/icheck.c
+++ b/debugfs/icheck.c
@@ -60,8 +60,9 @@ void do_icheck(int argc, char **argv)
 	int			i;
 	ext2_inode_scan		scan = 0;
 	ext2_ino_t		ino;
-	struct ext2_inode	inode;
 	errcode_t		retval;
+	struct ext2_inode	*inode;
+	int			inode_size;
 	char			*block_buf;
 
 	if (argc < 2) {
@@ -71,8 +72,14 @@ void do_icheck(int argc, char **argv)
 	if (check_fs_open(argv[0]))
 		return;
 
+	inode_size = EXT2_INODE_SIZE(current_fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval)
+		return;
+
 	bw.barray = malloc(sizeof(struct block_info) * argc);
 	if (!bw.barray) {
+		ext2fs_free_mem(&inode);
 		com_err("icheck", ENOMEM,
 			"while allocating inode info array");
 		return;
@@ -99,7 +106,8 @@ void do_icheck(int argc, char **argv)
 	}
 
 	do {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						    inode, inode_size);
 	} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 	if (retval) {
 		com_err("icheck", retval, "while starting inode scan");
@@ -109,27 +117,27 @@ void do_icheck(int argc, char **argv)
 	while (ino) {
 		blk64_t blk;
 
-		if (!inode.i_links_count)
+		if (!inode->i_links_count)
 			goto next;
 
 		bw.inode = ino;
 
-		blk = ext2fs_file_acl_block(current_fs, &inode);
+		blk = ext2fs_file_acl_block(current_fs, inode);
 		if (blk) {
 			icheck_proc(current_fs, &blk, 0,
 				    0, 0, &bw);
 			if (bw.blocks_left == 0)
 				break;
-			ext2fs_file_acl_block_set(current_fs, &inode, blk);
+			ext2fs_file_acl_block_set(current_fs, inode, blk);
 		}
 
-		if (!ext2fs_inode_has_valid_blocks2(current_fs, &inode))
+		if (!ext2fs_inode_has_valid_blocks2(current_fs, inode))
 			goto next;
 		/*
 		 * To handle filesystems touched by 0.3c extfs; can be
 		 * removed later.
 		 */
-		if (inode.i_dtime)
+		if (inode->i_dtime)
 			goto next;
 
 		retval = ext2fs_block_iterate3(current_fs, ino,
@@ -146,7 +154,8 @@ void do_icheck(int argc, char **argv)
 
 	next:
 		do {
-			retval = ext2fs_get_next_inode(scan, &ino, &inode);
+			retval = ext2fs_get_next_inode_full(scan, &ino,
+							    inode, inode_size);
 		} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 		if (retval) {
 			com_err("icheck", retval,
@@ -165,6 +174,7 @@ void do_icheck(int argc, char **argv)
 	}
 
 error_out:
+	ext2fs_free_mem(&inode);
 	free(bw.barray);
 	free(block_buf);
 	if (scan)
diff --git a/debugfs/lsdel.c b/debugfs/lsdel.c
index 7d5e7d8..6d11e3b 100644
--- a/debugfs/lsdel.c
+++ b/debugfs/lsdel.c
@@ -78,7 +78,8 @@ void do_lsdel(int argc, char **argv)
 	int			num_delarray, max_delarray;
 	ext2_inode_scan		scan = 0;
 	ext2_ino_t		ino;
-	struct ext2_inode	inode;
+	struct ext2_inode	*inode;
+	int			inode_size;
 	errcode_t		retval;
 	char			*block_buf;
 	int			i;
@@ -121,9 +122,14 @@ void do_lsdel(int argc, char **argv)
 			"while opening inode scan");
 		goto error_out;
 	}
+	inode_size = EXT2_INODE_SIZE(current_fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval)
+		goto error_out;
 
 	do {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						    inode, inode_size);
 	} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 	if (retval) {
 		com_err("ls_deleted_inodes", retval,
@@ -132,8 +138,8 @@ void do_lsdel(int argc, char **argv)
 	}
 
 	while (ino) {
-		if ((inode.i_dtime == 0) ||
-		    (secs && ((unsigned) abs(now - secs) > inode.i_dtime)))
+		if ((inode->i_dtime == 0) ||
+		    (secs && ((unsigned) abs(now - secs) > inode->i_dtime)))
 			goto next;
 
 		lsd.inode = ino;
@@ -141,7 +147,7 @@ void do_lsdel(int argc, char **argv)
 		lsd.free_blocks = 0;
 		lsd.bad_blocks = 0;
 
-		if (ext2fs_inode_has_valid_blocks2(current_fs, &inode)) {
+		if (ext2fs_inode_has_valid_blocks2(current_fs, inode)) {
 			retval = ext2fs_block_iterate3(current_fs, ino,
 						       BLOCK_FLAG_READ_ONLY,
 						       block_buf,
@@ -153,7 +159,7 @@ void do_lsdel(int argc, char **argv)
 			}
 		}
 		if ((lsd.free_blocks && !lsd.bad_blocks) ||
-		    inode.i_flags & EXT4_INLINE_DATA_FL) {
+		    inode->i_flags & EXT4_INLINE_DATA_FL) {
 			if (num_delarray >= max_delarray) {
 				max_delarray += 50;
 				delarray = realloc(delarray,
@@ -167,10 +173,10 @@ void do_lsdel(int argc, char **argv)
 			}
 
 			delarray[num_delarray].ino = ino;
-			delarray[num_delarray].mode = inode.i_mode;
-			delarray[num_delarray].uid = inode_uid(inode);
-			delarray[num_delarray].size = EXT2_I_SIZE(&inode);
-			delarray[num_delarray].dtime = (__s32) inode.i_dtime;
+			delarray[num_delarray].mode = inode->i_mode;
+			delarray[num_delarray].uid = inode_uid(*inode);
+			delarray[num_delarray].size = EXT2_I_SIZE(inode);
+			delarray[num_delarray].dtime = (__s32) inode->i_dtime;
 			delarray[num_delarray].num_blocks = lsd.num_blocks;
 			delarray[num_delarray].free_blocks = lsd.free_blocks;
 			num_delarray++;
@@ -178,7 +184,8 @@ void do_lsdel(int argc, char **argv)
 
 	next:
 		do {
-			retval = ext2fs_get_next_inode(scan, &ino, &inode);
+			retval = ext2fs_get_next_inode_full(scan, &ino,
+							inode, inode_size);
 		} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 		if (retval) {
 			com_err("ls_deleted_inodes", retval,
@@ -205,6 +212,7 @@ void do_lsdel(int argc, char **argv)
 	close_pager(out);
 
 error_out:
+	ext2fs_free_mem(&inode);
 	free(block_buf);
 	free(delarray);
 	if (scan)
diff --git a/debugfs/ncheck.c b/debugfs/ncheck.c
index 5d9b5d2..3becd59 100644
--- a/debugfs/ncheck.c
+++ b/debugfs/ncheck.c
@@ -95,7 +95,8 @@ void do_ncheck(int argc, char **argv)
 	int			c, i;
 	ext2_inode_scan		scan = 0;
 	ext2_ino_t		ino;
-	struct ext2_inode	inode;
+	struct ext2_inode	*inode;
+	int			inode_size;
 	errcode_t		retval;
 	char			*tmp;
 
@@ -145,9 +146,14 @@ void do_ncheck(int argc, char **argv)
 		com_err("ncheck", retval, "while opening inode scan");
 		goto error_out;
 	}
+	inode_size = EXT2_INODE_SIZE(current_fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval)
+		goto error_out;
 
 	do {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						inode, inode_size);
 	} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 	if (retval) {
 		com_err("ncheck", retval, "while starting inode scan");
@@ -156,16 +162,16 @@ void do_ncheck(int argc, char **argv)
 
 	printf("Inode\tPathname\n");
 	while (ino) {
-		if (!inode.i_links_count)
+		if (!inode->i_links_count)
 			goto next;
 		/*
 		 * To handle filesystems touched by 0.3c extfs; can be
 		 * removed later.
 		 */
-		if (inode.i_dtime)
+		if (inode->i_dtime)
 			goto next;
 		/* Ignore anything that isn't a directory */
-		if (!LINUX_S_ISDIR(inode.i_mode))
+		if (!LINUX_S_ISDIR(inode->i_mode))
 			goto next;
 
 		iw.position = 0;
@@ -187,7 +193,8 @@ void do_ncheck(int argc, char **argv)
 
 	next:
 		do {
-			retval = ext2fs_get_next_inode(scan, &ino, &inode);
+			retval = ext2fs_get_next_inode_full(scan, &ino,
+							inode, inode_size);
 		} while (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE);
 
 		if (retval) {
@@ -198,6 +205,7 @@ void do_ncheck(int argc, char **argv)
 	}
 
 error_out:
+	ext2fs_free_mem(inode);
 	free(iw.iarray);
 	if (scan)
 		ext2fs_close_inode_scan(scan);
diff --git a/e2fsck/iscan.c b/e2fsck/iscan.c
index 52cad11..6ea9e11 100644
--- a/e2fsck/iscan.c
+++ b/e2fsck/iscan.c
@@ -97,7 +97,8 @@ int main (int argc, char *argv[])
 	ext2_filsys	fs;
 	ext2_ino_t	ino;
 	__u32	num_inodes = 0;
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int		inode_size;
 	ext2_inode_scan	scan;
 
 	init_resource_track(&global_rtrack);
@@ -120,8 +121,14 @@ int main (int argc, char *argv[])
 		exit(1);
 	}
 
+	inode_size = EXT2_INODE_SIZE(current_fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval)
+		exit(1);
+
 	while (1) {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						inode, inode_size);
 		if (retval) {
 			com_err(program_name, retval,
 				_("while getting next inode"));
@@ -132,6 +139,7 @@ int main (int argc, char *argv[])
 		num_inodes++;
 	}
 
+	ext2fs_free_mem(&inode);
 	print_resource_track(NULL, &global_rtrack);
 	printf(_("%u inodes scanned.\n"), num_inodes);
 
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 5a8d4a1..48aa302 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -102,7 +102,7 @@ struct process_block_struct {
 
 struct process_inode_block {
 	ext2_ino_t ino;
-	struct ext2_inode inode;
+	struct ext2_inode_large inode;
 };
 
 struct scan_callback_struct {
@@ -1741,7 +1741,8 @@ void e2fsck_pass1(e2fsck_t ctx)
 		     inode->i_block[EXT2_TIND_BLOCK] ||
 		     ext2fs_file_acl_block(fs, inode))) {
 			inodes_to_process[process_inode_count].ino = ino;
-			inodes_to_process[process_inode_count].inode = *inode;
+			inodes_to_process[process_inode_count].inode =
+							*((struct ext2_inode_large *)inode);
 			process_inode_count++;
 		} else
 			check_blocks(ctx, &pctx, block_buf);
@@ -1904,7 +1905,8 @@ static void process_inodes(e2fsck_t ctx, char *block_buf)
 		      sizeof(struct process_inode_block), process_inode_cmp);
 	clear_problem_context(&pctx);
 	for (i=0; i < process_inode_count; i++) {
-		pctx.inode = ctx->stashed_inode = &inodes_to_process[i].inode;
+		pctx.inode = ctx->stashed_inode =
+				(struct ext2_inode *)&inodes_to_process[i].inode;
 		pctx.ino = ctx->stashed_ino = inodes_to_process[i].ino;
 
 #if 0
@@ -1942,8 +1944,8 @@ static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b)
 		 * inodes, so it's OK to pass NULL to
 		 * ext2fs_file_acl_block() here.
 		 */
-		ret = ext2fs_file_acl_block(0, &(ib_a->inode)) -
-			ext2fs_file_acl_block(0, &(ib_b->inode));
+		ret = ext2fs_file_acl_block(0, (struct ext2_inode *)&(ib_a->inode)) -
+			ext2fs_file_acl_block(0, (struct ext2_inode *)&(ib_b->inode));
 	if (ret == 0)
 		ret = ib_a->ino - ib_b->ino;
 	return ret;
diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c
index 2cbf82a..20e0d02 100644
--- a/e2fsck/pass1b.c
+++ b/e2fsck/pass1b.c
@@ -271,7 +271,8 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
 {
 	ext2_filsys fs = ctx->fs;
 	ext2_ino_t ino = 0;
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int inode_size;
 	ext2_inode_scan	scan;
 	struct process_block_struct pb;
 	struct problem_context pctx;
@@ -288,7 +289,15 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
 		ctx->flags |= E2F_FLAG_ABORT;
 		return;
 	}
-	ctx->stashed_inode = &inode;
+	inode_size = EXT2_INODE_SIZE(fs->super);
+	pctx.errcode = ext2fs_get_mem(inode_size, &inode);
+	if (pctx.errcode) {
+		ext2fs_close_inode_scan(scan);
+		ctx->flags |= E2F_FLAG_ABORT;
+		return;
+	}
+
+	ctx->stashed_inode = inode;
 	pb.ctx = ctx;
 	pb.pctx = &pctx;
 	pctx.str = "pass1b";
@@ -297,7 +306,8 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
 			if (e2fsck_mmp_update(fs))
 				fatal_error(ctx, 0);
 		}
-		pctx.errcode = ext2fs_get_next_inode(scan, &ino, &inode);
+		pctx.errcode = ext2fs_get_next_inode_full(scan, &ino,
+						     inode, inode_size);
 		if (pctx.errcode == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE)
 			continue;
 		if (pctx.errcode) {
@@ -315,24 +325,24 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
 
 		pb.ino = ino;
 		pb.dup_blocks = 0;
-		pb.inode = &inode;
+		pb.inode = inode;
 		pb.cur_cluster = ~0;
 		pb.phys_cluster = ~0;
 		pb.last_blk = 0;
 		pb.pctx->blk = pb.pctx->blk2 = 0;
 
-		if (ext2fs_inode_has_valid_blocks2(fs, &inode) ||
+		if (ext2fs_inode_has_valid_blocks2(fs, inode) ||
 		    (ino == EXT2_BAD_INO))
 			pctx.errcode = ext2fs_block_iterate3(fs, ino,
 					     BLOCK_FLAG_READ_ONLY, block_buf,
 					     process_pass1b_block, &pb);
 		/* If the feature is not set, attrs will be cleared later anyway */
 		if (ext2fs_has_feature_xattr(fs->super) &&
-		    ext2fs_file_acl_block(fs, &inode)) {
-			blk64_t blk = ext2fs_file_acl_block(fs, &inode);
+		    ext2fs_file_acl_block(fs, inode)) {
+			blk64_t blk = ext2fs_file_acl_block(fs, inode);
 			process_pass1b_block(fs, &blk,
 					     BLOCK_COUNT_EXTATTR, 0, 0, &pb);
-			ext2fs_file_acl_block_set(fs, &inode, blk);
+			ext2fs_file_acl_block_set(fs, inode, blk);
 		}
 		if (pb.dup_blocks) {
 			if (ino != EXT2_BAD_INO) {
@@ -348,6 +358,7 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
 		if (pctx.errcode)
 			fix_problem(ctx, PR_1B_BLOCK_ITERATE, &pctx);
 	}
+	ext2fs_free_mem(&inode);
 	ext2fs_close_inode_scan(scan);
 	e2fsck_use_inode_shortcuts(ctx, 0);
 }
diff --git a/e2fsck/scantest.c b/e2fsck/scantest.c
index 6131141..87a5b97 100644
--- a/e2fsck/scantest.c
+++ b/e2fsck/scantest.c
@@ -88,12 +88,12 @@ static void print_resource_track(struct resource_track *track)
 int main (int argc, char *argv[])
 {
 	errcode_t	retval = 0;
-	int		exit_value = 0;
 	int		i;
 	ext2_filsys	fs;
 	ext2_inode_scan	scan;
 	ext2_ino_t	ino;
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int inode_size;
 
 	printf(_("size of inode=%d\n"), sizeof(inode));
 
@@ -114,17 +114,27 @@ int main (int argc, char *argv[])
 		com_err(argv[0], retval, _("while opening inode scan"));
 		exit(1);
 	}
-	retval = ext2fs_get_next_inode(scan, &ino, &inode);
+
+	inode_size = EXT2_INODE_SIZE(fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval) {
+		com_err(argv[0], retval, _("while allocating inode memory"));
+		exit(1);
+	}
+
+	retval = ext2fs_get_next_inode_full(scan, &ino,
+					inode, inode_size);
 	if (retval) {
 		com_err(argv[0], retval, _("while starting inode scan"));
 		exit(1);
 	}
 	while (ino) {
-		if (!inode.i_links_count)
+		if (!inode->i_links_count)
 			goto next;
-		printf("%lu\n", inode.i_blocks);
+		printf("%lu\n", inode->i_blocks);
 	next:
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+					inode, inode_size);
 		if (retval) {
 			com_err(argv[0], retval,
 				_("while doing inode scan"));
@@ -133,9 +143,9 @@ int main (int argc, char *argv[])
 	}
 
 
+	ext2fs_free_mem(&inode);
 	ext2fs_close_free(&fs);
 
 	print_resource_track(&global_rtrack);
-
-	return exit_value;
+	return 0;
 }
diff --git a/lib/ext2fs/bmove.c b/lib/ext2fs/bmove.c
index e2ea405..93f6ebd 100644
--- a/lib/ext2fs/bmove.c
+++ b/lib/ext2fs/bmove.c
@@ -100,11 +100,17 @@ errcode_t ext2fs_move_blocks(ext2_filsys fs,
 			     int flags)
 {
 	ext2_ino_t	ino;
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int inode_size;
 	errcode_t	retval;
 	struct process_block_struct pb;
 	ext2_inode_scan	scan;
-	char		*block_buf;
+	char		*block_buf = NULL;
+
+	inode_size = EXT2_INODE_SIZE(fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval)
+		return retval;
 
 	retval = ext2fs_open_inode_scan(fs, 0, &scan);
 	if (retval)
@@ -132,20 +138,21 @@ errcode_t ext2fs_move_blocks(ext2_filsys fs,
 		}
 		retval = ext2fs_init_dblist(fs, 0);
 		if (retval)
-			return retval;
+			goto error;
 	}
 
-	retval = ext2fs_get_next_inode(scan, &ino, &inode);
+	retval = ext2fs_get_next_inode_full(scan, &ino,
+					    inode, inode_size);
 	if (retval)
-		return retval;
+		goto error;
 
 	while (ino) {
-		if ((inode.i_links_count == 0) ||
-		    !ext2fs_inode_has_valid_blocks2(fs, &inode))
+		if ((inode->i_links_count == 0) ||
+		    !ext2fs_inode_has_valid_blocks2(fs, inode))
 			goto next;
 
 		pb.ino = ino;
-		pb.inode = &inode;
+		pb.inode = inode;
 
 		pb.add_dir = (LINUX_S_ISDIR(inode.i_mode) &&
 			      flags & EXT2_BMOVE_GET_DBLIST);
@@ -153,15 +160,21 @@ errcode_t ext2fs_move_blocks(ext2_filsys fs,
 		retval = ext2fs_block_iterate3(fs, ino, 0, block_buf,
 					       process_block, &pb);
 		if (retval)
-			return retval;
-		if (pb.error)
-			return pb.error;
+			goto error;
+		if (pb.error) {
+			retval = pb.error;
+			goto error;
+		}
 
 	next:
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						inode, inode_size);
 		if (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE)
 			goto next;
 	}
+error:
+	ext2fs_free_mem(&inode);
+	ext2fs_free_mem(&block_buf);
 	return 0;
 }
 
diff --git a/lib/ext2fs/tst_iscan.c b/lib/ext2fs/tst_iscan.c
index 70bfbec..6e72c9d 100644
--- a/lib/ext2fs/tst_iscan.c
+++ b/lib/ext2fs/tst_iscan.c
@@ -140,7 +140,8 @@ static void setup(void)
  */
 static void iterate(void)
 {
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int inode_size;
 	ext2_inode_scan	scan;
 	errcode_t	retval;
 	ext2_ino_t	ino;
@@ -150,14 +151,23 @@ static void iterate(void)
 		com_err("iterate", retval, "While opening inode scan");
 		exit(1);
 	}
+
+	inode_size = EXT2_INODE_SIZE(test_fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval) {
+		com_err("iterate", retval, "while allocating inode mem");
+		exit(1);
+	}
 	printf("Reading blocks: ");
-	retval = ext2fs_get_next_inode(scan, &ino, &inode);
+	retval = ext2fs_get_next_inode_full(scan, &ino,
+				       inode, inode_size);
 	if (retval) {
 		com_err("iterate", retval, "while reading first inode");
 		exit(1);
 	}
 	while (ino) {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+					       inode, inode_size);
 		if (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) {
 			ext2fs_mark_inode_bitmap2(bad_inode_map, ino);
 			continue;
@@ -169,6 +179,7 @@ static void iterate(void)
 		}
 	}
 	printf("\n");
+	ext2fs_free_mem(&inode);
 	ext2fs_close_inode_scan(scan);
 }
 
diff --git a/lib/support/mkquota.c b/lib/support/mkquota.c
index 00e96f8..dc458d7 100644
--- a/lib/support/mkquota.c
+++ b/lib/support/mkquota.c
@@ -420,41 +420,50 @@ errcode_t quota_compute_usage(quota_ctx_t qctx)
 	ext2_filsys fs;
 	ext2_ino_t ino;
 	errcode_t ret;
-	struct ext2_inode inode;
+	struct ext2_inode* inode;
+	int inode_size;
 	qsize_t space;
 	ext2_inode_scan scan;
 
 	if (!qctx)
 		return 0;
 
+	inode_size = EXT2_INODE_SIZE(qctx->fs->super);
+	ret = ext2fs_get_mem(inode_size, &inode);
+	if (ret)
+		return ret;
+
 	fs = qctx->fs;
 	ret = ext2fs_open_inode_scan(fs, 0, &scan);
 	if (ret) {
+		free(inode);
 		log_err("while opening inode scan. ret=%ld", ret);
 		return ret;
 	}
 
 	while (1) {
-		ret = ext2fs_get_next_inode(scan, &ino, &inode);
+		ret = ext2fs_get_next_inode_full(scan, &ino, inode,
+						 inode_size);
 		if (ret) {
 			log_err("while getting next inode. ret=%ld", ret);
-			ext2fs_close_inode_scan(scan);
-			return ret;
+			goto err;
 		}
 		if (ino == 0)
 			break;
-		if (inode.i_links_count &&
+		if (inode->i_links_count &&
 		    (ino == EXT2_ROOT_INO ||
 		     ino >= EXT2_FIRST_INODE(fs->super))) {
-			space = ext2fs_inode_i_blocks(fs, &inode) << 9;
-			quota_data_add(qctx, &inode, ino, space);
-			quota_data_inodes(qctx, &inode, ino, +1);
+			space = ext2fs_inode_i_blocks(fs, inode) << 9;
+			quota_data_add(qctx, inode, ino, space);
+			quota_data_inodes(qctx, inode, ino, +1);
 		}
 	}
 
+err:
 	ext2fs_close_inode_scan(scan);
+	free(inode);
 
-	return 0;
+	return ret;
 }
 
 struct scan_dquots_data {
diff --git a/misc/e2image.c b/misc/e2image.c
index e9b4ae2..cf9e597 100644
--- a/misc/e2image.c
+++ b/misc/e2image.c
@@ -1258,7 +1258,8 @@ static void output_qcow2_meta_data_blocks(ext2_filsys fs, int fd)
 static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
 {
 	struct process_block_struct	pb;
-	struct ext2_inode		inode;
+	struct ext2_inode		*inode;
+	int				inode_size;
 	ext2_inode_scan			scan;
 	ext2_ino_t			ino;
 	errcode_t			retval;
@@ -1301,10 +1302,19 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
 		exit(1);
 	}
 
+	inode_size = EXT2_INODE_SIZE(fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
+	if (retval) {
+		com_err(program_name, retval,
+			_("while allocating inode memory"));
+		exit(1);
+	}
+
 	use_inode_shortcuts(fs, 1);
-	stashed_inode = &inode;
+	stashed_inode = inode;
 	while (1) {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						inode, inode_size);
 		if (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE)
 			continue;
 		if (retval) {
@@ -1314,22 +1324,22 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
 		}
 		if (ino == 0)
 			break;
-		if (!inode.i_links_count)
+		if (!inode->i_links_count)
 			continue;
-		if (ext2fs_file_acl_block(fs, &inode)) {
+		if (ext2fs_file_acl_block(fs, inode)) {
 			ext2fs_mark_block_bitmap2(meta_block_map,
-					ext2fs_file_acl_block(fs, &inode));
+					ext2fs_file_acl_block(fs, inode));
 			meta_blocks_count++;
 		}
-		if (!ext2fs_inode_has_valid_blocks2(fs, &inode))
+		if (!ext2fs_inode_has_valid_blocks2(fs, inode))
 			continue;
 
 		stashed_ino = ino;
 		pb.ino = ino;
-		pb.is_dir = LINUX_S_ISDIR(inode.i_mode);
-		if (LINUX_S_ISDIR(inode.i_mode) ||
-		    (LINUX_S_ISLNK(inode.i_mode) &&
-		     ext2fs_inode_has_valid_blocks2(fs, &inode)) ||
+		pb.is_dir = LINUX_S_ISDIR(inode->i_mode);
+		if (LINUX_S_ISDIR(inode->i_mode) ||
+		    (LINUX_S_ISLNK(inode->i_mode) &&
+		     ext2fs_inode_has_valid_blocks2(fs, inode)) ||
 		    ino == fs->super->s_journal_inum) {
 			retval = ext2fs_block_iterate3(fs, ino,
 					BLOCK_FLAG_READ_ONLY, block_buf,
@@ -1341,10 +1351,10 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
 				exit(1);
 			}
 		} else {
-			if ((inode.i_flags & EXT4_EXTENTS_FL) ||
-			    inode.i_block[EXT2_IND_BLOCK] ||
-			    inode.i_block[EXT2_DIND_BLOCK] ||
-			    inode.i_block[EXT2_TIND_BLOCK] || all_data) {
+			if ((inode->i_flags & EXT4_EXTENTS_FL) ||
+			    inode->i_block[EXT2_IND_BLOCK] ||
+			    inode->i_block[EXT2_DIND_BLOCK] ||
+			    inode->i_block[EXT2_TIND_BLOCK] || all_data) {
 				retval = ext2fs_block_iterate3(fs,
 				       ino, BLOCK_FLAG_READ_ONLY, block_buf,
 				       process_file_block, &pb);
@@ -1363,6 +1373,7 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags)
 	else
 		output_meta_data_blocks(fs, fd, flags);
 
+	ext2fs_free_mem(&inode);
 	ext2fs_free_mem(&block_buf);
 	ext2fs_close_inode_scan(scan);
 	ext2fs_free_block_bitmap(meta_block_map);
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 4d57399..b072ab9 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -2164,26 +2164,33 @@ static int inode_scan_and_fix(ext2_filsys fs, ext2fs_block_bitmap bmap)
 	ext2_ino_t ino;
 	blk64_t blk;
 	char *block_buf = 0;
-	struct ext2_inode inode;
+	struct ext2_inode *inode;
+	int inode_size;
 	ext2_inode_scan	scan = NULL;
 
-	retval = ext2fs_get_mem(fs->blocksize * 3, &block_buf);
+	inode_size = EXT2_INODE_SIZE(fs->super);
+	retval = ext2fs_get_mem(inode_size, &inode);
 	if (retval)
 		return retval;
 
+	retval = ext2fs_get_mem(fs->blocksize * 3, &block_buf);
+	if (retval)
+		goto err_out;
+
 	retval = ext2fs_open_inode_scan(fs, 0, &scan);
 	if (retval)
 		goto err_out;
 
 	while (1) {
-		retval = ext2fs_get_next_inode(scan, &ino, &inode);
+		retval = ext2fs_get_next_inode_full(scan, &ino,
+						    inode, inode_size);
 		if (retval)
 			goto err_out;
 
 		if (!ino)
 			break;
 
-		if (inode.i_links_count == 0)
+		if (inode->i_links_count == 0)
 			continue; /* inode not in use */
 
 		/* FIXME!!
@@ -2193,26 +2200,26 @@ static int inode_scan_and_fix(ext2_filsys fs, ext2fs_block_bitmap bmap)
 		 * Do we need to fix this ??
 		 */
 
-		if (ext2fs_file_acl_block(fs, &inode) &&
+		if (ext2fs_file_acl_block(fs, inode) &&
 		    ext2fs_test_block_bitmap2(bmap,
-					ext2fs_file_acl_block(fs, &inode))) {
+					ext2fs_file_acl_block(fs, inode))) {
 			blk = translate_block(ext2fs_file_acl_block(fs,
-								    &inode));
+								    inode));
 			if (!blk)
 				continue;
 
-			ext2fs_file_acl_block_set(fs, &inode, blk);
+			ext2fs_file_acl_block_set(fs, inode, blk);
 
 			/*
 			 * Write the inode to disk so that inode table
 			 * resizing can work
 			 */
-			retval = ext2fs_write_inode(fs, ino, &inode);
+			retval = ext2fs_write_inode(fs, ino, inode);
 			if (retval)
 				goto err_out;
 		}
 
-		if (!ext2fs_inode_has_valid_blocks2(fs, &inode))
+		if (!ext2fs_inode_has_valid_blocks2(fs, inode))
 			continue;
 
 		retval = ext2fs_block_iterate3(fs, ino, 0, block_buf,
@@ -2223,6 +2230,7 @@ static int inode_scan_and_fix(ext2_filsys fs, ext2fs_block_bitmap bmap)
 	}
 
 err_out:
+	ext2fs_free_mem(&inode);
 	ext2fs_free_mem(&block_buf);
 	ext2fs_close_inode_scan(scan);
 
diff --git a/resize/resize2fs.c b/resize/resize2fs.c
index f8df679..e516073 100644
--- a/resize/resize2fs.c
+++ b/resize/resize2fs.c
@@ -2118,7 +2118,8 @@ errout:
 		ext2fs_close_inode_scan(scan);
 	if (block_buf)
 		ext2fs_free_mem(&block_buf);
-	free(inode);
+	if (inode)
+		ext2fs_free_mem(&inode);
 	return retval;
 }
 
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ