ssize_t bw;
        mm_segment_t old_fs = get_fs();
 
+       file_start_write(file);
        set_fs(get_ds());
        bw = file->f_op->write(file, buf, len, &pos);
        set_fs(old_fs);
+       file_end_write(file);
        if (likely(bw == len))
                return 0;
        printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n",
 
                        }
 
                        data = kmap(page);
+                       file_start_write(file);
                        old_fs = get_fs();
                        set_fs(KERNEL_DS);
                        ret = file->f_op->write(
                                file, (const void __user *) data, len, &pos);
                        set_fs(old_fs);
                        kunmap(page);
+                       file_end_write(file);
                        if (ret != len)
                                ret = -EIO;
                }
 
                return -EINVAL;
 
        host_inode = file_inode(host_file);
+       file_start_write(host_file);
        mutex_lock(&coda_inode->i_mutex);
 
        ret = host_file->f_op->write(host_file, buf, count, ppos);
        coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
        coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC;
        mutex_unlock(&coda_inode->i_mutex);
+       file_end_write(host_file);
 
        return ret;
 }
 
                goto close_fail;
        if (displaced)
                put_files_struct(displaced);
+       file_start_write(cprm.file);
        retval = binfmt->core_dump(&cprm);
        if (retval)
                current->signal->group_exit_code |= 0x80;
+       file_end_write(cprm.file);
 
        if (ispipe && core_pipe_limit)
                wait_for_dump_helpers(cprm.file);
 
        struct kiocb kiocb;
        ssize_t ret;
 
-       file_start_write(filp);
        init_sync_kiocb(&kiocb, filp);
        kiocb.ki_pos = *ppos;
        kiocb.ki_left = len;
        if (-EIOCBQUEUED == ret)
                ret = wait_on_sync_kiocb(&kiocb);
        *ppos = kiocb.ki_pos;
-       file_end_write(filp);
        return ret;
 }
 
        ret = rw_verify_area(WRITE, file, pos, count);
        if (ret >= 0) {
                count = ret;
+               file_start_write(file);
                if (file->f_op->write)
                        ret = file->f_op->write(file, buf, count, pos);
                else
                        add_wchar(current, ret);
                }
                inc_syscw(current);
+               file_end_write(file);
        }
 
        return ret;
        } else {
                fn = (io_fn_t)file->f_op->write;
                fnv = file->f_op->aio_write;
+               file_start_write(file);
        }
 
-       if (fnv) {
-               file_start_write(file);
+       if (fnv)
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-               file_end_write(file);
-       } else
+       else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
+       if (type != READ)
+               file_end_write(file);
+
 out:
        if (iov != iovstack)
                kfree(iov);
        } else {
                fn = (io_fn_t)file->f_op->write;
                fnv = file->f_op->aio_write;
+               file_start_write(file);
        }
 
-       if (fnv) {
-               file_start_write(file);
+       if (fnv)
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-               file_end_write(file);
-       } else
+       else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
+       if (type != READ)
+               file_end_write(file);
+
 out:
        if (iov != iovstack)
                kfree(iov);
 
        loff_t tmp = sd->pos;
 
        data = buf->ops->map(pipe, buf, 0);
+       file_start_write(sd->u.file);
        ret = __kernel_write(sd->u.file, data + buf->offset, sd->len, &tmp);
+       file_end_write(sd->u.file);
        buf->ops->unmap(pipe, buf, data);
 
        return ret;
 
         * Kernel segment override to datasegment and write it
         * to the accounting file.
         */
+       file_start_write(file);
        fs = get_fs();
        set_fs(KERNEL_DS);
        /*
                               sizeof(acct_t), &file->f_pos);
        current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
        set_fs(fs);
+       file_end_write(file);
 out:
        revert_creds(orig_cred);
 }
 
        loff_t pos;
        ssize_t ret;
 
-       sb_start_write(inode->i_sb);
-
        mutex_lock(&inode->i_mutex);
 
        if (!access_ok(VERIFY_READ, buf, len)) {
        current->backing_dev_info = NULL;
  out_up:
        mutex_unlock(&inode->i_mutex);
-       sb_end_write(inode->i_sb);
        return ret;
 }
 EXPORT_SYMBOL_GPL(xip_file_write);