From: Thomas Veerman Date: Tue, 22 Jan 2013 16:40:53 +0000 (+0000) Subject: VFS/PFS: remove remnants of file position in pipes X-Git-Tag: v3.2.1~81 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/mdoc.3.txt?a=commitdiff_plain;h=b180f32ab31e242bdf4fb80fc6606e32fb3e38dd;p=minix.git VFS/PFS: remove remnants of file position in pipes --- diff --git a/servers/pfs/read.c b/servers/pfs/read.c index d80647b58..86a4f0b1e 100644 --- a/servers/pfs/read.c +++ b/servers/pfs/read.c @@ -1,7 +1,8 @@ #include "fs.h" #include "buf.h" -#include #include "inode.h" +#include +#include /*===========================================================================* @@ -53,10 +54,10 @@ int fs_readwrite(message *fs_m_in, message *fs_m_out) return(EFBIG); } } else { - position = bp->b_bytes; - if (nrbytes > rip->i_size - position) { + position = 0; + if (nrbytes > rip->i_size) { /* There aren't that many bytes to read */ - nrbytes = rip->i_size - position; + nrbytes = rip->i_size; } } @@ -75,25 +76,18 @@ int fs_readwrite(message *fs_m_in, message *fs_m_out) cum_io += nrbytes; } - fs_m_out->RES_SEEK_POS_LO = position; /* It might change later and the VFS - has to know this value */ - /* On write, update file size and access time. */ if (rw_flag == WRITING) { - if (position > f_size) rip->i_size = position; + rip->i_size = position; } else { - if(position >= rip->i_size) { - /* All data in the pipe is read, so reset pipe pointers */ - rip->i_size = 0; /* no data left */ - position = 0; /* reset reader(s) */ - } + memmove(bp->b_data, bp->b_data+nrbytes, rip->i_size - nrbytes); + rip->i_size -= nrbytes; } - if (rw_flag == READING) - bp->b_bytes = position; if (rw_flag == READING) rip->i_update |= ATIME; if (rw_flag == WRITING) rip->i_update |= CTIME | MTIME; fs_m_out->RES_NBYTES = (size_t) cum_io; + fs_m_out->RES_SEEK_POS_LO = rip->i_size; put_inode(rip); put_block(rip->i_dev, rip->i_num); diff --git a/servers/vfs/read.c b/servers/vfs/read.c index 65722ab41..05f173aa2 100644 --- a/servers/vfs/read.c +++ b/servers/vfs/read.c @@ -297,46 +297,33 @@ size_t req_size; r = req_readwrite(vp->v_mapfs_e, vp->v_mapinode_nr, position, rw_flag, usr_e, buf, size, &new_pos, &cum_io_incr); - if (r >= 0) { - if (ex64hi(new_pos)) - panic("rw_pipe: bad new pos"); - - cum_io += cum_io_incr; - buf += cum_io_incr; - req_size -= cum_io_incr; + if (r != OK) { + return(r); } - /* On write, update file size and access time. */ - if (rw_flag == WRITING) { - if (cmp64ul(new_pos, vp->v_size) > 0) { - if (ex64hi(new_pos) != 0) { - panic("read_write: file size too big for v_size"); - } - vp->v_size = ex64lo(new_pos); - } - } else { - if (cmp64ul(new_pos, vp->v_size) >= 0) { - /* Pipe emtpy; reset size */ - vp->v_size = 0; + if (ex64hi(new_pos)) + panic("rw_pipe: bad new pos"); + + cum_io += cum_io_incr; + buf += cum_io_incr; + req_size -= cum_io_incr; + + vp->v_size = ex64lo(new_pos); + + if (partial_pipe) { + /* partial write on pipe with */ + /* O_NONBLOCK, return write count */ + if (!(oflags & O_NONBLOCK)) { + /* partial write on pipe with req_size > PIPE_SIZE, + * non-atomic + */ + fp->fp_cum_io_partial = cum_io; + pipe_suspend(f, buf, req_size); + return(SUSPEND); } } - if (r == OK) { - if (partial_pipe) { - /* partial write on pipe with */ - /* O_NONBLOCK, return write count */ - if (!(oflags & O_NONBLOCK)) { - /* partial write on pipe with req_size > PIPE_SIZE, - * non-atomic - */ - fp->fp_cum_io_partial = cum_io; - pipe_suspend(f, buf, req_size); - return(SUSPEND); - } - } - fp->fp_cum_io_partial = 0; - return(cum_io); - } + fp->fp_cum_io_partial = 0; - return(r); + return(cum_io); }