hopefully make writei more correct

This commit is contained in:
Robert Morris 2020-10-23 10:18:30 -04:00
parent 147855e521
commit d7c0a1b7a7
2 changed files with 14 additions and 13 deletions

View file

@ -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);

View file

@ -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