Fix a bug in put_inode that causes corruption to the file system and another
bug that causes problems when files grow bigger than a certain threshold. Also fix a few type and code inconsistencies.
This commit is contained in:
parent
1207fcc6f0
commit
a0eaaa5c9f
@ -150,7 +150,7 @@
|
|||||||
/* Some limits. */
|
/* Some limits. */
|
||||||
#define MAX_INODE_NR ((ino_t) 037777777777) /* largest inode number */
|
#define MAX_INODE_NR ((ino_t) 037777777777) /* largest inode number */
|
||||||
#define MAX_FILE_POS ((off_t) 0x7FFFFFFF) /* largest legal file offset */
|
#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 */
|
#define MAX_SYM_LOOPS 8 /* how many symbolic links are recursed */
|
||||||
|
|
||||||
|
@ -226,7 +226,10 @@ register struct inode *rip; /* pointer to inode to be released */
|
|||||||
if (rip->i_nlinks == NO_LINK) {
|
if (rip->i_nlinks == NO_LINK) {
|
||||||
/* i_nlinks == NO_LINK means free the inode. */
|
/* i_nlinks == NO_LINK means free the inode. */
|
||||||
/* return all the disk blocks */
|
/* 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_mode = I_NOT_ALLOC; /* clear I_TYPE field */
|
||||||
rip->i_dirt = DIRTY;
|
rip->i_dirt = DIRTY;
|
||||||
free_inode(rip->i_dev, rip->i_num);
|
free_inode(rip->i_dev, rip->i_num);
|
||||||
@ -339,7 +342,7 @@ PRIVATE void free_inode(
|
|||||||
|
|
||||||
/* Locate the appropriate super_block. */
|
/* Locate the appropriate super_block. */
|
||||||
sp = get_super(dev);
|
sp = get_super(dev);
|
||||||
if (inumb > sp->s_ninodes) return;
|
if (inumb == NO_ENTRY || inumb > sp->s_ninodes) return;
|
||||||
b = (bit_t) inumb;
|
b = (bit_t) inumb;
|
||||||
free_bit(sp, IMAP, b);
|
free_bit(sp, IMAP, b);
|
||||||
if (b < sp->s_isearch) sp->s_isearch = b;
|
if (b < sp->s_isearch) sp->s_isearch = b;
|
||||||
|
@ -217,7 +217,7 @@ char dir_name[NAME_MAX]; /* name of directory to be removed */
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* search_dir checks that rip is a directory too. */
|
/* 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);
|
return(r);
|
||||||
|
|
||||||
if (strcmp(dir_name, ".") == 0 || strcmp(dir_name, "..") == 0)return(EINVAL);
|
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 */
|
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) {
|
if (r == OK) {
|
||||||
rip->i_nlinks--; /* entry deleted from parent's dir */
|
rip->i_nlinks--; /* entry deleted from parent's dir */
|
||||||
|
@ -155,7 +155,7 @@ PUBLIC int fs_mkdir()
|
|||||||
} else {
|
} else {
|
||||||
/* It was not possible to enter . or .. probably disk was full -
|
/* It was not possible to enter . or .. probably disk was full -
|
||||||
* links counts haven't been touched. */
|
* 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);
|
panic("Dir disappeared: %ul", rip->i_num);
|
||||||
rip->i_nlinks--; /* undo the increment done in new_node() */
|
rip->i_nlinks--; /* undo the increment done in new_node() */
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user