Author: mckusick
Date: Sat Dec 15 18:49:30 2018
New Revision: 342134
URL: https://svnweb.freebsd.org/changeset/base/342134

Log:
  Ensure that the inode check-hash is not left zeroed out in the case where
  the check-hash fails. Prior to the fix in -r342133 the inode with the
  zeroed out check-hash was written back to disk causing further confusion.
  
  Reported by:  Gary Jennejohn (gj)
  Sponsored by: Netflix

Modified:
  head/sys/ufs/ffs/ffs_subr.c

Modified: head/sys/ufs/ffs/ffs_subr.c
==============================================================================
--- head/sys/ufs/ffs/ffs_subr.c Sat Dec 15 18:35:46 2018        (r342133)
+++ head/sys/ufs/ffs/ffs_subr.c Sat Dec 15 18:49:30 2018        (r342134)
@@ -161,7 +161,7 @@ ffs_load_inode(struct buf *bp, struct inode *ip, struc
 int
 ffs_verify_dinode_ckhash(struct fs *fs, struct ufs2_dinode *dip)
 {
-       uint32_t save_ckhash;
+       uint32_t ckhash, save_ckhash;
 
        /*
         * Return success if unallocated or we are not doing inode check-hash.
@@ -174,10 +174,11 @@ ffs_verify_dinode_ckhash(struct fs *fs, struct ufs2_di
         */
        save_ckhash = dip->di_ckhash;
        dip->di_ckhash = 0;
-       if (save_ckhash != calculate_crc32c(~0L, (void *)dip, sizeof(*dip)))
-               return (EINVAL);
+       ckhash = calculate_crc32c(~0L, (void *)dip, sizeof(*dip));
        dip->di_ckhash = save_ckhash;
-       return (0);
+       if (save_ckhash == ckhash)
+               return (0);
+       return (EINVAL);
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to