VFS/PFS: remove remnants of file position in pipes

This commit is contained in:
Thomas Veerman 2013-01-22 16:40:53 +00:00
parent 306f3ccd6f
commit b180f32ab3
2 changed files with 32 additions and 51 deletions

View file

@ -1,7 +1,8 @@
#include "fs.h"
#include "buf.h"
#include <minix/com.h>
#include "inode.h"
#include <minix/com.h>
#include <string.h>
/*===========================================================================*
@ -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);

View file

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