>From FreeBSD. FFS2 inodes have unsigned block counts, so we have to
perform the underflow test before the substraction.

Index: ffs_inode.c
===================================================================
RCS file: /cvs/src/sys/ufs/ffs/ffs_inode.c,v
retrieving revision 1.62
diff -u -p -r1.62 ffs_inode.c
--- ffs_inode.c 16 Jan 2013 22:41:47 -0000      1.62
+++ ffs_inode.c 21 Apr 2013 20:06:39 -0000
@@ -436,8 +436,9 @@ done:
         * Put back the real size.
         */
        DIP_ASSIGN(oip, size, length);
-       DIP_ADD(oip, blocks, -blocksreleased);
-       if (DIP(oip, blocks) < 0)       /* Sanity */
+       if (DIP(oip, blocks) >= blocksreleased)
+               DIP_ADD(oip, blocks, -blocksreleased);
+       else    /* sanity */
                DIP_ASSIGN(oip, blocks, 0);
        oip->i_flag |= IN_CHANGE;
        (void)ufs_quota_free_blocks(oip, blocksreleased, NOCRED);

Reply via email to