mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	mtd: check for max_bitflips in mtd_read_oob()
mtd_read_oob() has some unexpected similarities to mtd_read(). For instance, when ops->datbuf != NULL, nand_base.c might return max_bitflips; however, when ops->datbuf == NULL, nand_base's code potentially could return -EUCLEAN (no in-tree drivers do this yet). In any case where the driver might return max_bitflips, we should translate this into an appropriate return code using the bitflip_threshold. Essentially, mtd_read_oob() duplicates the logic from mtd_read(). This prevents users of mtd_read_oob() from receiving a positive return value (i.e., from max_bitflips) and interpreting it as an unknown error. Artem: amend comments. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Reviewed-by: Mike Dunn <mikedunn@newsguy.com> Reviewed-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
		
							parent
							
								
									8bb8b85f67
								
							
						
					
					
						commit
						e47f68587b
					
				
					 1 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -860,10 +860,22 @@ EXPORT_SYMBOL_GPL(mtd_panic_write);
 | 
			
		|||
 | 
			
		||||
int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)
 | 
			
		||||
{
 | 
			
		||||
	int ret_code;
 | 
			
		||||
	ops->retlen = ops->oobretlen = 0;
 | 
			
		||||
	if (!mtd->_read_oob)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
	return mtd->_read_oob(mtd, from, ops);
 | 
			
		||||
	/*
 | 
			
		||||
	 * In cases where ops->datbuf != NULL, mtd->_read_oob() has semantics
 | 
			
		||||
	 * similar to mtd->_read(), returning a non-negative integer
 | 
			
		||||
	 * representing max bitflips. In other cases, mtd->_read_oob() may
 | 
			
		||||
	 * return -EUCLEAN. In all cases, perform similar logic to mtd_read().
 | 
			
		||||
	 */
 | 
			
		||||
	ret_code = mtd->_read_oob(mtd, from, ops);
 | 
			
		||||
	if (unlikely(ret_code < 0))
 | 
			
		||||
		return ret_code;
 | 
			
		||||
	if (mtd->ecc_strength == 0)
 | 
			
		||||
		return 0;	/* device lacks ecc */
 | 
			
		||||
	return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(mtd_read_oob);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue