summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-14 14:13:52 +0000
committerkaashoek <kaashoek>2006-08-14 14:13:52 +0000
commitbdb66433031ca96f2fd127995186623cd10c45b3 (patch)
tree037ffd2021f27718fba32c27cacd9ca52682b613
parentd15f0d1033a7da6448966d9626ec2776781e4188 (diff)
downloadxv6-labs-bdb66433031ca96f2fd127995186623cd10c45b3.tar.gz
xv6-labs-bdb66433031ca96f2fd127995186623cd10c45b3.tar.bz2
xv6-labs-bdb66433031ca96f2fd127995186623cd10c45b3.zip
set size for directories correctly in wdir and mkfs
mkdir ls shows stat info for each dir entry
-rw-r--r--fs.c3
-rw-r--r--ls.c20
-rw-r--r--mkfs.c11
-rw-r--r--syscall.c12
-rw-r--r--ulib.c4
5 files changed, 36 insertions, 14 deletions
diff --git a/fs.c b/fs.c
index cf717a2..2370e0e 100644
--- a/fs.c
+++ b/fs.c
@@ -355,7 +355,8 @@ writei(struct inode *ip, char *addr, uint off, uint n)
}
if (r > 0) {
if (off > ip->size) {
- ip->size = off;
+ if (ip->type == T_DIR) ip->size = ((off / BSIZE) + 1) * BSIZE;
+ else ip->size = off;
}
iupdate(ip);
}
diff --git a/ls.c b/ls.c
index ada61ec..9731f6f 100644
--- a/ls.c
+++ b/ls.c
@@ -12,6 +12,7 @@ main(int argc, char *argv[])
{
int fd;
uint off;
+ uint sz;
if(argc > 1){
puts("Usage: ls\n");
@@ -30,18 +31,19 @@ main(int argc, char *argv[])
if (st.st_type != T_DIR) {
printf(2, "ls: . is not a dir\n");
}
- cprintf("size %d\n", st.st_size);
- for(off = 0; off < st.st_size; off += sizeof(struct dirent)) {
+ sz = st.st_size;
+ for(off = 0; off < sz; off += sizeof(struct dirent)) {
if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) {
- printf(2, "ls: read error\n");
- exit();
+ printf(1, "ls: read error\n");
+ break;
}
if (dirent.inum != 0) {
-
- if (stat (dirent.name, &st) < 0)
- printf(2, "stat: failed\n");
-
- printf(1, "%s t %d\n", dirent.name, st.st_type);
+ if (stat (dirent.name, &st) < 0) {
+ printf(1, "stat: failed\n");
+ break;
+ }
+ printf(1, "%s t %d ino %d sz %d\n", dirent.name, st.st_type,
+ dirent.inum, st.st_size);
}
}
close(fd);
diff --git a/mkfs.c b/mkfs.c
index b048e10..15870d9 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -23,6 +23,7 @@ uint freeinode = 1;
void balloc(int);
void wsect(uint, void *);
void winode(uint, struct dinode *);
+void rinode(uint inum, struct dinode *ip);
void rsect(uint sec, void *buf);
uint ialloc(ushort type);
void iappend(uint inum, void *p, int n);
@@ -53,9 +54,10 @@ xint(uint x)
main(int argc, char *argv[])
{
int i, cc, fd;
- uint bn, rootino, inum;
+ uint bn, rootino, inum, off;
struct dirent de;
char buf[512];
+ struct dinode din;
if(argc < 2){
fprintf(stderr, "Usage: mkfs fs.img files...\n");
@@ -122,6 +124,13 @@ main(int argc, char *argv[])
close(fd);
}
+ // fix size of root inode dir
+ rinode(rootino, &din);
+ off = xint(din.size);
+ off = ((off/BSIZE) + 1) * BSIZE;
+ din.size = xint(off);
+ winode(rootino, &din);
+
balloc(usedblocks);
exit(0);
diff --git a/syscall.c b/syscall.c
index 0ef2670..0a017c7 100644
--- a/syscall.c
+++ b/syscall.c
@@ -294,8 +294,10 @@ sys_mkdir(void)
{
struct proc *cp = curproc[cpu()];
struct inode *nip;
+ struct inode *pip;
uint arg0;
int l;
+ struct dirent de;
if(fetcharg(0, &arg0) < 0)
return -1;
@@ -308,7 +310,15 @@ sys_mkdir(void)
nip = mknod (cp->mem + arg0, T_DIR, 0, 0);
- // XXX put . and .. in
+ de.name[0] = '.';
+ de.inum = nip->inum;
+ writei (nip, (char *) &de, 0, sizeof(de));
+
+ pip = namei(".", NAMEI_LOOKUP, 0);
+ de.inum = pip->inum;
+ de.name[1] = '.';
+ iput(pip);
+ writei (nip, (char *) &de, sizeof(de), sizeof(de));
iput(nip);
return (nip == 0) ? -1 : 0;
diff --git a/ulib.c b/ulib.c
index eaa33d3..004b934 100644
--- a/ulib.c
+++ b/ulib.c
@@ -61,11 +61,11 @@ gets(char *buf, int max)
int
stat(char *n, struct stat *st)
{
- int fd = open(n, O_RDONLY);
+ int fd;
int r;
+ fd = open(n, O_RDONLY);
if (fd < 0) return -1;
-
r = fstat(fd, st);
close(fd);
return r;