svn commit: r333586 - head/sys/fs/ext2fs
Fedor Uporov
fsu at FreeBSD.org
Sun May 13 19:48:32 UTC 2018
Author: fsu
Date: Sun May 13 19:48:30 2018
New Revision: 333586
URL: https://svnweb.freebsd.org/changeset/base/333586
Log:
Fix directory blocks checksumming.
Reviewed by: pfg
MFC after: 3 months
Differential Revision: https://reviews.freebsd.org/D15396
Modified:
head/sys/fs/ext2fs/ext2_csum.c
head/sys/fs/ext2fs/ext2_extern.h
head/sys/fs/ext2fs/ext2_htree.c
head/sys/fs/ext2fs/ext2_inode_cnv.c
head/sys/fs/ext2fs/ext2_lookup.c
head/sys/fs/ext2fs/ext2_vnops.c
Modified: head/sys/fs/ext2fs/ext2_csum.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_csum.c Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_csum.c Sun May 13 19:48:30 2018 (r333586)
@@ -154,12 +154,37 @@ ext2_extattr_blk_csum_set(struct inode *ip, struct buf
header->h_checksum = ext2_extattr_blk_csum(ip, ip->i_facl, header);
}
-static struct ext2fs_direct_tail *
-ext2_get_dirent_tail(struct inode *ip, struct ext2fs_direct_2 *ep)
+void
+ext2_init_dirent_tail(struct ext2fs_direct_tail *tp)
{
+ memset(tp, 0, sizeof(struct ext2fs_direct_tail));
+ tp->e2dt_rec_len = sizeof(struct ext2fs_direct_tail);
+ tp->e2dt_reserved_ft = EXT2_FT_DIR_CSUM;
+}
+
+struct ext2fs_direct_tail *
+ext2_dirent_get_tail(struct inode *ip, struct ext2fs_direct_2 *ep)
+{
+ struct ext2fs_direct_2 *dep;
+ void *top;
struct ext2fs_direct_tail *tp;
+ unsigned int rec_len;
- tp = EXT2_DIRENT_TAIL(ep, ip->i_e2fs->e2fs_bsize);
+ dep = ep;
+ top = EXT2_DIRENT_TAIL(ep, ip->i_e2fs->e2fs_bsize);
+ rec_len = dep->e2d_reclen;
+
+ while (rec_len && !(rec_len & 0x3)) {
+ dep = (struct ext2fs_direct_2 *)(((char *)dep) + rec_len);
+ if ((void *)dep >= top)
+ break;
+ rec_len = dep->e2d_reclen;
+ }
+
+ if (dep != top)
+ return (NULL);
+
+ tp = (struct ext2fs_direct_tail *)dep;
if (tp->e2dt_reserved_zero1 ||
tp->e2dt_rec_len != sizeof(struct ext2fs_direct_tail) ||
tp->e2dt_reserved_zero2 ||
@@ -189,13 +214,13 @@ ext2_dirent_csum(struct inode *ip, struct ext2fs_direc
return (crc);
}
-static int
+int
ext2_dirent_csum_verify(struct inode *ip, struct ext2fs_direct_2 *ep)
{
uint32_t calculated;
struct ext2fs_direct_tail *tp;
- tp = ext2_get_dirent_tail(ip, ep);
+ tp = ext2_dirent_get_tail(ip, ep);
if (tp == NULL)
return (0);
@@ -263,7 +288,7 @@ ext2_dx_csum(struct inode *ip, struct ext2fs_direct_2
return (crc);
}
-static int
+int
ext2_dx_csum_verify(struct inode *ip, struct ext2fs_direct_2 *ep)
{
uint32_t calculated;
@@ -304,7 +329,7 @@ ext2_dir_blk_csum_verify(struct inode *ip, struct buf
ep = (struct ext2fs_direct_2 *)bp->b_data;
- if (ext2_get_dirent_tail(ip, ep) != NULL)
+ if (ext2_dirent_get_tail(ip, ep) != NULL)
error = ext2_dirent_csum_verify(ip, ep);
else if (ext2_get_dx_count(ip, ep, NULL) != NULL)
error = ext2_dx_csum_verify(ip, ep);
@@ -316,12 +341,18 @@ ext2_dir_blk_csum_verify(struct inode *ip, struct buf
return (error);
}
-static void
+void
ext2_dirent_csum_set(struct inode *ip, struct ext2fs_direct_2 *ep)
{
+ struct m_ext2fs *fs;
struct ext2fs_direct_tail *tp;
- tp = ext2_get_dirent_tail(ip, ep);
+ fs = ip->i_e2fs;
+
+ if (!EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
+ return;
+
+ tp = ext2_dirent_get_tail(ip, ep);
if (tp == NULL)
return;
@@ -329,13 +360,19 @@ ext2_dirent_csum_set(struct inode *ip, struct ext2fs_d
ext2_dirent_csum(ip, ep, (char *)tp - (char *)ep);
}
-static void
+void
ext2_dx_csum_set(struct inode *ip, struct ext2fs_direct_2 *ep)
{
+ struct m_ext2fs *fs;
struct ext2fs_htree_count *cp;
struct ext2fs_htree_tail *tp;
int count_offset, limit, count;
+ fs = ip->i_e2fs;
+
+ if (!EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
+ return;
+
cp = ext2_get_dx_count(ip, ep, &count_offset);
if (cp == NULL)
return;
@@ -350,35 +387,6 @@ ext2_dx_csum_set(struct inode *ip, struct ext2fs_direc
tp->ht_checksum = ext2_dx_csum(ip, ep, count_offset, count, tp);
}
-void
-ext2_dir_blk_csum_set_mem(struct inode *ip, char *buf, int size)
-{
- struct m_ext2fs *fs;
- struct ext2fs_direct_2 *ep;
-
- fs = ip->i_e2fs;
-
- if (!EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
- return;
-
- ep = (struct ext2fs_direct_2 *)buf;
-
- if (ext2_htree_has_idx(ip)) {
- if (ext2_get_dx_count(ip, ep, NULL) != NULL)
- ext2_dx_csum_set(ip, ep);
- } else {
- if (ext2_get_dirent_tail(ip, ep) != NULL)
- ext2_dirent_csum_set(ip, ep);
- }
-}
-
-void
-ext2_dir_blk_csum_set(struct inode *ip, struct buf *bp)
-{
-
- ext2_dir_blk_csum_set_mem(ip, bp->b_data, bp->b_bufsize);
-}
-
static uint32_t
ext2_extent_blk_csum(struct inode *ip, struct ext4_extent_header *ehp)
{
@@ -543,9 +551,9 @@ ext2_ei_csum(struct inode *ip, struct ext2fs_dinode *e
offset = offsetof(struct ext2fs_dinode, e2di_chksum_lo);
csum_size = sizeof(dummy_csum);
inum = ip->i_number;
- gen = ip->i_gen;
crc = calculate_crc32c(fs->e2fs_csum_seed,
(uint8_t *)&inum, sizeof(inum));
+ gen = ip->i_gen;
inode_csum_seed = calculate_crc32c(crc,
(uint8_t *)&gen, sizeof(gen));
Modified: head/sys/fs/ext2fs/ext2_extern.h
==============================================================================
--- head/sys/fs/ext2fs/ext2_extern.h Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_extern.h Sun May 13 19:48:30 2018 (r333586)
@@ -43,6 +43,7 @@
struct ext2fs_dinode;
struct ext2fs_direct_2;
+struct ext2fs_direct_tail;
struct ext2fs_searchslot;
struct indir;
struct inode;
@@ -110,10 +111,15 @@ void ext2_sb_csum_set(struct m_ext2fs *);
int ext2_extattr_blk_csum_verify(struct inode *, struct buf *);
void ext2_extattr_blk_csum_set(struct inode *, struct buf *);
int ext2_dir_blk_csum_verify(struct inode *, struct buf *);
-void ext2_dir_blk_csum_set(struct inode *, struct buf *);
-void ext2_dir_blk_csum_set_mem(struct inode *, char *, int);
+struct ext2fs_direct_tail *ext2_dirent_get_tail(struct inode *ip,
+ struct ext2fs_direct_2 *ep);
+void ext2_dirent_csum_set(struct inode *, struct ext2fs_direct_2 *);
+int ext2_dirent_csum_verify(struct inode *ip, struct ext2fs_direct_2 *ep);
+void ext2_dx_csum_set(struct inode *, struct ext2fs_direct_2 *);
+int ext2_dx_csum_verify(struct inode *ip, struct ext2fs_direct_2 *ep);
int ext2_extent_blk_csum_verify(struct inode *, void *);
void ext2_extent_blk_csum_set(struct inode *, void *);
+void ext2_init_dirent_tail(struct ext2fs_direct_tail *);
int ext2_gd_i_bitmap_csum_verify(struct m_ext2fs *, int, struct buf *);
void ext2_gd_i_bitmap_csum_set(struct m_ext2fs *, int, struct buf *);
int ext2_gd_b_bitmap_csum_verify(struct m_ext2fs *, int, struct buf *);
@@ -122,7 +128,6 @@ int ext2_ei_csum_verify(struct inode *, struct ext2fs_
void ext2_ei_csum_set(struct inode *, struct ext2fs_dinode *);
int ext2_gd_csum_verify(struct m_ext2fs *, struct cdev *);
void ext2_gd_csum_set(struct m_ext2fs *);
-
/* Flags to low-level allocation routines.
* The low 16-bits are reserved for IO_ flags from vnode.h.
Modified: head/sys/fs/ext2fs/ext2_htree.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_htree.c Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_htree.c Sun May 13 19:48:30 2018 (r333586)
@@ -56,7 +56,7 @@
static void ext2_append_entry(char *block, uint32_t blksize,
struct ext2fs_direct_2 *last_entry,
- struct ext2fs_direct_2 *new_entry);
+ struct ext2fs_direct_2 *new_entry, int csum_size);
static int ext2_htree_append_block(struct vnode *vp, char *data,
struct componentname *cnp, uint32_t blksize);
static int ext2_htree_check_next(struct inode *ip, uint32_t hash,
@@ -82,12 +82,14 @@ static void ext2_htree_set_hash(struct ext2fs_htree_en
uint32_t hash);
static void ext2_htree_set_limit(struct ext2fs_htree_entry *ep,
uint16_t limit);
-static int ext2_htree_split_dirblock(char *block1, char *block2,
- uint32_t blksize, uint32_t *hash_seed, uint8_t hash_version,
+static int ext2_htree_split_dirblock(struct inode *ip,
+ char *block1, char *block2, uint32_t blksize,
+ uint32_t *hash_seed, uint8_t hash_version,
uint32_t *split_hash, struct ext2fs_direct_2 *entry);
static void ext2_htree_release(struct ext2fs_htree_lookup_info *info);
static uint32_t ext2_htree_root_limit(struct inode *ip, int len);
-static int ext2_htree_writebuf(struct ext2fs_htree_lookup_info *info);
+static int ext2_htree_writebuf(struct inode *ip,
+ struct ext2fs_htree_lookup_info *info);
int
ext2_htree_has_idx(struct inode *ip)
@@ -207,10 +209,16 @@ ext2_htree_release(struct ext2fs_htree_lookup_info *in
static uint32_t
ext2_htree_root_limit(struct inode *ip, int len)
{
+ struct m_ext2fs *fs;
uint32_t space;
+ fs = ip->i_e2fs;
space = ip->i_e2fs->e2fs_bsize - EXT2_DIR_REC_LEN(1) -
EXT2_DIR_REC_LEN(2) - len;
+
+ if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
+ space -= sizeof(struct ext2fs_htree_tail);
+
return (space / sizeof(struct ext2fs_htree_entry));
}
@@ -223,6 +231,9 @@ ext2_htree_node_limit(struct inode *ip)
fs = ip->i_e2fs;
space = fs->e2fs_bsize - EXT2_DIR_REC_LEN(0);
+ if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
+ space -= sizeof(struct ext2fs_htree_tail);
+
return (space / sizeof(struct ext2fs_htree_entry));
}
@@ -417,13 +428,13 @@ ext2_htree_append_block(struct vnode *vp, char *data,
}
static int
-ext2_htree_writebuf(struct ext2fs_htree_lookup_info *info)
+ext2_htree_writebuf(struct inode* ip, struct ext2fs_htree_lookup_info *info)
{
int i, error;
for (i = 0; i < info->h_levels_num; i++) {
struct buf *bp = info->h_levels[i].h_bp;
-
+ ext2_dx_csum_set(ip, (struct ext2fs_direct_2 *)bp->b_data);
error = bwrite(bp);
if (error)
return (error);
@@ -487,14 +498,14 @@ ext2_htree_cmp_sort_entry(const void *e1, const void *
static void
ext2_append_entry(char *block, uint32_t blksize,
struct ext2fs_direct_2 *last_entry,
- struct ext2fs_direct_2 *new_entry)
+ struct ext2fs_direct_2 *new_entry, int csum_size)
{
uint16_t entry_len;
entry_len = EXT2_DIR_REC_LEN(last_entry->e2d_namlen);
last_entry->e2d_reclen = entry_len;
last_entry = (struct ext2fs_direct_2 *)((char *)last_entry + entry_len);
- new_entry->e2d_reclen = block + blksize - (char *)last_entry;
+ new_entry->e2d_reclen = block + blksize - (char *)last_entry - csum_size;
memcpy(last_entry, new_entry, EXT2_DIR_REC_LEN(new_entry->e2d_namlen));
}
@@ -502,12 +513,13 @@ ext2_append_entry(char *block, uint32_t blksize,
* Move half of entries from the old directory block to the new one.
*/
static int
-ext2_htree_split_dirblock(char *block1, char *block2, uint32_t blksize,
- uint32_t *hash_seed, uint8_t hash_version,
+ext2_htree_split_dirblock(struct inode *ip, char *block1, char *block2,
+ uint32_t blksize, uint32_t *hash_seed, uint8_t hash_version,
uint32_t *split_hash, struct ext2fs_direct_2 *entry)
{
+ struct m_ext2fs *fs;
int entry_cnt = 0;
- int size = 0;
+ int size = 0, csum_size = 0;
int i, k;
uint32_t offset;
uint16_t entry_len = 0;
@@ -516,11 +528,15 @@ ext2_htree_split_dirblock(char *block1, char *block2,
char *dest;
struct ext2fs_htree_sort_entry *sort_info;
+ fs = ip->i_e2fs;
ep = (struct ext2fs_direct_2 *)block1;
dest = block2;
sort_info = (struct ext2fs_htree_sort_entry *)
((char *)block2 + blksize);
+ if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM))
+ csum_size = sizeof(struct ext2fs_direct_tail);
+
/*
* Calculate name hash value for the entry which is to be added.
*/
@@ -530,7 +546,7 @@ ext2_htree_split_dirblock(char *block1, char *block2,
/*
* Fill in directory entry sort descriptors.
*/
- while ((char *)ep < block1 + blksize) {
+ while ((char *)ep < block1 + blksize - csum_size) {
if (ep->e2d_ino && ep->e2d_namlen) {
entry_cnt++;
sort_info--;
@@ -585,7 +601,7 @@ ext2_htree_split_dirblock(char *block1, char *block2,
/* Shrink directory entries in block 1. */
last = (struct ext2fs_direct_2 *)block1;
entry_len = 0;
- for (offset = 0; offset < blksize; ) {
+ for (offset = 0; offset < blksize - csum_size; ) {
ep = (struct ext2fs_direct_2 *)(block1 + offset);
offset += ep->e2d_reclen;
if (ep->e2d_ino) {
@@ -600,19 +616,24 @@ ext2_htree_split_dirblock(char *block1, char *block2,
if (entry_hash >= *split_hash) {
/* Add entry to block 2. */
ext2_append_entry(block2, blksize,
- (struct ext2fs_direct_2 *)dest, entry);
+ (struct ext2fs_direct_2 *)dest, entry, csum_size);
/* Adjust length field of last entry of block 1. */
- last->e2d_reclen = block1 + blksize - (char *)last;
+ last->e2d_reclen = block1 + blksize - (char *)last - csum_size;
} else {
/* Add entry to block 1. */
- ext2_append_entry(block1, blksize, last, entry);
+ ext2_append_entry(block1, blksize, last, entry, csum_size);
/* Adjust length field of last entry of block 2. */
((struct ext2fs_direct_2 *)dest)->e2d_reclen =
- block2 + blksize - dest;
+ block2 + blksize - dest - csum_size;
}
+ if (csum_size) {
+ ext2_init_dirent_tail(EXT2_DIRENT_TAIL(block1, blksize));
+ ext2_init_dirent_tail(EXT2_DIRENT_TAIL(block2, blksize));
+ }
+
return (0);
}
@@ -680,13 +701,14 @@ ext2_htree_create_index(struct vnode *vp, struct compo
hash_version = root->h_info.h_hash_version;
if (hash_version <= EXT2_HTREE_TEA)
hash_version += m_fs->e2fs_uhash;
- ext2_htree_split_dirblock(buf1, buf2, blksize, fs->e3fs_hash_seed,
+ ext2_htree_split_dirblock(dp, buf1, buf2, blksize, fs->e3fs_hash_seed,
hash_version, &split_hash, new_entry);
ext2_htree_insert_entry(&info, split_hash, 2);
/*
* Write directory block 0.
*/
+ ext2_dx_csum_set(dp, (struct ext2fs_direct_2 *)bp->b_data);
if (DOINGASYNC(vp)) {
bdwrite(bp);
error = 0;
@@ -700,6 +722,7 @@ ext2_htree_create_index(struct vnode *vp, struct compo
/*
* Write directory block 1.
*/
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)buf1);
error = ext2_htree_append_block(vp, buf1, cnp, blksize);
if (error)
goto out1;
@@ -707,6 +730,7 @@ ext2_htree_create_index(struct vnode *vp, struct compo
/*
* Write directory block 2.
*/
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)buf2);
error = ext2_htree_append_block(vp, buf2, cnp, blksize);
free(buf1, M_TEMP);
@@ -825,6 +849,8 @@ ext2_htree_add_entry(struct vnode *dvp, struct ext2fs_
split_hash, blknum);
/* Write new index node to disk */
+ ext2_dx_csum_set(ip,
+ (struct ext2fs_direct_2 *)dst_bp->b_data);
error = bwrite(dst_bp);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
if (error)
@@ -863,7 +889,7 @@ ext2_htree_add_entry(struct vnode *dvp, struct ext2fs_
/* Split target directory block */
newdirblock = malloc(blksize, M_TEMP, M_WAITOK | M_ZERO);
- ext2_htree_split_dirblock((char *)bp->b_data, newdirblock, blksize,
+ ext2_htree_split_dirblock(ip, (char *)bp->b_data, newdirblock, blksize,
fs->e3fs_hash_seed, hash_version, &split_hash, entry);
cursize = roundup(ip->i_size, blksize);
dirsize = cursize + blksize;
@@ -873,11 +899,13 @@ ext2_htree_add_entry(struct vnode *dvp, struct ext2fs_
ext2_htree_insert_entry(&info, split_hash, blknum);
/* Write the new directory block to the end of the directory */
+ ext2_dirent_csum_set(ip, (struct ext2fs_direct_2 *)newdirblock);
error = ext2_htree_append_block(dvp, newdirblock, cnp, blksize);
if (error)
goto finish;
/* Write the target directory block */
+ ext2_dirent_csum_set(ip, (struct ext2fs_direct_2 *)bp->b_data);
error = bwrite(bp);
ip->i_flag |= IN_CHANGE | IN_UPDATE;
if (error)
@@ -885,7 +913,7 @@ ext2_htree_add_entry(struct vnode *dvp, struct ext2fs_
write_bp = 1;
/* Write the index block */
- error = ext2_htree_writebuf(&info);
+ error = ext2_htree_writebuf(ip, &info);
if (!error)
write_info = 1;
Modified: head/sys/fs/ext2fs/ext2_inode_cnv.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_inode_cnv.c Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_inode_cnv.c Sun May 13 19:48:30 2018 (r333586)
@@ -136,6 +136,7 @@ ext2_ei2i(struct ext2fs_dinode *ei, struct inode *ip)
memcpy(ip->i_data, ei->e2di_blocks, sizeof(ei->e2di_blocks));
+ /* Verify inode csum. */
return (ext2_ei_csum_verify(ip, ei));
}
@@ -197,7 +198,7 @@ ext2_i2ei(struct inode *ip, struct ext2fs_dinode *ei)
memcpy(ei->e2di_blocks, ip->i_data, sizeof(ei->e2di_blocks));
- /* Set inode csum */
+ /* Set inode csum. */
ext2_ei_csum_set(ip, ei);
return (0);
Modified: head/sys/fs/ext2fs/ext2_lookup.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_lookup.c Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_lookup.c Sun May 13 19:48:30 2018 (r333586)
@@ -930,7 +930,7 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, str
memcpy(bp->b_data, &newdir, sizeof(struct ext2fs_direct_2));
- ext2_dir_blk_csum_set(dp, bp);
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)bp->b_data);
error = bwrite(bp);
if (error)
return (error);
@@ -1030,7 +1030,7 @@ ext2_add_entry(struct vnode *dvp, struct ext2fs_direct
ep = (struct ext2fs_direct_2 *)((char *)ep + dsize);
}
bcopy((caddr_t)entry, (caddr_t)ep, (u_int)newentrysize);
- ext2_dir_blk_csum_set(dp, bp);
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)bp->b_data);
if (DOINGASYNC(dvp)) {
bdwrite(bp);
error = 0;
@@ -1088,7 +1088,7 @@ ext2_dirremove(struct vnode *dvp, struct componentname
else
rep = (struct ext2fs_direct_2 *)((char *)ep + ep->e2d_reclen);
ep->e2d_reclen += rep->e2d_reclen;
- ext2_dir_blk_csum_set(dp, bp);
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)bp->b_data);
if (DOINGASYNC(dvp) && dp->i_count != 0)
bdwrite(bp);
else
@@ -1119,7 +1119,7 @@ ext2_dirrewrite(struct inode *dp, struct inode *ip, st
ep->e2d_type = DTTOFT(IFTODT(ip->i_mode));
else
ep->e2d_type = EXT2_FT_UNKNOWN;
- ext2_dir_blk_csum_set(dp, bp);
+ ext2_dirent_csum_set(dp, (struct ext2fs_direct_2 *)bp->b_data);
error = bwrite(bp);
dp->i_flag |= IN_CHANGE | IN_UPDATE;
return (error);
Modified: head/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_vnops.c Sun May 13 19:29:35 2018 (r333585)
+++ head/sys/fs/ext2fs/ext2_vnops.c Sun May 13 19:48:30 2018 (r333586)
@@ -1091,9 +1091,8 @@ abortit:
"rename: mangled dir");
} else {
dirbuf->dotdot_ino = newparent;
- ext2_dir_blk_csum_set_mem(ip,
- (char *)dirbuf,
- ip->i_e2fs->e2fs_bsize);
+ ext2_dirent_csum_set(ip,
+ (struct ext2fs_direct_2 *)dirbuf);
(void)vn_rdwr(UIO_WRITE, fvp,
(caddr_t)dirbuf,
ip->i_e2fs->e2fs_bsize,
@@ -1284,14 +1283,6 @@ out:
#endif /* UFS_ACL */
-static void
-ext2_init_dirent_tail(struct ext2fs_direct_tail *tp)
-{
- memset(tp, 0, sizeof(struct ext2fs_direct_tail));
- tp->e2dt_rec_len = sizeof(struct ext2fs_direct_tail);
- tp->e2dt_reserved_ft = EXT2_FT_DIR_CSUM;
-}
-
/*
* Mkdir system call
*/
@@ -1400,7 +1391,7 @@ ext2_mkdir(struct vop_mkdir_args *ap)
ext2_init_dirent_tail(EXT2_DIRENT_TAIL(buf, DIRBLKSIZ));
}
memcpy(buf, &dirtemplate, sizeof(dirtemplate));
- ext2_dir_blk_csum_set_mem(ip, buf, DIRBLKSIZ);
+ ext2_dirent_csum_set(ip, (struct ext2fs_direct_2 *)buf);
error = vn_rdwr(UIO_WRITE, tvp, (caddr_t)buf,
DIRBLKSIZ, (off_t)0, UIO_SYSSPACE,
IO_NODELOCKED | IO_SYNC | IO_NOMACCHECK, cnp->cn_cred, NOCRED,
More information about the svn-src-all
mailing list