14 Jul, 2012

3 commits

  • Pass mount flags to sget() so that it can use them in initialising a new
    superblock before the set function is called. They could also be passed to the
    compare function.

    Signed-off-by: David Howells
    Signed-off-by: Al Viro

    David Howells
     
  • boolean "does it have to be exclusive?" flag is passed instead;
    Local filesystem should just ignore it - the object is guaranteed
    not to be there yet.

    Signed-off-by: Al Viro

    Al Viro
     
  • Just the flags; only NFS cares even about that, but there are
    legitimate uses for such argument. And getting rid of that
    completely would require splitting ->lookup() into a couple
    of methods (at least), so let's leave that alone for now...

    Signed-off-by: Al Viro

    Al Viro
     

06 May, 2012

1 commit

  • After we moved inode_sync_wait() from end_writeback() it doesn't make sense
    to call the function end_writeback() anymore. Rename it to clear_inode()
    which well says what the function really does - set I_CLEAR flag.

    Signed-off-by: Jan Kara
    Signed-off-by: Fengguang Wu

    Jan Kara
     

22 Mar, 2012

1 commit

  • Pull vfs pile 1 from Al Viro:
    "This is _not_ all; in particular, Miklos' and Jan's stuff is not there
    yet."

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (64 commits)
    ext4: initialization of ext4_li_mtx needs to be done earlier
    debugfs-related mode_t whack-a-mole
    hfsplus: add an ioctl to bless files
    hfsplus: change finder_info to u32
    hfsplus: initialise userflags
    qnx4: new helper - try_extent()
    qnx4: get rid of qnx4_bread/qnx4_getblk
    take removal of PF_FORKNOEXEC to flush_old_exec()
    trim includes in inode.c
    um: uml_dup_mmap() relies on ->mmap_sem being held, but activate_mm() doesn't hold it
    um: embed ->stub_pages[] into mmu_context
    gadgetfs: list_for_each_safe() misuse
    ocfs2: fix leaks on failure exits in module_init
    ecryptfs: make register_filesystem() the last potential failure exit
    ntfs: forgets to unregister sysctls on register_filesystem() failure
    logfs: missing cleanup on register_filesystem() failure
    jfs: mising cleanup on register_filesystem() failure
    make configfs_pin_fs() return root dentry on success
    configfs: configfs_create_dir() has parent dentry in dentry->d_parent
    configfs: sanitize configfs_create()
    ...

    Linus Torvalds
     

21 Mar, 2012

3 commits


20 Mar, 2012

1 commit


02 Feb, 2012

1 commit

  • This patch fixes merge conflict resolution breakage introduced by merge
    d3712b9dfcf4 ("Merge tag 'for-linus' of git://github.com/prasad-joshi/logfs_upstream").

    The commit changed 'mtd_can_have_bb()' function and made it always
    return zero, which is incorrect. Instead, we need it to return whether
    the underlying flash device can have bad eraseblocks or not. UBI needs
    this information because it affects how it handles the underlying flash.
    E.g., if the underlying flash is NOR, it cannot have bad blocks and any
    write or erase error is fatal, and all we can do is to switch to R/O
    mode. We do not need to reserve a pool of good eraseblocks for bad
    eraseblocks handling, and so on.

    This patch also removes 'mtd_can_have_bb()' invocations from Logfs to
    ensure correct Logfs behavior.

    I've tested that with this patch UBI works on top of NOR and NAND
    flashes emulated by mtdram and nandsim correspondingly.

    This patch is based on patch from Linus Torvalds.

    Signed-off-by: Artem Bityutskiy
    Acked-by: Jörn Engel
    Acked-by: Prasad Joshi
    Acked-by: Brian Norris
    Signed-off-by: Linus Torvalds

    Artem Bityutskiy
     

01 Feb, 2012

