diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2020-10-23 10:18:30 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@mit.edu> | 2020-11-05 06:56:51 -0500 | 
| commit | 5e392531c07966fd8a6bee50e3e357c553fb2a2f (patch) | |
| tree | d58c45f27ef9431f277fc1b4cd411a13fb128fe3 /kernel | |
| parent | e1bb4c74346bc439e8c0cd93750f90bb82c537c8 (diff) | |
| download | xv6-labs-5e392531c07966fd8a6bee50e3e357c553fb2a2f.tar.gz xv6-labs-5e392531c07966fd8a6bee50e3e357c553fb2a2f.tar.bz2 xv6-labs-5e392531c07966fd8a6bee50e3e357c553fb2a2f.zip | |
hopefully make writei more correct
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/file.c | 6 | ||||
| -rw-r--r-- | 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 | 
