swap: redirty page if page write fails on swap file
[deliverable/linux.git] / mm / filemap.c
index 2581826409f2f0fa279aeb9e0624b79cb872dabb..e989fb1eaa72ba33bc7ed1526d49f13d84249748 100644 (file)
@@ -188,6 +188,17 @@ static int sleep_on_page_killable(void *word)
        return fatal_signal_pending(current) ? -EINTR : 0;
 }
 
+static int filemap_check_errors(struct address_space *mapping)
+{
+       int ret = 0;
+       /* Check for outstanding write errors */
+       if (test_and_clear_bit(AS_ENOSPC, &mapping->flags))
+               ret = -ENOSPC;
+       if (test_and_clear_bit(AS_EIO, &mapping->flags))
+               ret = -EIO;
+       return ret;
+}
+
 /**
  * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
  * @mapping:   address space structure to write
@@ -269,10 +280,10 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte,
        pgoff_t end = end_byte >> PAGE_CACHE_SHIFT;
        struct pagevec pvec;
        int nr_pages;
-       int ret = 0;
+       int ret2, ret = 0;
 
        if (end_byte < start_byte)
-               return 0;
+               goto out;
 
        pagevec_init(&pvec, 0);
        while ((index <= end) &&
@@ -295,12 +306,10 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte,
                pagevec_release(&pvec);
                cond_resched();
        }
-
-       /* Check for outstanding write errors */
-       if (test_and_clear_bit(AS_ENOSPC, &mapping->flags))
-               ret = -ENOSPC;
-       if (test_and_clear_bit(AS_EIO, &mapping->flags))
-               ret = -EIO;
+out:
+       ret2 = filemap_check_errors(mapping);
+       if (!ret)
+               ret = ret2;
 
        return ret;
 }
@@ -341,6 +350,8 @@ int filemap_write_and_wait(struct address_space *mapping)
                        if (!err)
                                err = err2;
                }
+       } else {
+               err = filemap_check_errors(mapping);
        }
        return err;
 }
@@ -372,6 +383,8 @@ int filemap_write_and_wait_range(struct address_space *mapping,
                        if (!err)
                                err = err2;
                }
+       } else {
+               err = filemap_check_errors(mapping);
        }
        return err;
 }
This page took 0.025779 seconds and 5 git commands to generate.