public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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