1 commit

  • There are few important bug fixes for LogFS

    * tag 'for-linus' of git://github.com/prasad-joshi/logfs_upstream:
    Logfs: Allow NULL block_isbad() methods
    logfs: Grow inode in delete path
    logfs: Free areas before calling generic_shutdown_super()
    logfs: remove useless BUG_ON
    MAINTAINERS: Add Prasad Joshi in LogFS maintiners
    logfs: Propagate page parameter to __logfs_write_inode
    logfs: set superblock shutdown flag after generic sb shutdown
    logfs: take write mutex lock during fsync and sync
    logfs: Prevent memory corruption
    logfs: update page reference count for pined pages

    Fix up conflict in fs/logfs/dev_mtd.c due to semantic change in what
    "mtd->block_isbad" means in commit f2933e86ad93: "Logfs: Allow NULL
    block_isbad() methods" clashing with the abstraction changes in the
    commits 7086c19d0742: "mtd: introduce mtd_block_isbad interface" and
    d58b27ed58a3: "logfs: do not use 'mtd->block_isbad' directly".

    This resolution takes the semantics from commit f2933e86ad93, and just
    makes mtd_block_isbad() return zero (false) if the 'block_isbad'
    function is NULL. But that also means that now "mtd_can_have_bb()"
    always returns 0.

    Now, "mtd_block_markbad()" will obviously return an error if the
    low-level driver doesn't support bad blocks, so this is somewhat
    non-symmetric, but it actually makes sense if a NULL "block_isbad"
    function is considered to mean "I assume that all my blocks are always
    good".

    Linus Torvalds
     

28 Jan, 2012

