]> Zhao Yanbai Git Server - minix.git/commitdiff
Fix a bug in put_inode that causes corruption to the file system and another
authorThomas Veerman <thomas@minix3.org>
Wed, 9 Jun 2010 09:56:43 +0000 (09:56 +0000)
committerThomas Veerman <thomas@minix3.org>
Wed, 9 Jun 2010 09:56:43 +0000 (09:56 +0000)
bug that causes problems when files grow bigger than a certain threshold. Also
fix a few type and code inconsistencies.

include/minix/const.h
servers/mfs/inode.c
servers/mfs/link.c
servers/mfs/open.c

index f4722189eac025543f18990646b4df8f15ca7a69..4d881fb84f114dc3d9252e9b0074aa7ec91ebf48 100644 (file)
 /* Some limits. */
 #define MAX_INODE_NR ((ino_t) 037777777777)    /* largest inode number */
 #define MAX_FILE_POS ((off_t) 0x7FFFFFFF)      /* largest legal file offset */
-#define UMAX_FILE_POS ((unsigned) 0x7FFFFFF  /* largest legal file offset */
+#define UMAX_FILE_POS ((unsigned) 0x7FFFFFFF)  /* largest legal file offset */
 
 #define MAX_SYM_LOOPS  8       /* how many symbolic links are recursed */
 
index febd5bea49511f4334b1d836881fa88c6af3da0d..81f3441a2451afe12021e39de4bf34d6cb6e4140 100644 (file)
@@ -226,7 +226,10 @@ register struct inode *rip;        /* pointer to inode to be released */
        if (rip->i_nlinks == NO_LINK) {
                /* i_nlinks == NO_LINK means free the inode. */
                /* return all the disk blocks */
-               if (truncate_inode(rip, (off_t) 0) != OK) return;
+               if (truncate_inode(rip, (off_t) 0) != OK) {
+                       printf("MFS: truncate of inode %u on dev %d failed\n",
+                               rip->i_num, rip->i_dev);
+               }
                rip->i_mode = I_NOT_ALLOC;     /* clear I_TYPE field */
                rip->i_dirt = DIRTY;
                free_inode(rip->i_dev, rip->i_num);
@@ -339,7 +342,7 @@ PRIVATE void free_inode(
 
   /* Locate the appropriate super_block. */
   sp = get_super(dev);
-  if (inumb > sp->s_ninodes) return;
+  if (inumb == NO_ENTRY || inumb > sp->s_ninodes) return;
   b = (bit_t) inumb;
   free_bit(sp, IMAP, b);
   if (b < sp->s_isearch) sp->s_isearch = b;
index 07ac263fe12a5b801c812f6c3af0b5b63688ed43..2848345fafd8d4fbb0a5edc0ed98222e64dae076 100644 (file)
@@ -217,7 +217,7 @@ char dir_name[NAME_MAX];            /* name of directory to be removed */
   int r;
 
   /* search_dir checks that rip is a directory too. */
-  if ((r = search_dir(rip, "", (ino_t *) 0, IS_EMPTY, IGN_PERM)) != OK)
+  if ((r = search_dir(rip, "", NULL, IS_EMPTY, IGN_PERM)) != OK)
        return(r);
 
   if (strcmp(dir_name, ".") == 0 || strcmp(dir_name, "..") == 0)return(EINVAL);
@@ -258,7 +258,7 @@ char file_name[NAME_MAX];   /* name of file to be removed */
        dup_inode(rip);         /* inode will be returned with put_inode */
   }
 
-  r = search_dir(dirp, file_name, (ino_t *) 0, DELETE, IGN_PERM);
+  r = search_dir(dirp, file_name, NULL, DELETE, IGN_PERM);
 
   if (r == OK) {
        rip->i_nlinks--;        /* entry deleted from parent's dir */
index b45ec6f7491ac090b543a6431d072a6941b3b2ca..0e1d62525bfb4ac713b39eaf6cb9edd00e32db53 100644 (file)
@@ -155,7 +155,7 @@ PUBLIC int fs_mkdir()
   } else {
          /* It was not possible to enter . or .. probably disk was full -
           * links counts haven't been touched. */
-         if(search_dir(ldirp, lastc, (ino_t *) 0, DELETE, IGN_PERM) != OK)
+         if(search_dir(ldirp, lastc, NULL, DELETE, IGN_PERM) != OK)
                  panic("Dir disappeared: %ul", rip->i_num);
          rip->i_nlinks--;      /* undo the increment done in new_node() */
   }