forked from mirrors/linux
		
	xfs: fallback to vmalloc for large buffers in xfs_attrmulti_attr_get
xfsdump uses for a large buffer for extended attributes, which has a kmalloc'd shadow buffer in the kernel. This can fail after the system has been running for some time as it is a high order allocation. Add a fallback to vmalloc so that it doesn't require contiguous memory and so won't randomly fail while xfsdump is running. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
		
							parent
							
								
									6eb2466036
								
							
						
					
					
						commit
						ad650f5b27
					
				
					 1 changed files with 10 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -450,9 +450,12 @@ xfs_attrmulti_attr_get(
 | 
			
		|||
 | 
			
		||||
	if (*len > XATTR_SIZE_MAX)
 | 
			
		||||
		return EINVAL;
 | 
			
		||||
	kbuf = kmalloc(*len, GFP_KERNEL);
 | 
			
		||||
	if (!kbuf)
 | 
			
		||||
		return ENOMEM;
 | 
			
		||||
	kbuf = kmem_zalloc(*len, KM_SLEEP | KM_MAYFAIL);
 | 
			
		||||
	if (!kbuf) {
 | 
			
		||||
		kbuf = kmem_zalloc_large(*len);
 | 
			
		||||
		if (!kbuf)
 | 
			
		||||
			return ENOMEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	error = xfs_attr_get(XFS_I(inode), name, kbuf, (int *)len, flags);
 | 
			
		||||
	if (error)
 | 
			
		||||
| 
						 | 
				
			
			@ -462,7 +465,10 @@ xfs_attrmulti_attr_get(
 | 
			
		|||
		error = EFAULT;
 | 
			
		||||
 | 
			
		||||
 out_kfree:
 | 
			
		||||
	kfree(kbuf);
 | 
			
		||||
	if (is_vmalloc_addr(kbuf))
 | 
			
		||||
		kmem_free_large(kbuf);
 | 
			
		||||
	else
 | 
			
		||||
		kmem_free(kbuf);
 | 
			
		||||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue