The following patch removes the f_error field and all checks of f_error.
Trond said:
  f_error was introduced for NFS, and made sense when we were guaranteed
  always to have a file pointer around when write errors occurred.  Since
  then, we have (for various reasons) had to introduce the nfs_open_context in
  order to track the file read/write state, and it made sense to move our
  f_error tracking there too.
Signed-off-by: Christoph Lameter <christoph@lameter.com>
Acked-by: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
        retval = -EFAULT;
        if (!access_ok(VERIFY_READ, iov.iov_base, iov.iov_len))
                goto out;
-        if (file->f_error) {
-                retval = file->f_error;
-                file->f_error = 0;
-                goto out;
-        }
        retval = -EFBIG;
        if (limit != RLIM_INFINITY) {
                if (pos >= limit) {
 
  */
 int filp_close(struct file *filp, fl_owner_t id)
 {
-       int retval;
-
-       /* Report and clear outstanding errors */
-       retval = filp->f_error;
-       if (retval)
-               filp->f_error = 0;
+       int retval = 0;
 
        if (!file_count(filp)) {
                printk(KERN_ERR "VFS: Close: file count is 0\n");
-               return retval;
+               return 0;
        }
 
-       if (filp->f_op && filp->f_op->flush) {
-               int err = filp->f_op->flush(filp);
-               if (!retval)
-                       retval = err;
-       }
+       if (filp->f_op && filp->f_op->flush)
+               retval = filp->f_op->flush(filp);
 
        dnotify_flush(filp, id);
        locks_remove_posix(filp, id);
 
        atomic_t                f_count;
        unsigned int            f_flags;
        mode_t                  f_mode;
-       int                     f_error;
        loff_t                  f_pos;
        struct fown_struct      f_owner;
        unsigned int            f_uid, f_gid;
 
         if (unlikely(*pos < 0))
                 return -EINVAL;
 
-        if (unlikely(file->f_error)) {
-                int err = file->f_error;
-                file->f_error = 0;
-                return err;
-        }
-
        if (!isblk) {
                /* FIXME: this is for backwards compatibility with 2.4 */
                if (file->f_flags & O_APPEND)