Hi all: I'm looking in ext4_mb_use_preallocated() and am seeing something odd. First we look through the inode prealloc list, and see if we have a preallocation that satisfies the allocation context: /* all fields in this condition don't change, * so we can skip locking for them */ if (ac->ac_o_ex.fe_logical < pa->pa_lstart || ac->ac_o_ex.fe_logical >= pa->pa_lstart + pa->pa_len) continue; /* non-extent files can't have physical blocks past 2^32 */ if (!(EXT4_I(ac->ac_inode)->i_flags & EXT4_EXTENTS_FL) && pa->pa_pstart + pa->pa_len > EXT4_MAX_BLOCK_FILE_PHYS) continue; /* found preallocated blocks, use them */ spin_lock(&pa->pa_lock); if (pa->pa_deleted == 0 && pa->pa_free) { => Now we're good, and have an AC that satisfies us. => We call ext4_mb_use_inode_pa(ac, pa); But ext4_mb_use_inode_pa() has this: BUG_ON(pa->pa_free < len); Nowhere do we check the 'pa_free' value to decide if this preallocation is okay to use. Further down in ext4_mb_use_preallocated() we check the locality group prealloc list; for this, we DO check pa_free: spin_lock(&pa->pa_lock); if (pa->pa_deleted == 0 && pa->pa_free >= ac->ac_o_ex.fe_len) { cpa = ext4_mb_check_group_pa(goal_block, pa, cpa); So my question is: Is it a bug that we don't check that an inode preallocation has enough free blocks for the AC before we try to use it? I have hit the BUG_ON above at least once in my testing, but I can't characterize what the workload was at the time (nor can I reproduce it...). Thanks, Curt -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html