VFS/PFS: remove remnants of file position in pipes
This commit is contained in:
parent
306f3ccd6f
commit
b180f32ab3
2 changed files with 32 additions and 51 deletions
|
@ -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);
|
||||
|
|
|
@ -297,31 +297,19 @@ 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 (r != OK) {
|
||||
return(r);
|
||||
}
|
||||
|
||||
if (ex64hi(new_pos))
|
||||
panic("rw_pipe: bad new pos");
|
||||
|
||||
cum_io += cum_io_incr;
|
||||
buf += cum_io_incr;
|
||||
req_size -= cum_io_incr;
|
||||
}
|
||||
|
||||
/* 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 (r == OK) {
|
||||
if (partial_pipe) {
|
||||
/* partial write on pipe with */
|
||||
/* O_NONBLOCK, return write count */
|
||||
|
@ -334,9 +322,8 @@ size_t req_size;
|
|||
return(SUSPEND);
|
||||
}
|
||||
}
|
||||
|
||||
fp->fp_cum_io_partial = 0;
|
||||
|
||||
return(cum_io);
|
||||
}
|
||||
|
||||
return(r);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue