Re: Questions about XFS abnormal img mount test

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2/9/20 9:02 PM, zhengbin (A) wrote:
> ### question
> We recently used fuzz(hydra) to test 4.19 stable XFS and automatically generate tmp.img (XFS v5 format, but some metadata is wrong)

Since you are testing a stable series kernel, the first thing to do
would be to test an upstream kernel and see if the problem persists.
If it does not you can bisect to the solution.

If the problem persists in the current upstream kernel, please let us know
and we can look into it further.

> Test as follows:
> mount tmp.img tmpdir
> cp file tmpdir
> sync  --> stuck
> 
> ### cause analysis
> This is because tmp.img (only 1 AG) has some problems. Using xfs_repair detect information as follows:
> 
> agf_freeblks 0, counted 3224 in ag 0
> agf_longest 536874136, counted 3224 in ag 0 
> sb_fdblocks 613, counted 3228
> 
> The reason sync is blocked is :
> xfs_vm_writepages(xfs_address_space_operations--writepages)
>   write_cache_pages
>     xfs_do_writepage
>       xfs_writepage_map
> 	xfs_map_blocks
>           allocate_blocks:
> 	    error = xfs_iomap_write_allocate
> 			
> xfs_iomap_write_allocate
>   while (count_fsb != 0) {
>     nimaps = 0;
>       while (nimaps == 0) { --> endless loop
> 	nimaps = 1;
> 	error = xfs_bmapi_write(..., &nimaps) --> nimaps becomes 0 again
> 
> xfs_bmapi_write
>   xfs_bmap_alloc
>     xfs_bmap_btalloc
>       xfs_alloc_vextent
> 	xfs_alloc_fix_freelist
>           xfs_alloc_space_available --> less space than needed
> 
> xfs_alloc_space_available
>   alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop;
>     longest = xfs_alloc_longest_free_extent(pag, min_free, reservation);
>     if (longest < alloc_len)
>        return false;
> 
>     /* do we have enough free space remaining for the allocation? */
>     available = (int)(pag->pagf_freeblks + pag->pagf_flcount -
>                         reservation - min_free - args->minleft);
>     if (available < (int)max(args->total, alloc_len))
>       return false;
> 
> ### solve
> 1. Detect the above metadata corruption when mounting XFS?
>    agf_freeblks 0, counted 3224 in ag 0
>    agf_longest 536874136, counted 3224 in ag 0 
>    sb_fdblocks 613, counted 3228
> 
> 2. xfs_repair detection at system boot? If xfs_repair fails, refuse to mount XFS

no, we won't be running repair at every boot.

-Eric



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux