On Tue, May 20, 2008 at 10:08:04PM +0100, Tom Spink wrote:Hi Tom, I spotted one definite bug; on failure, you leave the superblock on the super_blocks list. Your locking may well be correct, but it has the hallmarks of being "a bit tricky" and a bit tricky means potentially buggy. How about doing the nesting the other way round, ie take the mutex first, then the spinlock? The code needs a bit of tweaking because you don't want to put the superblock on any list where it can be found until it's fully initialised. This may not be quite right: sget is a little more complex ... the fs_supers_lock would need to be dropped in a lot more places than I've shown here: @@ -365,11 +372,31 @@ retry: retry: + mutex_lock(&type->fs_supers_lock); spin_lock(&sb_lock); destroy_super(s); return ERR_PTR(err); } s->s_type = type; strlcpy(s->s_id, type->name, sizeof(s->s_id)); + if (list_empty(&type->fs_supers) && type->init) { + spin_unlock(&sb_lock); + err = type->init(); + if (err) { + mutex_unlock(&type->fs_supers_lock); + destroy_super(s); + return ERR_PTR(err); + } + spin_lock(&sb_lock); + } list_add_tail(&s->s_list, &super_blocks); list_add(&s->s_instances, &type->fs_supers); spin_unlock(&sb_lock); + mutex_unlock(&type->fs_supers_lock); get_filesystem(type); return s; } -- Intel are signing my paycheques ... these opinions are still mine "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." --
| Greg Kroah-Hartman | [PATCH 006/196] Chinese: add translation of oops-tracing.txt |
| Linus Torvalds | Linux 2.6.21-rc1 |
| david | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Vladislav Bolkhovitin | Re: Integration of SCST in the mainstream Linux kernel |
| Alexey Dobriyan | Re: [GIT]: Networking |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Evgeniy Polyakov | Re: [BUG] New Kernel Bugs |
git: | |
