summaryrefslogtreecommitdiff
path: root/fs.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2011-08-15 12:44:20 -0400
committerRobert Morris <[email protected]>2011-08-15 12:44:20 -0400
commit5053dd6a6d2b481bfcddbd91bacc885b9f0e0ff5 (patch)
treeca7d000f9996082466bdfe8c7a0c9667341f2dfa /fs.c
parentc95ce31c5978bd43e1f0d34e51a4e3d7bcc41b14 (diff)
downloadxv6-labs-5053dd6a6d2b481bfcddbd91bacc885b9f0e0ff5.tar.gz
xv6-labs-5053dd6a6d2b481bfcddbd91bacc885b9f0e0ff5.tar.bz2
xv6-labs-5053dd6a6d2b481bfcddbd91bacc885b9f0e0ff5.zip
avoid deadlock by calling begin_trans() before locking any inodes
Diffstat (limited to 'fs.c')
-rw-r--r--fs.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/fs.c b/fs.c
index a76788b..fe9ce48 100644
--- a/fs.c
+++ b/fs.c
@@ -43,13 +43,13 @@ bzero(int dev, int bno)
bp = bread(dev, bno);
memset(bp->data, 0, BSIZE);
- bwrite(bp);
+ log_write(bp);
brelse(bp);
}
// Blocks.
-// Allocate a disk block.
+// Allocate a zeroed disk block.
static uint
balloc(uint dev)
{
@@ -67,6 +67,7 @@ balloc(uint dev)
bp->data[bi/8] |= m; // Mark block in use on disk.
log_write(bp);
brelse(bp);
+ bzero(dev, b + bi);
return b + bi;
}
}
@@ -83,8 +84,6 @@ bfree(int dev, uint b)
struct superblock sb;
int bi, m;
- bzero(dev, b);
-
readsb(dev, &sb);
bp = bread(dev, BBLOCK(b, sb.ninodes));
bi = b % BPB;