mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
ocfs2: Free block to the right block group.
In case the block we are going to free is allocated from a discontiguous block group, we have to use suballoc_loc to be the right group. Signed-off-by: Tao Ma <tao.ma@oracle.com>
This commit is contained in:
parent
af2bf0d860
commit
74380c479a
6 changed files with 28 additions and 10 deletions
|
@ -6203,6 +6203,7 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb)
|
||||||
*/
|
*/
|
||||||
struct ocfs2_cached_block_free {
|
struct ocfs2_cached_block_free {
|
||||||
struct ocfs2_cached_block_free *free_next;
|
struct ocfs2_cached_block_free *free_next;
|
||||||
|
u64 free_bg;
|
||||||
u64 free_blk;
|
u64 free_blk;
|
||||||
unsigned int free_bit;
|
unsigned int free_bit;
|
||||||
};
|
};
|
||||||
|
@ -6249,6 +6250,9 @@ static int ocfs2_free_cached_blocks(struct ocfs2_super *osb,
|
||||||
}
|
}
|
||||||
|
|
||||||
while (head) {
|
while (head) {
|
||||||
|
if (head->free_bg)
|
||||||
|
bg_blkno = head->free_bg;
|
||||||
|
else
|
||||||
bg_blkno = ocfs2_which_suballoc_group(head->free_blk,
|
bg_blkno = ocfs2_which_suballoc_group(head->free_blk,
|
||||||
head->free_bit);
|
head->free_bit);
|
||||||
mlog(0, "Free bit: (bit %u, blkno %llu)\n",
|
mlog(0, "Free bit: (bit %u, blkno %llu)\n",
|
||||||
|
@ -6298,7 +6302,7 @@ int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct ocfs2_cached_block_free *item;
|
struct ocfs2_cached_block_free *item;
|
||||||
|
|
||||||
item = kmalloc(sizeof(*item), GFP_NOFS);
|
item = kzalloc(sizeof(*item), GFP_NOFS);
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
|
@ -6438,8 +6442,8 @@ ocfs2_find_per_slot_free_list(int type,
|
||||||
}
|
}
|
||||||
|
|
||||||
int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
int type, int slot, u64 blkno,
|
int type, int slot, u64 suballoc,
|
||||||
unsigned int bit)
|
u64 blkno, unsigned int bit)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct ocfs2_per_slot_free_list *fl;
|
struct ocfs2_per_slot_free_list *fl;
|
||||||
|
@ -6452,7 +6456,7 @@ int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
item = kmalloc(sizeof(*item), GFP_NOFS);
|
item = kzalloc(sizeof(*item), GFP_NOFS);
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
|
@ -6462,6 +6466,7 @@ int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
mlog(0, "Insert: (type %d, slot %u, bit %u, blk %llu)\n",
|
mlog(0, "Insert: (type %d, slot %u, bit %u, blk %llu)\n",
|
||||||
type, slot, bit, (unsigned long long)blkno);
|
type, slot, bit, (unsigned long long)blkno);
|
||||||
|
|
||||||
|
item->free_bg = suballoc;
|
||||||
item->free_blk = blkno;
|
item->free_blk = blkno;
|
||||||
item->free_bit = bit;
|
item->free_bit = bit;
|
||||||
item->free_next = fl->f_first;
|
item->free_next = fl->f_first;
|
||||||
|
@ -6478,6 +6483,7 @@ static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
{
|
{
|
||||||
return ocfs2_cache_block_dealloc(ctxt, EXTENT_ALLOC_SYSTEM_INODE,
|
return ocfs2_cache_block_dealloc(ctxt, EXTENT_ALLOC_SYSTEM_INODE,
|
||||||
le16_to_cpu(eb->h_suballoc_slot),
|
le16_to_cpu(eb->h_suballoc_slot),
|
||||||
|
le64_to_cpu(eb->h_suballoc_loc),
|
||||||
le64_to_cpu(eb->h_blkno),
|
le64_to_cpu(eb->h_blkno),
|
||||||
le16_to_cpu(eb->h_suballoc_bit));
|
le16_to_cpu(eb->h_suballoc_bit));
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,7 @@ static inline void ocfs2_init_dealloc_ctxt(struct ocfs2_cached_dealloc_ctxt *c)
|
||||||
int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
u64 blkno, unsigned int bit);
|
u64 blkno, unsigned int bit);
|
||||||
int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
|
||||||
int type, int slot, u64 blkno,
|
int type, int slot, u64 suballoc, u64 blkno,
|
||||||
unsigned int bit);
|
unsigned int bit);
|
||||||
static inline int ocfs2_dealloc_has_cluster(struct ocfs2_cached_dealloc_ctxt *c)
|
static inline int ocfs2_dealloc_has_cluster(struct ocfs2_cached_dealloc_ctxt *c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4466,6 +4466,9 @@ static int ocfs2_dx_dir_remove_index(struct inode *dir,
|
||||||
|
|
||||||
blk = le64_to_cpu(dx_root->dr_blkno);
|
blk = le64_to_cpu(dx_root->dr_blkno);
|
||||||
bit = le16_to_cpu(dx_root->dr_suballoc_bit);
|
bit = le16_to_cpu(dx_root->dr_suballoc_bit);
|
||||||
|
if (dx_root->dr_suballoc_loc)
|
||||||
|
bg_blkno = le64_to_cpu(dx_root->dr_suballoc_loc);
|
||||||
|
else
|
||||||
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
||||||
ret = ocfs2_free_suballoc_bits(handle, dx_alloc_inode, dx_alloc_bh,
|
ret = ocfs2_free_suballoc_bits(handle, dx_alloc_inode, dx_alloc_bh,
|
||||||
bit, bg_blkno, 1);
|
bit, bg_blkno, 1);
|
||||||
|
|
|
@ -792,6 +792,9 @@ int ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh)
|
||||||
if (le32_to_cpu(rb->rf_count) == 1) {
|
if (le32_to_cpu(rb->rf_count) == 1) {
|
||||||
blk = le64_to_cpu(rb->rf_blkno);
|
blk = le64_to_cpu(rb->rf_blkno);
|
||||||
bit = le16_to_cpu(rb->rf_suballoc_bit);
|
bit = le16_to_cpu(rb->rf_suballoc_bit);
|
||||||
|
if (rb->rf_suballoc_loc)
|
||||||
|
bg_blkno = le64_to_cpu(rb->rf_suballoc_loc);
|
||||||
|
else
|
||||||
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
||||||
|
|
||||||
alloc_inode = ocfs2_get_system_file_inode(osb,
|
alloc_inode = ocfs2_get_system_file_inode(osb,
|
||||||
|
@ -2108,6 +2111,7 @@ static int ocfs2_remove_refcount_extent(handle_t *handle,
|
||||||
*/
|
*/
|
||||||
ret = ocfs2_cache_block_dealloc(dealloc, EXTENT_ALLOC_SYSTEM_INODE,
|
ret = ocfs2_cache_block_dealloc(dealloc, EXTENT_ALLOC_SYSTEM_INODE,
|
||||||
le16_to_cpu(rb->rf_suballoc_slot),
|
le16_to_cpu(rb->rf_suballoc_slot),
|
||||||
|
le64_to_cpu(rb->rf_suballoc_loc),
|
||||||
le64_to_cpu(rb->rf_blkno),
|
le64_to_cpu(rb->rf_blkno),
|
||||||
le16_to_cpu(rb->rf_suballoc_bit));
|
le16_to_cpu(rb->rf_suballoc_bit));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -2349,6 +2349,8 @@ int ocfs2_free_dinode(handle_t *handle,
|
||||||
u16 bit = le16_to_cpu(di->i_suballoc_bit);
|
u16 bit = le16_to_cpu(di->i_suballoc_bit);
|
||||||
u64 bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
u64 bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
||||||
|
|
||||||
|
if (di->i_suballoc_loc)
|
||||||
|
bg_blkno = le64_to_cpu(di->i_suballoc_loc);
|
||||||
return ocfs2_free_suballoc_bits(handle, inode_alloc_inode,
|
return ocfs2_free_suballoc_bits(handle, inode_alloc_inode,
|
||||||
inode_alloc_bh, bit, bg_blkno, 1);
|
inode_alloc_bh, bit, bg_blkno, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2466,6 +2466,9 @@ static int ocfs2_xattr_free_block(struct inode *inode,
|
||||||
xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
|
xb = (struct ocfs2_xattr_block *)blk_bh->b_data;
|
||||||
blk = le64_to_cpu(xb->xb_blkno);
|
blk = le64_to_cpu(xb->xb_blkno);
|
||||||
bit = le16_to_cpu(xb->xb_suballoc_bit);
|
bit = le16_to_cpu(xb->xb_suballoc_bit);
|
||||||
|
if (xb->xb_suballoc_loc)
|
||||||
|
bg_blkno = le64_to_cpu(xb->xb_suballoc_loc);
|
||||||
|
else
|
||||||
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
bg_blkno = ocfs2_which_suballoc_group(blk, bit);
|
||||||
|
|
||||||
xb_alloc_inode = ocfs2_get_system_file_inode(osb,
|
xb_alloc_inode = ocfs2_get_system_file_inode(osb,
|
||||||
|
|
Loading…
Reference in a new issue