Message ID | 1264863768-27606-4-git-send-email-maximlevitsky@gmail.com |
---|---|
State | New, archived |
Headers | show |
On Sat, 30 Jan 2010, Maxim Levitsky wrote: > This patch adds tracking for open and close calls. > Now trans ->open and ->release are never called twise in a row > ->release is also called once before mtd device disappers > ... > --- a/drivers/mtd/mtd_blkdevs.c > +++ b/drivers/mtd/mtd_blkdevs.c > @@ -128,6 +128,9 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) > if (!get_mtd_device(NULL, dev->mtd->index)) > goto out; > > + if (dev->open++) > + goto out; > + > if (!try_module_get(tr->owner)) > goto out_tr; > > @@ -153,6 +156,10 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) > struct mtd_blktrans_ops *tr = dev->tr; > int ret = 0; > > + dev->open--; > + if (dev->open) > + return 0; > + Just a very minor quibble: if you use if (dev->open++) in one function, why not use if (--dev->open) in the other? Or separate the increment/decrement from the test, depending on you style preferences. /Ricard
On Mon, 2010-02-01 at 08:46 +0100, Ricard Wanderlof wrote: > On Sat, 30 Jan 2010, Maxim Levitsky wrote: > > > This patch adds tracking for open and close calls. > > Now trans ->open and ->release are never called twise in a row > > ->release is also called once before mtd device disappers > > ... > > > --- a/drivers/mtd/mtd_blkdevs.c > > +++ b/drivers/mtd/mtd_blkdevs.c > > @@ -128,6 +128,9 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) > > if (!get_mtd_device(NULL, dev->mtd->index)) > > goto out; > > > > + if (dev->open++) > > + goto out; > > + > > if (!try_module_get(tr->owner)) > > goto out_tr; > > > > @@ -153,6 +156,10 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) > > struct mtd_blktrans_ops *tr = dev->tr; > > int ret = 0; > > > > + dev->open--; > > + if (dev->open) > > + return 0; > > + > > Just a very minor quibble: if you use if (dev->open++) in one function, > why not use if (--dev->open) in the other? Or separate the > increment/decrement from the test, depending on you style preferences. No problem, this just got lost in all the noise. I tried all kinds of approaches to make hotplug reliable, before finally making it be so. (It is really stable here, I didn't have any hotplug related issues for very long time) In fact I feel that my xd card is more stable that sd one... (I recently found a bug in sdhci driver....) I would be very happy to receive a full review of the patches, and get it in the kernel. Best regards, Maxim Levitsky
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 93c87af..966398b 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -128,6 +128,9 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) if (!get_mtd_device(NULL, dev->mtd->index)) goto out; + if (dev->open++) + goto out; + if (!try_module_get(tr->owner)) goto out_tr; @@ -153,6 +156,10 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) struct mtd_blktrans_ops *tr = dev->tr; int ret = 0; + dev->open--; + if (dev->open) + return 0; + if (tr->release) ret = tr->release(dev); @@ -304,6 +311,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new) if (new->readonly) set_disk_ro(gd, 1); + new->open = 0; add_disk(gd); return 0; @@ -333,6 +341,16 @@ int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) /* Stop the thread */ kthread_stop(old->thread); + if (old->open) { + if (old->tr->release) + old->tr->release(old); + put_mtd_device(old->mtd); + } + + /* From now on, no calls into trans can be made */ + /* Mtd device will be gone real soon now */ + old->mtd = NULL; + blk_cleanup_queue(old->rq); return 0; } diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index a4b3928..507f7b2 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h @@ -24,6 +24,7 @@ struct mtd_blktrans_dev { int devnum; unsigned long size; int readonly; + int open; struct gendisk *disk; struct task_struct *thread; struct request_queue *rq;
This patch adds tracking for open and close calls. Now trans ->open and ->release are never called twise in a row ->release is also called once before mtd device disappers Proper locking will be added in follow up patch Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> --- drivers/mtd/mtd_blkdevs.c | 18 ++++++++++++++++++ include/linux/mtd/blktrans.h | 1 + 2 files changed, 19 insertions(+), 0 deletions(-)