Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753235AbbDBOeE (ORCPT ); Thu, 2 Apr 2015 10:34:04 -0400 Received: from a.ns.miles-group.at ([95.130.255.143]:65275 "EHLO radon.swed.at" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752639AbbDBOd5 (ORCPT ); Thu, 2 Apr 2015 10:33:57 -0400 Message-ID: <551D5352.8060305@nod.at> Date: Thu, 02 Apr 2015 16:33:54 +0200 From: Richard Weinberger User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Fabio Estevam CC: Brian Norris , "linux-mtd@lists.infradead.org" , David Woodhouse , linux-kernel Subject: Re: [PATCH] mtd: Add simple read disturb test References: <1427984026-31100-1-git-send-email-richard@nod.at> In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3169 Lines: 101 Am 02.04.2015 um 16:32 schrieb Fabio Estevam: > On Thu, Apr 2, 2015 at 11:13 AM, Richard Weinberger wrote: > >> + err = -ENOMEM; >> + iobuf = kmalloc(mtd->erasesize, GFP_KERNEL); >> + if (!iobuf) >> + goto out; > > The error handling here does not look right. > >> + >> + iobuf_orig = kmalloc(mtd->erasesize, GFP_KERNEL); >> + if (!iobuf_orig) >> + goto out; >> + >> + prandom_bytes_state(&rnd_state, iobuf_orig, mtd->erasesize); >> + >> + bit_flips = kcalloc(ebcnt, sizeof(unsigned long), GFP_KERNEL); >> + if (!bit_flips) >> + goto out; >> + >> + bbt = kzalloc(ebcnt, GFP_KERNEL); >> + if (!bbt) >> + goto out; >> + >> + err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt); >> + if (err) >> + goto out; >> + >> + pr_info("erasing and programming flash\n"); >> + for (i = 0; i < ebcnt; ++i) { >> + if (skip_blocks && i % skip_blocks != 0) >> + continue; >> + >> + if (bbt[i]) >> + continue; >> + >> + ret = mtdtest_erase_eraseblock(mtd, i); >> + if (ret) { >> + err = ret; >> + goto out; >> + } >> + >> + ret = mtdtest_write(mtd, i * mtd->erasesize, mtd->erasesize, >> + iobuf_orig); >> + if (ret) { >> + err = ret; >> + goto out; >> + } >> + >> + ret = mtdtest_relax(); >> + if (ret) >> + goto out; >> + } >> + >> + pr_info("starting read disturb test on every %ith block\n", >> + skip_blocks); >> + while (!ret) { >> + for (i = 0; i < ebcnt; ++i) { >> + if (skip_blocks && i % skip_blocks != 0) >> + continue; >> + >> + if (bbt[i]) >> + continue; >> + >> + ret = read_eraseblock_by_page(i, iteration); >> + >> + ret = mtdtest_relax(); >> + if (ret) >> + goto out; >> + } >> + >> + iteration++; >> + if (iteration % 1000 == 0) >> + pr_info("iteration %lu started\n", iteration); >> + } >> + >> + if (err) >> + pr_info("finished with errors\n"); >> + else >> + pr_info("finished\n"); >> + >> +out: >> + >> + kfree(bit_flips); >> + kfree(iobuf); >> + kfree(iobuf_orig); >> + kfree(bbt); > > ,as you have a single label to handle all the free's. Why? Free()ing a NULL pointer is perfectly fine. What did I miss? :) Thanks, //richard -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/