|
@@ -1835,24 +1835,12 @@ repeat:
|
|
|
* later. Real quota accounting is done at pages writeout
|
|
|
* time.
|
|
|
*/
|
|
|
- if (vfs_dq_reserve_block(inode, md_needed + 1)) {
|
|
|
- /*
|
|
|
- * We tend to badly over-estimate the amount of
|
|
|
- * metadata blocks which are needed, so if we have
|
|
|
- * reserved any metadata blocks, try to force out the
|
|
|
- * inode and see if we have any better luck.
|
|
|
- */
|
|
|
- if (md_reserved && retries++ <= 3)
|
|
|
- goto retry;
|
|
|
+ if (vfs_dq_reserve_block(inode, md_needed + 1))
|
|
|
return -EDQUOT;
|
|
|
- }
|
|
|
|
|
|
if (ext4_claim_free_blocks(sbi, md_needed + 1)) {
|
|
|
vfs_dq_release_reservation_block(inode, md_needed + 1);
|
|
|
if (ext4_should_retry_alloc(inode->i_sb, &retries)) {
|
|
|
- retry:
|
|
|
- if (md_reserved)
|
|
|
- write_inode_now(inode, (retries == 3));
|
|
|
yield();
|
|
|
goto repeat;
|
|
|
}
|
|
@@ -3032,7 +3020,7 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,
|
|
|
loff_t pos, unsigned len, unsigned flags,
|
|
|
struct page **pagep, void **fsdata)
|
|
|
{
|
|
|
- int ret, retries = 0;
|
|
|
+ int ret, retries = 0, quota_retries = 0;
|
|
|
struct page *page;
|
|
|
pgoff_t index;
|
|
|
unsigned from, to;
|
|
@@ -3091,6 +3079,22 @@ retry:
|
|
|
|
|
|
if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
|
|
|
goto retry;
|
|
|
+
|
|
|
+ if ((ret == -EDQUOT) &&
|
|
|
+ EXT4_I(inode)->i_reserved_meta_blocks &&
|
|
|
+ (quota_retries++ < 3)) {
|
|
|
+ /*
|
|
|
+ * Since we often over-estimate the number of meta
|
|
|
+ * data blocks required, we may sometimes get a
|
|
|
+ * spurios out of quota error even though there would
|
|
|
+ * be enough space once we write the data blocks and
|
|
|
+ * find out how many meta data blocks were _really_
|
|
|
+ * required. So try forcing the inode write to see if
|
|
|
+ * that helps.
|
|
|
+ */
|
|
|
+ write_inode_now(inode, (quota_retries == 3));
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
out:
|
|
|
return ret;
|
|
|
}
|