9 commits

  • Not all mtd drivers define block_isbad(). Let's assume no bad blocks
    instead of refusing to mount.

    Signed-off-by: Joern Engel

    Joern Engel
     
  • Can be necessary if an inode gets deleted (through -ENOSPC) before being
    written. Might be better to move this into logfs_write_rec(), but for
    now go with the stupid&safe patch.

    Signed-off-by: Joern Engel

    Joern Engel
     
  • Or hit an assertion in map_invalidatepage() instead.

    Signed-off-by: Joern Engel

    Joern Engel
     
  • It prevents write sizes >4k.

    Signed-off-by: Joern Engel

    Joern Engel
     
  • During GC LogFS has to rewrite each valid block to a separate segment.
    Rewrite operation reads data from an old segment and writes it to a
    newly allocated segment. Since every write operation changes data
    block pointers maintained in inode, inode should also be rewritten.

    In GC path to avoid AB-BA deadlock LogFS marks a page with
    PG_pre_locked in addition to locking the page (PG_locked). The page
    lock is ignored iff the page is pre-locked.

    LogFS uses a special file called segment file. The segment file
    maintains an 8 bytes entry for every segment. It keeps track of erase
    count, level etc. for every segment.

    Bad things happen with a segment belonging to the segment file is GCed

    ------------[ cut here ]------------
    kernel BUG at /home/prasad/logfs/readwrite.c:297!
    invalid opcode: 0000 [#1] SMP
    Modules linked in: logfs joydev usbhid hid psmouse e1000 i2c_piix4
    serio_raw [last unloaded: logfs]
    Pid: 20161, comm: mount Not tainted 3.1.0-rc3+ #3 innotek GmbH
    VirtualBox
    EIP: 0060:[] EFLAGS: 00010292 CPU: 0
    EIP is at logfs_lock_write_page+0x6a/0x70 [logfs]
    EAX: 00000027 EBX: f73f5b20 ECX: c16007c8 EDX: 00000094
    ESI: 00000000 EDI: e59be6e4 EBP: c7337b28 ESP: c7337b18
    DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    Process mount (pid: 20161, ti=c7336000 task=eb323f70 task.ti=c7336000)
    Stack:
    f8099a3d c7337b24 f73f5b20 00001002 c7337b50 f8091f6d f8099a4d f80994e4
    00000003 00000000 c7337b68 00000000 c67e4400 00001000 c7337b80 f80935e5
    00000000 00000000 00000000 00000000 e1fcf000 0000000f e59be618 c70bf900
    Call Trace:
    [] logfs_get_write_page.clone.16+0xdd/0x100 [logfs]
    [] logfs_mod_segment_entry+0x55/0x110 [logfs]
    [] logfs_get_segment_entry+0x1d/0x20 [logfs]
    [] ? logfs_cleanup_journal+0x50/0x50 [logfs]
    [] ostore_get_erase_count+0x1b/0x40 [logfs]
    [] logfs_open_area+0xc8/0x150 [logfs]
    [] ? kmemleak_alloc+0x2c/0x60
    [] __logfs_segment_write.clone.16+0x4e/0x1b0 [logfs]
    [] ? mempool_kmalloc+0x13/0x20
    [] ? mempool_kmalloc+0x13/0x20
    [] logfs_segment_write+0x17f/0x1d0 [logfs]
    [] logfs_write_i0+0x11c/0x180 [logfs]
    [] logfs_write_direct+0x45/0x90 [logfs]
    [] __logfs_write_buf+0xbd/0xf0 [logfs]
    [] ? kmap_atomic_prot+0x4e/0xe0
    [] logfs_write_buf+0x3b/0x60 [logfs]
    [] __logfs_write_inode+0xa9/0x110 [logfs]
    [] logfs_rewrite_block+0xc0/0x110 [logfs]
    [] ? get_mapping_page+0x10/0x60 [logfs]
    [] ? logfs_load_object_aliases+0x2e0/0x2f0 [logfs]
    [] logfs_gc_segment+0x2ad/0x310 [logfs]
    [] __logfs_gc_once+0x4a/0x80 [logfs]
    [] logfs_gc_pass+0x683/0x6a0 [logfs]
    [] logfs_mount+0x5a9/0x680 [logfs]
    [] mount_fs+0x21/0xd0
    [] ? __alloc_percpu+0xf/0x20
    [] ? alloc_vfsmnt+0xb1/0x130
    [] vfs_kern_mount+0x4b/0xa0
    [] do_kern_mount+0x3e/0xe0
    [] do_mount+0x34d/0x670
    [] ? strndup_user+0x49/0x70
    [] sys_mount+0x6b/0xa0
    [] syscall_call+0x7/0xb
    Code: f8 e8 8b 93 39 c9 8b 45 f8 3e 0f ba 28 00 19 d2 85 d2 74 ca eb d0 0f 0b 8d 45 fc 89 44 24 04 c7 04 24 3d 9a 09 f8 e8 09 92 39 c9 0b 8d 74 26 00 55 89 e5 3e 8d 74 26 00 8b 10 80 e6 01 74 09
    EIP: [] logfs_lock_write_page+0x6a/0x70 [logfs] SS:ESP 0068:c7337b18
    ---[ end trace 96e67d5b3aa3d6ca ]---

    The patch passes locked page to __logfs_write_inode. It calls function
    logfs_get_wblocks() to pre-lock the page. This ensures any further
    attempts to lock the page are ignored (esp from get_erase_count).

    Acked-by: Joern Engel
    Signed-off-by: Prasad Joshi

    Prasad Joshi
     
  • While unmounting the file system LogFS calls generic_shutdown_super.
    The function does file system independent superblock shutdown.
    However, it might result in call file system specific inode eviction.

    LogFS marks FS shutting down by setting bit LOGFS_SB_FLAG_SHUTDOWN in
    super->s_flags. Since, inode eviction might call truncate on inode,
    following BUG is observed when file system is unmounted:

    ------------[ cut here ]------------
    kernel BUG at /home/prasad/logfs/segment.c:362!
    invalid opcode: 0000 [#1] PREEMPT SMP
    CPU 3
    Modules linked in: logfs binfmt_misc ppdev virtio_blk parport_pc lp
    parport psmouse floppy virtio_pci serio_raw virtio_ring virtio

    Pid: 1933, comm: umount Not tainted 3.0.0+ #4 Bochs Bochs
    RIP: 0010:[] []
    logfs_segment_write+0x211/0x230 [logfs]
    RSP: 0018:ffff880062d7b9e8 EFLAGS: 00010202
    RAX: 000000000000000e RBX: ffff88006eca9000 RCX: 0000000000000000
    RDX: ffff88006fd87c40 RSI: ffffea00014ff468 RDI: ffff88007b68e000
    RBP: ffff880062d7ba48 R08: 8000000020451430 R09: 0000000000000000
    R10: dead000000100100 R11: 0000000000000000 R12: ffff88006fd87c40
    R13: ffffea00014ff468 R14: ffff88005ad0a460 R15: 0000000000000000
    FS: 00007f25d50ea760(0000) GS:ffff88007fd80000(0000)
    knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 0000000000d05e48 CR3: 0000000062c72000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process umount (pid: 1933, threadinfo ffff880062d7a000,
    task ffff880070b44500)
    Stack:
    ffff880062d7ba38 ffff88005ad0a508 0000000000001000 0000000000000000
    8000000020451430 ffffea00014ff468 ffff880062d7ba48 ffff88005ad0a460
    ffff880062d7bad8 ffffea00014ff468 ffff88006fd87c40 0000000000000000
    Call Trace:
    [] logfs_write_i0+0x12e/0x190 [logfs]
    [] __logfs_write_rec+0x140/0x220 [logfs]
    [] __logfs_write_rec+0xf2/0x220 [logfs]
    [] logfs_write_rec+0x64/0xd0 [logfs]
    [] __logfs_write_buf+0x106/0x110 [logfs]
    [] logfs_write_buf+0x4e/0x80 [logfs]
    [] __logfs_write_inode+0x98/0x110 [logfs]
    [] logfs_truncate+0x54/0x290 [logfs]
    [] logfs_evict_inode+0xdc/0x190 [logfs]
    [] evict+0x85/0x170
    [] iput+0xe6/0x1b0
    [] shrink_dcache_for_umount_subtree+0x218/0x280
    [] shrink_dcache_for_umount+0x51/0x90
    [] generic_shutdown_super+0x2c/0x100
    [] logfs_kill_sb+0x57/0xf0 [logfs]
    [] deactivate_locked_super+0x45/0x70
    [] deactivate_super+0x4a/0x70
    [] mntput_no_expire+0xa4/0xf0
    [] sys_umount+0x6f/0x380
    [] system_call_fastpath+0x16/0x1b
    Code: 55 c8 49 8d b6 a8 00 00 00 45 89 f9 45 89 e8 4c 89 e1 4c 89 55
    b8 c7 04 24 00 00 00 00 e8 68 fc ff ff 4c 8b 55 b8 e9 3c ff ff ff
    0b 0f 0b c7 45 c0 00 00 00 00 e9 44 fe ff ff 66 66 66 66 66
    RIP [] logfs_segment_write+0x211/0x230 [logfs]
    RSP
    ---[ end trace fe6b040cea952290 ]---

    Therefore, move super->s_flags setting after the fs-indenpendent work
    has been finished.

    Reviewed-by: Joern Engel
    Signed-off-by: Prasad Joshi

    Prasad Joshi
     
  • LogFS uses super->s_write_mutex while writing data to disk. Taking the
    same mutex lock in sync and fsync code path solves the following BUG:

    ------------[ cut here ]------------
    kernel BUG at /home/prasad/logfs/dev_bdev.c:134!

    Pid: 2387, comm: flush-253:16 Not tainted 3.0.0+ #4 Bochs Bochs
    RIP: 0010:[] []
    bdev_writeseg+0x25d/0x270 [logfs]
    Call Trace:
    [] logfs_open_area+0x91/0x150 [logfs]
    [] ? find_level.clone.9+0x62/0x100
    [] __logfs_segment_write.clone.20+0x5c/0x190 [logfs]
    [] ? mempool_kmalloc+0x15/0x20
    [] ? mempool_alloc+0x53/0x130
    [] logfs_segment_write+0x1d4/0x230 [logfs]
    [] logfs_write_i0+0x12e/0x190 [logfs]
    [] __logfs_write_rec+0x140/0x220 [logfs]
    [] logfs_write_rec+0x64/0xd0 [logfs]
    [] __logfs_write_buf+0x106/0x110 [logfs]
    [] logfs_write_buf+0x4e/0x80 [logfs]
    [] __logfs_writepage+0x23/0x80 [logfs]
    [] logfs_writepage+0xdc/0x110 [logfs]
    [] __writepage+0x17/0x40
    [] write_cache_pages+0x208/0x4f0
    [] ? set_page_dirty+0x70/0x70
    [] generic_writepages+0x4a/0x70
    [] do_writepages+0x21/0x40
    [] writeback_single_inode+0x101/0x250
    [] writeback_sb_inodes+0xed/0x1c0
    [] writeback_inodes_wb+0x7b/0x1e0
    [] wb_writeback+0x4c3/0x530
    [] ? sub_preempt_count+0x9d/0xd0
    [] wb_do_writeback+0xdb/0x290
    [] ? sub_preempt_count+0x9d/0xd0
    [] ? _raw_spin_unlock_irqrestore+0x18/0x40
    [] ? del_timer+0x8a/0x120
    [] bdi_writeback_thread+0x8c/0x2e0
    [] ? wb_do_writeback+0x290/0x290
    [] kthread+0x96/0xa0
    [] kernel_thread_helper+0x4/0x10
    [] ? kthread_worker_fn+0x190/0x190
    [] ? gs_change+0xb/0xb
    RIP [] bdev_writeseg+0x25d/0x270 [logfs]
    ---[ end trace 0211ad60a57657c4 ]---

    Reviewed-by: Joern Engel
    Signed-off-by: Prasad Joshi

    Prasad Joshi
     
  • This is a bad one. I wonder whether we were so far protected by
    no_free_segments(sb) usually being smaller than LOGFS_NO_AREAS.

    Found by Dan Carpenter using smatch.

    Signed-off-by: Joern Engel
    Signed-off-by: Prasad Joshi

    Joern Engel
     
  • LogFS sets PG_private flag to indicate a pined page. We assumed that
    marking a page as private is enough to ensure its existence. But
    instead it is necessary to hold a reference count to the page.

    The change resolves the following BUG

    BUG: Bad page state in process flush-253:16 pfn:6a6d0
    page flags: 0x100000000000808(uptodate|private)

    Suggested-and-Acked-by: Joern Engel
    Signed-off-by: Prasad Joshi

    Prasad Joshi
     

11 Jan, 2012

1 commit

  • MTD pull for 3.3

    * tag 'for-linus-3.3' of git://git.infradead.org/mtd-2.6: (113 commits)
    mtd: Fix dependency for MTD_DOC200x
    mtd: do not use mtd->block_markbad directly
    logfs: do not use 'mtd->block_isbad' directly
    mtd: introduce mtd_can_have_bb helper
    mtd: do not use mtd->suspend and mtd->resume directly
    mtd: do not use mtd->lock, unlock and is_locked directly
    mtd: do not use mtd->sync directly
    mtd: harmonize mtd_writev usage
    mtd: do not use mtd->lock_user_prot_reg directly
    mtd: mtd->write_user_prot_reg directly
    mtd: do not use mtd->read_*_prot_reg directly
    mtd: do not use mtd->get_*_prot_info directly
    mtd: do not use mtd->read_oob directly
    mtd: mtdoops: do not use mtd->panic_write directly
    romfs: do not use mtd->get_unmapped_area directly
    mtd: do not use mtd->get_unmapped_area directly
    mtd: do use mtd->point directly
    mtd: introduce mtd_has_oob helper
    mtd: mtdcore: export symbols cleanup
    mtd: clean-up the default_mtd_writev function
    ...

    Fix up trivial edit/remove conflict in drivers/staging/spectra/lld_mtd.c

    Linus Torvalds
     

10 Jan, 2012

8 commits


04 Jan, 2012

5 commits


07 Nov, 2011

1 commit

  • * 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux: (230 commits)
    Revert "tracing: Include module.h in define_trace.h"
    irq: don't put module.h into irq.h for tracking irqgen modules.
    bluetooth: macroize two small inlines to avoid module.h
    ip_vs.h: fix implicit use of module_get/module_put from module.h
    nf_conntrack.h: fix up fallout from implicit moduleparam.h presence
    include: replace linux/module.h with "struct module" wherever possible
    include: convert various register fcns to macros to avoid include chaining
    crypto.h: remove unused crypto_tfm_alg_modname() inline
    uwb.h: fix implicit use of asm/page.h for PAGE_SIZE
    pm_runtime.h: explicitly requires notifier.h
    linux/dmaengine.h: fix implicit use of bitmap.h and asm/page.h
    miscdevice.h: fix up implicit use of lists and types
    stop_machine.h: fix implicit use of smp.h for smp_processor_id
    of: fix implicit use of errno.h in include/linux/of.h
    of_platform.h: delete needless include
    acpi: remove module.h include from platform/aclinux.h
    miscdevice.h: delete unnecessary inclusion of module.h
    device_cgroup.h: delete needless include
    net: sch_generic remove redundant use of
    net: inet_timewait_sock doesnt need
    ...

    Fix up trivial conflicts (other header files, and removal of the ab3550 mfd driver) in
    - drivers/media/dvb/frontends/dibx000_common.c
    - drivers/media/video/{mt9m111.c,ov6650.c}
    - drivers/mfd/ab3550-core.c
    - include/linux/dmaengine.h

    Linus Torvalds
     

02 Nov, 2011

3 commits


01 Nov, 2011

2 commits

  • memchr_inv() is mainly used to check whether the whole buffer is filled
    with just a specified byte.

    The function name and prototype are stolen from logfs and the
    implementation is from SLUB.

    Signed-off-by: Akinobu Mita
    Acked-by: Christoph Lameter
    Acked-by: Pekka Enberg
    Cc: Matt Mackall
    Acked-by: Joern Engel
    Cc: Marcin Slusarz
    Cc: Eric Dumazet
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Akinobu Mita
     
  • Some files were using the complete module.h infrastructure without
    actually including the header at all. Fix them up in advance so
    once the implicit presence is removed, we won't get failures like this:

    CC [M] fs/nfsd/nfssvc.o
    fs/nfsd/nfssvc.c: In function 'nfsd_create_serv':
    fs/nfsd/nfssvc.c:335: error: 'THIS_MODULE' undeclared (first use in this function)
    fs/nfsd/nfssvc.c:335: error: (Each undeclared identifier is reported only once
    fs/nfsd/nfssvc.c:335: error: for each function it appears in.)
    fs/nfsd/nfssvc.c: In function 'nfsd':
    fs/nfsd/nfssvc.c:555: error: implicit declaration of function 'module_put_and_exit'
    make[3]: *** [fs/nfsd/nfssvc.o] Error 1

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker