]> Zhao Yanbai Git Server - minix.git/commitdiff
mfs fix by tveerman from trunk.
authorBen Gras <ben@minix3.org>
Mon, 7 Jun 2010 15:46:26 +0000 (15:46 +0000)
committerBen Gras <ben@minix3.org>
Mon, 7 Jun 2010 15:46:26 +0000 (15:46 +0000)
include/minix/const.h
servers/mfs/inode.c
servers/mfs/link.c
servers/mfs/path.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..c5c09278a67ccdde1d93ff59fd492a284ff76996 100644 (file)
@@ -226,7 +226,11 @@ 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;
+
+               /* Ignore errors by truncate_inode in case inode is a block
+                * special or character special file.
+                */
+               (void) truncate_inode(rip, (off_t) 0);  
                rip->i_mode = I_NOT_ALLOC;     /* clear I_TYPE field */
                rip->i_dirt = DIRTY;
                free_inode(rip->i_dev, rip->i_num);
@@ -257,8 +261,9 @@ PUBLIC struct inode *alloc_inode(dev_t dev, mode_t bits)
 
   register struct inode *rip;
   register struct super_block *sp;
-  int major, minor, inumb;
+  int major, minor;
   bit_t b;
+  ino_t inumb;
 
   sp = get_super(dev); /* get pointer to super_block */
   if (sp->s_rd_only) { /* can't allocate an inode on a read only device. */
@@ -276,7 +281,7 @@ PUBLIC struct inode *alloc_inode(dev_t dev, mode_t bits)
        return(NULL);
   }
   sp->s_isearch = b;           /* next time start here */
