Module Name: src
Committed By: jdolecek
Date: Sat Aug 20 20:05:28 UTC 2016
Modified Files:
src/sys/ufs/ext2fs: ext2fs_vfsops.c
Log Message:
adjust ext2fs_loadvnode_content() to do the sanity checking before allocating
memory, and avoid reallocaing memory on vnode reload
To generate a diff of this commit:
cvs rdiff -u -r1.200 -r1.201 src/sys/ufs/ext2fs/ext2fs_vfsops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.200 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.201
--- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.200 Sat Aug 20 19:47:44 2016
+++ src/sys/ufs/ext2fs/ext2fs_vfsops.c Sat Aug 20 20:05:28 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vfsops.c,v 1.200 2016/08/20 19:47:44 jdolecek Exp $ */
+/* $NetBSD: ext2fs_vfsops.c,v 1.201 2016/08/20 20:05:28 jdolecek Exp $ */
/*
* Copyright (c) 1989, 1991, 1993, 1994
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.200 2016/08/20 19:47:44 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.201 2016/08/20 20:05:28 jdolecek Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -493,22 +493,19 @@ fail:
}
/*
- *
+ * Sanity check the disk vnode content, and copy it over to inode structure.
*/
static int
ext2fs_loadvnode_content(struct m_ext2fs *fs, ino_t ino, struct buf *bp, struct inode *ip)
{
struct ext2fs_dinode *din;
- void *cp;
int error = 0;
- cp = (char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE(fs));
- din = kmem_alloc(EXT2_DINODE_SIZE(fs), KM_SLEEP);
- e2fs_iload((struct ext2fs_dinode *)cp, din, EXT2_DINODE_SIZE(fs));
+ din = (struct ext2fs_dinode *)((char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE(fs)));
- /* sanity checks */
+ /* sanity checks - inode data NOT byteswapped at this point */
if (EXT2_DINODE_FITS(din, e2di_extra_isize, EXT2_DINODE_SIZE(fs))
- && (EXT2_DINODE_SIZE(fs) - EXT2_REV0_DINODE_SIZE) < din->e2di_extra_isize)
+ && (EXT2_DINODE_SIZE(fs) - EXT2_REV0_DINODE_SIZE) < fs2h16(din->e2di_extra_isize))
{
printf("ext2fs: inode %"PRIu64" bad extra_isize %u",
ino, din->e2di_extra_isize);
@@ -516,16 +513,15 @@ ext2fs_loadvnode_content(struct m_ext2fs
goto bad;
}
- /* replace old dinode; assumes new dinode size is same as old one */
- if (ip->i_din.e2fs_din)
- kmem_free(ip->i_din.e2fs_din, EXT2_DINODE_SIZE(fs));
- ip->i_din.e2fs_din = din;
+ /* everything allright, proceed with copy */
+ if (ip->i_din.e2fs_din == NULL)
+ ip->i_din.e2fs_din = kmem_alloc(EXT2_DINODE_SIZE(fs), KM_SLEEP);
+
+ e2fs_iload(din, ip->i_din.e2fs_din, EXT2_DINODE_SIZE(fs));
ext2fs_set_inode_guid(ip);
- return error;
bad:
- kmem_free(din, EXT2_DINODE_SIZE(fs));
return error;
}