* [PATCH][zram] Do not check for init flag before starting I/O
@ 2010-12-30 9:07 Nitin Gupta
2010-12-30 17:17 ` Linus Torvalds
0 siblings, 1 reply; 4+ messages in thread
From: Nitin Gupta @ 2010-12-30 9:07 UTC (permalink / raw)
To: Greg KH
Cc: Pekka Enberg, Linus Torvalds, Dennis Jansen, Linux Driver Project,
linux-kernel
zram module is unusable without this fix.
Checking for init_done flag in zram_make_request() results in a
*no-op* for any I/O operation since we simply always return
success. This flag is actually set when the first write occurs
on a zram disk which triggers its initialization.
Bug report: https://bugzilla.kernel.org/show_bug.cgi?id=25722
Reported-by: Dennis Jansen <dennis.jansen@web.de>
Signed-off-by: Nitin Gupta <ngupta@vflare.org>
---
drivers/staging/zram/zram_drv.c | 6 ------
1 files changed, 0 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
index 8c3c057..d0e9e02 100644
--- a/drivers/staging/zram/zram_drv.c
+++ b/drivers/staging/zram/zram_drv.c
@@ -435,12 +435,6 @@ static int zram_make_request(struct request_queue *queue, struct bio *bio)
int ret = 0;
struct zram *zram = queue->queuedata;
- if (unlikely(!zram->init_done)) {
- set_bit(BIO_UPTODATE, &bio->bi_flags);
- bio_endio(bio, 0);
- return 0;
- }
-
if (!valid_io_request(zram, bio)) {
zram_stat64_inc(zram, &zram->stats.invalid_io);
bio_io_error(bio);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH][zram] Do not check for init flag before starting I/O
2010-12-30 9:07 [PATCH][zram] Do not check for init flag before starting I/O Nitin Gupta
@ 2010-12-30 17:17 ` Linus Torvalds
2010-12-30 19:02 ` Nitin Gupta
0 siblings, 1 reply; 4+ messages in thread
From: Linus Torvalds @ 2010-12-30 17:17 UTC (permalink / raw)
To: Nitin Gupta
Cc: Greg KH, Pekka Enberg, Dennis Jansen, Linux Driver Project,
linux-kernel
On Thu, Dec 30, 2010 at 1:07 AM, Nitin Gupta <ngupta@vflare.org> wrote:
> zram module is unusable without this fix.
.. and apparently it oopses without it.
See commit 7e24cce38a99f3 which added the code that you now remove.
You were cc'd on it, I don't think we got any reply to it.
So no. I'm not taking this without way more explanations of why the
original problem isn't a problem any more.
Linus
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][zram] Do not check for init flag before starting I/O
2010-12-30 17:17 ` Linus Torvalds
@ 2010-12-30 19:02 ` Nitin Gupta
2010-12-30 20:09 ` Linus Torvalds
0 siblings, 1 reply; 4+ messages in thread
From: Nitin Gupta @ 2010-12-30 19:02 UTC (permalink / raw)
To: Linus Torvalds
Cc: Greg KH, Pekka Enberg, Dennis Jansen, Linux Driver Project,
linux-kernel
On 12/30/2010 10:47 PM, Linus Torvalds wrote:
> On Thu, Dec 30, 2010 at 1:07 AM, Nitin Gupta<ngupta@vflare.org> wrote:
>> zram module is unusable without this fix.
>
> .. and apparently it oopses without it.
>
> See commit 7e24cce38a99f3 which added the code that you now remove.
> You were cc'd on it, I don't think we got any reply to it.
>
This commit shows oops in zram_inc_stat() which does not exist in
staging tree version of zram. Its actually a problem with zram version
as present in project's own repository where we allocate struct
zram_stats_cpu upon device initialization. OTOH, In mainline/staging
version of zram, we allocate struct stats upfront, so this oops cannot
happen in mainline version.
So, this commit is not even applicable for mainline/staging tree. My
bad, I didn't get a chance to review that patch.
> So no. I'm not taking this without way more explanations of why the
> original problem isn't a problem any more.
>
I will now end development on local project repository and sync it with
the mainline version, so all future development happens on
mainline/staging only, avoiding such confusions in future.
Nitin
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][zram] Do not check for init flag before starting I/O
2010-12-30 19:02 ` Nitin Gupta
@ 2010-12-30 20:09 ` Linus Torvalds
0 siblings, 0 replies; 4+ messages in thread
From: Linus Torvalds @ 2010-12-30 20:09 UTC (permalink / raw)
To: Nitin Gupta
Cc: Greg KH, Pekka Enberg, Dennis Jansen, Linux Driver Project,
linux-kernel, Anton Blanchard, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 815 bytes --]
On Thu, Dec 30, 2010 at 11:02 AM, Nitin Gupta <ngupta@vflare.org> wrote:
>
> This commit shows oops in zram_inc_stat() which does not exist in staging
> tree version of zram. Its actually a problem with zram version as present in
> project's own repository where we allocate struct zram_stats_cpu upon device
> initialization. OTOH, In mainline/staging version of zram, we allocate
> struct stats upfront, so this oops cannot happen in mainline version.
>
> So, this commit is not even applicable for mainline/staging tree. My bad, I
> didn't get a chance to review that patch.
Ok. So it really is a revert, and the commit message for the revert
should have explained that.
I changed the commit message appropriately, and committed it as the
attached commit.
Linus
[-- Attachment #2: patch.diff --]
[-- Type: text/x-patch, Size: 6497 bytes --]
arch/avr32/kernel/module.c | 3 +--
arch/h8300/kernel/module.c | 3 +--
arch/mn10300/kernel/module.c | 3 +--
arch/parisc/kernel/module.c | 3 +--
arch/powerpc/kernel/module.c | 5 -----
arch/s390/kernel/module.c | 3 +--
arch/sh/kernel/module.c | 2 --
arch/x86/kernel/module.c | 3 +--
include/linux/module.h | 5 ++---
kernel/module.c | 3 +++
lib/bug.c | 6 ++----
11 files changed, 13 insertions(+), 26 deletions(-)
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c
index 98f94d0..a727f54 100644
--- a/arch/avr32/kernel/module.c
+++ b/arch/avr32/kernel/module.c
@@ -314,10 +314,9 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
vfree(module->arch.syminfo);
module->arch.syminfo = NULL;
- return module_bug_finalize(hdr, sechdrs, module);
+ return 0;
}
void module_arch_cleanup(struct module *module)
{
- module_bug_cleanup(module);
}
diff --git a/arch/h8300/kernel/module.c b/arch/h8300/kernel/module.c
index 0865e29..db4953d 100644
--- a/arch/h8300/kernel/module.c
+++ b/arch/h8300/kernel/module.c
@@ -112,10 +112,9 @@ int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
- return module_bug_finalize(hdr, sechdrs, me);
+ return 0;
}
void module_arch_cleanup(struct module *mod)
{
- module_bug_cleanup(mod);
}
diff --git a/arch/mn10300/kernel/module.c b/arch/mn10300/kernel/module.c
index 6aea7fd..196a111 100644
--- a/arch/mn10300/kernel/module.c
+++ b/arch/mn10300/kernel/module.c
@@ -206,7 +206,7 @@ int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *me)
{
- return module_bug_finalize(hdr, sechdrs, me);
+ return 0;
}
/*
@@ -214,5 +214,4 @@ int module_finalize(const Elf_Ehdr *hdr,
*/
void module_arch_cleanup(struct module *mod)
{
- module_bug_cleanup(mod);
}
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c
index 159a2b8..6e81bb5 100644
--- a/arch/parisc/kernel/module.c
+++ b/arch/parisc/kernel/module.c
@@ -941,11 +941,10 @@ int module_finalize(const Elf_Ehdr *hdr,
nsyms = newptr - (Elf_Sym *)symhdr->sh_addr;
DEBUGP("NEW num_symtab %lu\n", nsyms);
symhdr->sh_size = nsyms * sizeof(Elf_Sym);
- return module_bug_finalize(hdr, sechdrs, me);
+ return 0;
}
void module_arch_cleanup(struct module *mod)
{
deregister_unwind_table(mod);
- module_bug_cleanup(mod);
}
diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c
index 477c663..4ef93ae 100644
--- a/arch/powerpc/kernel/module.c
+++ b/arch/powerpc/kernel/module.c
@@ -65,10 +65,6 @@ int module_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sect;
int err;
- err = module_bug_finalize(hdr, sechdrs, me);
- if (err)
- return err;
-
/* Apply feature fixups */
sect = find_section(hdr, sechdrs, "__ftr_fixup");
if (sect != NULL)
@@ -101,5 +97,4 @@ int module_finalize(const Elf_Ehdr *hdr,
void module_arch_cleanup(struct module *mod)
{
- module_bug_cleanup(mod);
}
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c
index 22cfd63..f7167ee 100644
--- a/arch/s390/kernel/module.c
+++ b/arch/s390/kernel/module.c
@@ -407,10 +407,9 @@ int module_finalize(const Elf_Ehdr *hdr,
{
vfree(me->arch.syminfo);
me->arch.syminfo = NULL;
- return module_bug_finalize(hdr, sechdrs, me);
+ return 0;
}
void module_arch_cleanup(struct module *mod)
{
- module_bug_cleanup(mod);
}
diff --git a/arch/sh/kernel/module.c b/arch/sh/kernel/module.c
index 43adddf..ae0be69 100644
--- a/arch/sh/kernel/module.c
+++ b/arch/sh/kernel/module.c
@@ -149,13 +149,11 @@ int module_finalize(const Elf_Ehdr *hdr,
int ret = 0;
ret |= module_dwarf_finalize(hdr, sechdrs, me);
- ret |= module_bug_finalize(hdr, sechdrs, me);
return ret;
}
void module_arch_cleanup(struct module *mod)
{
- module_bug_cleanup(mod);
module_dwarf_cleanup(mod);
}
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index e0bc186..1c355c5 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -239,11 +239,10 @@ int module_finalize(const Elf_Ehdr *hdr,
apply_paravirt(pseg, pseg + para->sh_size);
}
- return module_bug_finalize(hdr, sechdrs, me);
+ return 0;
}
void module_arch_cleanup(struct module *mod)
{
alternatives_smp_module_del(mod);
- module_bug_cleanup(mod);
}
diff --git a/include/linux/module.h b/include/linux/module.h
index 8a6b9fd..aace066 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -686,17 +686,16 @@ extern int module_sysfs_initialized;
#ifdef CONFIG_GENERIC_BUG
-int module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *,
+void module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *,
struct module *);
void module_bug_cleanup(struct module *);
#else /* !CONFIG_GENERIC_BUG */
-static inline int module_bug_finalize(const Elf_Ehdr *hdr,
+static inline void module_bug_finalize(const Elf_Ehdr *hdr,
const Elf_Shdr *sechdrs,
struct module *mod)
{
- return 0;
}
static inline void module_bug_cleanup(struct module *mod) {}
#endif /* CONFIG_GENERIC_BUG */
diff --git a/kernel/module.c b/kernel/module.c
index d0b5f8d..e2aeddd 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2625,6 +2625,7 @@ static struct module *load_module(void __user *umod,
if (err < 0)
goto ddebug;
+ module_bug_finalize(info.hdr, info.sechdrs, mod);
list_add_rcu(&mod->list, &modules);
mutex_unlock(&module_mutex);
@@ -2650,6 +2651,8 @@ static struct module *load_module(void __user *umod,
mutex_lock(&module_mutex);
/* Unlink carefully: kallsyms could be walking list. */
list_del_rcu(&mod->list);
+ module_bug_cleanup(mod);
+
ddebug:
if (!mod->taints)
dynamic_debug_remove(info.debug);
diff --git a/lib/bug.c b/lib/bug.c
index 7cdfad8..1955209 100644
--- a/lib/bug.c
+++ b/lib/bug.c
@@ -72,8 +72,8 @@ static const struct bug_entry *module_find_bug(unsigned long bugaddr)
return NULL;
}
-int module_bug_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
- struct module *mod)
+void module_bug_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
+ struct module *mod)
{
char *secstrings;
unsigned int i;
@@ -97,8 +97,6 @@ int module_bug_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
* could potentially lead to deadlock and thus be counter-productive.
*/
list_add(&mod->bug_list, &module_bug_list);
-
- return 0;
}
void module_bug_cleanup(struct module *mod)
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-12-30 20:09 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-30 9:07 [PATCH][zram] Do not check for init flag before starting I/O Nitin Gupta
2010-12-30 17:17 ` Linus Torvalds
2010-12-30 19:02 ` Nitin Gupta
2010-12-30 20:09 ` Linus Torvalds
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox