Skip to content

Commit a2824f1

Browse files
committed
Merge tag 'mtd/fixes-for-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
Pull MTD fixes from Miquel Raynal: "MTD core fixes: - Fix lock hierarchy in deregister_mtd_blktrans - Handle flashes without OTP gracefully - Break circular locks in register_mtd_blktrans MTD device fixes: - mchp48l640: - Fix memory leak on cmd - Silence some uninitialized variable warnings - blkdevs: - Initialize rq.limits.discard_granularity CFI fixes: - Fix crash when erasing/writing AMD cards Raw NAND fixes: - Fix of_get_nand_secure_regions(): - Add a missing check - Avoid an unwanted probe failure when a DT property is missing" * tag 'mtd/fixes-for-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: mtd: rawnand: Fix probe failure due to of_get_nand_secure_regions() mtd: fix lock hierarchy in deregister_mtd_blktrans mtd: devices: mchp48l640: Fix memory leak on cmd mtd: cfi_cmdset_0002: fix crash when erasing/writing AMD cards mtd: core: handle flashes without OTP gracefully mtd: mchp48l640: silence some uninitialized variable warnings mtd: break circular locks in register_mtd_blktrans mtd: rawnand: Add a check in of_get_nand_secure_regions() mtd: mtd_blkdevs: Initialize rq.limits.discard_granularity
2 parents b88bcc7 + b480270 commit a2824f1

File tree

5 files changed

+19
-13
lines changed

5 files changed

+19
-13
lines changed

drivers/mtd/chips/cfi_cmdset_0002.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ static int cfi_use_status_reg(struct cfi_private *cfi)
119119
struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
120120
u8 poll_mask = CFI_POLL_STATUS_REG | CFI_POLL_DQ;
121121

122-
return extp->MinorVersion >= '5' &&
122+
return extp && extp->MinorVersion >= '5' &&
123123
(extp->SoftwareFeatures & poll_mask) == CFI_POLL_STATUS_REG;
124124
}
125125

drivers/mtd/devices/mchp48l640.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static int mchp48l640_write(struct mtd_info *mtd, loff_t to, size_t len,
229229
woff += ws;
230230
}
231231

232-
return ret;
232+
return 0;
233233
}
234234

235235
static int mchp48l640_read_page(struct mtd_info *mtd, loff_t from, size_t len,
@@ -255,6 +255,7 @@ static int mchp48l640_read_page(struct mtd_info *mtd, loff_t from, size_t len,
255255
if (!ret)
256256
*retlen += len;
257257

258+
kfree(cmd);
258259
return ret;
259260

260261
fail:
@@ -286,7 +287,7 @@ static int mchp48l640_read(struct mtd_info *mtd, loff_t from, size_t len,
286287
woff += ws;
287288
}
288289

289-
return ret;
290+
return 0;
290291
};
291292

292293
static const struct mchp48_caps mchp48l640_caps = {

drivers/mtd/mtd_blkdevs.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
419419
if (tr->discard) {
420420
blk_queue_flag_set(QUEUE_FLAG_DISCARD, new->rq);
421421
blk_queue_max_discard_sectors(new->rq, UINT_MAX);
422+
new->rq->limits.discard_granularity = tr->blksize;
422423
}
423424

424425
gd->queue = new->rq;
@@ -525,14 +526,10 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
525526
if (!blktrans_notifier.list.next)
526527
register_mtd_user(&blktrans_notifier);
527528

528-
529-
mutex_lock(&mtd_table_mutex);
530-
531529
ret = register_blkdev(tr->major, tr->name);
532530
if (ret < 0) {
533531
printk(KERN_WARNING "Unable to register %s block device on major %d: %d\n",
534532
tr->name, tr->major, ret);
535-
mutex_unlock(&mtd_table_mutex);
536533
return ret;
537534
}
538535

@@ -542,12 +539,12 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
542539
tr->blkshift = ffs(tr->blksize) - 1;
543540

544541
INIT_LIST_HEAD(&tr->devs);
545-
list_add(&tr->list, &blktrans_majors);
546542

543+
mutex_lock(&mtd_table_mutex);
544+
list_add(&tr->list, &blktrans_majors);
547545
mtd_for_each_device(mtd)
548546
if (mtd->type != MTD_ABSENT)
549547
tr->add_mtd(tr, mtd);
550-
551548
mutex_unlock(&mtd_table_mutex);
552549
return 0;
553550
}
@@ -564,8 +561,8 @@ int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr)
564561
list_for_each_entry_safe(dev, next, &tr->devs, list)
565562
tr->remove_dev(dev);
566563

567-
unregister_blkdev(tr->major, tr->name);
568564
mutex_unlock(&mtd_table_mutex);
565+
unregister_blkdev(tr->major, tr->name);
569566

570567
BUG_ON(!list_empty(&tr->devs));
571568
return 0;

drivers/mtd/mtdcore.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,9 @@ static ssize_t mtd_otp_size(struct mtd_info *mtd, bool is_user)
806806

807807
err:
808808
kfree(info);
809-
return ret;
809+
810+
/* ENODATA means there is no OTP region. */
811+
return ret == -ENODATA ? 0 : ret;
810812
}
811813

812814
static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd,

drivers/mtd/nand/raw/nand_base.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5228,12 +5228,18 @@ static bool of_get_nand_on_flash_bbt(struct device_node *np)
52285228
static int of_get_nand_secure_regions(struct nand_chip *chip)
52295229
{
52305230
struct device_node *dn = nand_get_flash_node(chip);
5231+
struct property *prop;
52315232
int nr_elem, i, j;
52325233

5233-
nr_elem = of_property_count_elems_of_size(dn, "secure-regions", sizeof(u64));
5234-
if (!nr_elem)
5234+
/* Only proceed if the "secure-regions" property is present in DT */
5235+
prop = of_find_property(dn, "secure-regions", NULL);
5236+
if (!prop)
52355237
return 0;
52365238

5239+
nr_elem = of_property_count_elems_of_size(dn, "secure-regions", sizeof(u64));
5240+
if (nr_elem <= 0)
5241+
return nr_elem;
5242+
52375243
chip->nr_secure_regions = nr_elem / 2;
52385244
chip->secure_regions = kcalloc(chip->nr_secure_regions, sizeof(*chip->secure_regions),
52395245
GFP_KERNEL);

0 commit comments

Comments
 (0)