|
@@ -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;
|
|
|
}
|