-  inumb = (int) b;             /* be careful not to pass unshort as param */
+  inumb = (ino_t) b;           /* be careful not to pass unshort as param */
 
   /* Try to acquire a slot in the inode table. */
   if ((rip = get_inode(NO_DEV, inumb)) == NULL) {
@@ -339,7 +344,7 @@ PRIVATE void free_inode(
 
   /* Locate the appropriate super_block. */
   sp = get_super(dev);
-  if (inumb > sp->s_ninodes) return;
+  if (inumb == 0 || inumb > sp->s_ninodes) return;
   b = (bit_t) inumb;
   free_bit(sp, IMAP, b);
   if (b < sp->s_isearch) sp->s_isearch = b;
index d067ee9ad3629d5d8438f208ba95a496cd26c1ba..52c0a0a532b5fed727ff9d073933ac5abf3e1c25 100644 (file)
@@ -245,14 +245,14 @@ char file_name[NAME_MAX]; /* name of file to be removed */
 {
 /* Unlink 'file_name'; rip must be the inode of 'file_name' or NULL. */
 
-  ino_t numb;                  /* inode number */
+  ino_t inumb;                 /* inode number */
   int  r;
 
   /* If rip is not NULL, it is used to get faster access to the inode. */
   if (rip == NULL) {
        /* Search for file in directory and try to get its inode. */
-       err_code = search_dir(dirp, file_name, &numb, LOOK_UP, IGN_PERM);
-       if (err_code == OK) rip = get_inode(dirp->i_dev, (int) numb);
+       err_code = search_dir(dirp, file_name, &inumb, LOOK_UP, IGN_PERM);
+       if (err_code == OK) rip = get_inode(dirp->i_dev, inumb);
        if (err_code != OK || rip == NULL) return(err_code);
   } else {
        dup_inode(rip);         /* inode will be returned with put_inode */
@@ -284,7 +284,7 @@ PUBLIC int fs_rename()
   int odir, ndir;                      /* TRUE iff {old|new} file is dir */
   int same_pdir;                       /* TRUE iff parent dirs are the same */
   char old_name[NAME_MAX], new_name[NAME_MAX];
-  ino_t numb;
+  ino_t inumb;
   phys_bytes len;
   
   /* Copy the last component of the old name */
@@ -423,16 +423,16 @@ PUBLIC int fs_rename()
           * otherwise first try to create the new name entry to make sure
           * the rename will succeed.
           */
-       numb = old_ip->i_num;           /* inode number of old file */
+       inumb = old_ip->i_num;          /* inode number of old file */
          
        if(same_pdir) {
                r = search_dir(old_dirp, old_name, NULL, DELETE, IGN_PERM);
                                                /* shouldn't go wrong. */
                if(r == OK)
-                       (void) search_dir(old_dirp, new_name, &numb, ENTER,
+                       (void) search_dir(old_dirp, new_name, &inumb, ENTER,
                                          IGN_PERM);
        } else {
-               r = search_dir(new_dirp, new_name, &numb, ENTER, IGN_PERM);
+               r = search_dir(new_dirp, new_name, &inumb, ENTER, IGN_PERM);
                if(r == OK)
                        (void) search_dir(old_dirp, old_name, NULL, DELETE,
                                          IGN_PERM);
@@ -443,9 +443,9 @@ PUBLIC int fs_rename()
 
   if(r == OK && odir && !same_pdir) {
        /* Update the .. entry in the directory (still points to old_dirp).*/
-       numb = new_dirp->i_num;
+       inumb = new_dirp->i_num;
        (void) unlink_file(old_ip, NULL, dot2);
-       if(search_dir(old_ip, dot2, &numb, ENTER, IGN_PERM) == OK) {
+       if(search_dir(old_ip, dot2, &inumb, ENTER, IGN_PERM) == OK) {
                /* New link created. */
                new_dirp->i_nlinks++;
                new_dirp->i_dirt = DIRTY;
index 8bce2afe685b7d1ec608b2fdf9f55dfe7280651f..3235205c4b56892cb61944c192f5aa4e14d86c5c 100644 (file)
@@ -363,7 +363,7 @@ int chk_perm;                       /* check permissions when string is looked up*/
  * the directory, find the inode, open it, and return a pointer to its inode
  * slot.
  */
-  ino_t numb;
+  ino_t inumb;
   struct inode *rip;
 
   /* If 'string' is empty, return an error. */
@@ -376,12 +376,12 @@ int chk_perm;                     /* check permissions when string is looked up*/
   if (dirp == NULL) return(NULL);
 
   /* If 'string' is not present in the directory, signal error. */
-  if ( (err_code = search_dir(dirp, string, &numb, LOOK_UP, chk_perm)) != OK) {
+  if ( (err_code = search_dir(dirp, string, &inumb, LOOK_UP, chk_perm)) != OK) {
        return(NULL);
   }
 
   /* The component has been found in the directory.  Get inode. */
-  if ( (rip = get_inode(dirp->i_dev, (int) numb)) == NULL)  {
+  if ( (rip = get_inode(dirp->i_dev, inumb)) == NULL)  {
        return(NULL);
   }
 
@@ -468,17 +468,17 @@ char string[NAME_MAX+1];  /* component extracted from 'old_name' */
 /*===========================================================================*
  *                             search_dir                                   *
  *===========================================================================*/
-PUBLIC int search_dir(ldir_ptr, string, numb, flag, check_permissions)
+PUBLIC int search_dir(ldir_ptr, string, inumb, flag, check_permissions)
 register struct inode *ldir_ptr; /* ptr to inode for dir to search */
 char string[NAME_MAX];          /* component to search for */
-ino_t *numb;                    /* pointer to inode number */
+ino_t *inumb;                   /* pointer to inode number */
 int flag;                       /* LOOK_UP, ENTER, DELETE or IS_EMPTY */
 int check_permissions;          /* check permissions when flag is !IS_EMPTY */
 {
 /* This function searches the directory whose inode is pointed to by 'ldip':
- * if (flag == ENTER)  enter 'string' in the directory with inode # '*numb';
+ * if (flag == ENTER)  enter 'string' in the directory with inode # '*inumb';
  * if (flag == DELETE) delete 'string' from the directory;
- * if (flag == LOOK_UP) search for 'string' and return inode # in 'numb';
+ * if (flag == LOOK_UP) search for 'string' and return inode # in 'inumb';
  * if (flag == IS_EMPTY) return OK if only . and .. in dir else ENOTEMPTY;
  *
  *    if 'string' is dot1 or dot2, no access permissions are checked.
@@ -563,7 +563,7 @@ int check_permissions;               /* check permissions when flag is !IS_EMPTY */
                                ldir_ptr->i_dirt = DIRTY;
                        } else {
                                sp = ldir_ptr->i_sp;    /* 'flag' is LOOK_UP */
-                               *numb = (ino_t) conv4(sp->s_native,
+                               *inumb = (ino_t) conv4(sp->s_native,
                                                      (int) dp->d_ino);
                        }
                        put_block(bp, DIRECTORY_BLOCK);
@@ -603,7 +603,7 @@ int check_permissions;               /* check permissions when flag is !IS_EMPTY */
   (void) memset(dp->d_name, 0, (size_t) NAME_MAX); /* clear entry */
   for (i = 0; i < NAME_MAX && string[i]; i++) dp->d_name[i] = string[i];
   sp = ldir_ptr->i_sp; 
-  dp->d_ino = conv4(sp->s_native, (int) *numb);
+  dp->d_ino = conv4(sp->s_native, (int) *inumb);
   bp->b_dirt = DIRTY;
   put_block(bp, DIRECTORY_BLOCK);
   ldir_ptr->i_update |= CTIME | MTIME; /* mark mtime for update later */