From 8e8bf2c2b607a80658b459473957f06c4089d8e9 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Mon, 26 Sep 2011 15:46:06 -0400 Subject: [PATCH] --- yaml --- r: 274635 b: refs/heads/master c: 726c35fa0edf1d9b8a88b73255532e73089aedda h: refs/heads/master i: 274633: 4af562607228ea6d957393899211c164e2cf0331 274631: 8a9710c4633a2c128caf734d04623e922c319932 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 061220727ebb..879c177510e3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1728366efa5ebf48bd2ed544afa8700cd07ba822 +refs/heads/master: 726c35fa0edf1d9b8a88b73255532e73089aedda diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 8005be176252..96fc9e342219 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -3526,7 +3526,7 @@ void btrfs_evict_inode(struct inode *inode) { struct btrfs_trans_handle *trans; struct btrfs_root *root = BTRFS_I(inode)->root; - struct btrfs_block_rsv *rsv; + struct btrfs_block_rsv *rsv, *global_rsv; u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); unsigned long nr; int ret; @@ -3561,6 +3561,7 @@ void btrfs_evict_inode(struct inode *inode) goto no_delete; } rsv->size = min_size; + global_rsv = &root->fs_info->global_block_rsv; btrfs_i_size_write(inode, 0); @@ -3577,6 +3578,15 @@ void btrfs_evict_inode(struct inode *inode) */ while (1) { ret = btrfs_block_rsv_check(root, rsv, min_size, 0, 1); + + /* + * Try and steal from the global reserve since we will + * likely not use this space anyway, we want to try as + * hard as possible to get this to work. + */ + if (ret) + ret = btrfs_block_rsv_migrate(global_rsv, rsv, min_size); + if (ret) { printk(KERN_WARNING "Could not get space for a " "delete, will truncate on mount %d\n", ret);