From d7c0a1b7a703f7366942092f9cf421b6cd111a36 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Fri, 23 Oct 2020 10:18:30 -0400 Subject: [PATCH] hopefully make writei more correct --- kernel/file.c | 6 +++--- kernel/fs.c | 21 +++++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/kernel/file.c b/kernel/file.c index 116eb97..25fa226 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -166,10 +166,10 @@ filewrite(struct file *f, uint64 addr, int n) iunlock(f->ip); end_op(); - if(r < 0) + if(r != n1){ + // error from writei break; - if(r != n1) - panic("short filewrite"); + } i += r; } ret = (i == n ? n : -1); diff --git a/kernel/fs.c b/kernel/fs.c index 848b2c9..f33553a 100644 --- a/kernel/fs.c +++ b/kernel/fs.c @@ -480,6 +480,9 @@ readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) // Caller must hold ip->lock. // If user_src==1, then src is a user virtual address; // otherwise, src is a kernel address. +// Returns the number of bytes successfully written. +// If the return value is less than the requested n, +// there was an error of some kind. int writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) { @@ -496,23 +499,21 @@ writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) m = min(n - tot, BSIZE - off%BSIZE); if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { brelse(bp); - n = -1; break; } log_write(bp); brelse(bp); } - if(n > 0){ - if(off > ip->size) - ip->size = off; - // write the i-node back to disk even if the size didn't change - // because the loop above might have called bmap() and added a new - // block to ip->addrs[]. - iupdate(ip); - } + if(off > ip->size) + ip->size = off; - return n; + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); + + return tot; } // Directories