summaryrefslogtreecommitdiff
path: root/kernel/fs.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-08-20 11:57:24 -0400
committerFrans Kaashoek <[email protected]>2019-08-20 11:57:24 -0400
commit6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68 (patch)
tree2369138e62983d067dc56acfb90ace1473f4f356 /kernel/fs.c
parentd9818b89e136ed51242257ca6cbf0a78292f862b (diff)
downloadxv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.tar.gz
xv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.tar.bz2
xv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.zip
Release buffer also when copyin fails
Diffstat (limited to 'kernel/fs.c')
-rw-r--r--kernel/fs.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/fs.c b/kernel/fs.c
index 454d52b..da9bcca 100644
--- a/kernel/fs.c
+++ b/kernel/fs.c
@@ -495,8 +495,10 @@ writei(struct inode *ip, int user_src, uint64 src, uint off, uint n)
for(tot=0; tot<n; tot+=m, off+=m, src+=m){
bp = bread(ip->dev, bmap(ip, off/BSIZE));
m = min(n - tot, BSIZE - off%BSIZE);
- if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1)
+ if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) {
+ brelse(bp);
break;
+ }
log_write(bp);
brelse(bp);
}