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