]> git.hungrycats.org Git - linux/commitdiff
read/write: pass down a copy of f_pos, not f_pos itself.
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 9 Aug 2004 10:28:42 +0000 (03:28 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 9 Aug 2004 10:28:42 +0000 (03:28 -0700)
This allows the VFS layer to the update rather than the
low-level drivers.

fs/read_write.c

index d53bfe726a8d1075a207e5a7c3837e4fdec0d276..d85431d5d09ea99169309593d8ccb0ac760fdea0 100644 (file)
@@ -270,6 +270,16 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
 
 EXPORT_SYMBOL(vfs_write);
 
+static inline loff_t file_pos_read(struct file *file)
+{
+       return file->f_pos;
+}
+
+static inline void file_pos_write(struct file *file, loff_t pos)
+{
+       file->f_pos = pos;
+}
+
 asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
 {
        struct file *file;
@@ -278,7 +288,9 @@ asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
 
        file = fget_light(fd, &fput_needed);
        if (file) {
-               ret = vfs_read(file, buf, count, &file->f_pos);
+               loff_t pos = file_pos_read(file);
+               ret = vfs_read(file, buf, count, &pos);
+               file_pos_write(file, pos);
                fput_light(file, fput_needed);
        }
 
@@ -294,7 +306,9 @@ asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t co
 
        file = fget_light(fd, &fput_needed);
        if (file) {
-               ret = vfs_write(file, buf, count, &file->f_pos);
+               loff_t pos = file_pos_read(file);
+               ret = vfs_write(file, buf, count, &pos);
+               file_pos_write(file, pos);
                fput_light(file, fput_needed);
        }
 
@@ -520,7 +534,9 @@ sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
 
        file = fget_light(fd, &fput_needed);
        if (file) {
-               ret = vfs_readv(file, vec, vlen, &file->f_pos);
+               loff_t pos = file_pos_read(file);
+               ret = vfs_readv(file, vec, vlen, &pos);
+               file_pos_write(file, pos);
                fput_light(file, fput_needed);
        }
 
@@ -536,7 +552,9 @@ sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
 
        file = fget_light(fd, &fput_needed);
        if (file) {
-               ret = vfs_writev(file, vec, vlen, &file->f_pos);
+               loff_t pos = file_pos_read(file);
+               ret = vfs_writev(file, vec, vlen, &pos);
+               file_pos_write(file, pos);
                fput_light(file, fput_needed);
        }