]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS/PFS: remove remnants of file position in pipes
authorThomas Veerman <thomas@minix3.org>
Tue, 22 Jan 2013 16:40:53 +0000 (16:40 +0000)
committerThomas Veerman <thomas@minix3.org>
Wed, 23 Jan 2013 11:14:34 +0000 (11:14 +0000)
servers/pfs/read.c
servers/vfs/read.c

index d80647b58d2059c272ee230bb29fe39b3300b8c8..86a4f0b1eba77ca13d06d050ec9285b8e09d09b6 100644 (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);
index 65722ab41066dbdbe35696b60b9b90d2c5a81031..05f173aa282af42d386e238c92df00e413334d32 100644 (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);
 }