diff mbox

[2/2] ext3: Allow quota file use root reservation

Message ID 1319019383-12603-2-git-send-email-dmonakhov@openvz.org
State Not Applicable, archived
Headers show

Commit Message

Dmitry Monakhov Oct. 19, 2011, 10:16 a.m. UTC
Quota file is fs's metadata, so it is reasonable  to permit use
root resevation if necessary. This patch fix 265'th xfstest failure

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
---
 fs/ext3/balloc.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

Comments

Jan Kara Oct. 20, 2011, 11:36 p.m. UTC | #1
On Wed 19-10-11 14:16:23, Dmitry Monakhov wrote:
> Quota file is fs's metadata, so it is reasonable  to permit use
> root resevation if necessary. This patch fix 265'th xfstest failure
> 
> Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
> ---
>  fs/ext3/balloc.c |    8 ++++----
>  1 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c
> index 6386d76..5430559 100644
> --- a/fs/ext3/balloc.c
> +++ b/fs/ext3/balloc.c
...
> @@ -1546,7 +1546,7 @@ ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode,
>  	if (block_i && ((windowsz = block_i->rsv_window_node.rsv_goal_size) > 0))
>  		my_rsv = &block_i->rsv_window_node;
>  
> -	if (!ext3_has_free_blocks(sbi)) {
> +	if (!ext3_has_free_blocks(sbi, IS_NOQUOTA(inode))) {
>  		*errp = -ENOSPC;
>  		goto out;
>  	}
  Hmph, using IS_NOQUOTA() for a detection of quota files is a hack. But if
we look at it like "if a file is extempted from quota, it can be as well
allowed to use reserved blocks" then it makes some sense. So I'll take the
patch. Thanks.

								Honza
diff mbox

Patch

diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c
index 6386d76..5430559 100644
--- a/fs/ext3/balloc.c
+++ b/fs/ext3/balloc.c
@@ -1440,14 +1440,14 @@  out:
  *
  * Check if filesystem has at least 1 free block available for allocation.
  */
-static int ext3_has_free_blocks(struct ext3_sb_info *sbi)
+static int ext3_has_free_blocks(struct ext3_sb_info *sbi, int use_reservation)
 {
 	ext3_fsblk_t free_blocks, root_blocks;
 
 	free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
 	root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
 	if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
-		sbi->s_resuid != current_fsuid() &&
+		!use_reservation && sbi->s_resuid != current_fsuid() &&
 		(sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
 		return 0;
 	}
@@ -1468,7 +1468,7 @@  static int ext3_has_free_blocks(struct ext3_sb_info *sbi)
  */
 int ext3_should_retry_alloc(struct super_block *sb, int *retries)
 {
-	if (!ext3_has_free_blocks(EXT3_SB(sb)) || (*retries)++ > 3)
+	if (!ext3_has_free_blocks(EXT3_SB(sb), 0) || (*retries)++ > 3)
 		return 0;
 
 	jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);
@@ -1546,7 +1546,7 @@  ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode,
 	if (block_i && ((windowsz = block_i->rsv_window_node.rsv_goal_size) > 0))
 		my_rsv = &block_i->rsv_window_node;
 
-	if (!ext3_has_free_blocks(sbi)) {
+	if (!ext3_has_free_blocks(sbi, IS_NOQUOTA(inode))) {
 		*errp = -ENOSPC;
 		goto out;
 	}