summaryrefslogtreecommitdiffstats
path: root/sbin/fsck_ffs/pass1.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/fsck_ffs/pass1.c')
-rw-r--r--sbin/fsck_ffs/pass1.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/sbin/fsck_ffs/pass1.c b/sbin/fsck_ffs/pass1.c
index 3d09bd0..3a5e408 100644
--- a/sbin/fsck_ffs/pass1.c
+++ b/sbin/fsck_ffs/pass1.c
@@ -41,6 +41,7 @@ static const char rcsid[] =
#include <sys/param.h>
#include <sys/stat.h>
+#include <sys/sysctl.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
@@ -265,7 +266,7 @@ checkinode(inumber, idesc)
* Fake ndb value so direct/indirect block checks below
* will detect any garbage after symlink string.
*/
- if (dp->di_size < sblock.fs_maxsymlinklen) {
+ if (dp->di_size < (u_int64_t)sblock.fs_maxsymlinklen) {
ndb = howmany(dp->di_size, sizeof(ufs_daddr_t));
if (ndb > NDADDR) {
j = ndb - NDADDR;
@@ -343,9 +344,20 @@ checkinode(inumber, idesc)
printf(" (CORRECTED)\n");
else if (reply("CORRECT") == 0)
return;
- dp = ginode(inumber);
- dp->di_blocks = idesc->id_entryno;
- inodirty();
+ if (bkgrdflag == 0) {
+ dp = ginode(inumber);
+ dp->di_blocks = idesc->id_entryno;
+ inodirty();
+ } else {
+ cmd.value = idesc->id_number;
+ cmd.size = idesc->id_entryno - dp->di_blocks;
+ if (debug)
+ printf("adjblkcnt ino %d amount %d\n",
+ (long)cmd.value, cmd.size);
+ if (sysctl(adjblkcnt, MIBSIZE, 0, 0,
+ &cmd, sizeof cmd) == -1)
+ rwerror("ADJUST INODE BLOCK COUNT", cmd.value);
+ }
}
return;
unknown:
OpenPOWER on IntegriCloud