]> Pileus Git - ~andy/linux/blobdiff - fs/read_write.c
don't call file_pos_write() if vfs_{read,write}{,v}() fails
[~andy/linux] / fs / read_write.c
index abca7437d192434dfd99325531544525fe7779d7..f646c8b565b913d5cbe02a5dafb2aba5a4b163ef 100644 (file)
@@ -477,7 +477,8 @@ SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
        if (f.file) {
                loff_t pos = file_pos_read(f.file);
                ret = vfs_read(f.file, buf, count, &pos);
-               file_pos_write(f.file, pos);
+               if (ret >= 0)
+                       file_pos_write(f.file, pos);
                fdput(f);
        }
        return ret;
@@ -492,7 +493,8 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
        if (f.file) {
                loff_t pos = file_pos_read(f.file);
                ret = vfs_write(f.file, buf, count, &pos);
-               file_pos_write(f.file, pos);
+               if (ret >= 0)
+                       file_pos_write(f.file, pos);
                fdput(f);
        }
 
@@ -780,7 +782,8 @@ SYSCALL_DEFINE3(readv, unsigned long, fd, const struct iovec __user *, vec,
        if (f.file) {
                loff_t pos = file_pos_read(f.file);
                ret = vfs_readv(f.file, vec, vlen, &pos);
-               file_pos_write(f.file, pos);
+               if (ret >= 0)
+                       file_pos_write(f.file, pos);
                fdput(f);
        }
 
@@ -799,7 +802,8 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec,
        if (f.file) {
                loff_t pos = file_pos_read(f.file);
                ret = vfs_writev(f.file, vec, vlen, &pos);
-               file_pos_write(f.file, pos);
+               if (ret >= 0)
+                       file_pos_write(f.file, pos);
                fdput(f);
        }
 
@@ -959,7 +963,8 @@ COMPAT_SYSCALL_DEFINE3(readv, unsigned long, fd,
                return -EBADF;
        pos = f.file->f_pos;
        ret = compat_readv(f.file, vec, vlen, &pos);
-       f.file->f_pos = pos;
+       if (ret >= 0)
+               f.file->f_pos = pos;
        fdput(f);
        return ret;
 }
@@ -1025,7 +1030,8 @@ COMPAT_SYSCALL_DEFINE3(writev, unsigned long, fd,
                return -EBADF;
        pos = f.file->f_pos;
        ret = compat_writev(f.file, vec, vlen, &pos);
-       f.file->f_pos = pos;
+       if (ret >= 0)
+               f.file->f_pos = pos;
        fdput(f);
        return ret;
 }