diff options
author | Frans Kaashoek <[email protected]> | 2019-08-20 11:57:24 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2019-08-20 11:57:24 -0400 |
commit | 6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68 (patch) | |
tree | 2369138e62983d067dc56acfb90ace1473f4f356 | |
parent | d9818b89e136ed51242257ca6cbf0a78292f862b (diff) | |
download | xv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.tar.gz xv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.tar.bz2 xv6-labs-6005ef5a1c0bb17a3a5da683d95ed9e1e6f44e68.zip |
Release buffer also when copyin fails
-rw-r--r-- | kernel/fs.c | 4 |
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); } |