On 8/31/05, Machida, Hiroyuki <[EMAIL PROTECTED]> wrote: > How about this ? > > if (!MSDOS_I(dir)->scan_hints) { > hints = kcalllo(....); > > down > if (MSDOS_I(dir)->scan_hints) { > up > goto already_allocated; > } > if (hints) > MSDOS_I(dir)->scan_hints = hints; > up > } > return (hints == 0) ? -ENOMEM : 0; > > already_allocated: > kfree(hints); /* kfree accepts NULL */ > return 0;
After finally understanding what you're doing, how about: static inline int hint_allocate(struct inode *dir) { loff_t *hints; int err = 0; if (!MSDOS_I(dir)->scan_hints) return 0; hints = kcalloc(FAT_SCAN_NWAY, sizeof(loff_t), GFP_KERNEL); if (!hints) err = -ENOMEM; down(&MSDOS_I(dir)->scan_lock); /* * We allocated memory without scan_lock so lets make sure * no other thread completed hint_allocate() before us. */ if (!MSDOS_I(dir)->scan_hints) { MSDOS_I(dir)->scan_hints = hints; hints = NULL; } up(&MSDOS_I(dir)->scan_lock); kfree(hints); return err; } Pekka - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/