diff options
author | rsc <rsc> | 2009-05-31 02:07:51 +0000 |
---|---|---|
committer | rsc <rsc> | 2009-05-31 02:07:51 +0000 |
commit | f3685aa391431d5eafbc918e1d143dd731c64787 (patch) | |
tree | 729cd8f2c7788e5fb87c84a3748760b5fd87e06b | |
parent | 7f399ccaa4fb14527238be333fab207ae3a57856 (diff) | |
download | xv6-labs-f3685aa391431d5eafbc918e1d143dd731c64787.tar.gz xv6-labs-f3685aa391431d5eafbc918e1d143dd731c64787.tar.bz2 xv6-labs-f3685aa391431d5eafbc918e1d143dd731c64787.zip |
simplify
-rw-r--r-- | file.h | 2 | ||||
-rw-r--r-- | pipe.c | 8 | ||||
-rw-r--r-- | sysfile.c | 35 |
3 files changed, 16 insertions, 29 deletions
@@ -1,5 +1,5 @@ struct file { - enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_INODE } type; + enum { FD_NONE, FD_PIPE, FD_INODE } type; int ref; // reference count char readable; char writable; @@ -47,14 +47,10 @@ pipealloc(struct file **f0, struct file **f1) bad: if(p) kfree((char*)p, PAGE); - if(*f0){ - (*f0)->type = FD_NONE; + if(*f0) fileclose(*f0); - } - if(*f1){ - (*f1)->type = FD_NONE; + if(*f1) fileclose(*f1); - } return -1; } @@ -127,17 +127,17 @@ sys_link(void) iunlock(ip); if((dp = nameiparent(new, name)) == 0) - goto bad; + goto bad; ilock(dp); - if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0) + if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0){ + iunlockput(dp); goto bad; + } iunlockput(dp); iput(ip); return 0; bad: - if(dp) - iunlockput(dp); ilock(ip); ip->nlink--; iupdate(ip); @@ -212,7 +212,7 @@ sys_unlink(void) } static struct inode* -create(char *path, int canexist, short type, short major, short minor) +create(char *path, short type, short major, short minor) { uint off; struct inode *ip, *dp; @@ -222,10 +222,10 @@ create(char *path, int canexist, short type, short major, short minor) return 0; ilock(dp); - if(canexist && (ip = dirlookup(dp, name, &off)) != 0){ + if((ip = dirlookup(dp, name, &off)) != 0){ iunlockput(dp); ilock(ip); - if(ip->type != type || ip->major != major || ip->minor != minor){ + if(ip->type != type || type != T_FILE){ iunlockput(ip); return 0; } @@ -250,17 +250,8 @@ create(char *path, int canexist, short type, short major, short minor) panic("create dots"); } - if(dirlink(dp, name, ip->inum) < 0){ - if(type == T_DIR){ - dp->nlink--; - iupdate(dp); - } - iunlockput(dp); - - ip->nlink = 0; - iunlockput(ip); - return 0; - } + if(dirlink(dp, name, ip->inum) < 0) + panic("create: dirlink"); iunlockput(dp); return ip; @@ -278,13 +269,13 @@ sys_open(void) return -1; if(omode & O_CREATE){ - if((ip = create(path, 1, T_FILE, 0, 0)) == 0) + if((ip = create(path, T_FILE, 0, 0)) == 0) return -1; } else { if((ip = namei(path)) == 0) return -1; ilock(ip); - if(ip->type == T_DIR && (omode & (O_RDWR|O_WRONLY))){ + if(ip->type == T_DIR && omode != O_RDONLY){ iunlockput(ip); return -1; } @@ -318,7 +309,7 @@ sys_mknod(void) if((len=argstr(0, &path)) < 0 || argint(1, &major) < 0 || argint(2, &minor) < 0 || - (ip = create(path, 0, T_DEV, major, minor)) == 0) + (ip = create(path, T_DEV, major, minor)) == 0) return -1; iunlockput(ip); return 0; @@ -330,7 +321,7 @@ sys_mkdir(void) char *path; struct inode *ip; - if(argstr(0, &path) < 0 || (ip = create(path, 0, T_DIR, 0, 0)) == 0) + if(argstr(0, &path) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0) return -1; iunlockput(ip); return 0; |