[Yaffs] Yaffs on MTD, strange umount behaviour

Brad Beveridge bbeveridge@bluewatersys.com
Tue, 23 Nov 2004 14:24:04 +1300


Hi yaffsers.  I've noticed some slight strangeness in the yaffs/mtd 
interaction.
I have put debugging code in the 
drivers/mtd/mtd_blkdevs::blktrans_open/release functions, and when yaffs 
mounts blktrans_open gets called, and the use count increases.  When 
yaffs is umounted the blktrans_release function is not called - 
therefore the use count isn't decremented, and other clean up operations 
aren't done.  Normally this is OK, I can mount & umount as many times as 
I like.  However, if I happen to remove my mtd device (if you are 
curious, I have removable nand storage & I am rmmoding the nand driver 
module), then add the mtd device back & remount yaffs, it borks.

In the below structure (yaffs_fs.c)
static struct file_system_type yaffs_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "yaffs",
        .get_sb         = yaffs_read_super,
        //.kill_sb        = kill_block_super,
        .kill_sb      = kill_litter_super,
        .fs_flags       = FS_REQUIRES_DEV,
};
.kill_sb is set to kill_litter_super, but there is a (commented out) 
alternative of .kill_sb = kill_block_super.
I have found that setting kill_sb to be kill_block_super causes the 
blktrans_release function to be called when yaffs is unmounted, and I 
can happily go through the sequence of
- insmod driver
- mount yaffs
- umount yaffs
- rmmod driver

My question is: why should the default kill_litter_super be prefered 
over kill_block_super, and what might I have screwed up in the process 
of changing from one function to another?

Cheers
Brad