hopefully make writei more correct

This commit is contained in:
Robert Morris 2020-10-23 10:18:30 -04:00 committed by Frans Kaashoek
parent e1bb4c7434
commit 5e392531c0
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); iunlock(f->ip);
end_op(); end_op();
if(r < 0) if(r != n1){
// error from writei
break; break;
if(r != n1) }
panic("short filewrite");
i += r; i += r;
} }
ret = (i == n ? n : -1); 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. // Caller must hold ip->lock.
// If user_src==1, then src is a user virtual address; // If user_src==1, then src is a user virtual address;
// otherwise, src is a kernel 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 int
writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) 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); 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); brelse(bp);
n = -1;
break; break;
} }
log_write(bp); log_write(bp);
brelse(bp); brelse(bp);
} }
if(n > 0){
if(off > ip->size) if(off > ip->size)
ip->size = off; ip->size = off;
// write the i-node back to disk even if the size didn't change // 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 // because the loop above might have called bmap() and added a new
// block to ip->addrs[]. // block to ip->addrs[].
iupdate(ip); iupdate(ip);
}
return n; return tot;
} }
// Directories // Directories