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,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to