• D
    proc: introduce proc_create_data to setup de->data · 59b74351
    Denis V. Lunev 提交于
    This set of patches fixes an proc ->open'less usage due to ->proc_fops flip in
    the most part of the kernel code.  The original OOPS is described in the
    commit 2d3a4e36:
    
        Typical PDE creation code looks like:
    
        	pde = create_proc_entry("foo", 0, NULL);
        	if (pde)
        		pde->proc_fops = &foo_proc_fops;
    
        Notice that PDE is first created, only then ->proc_fops is set up to
        final value. This is a problem because right after creation
        a) PDE is fully visible in /proc , and
        b) ->proc_fops are proc_file_operations which do not have ->open callback. So, it's
           possible to ->read without ->open (see one class of oopses below).
    
        The fix is new API called proc_create() which makes sure ->proc_fops are
        set up before gluing PDE to main tree. Typical new code looks like:
    
        	pde = proc_create("foo", 0, NULL, &foo_proc_fops);
        	if (!pde)
        		return -ENOMEM;
    
        Fix most networking users for a start.
    
        In the long run, create_proc_entry() for regular files will go.
    
    In addition to this, proc_create_data is introduced to fix reading from
    proc without PDE->data. The race is basically the same as above.
    
    create_proc_entries is replaced in the entire kernel code as new method
    is also simply better.
    
    This patch:
    
    The problem is the same as for de->proc_fops.  Right now PDE becomes visible
    without data set.  So, the entry could be looked up without data.  This, in
    most cases, will simply OOPS.
    
    proc_create_data call is created to address this issue.  proc_create now
    becomes a wrapper around it.
    Signed-off-by: NDenis V. Lunev <den@openvz.org>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: "J. Bruce Fields" <bfields@fieldses.org>
    Cc: Alessandro Zummo <a.zummo@towertech.it>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
    Cc: Chris Mason <chris.mason@oracle.com>
    Acked-by: NDavid Howells <dhowells@redhat.com>
    Cc: Dmitry Torokhov <dtor@mail.ru>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Grant Grundler <grundler@parisc-linux.org>
    Cc: Greg Kroah-Hartman <gregkh@suse.de>
    Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: Jaroslav Kysela <perex@suse.cz>
    Cc: Jeff Garzik <jgarzik@pobox.com>
    Cc: Jeff Mahoney <jeffm@suse.com>
    Cc: Jesper Nilsson <jesper.nilsson@axis.com>
    Cc: Karsten Keil <kkeil@suse.de>
    Cc: Kyle McMartin <kyle@parisc-linux.org>
    Cc: Len Brown <lenb@kernel.org>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    Cc: Matthew Wilcox <matthew@wil.cx>
    Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
    Cc: Mikael Starvik <starvik@axis.com>
    Cc: Nadia Derbey <Nadia.Derbey@bull.net>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Osterlund <petero2@telia.com>
    Cc: Pierre Peiffer <peifferp@gmail.com>
    Cc: Russell King <rmk@arm.linux.org.uk>
    Cc: Takashi Iwai <tiwai@suse.de>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    59b74351
root.c 5.0 KB