07 Aug, 2011

6 commits

  • * 'for-linus' of git://git.open-osd.org/linux-open-osd:
    ore: Make ore its own module
    exofs: Rename raid engine from exofs/ios.c => ore
    exofs: ios: Move to a per inode components & device-table
    exofs: Move exofs specific osd operations out of ios.c
    exofs: Add offset/length to exofs_get_io_state
    exofs: Fix truncate for the raid-groups case
    exofs: Small cleanup of exofs_fill_super
    exofs: BUG: Avoid sbi realloc
    exofs: Remove pnfs-osd private definitions
    nfs_xdr: Move nfs4_string definition out of #ifdef CONFIG_NFS_V4

    Linus Torvalds
     
  • Export everything from ore need exporting. Change Kbuild and Kconfig
    to build ore.ko as an independent module. Import ore from exofs

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • ORE stands for "Objects Raid Engine"

    This patch is a mechanical rename of everything that was in ios.c
    and its API declaration to an ore.c and an osd_ore.h header. The ore
    engine will later be used by the pnfs objects layout driver.

    * File ios.c => ore.c

    * Declaration of types and API are moved from exofs.h to a new
    osd_ore.h

    * All used types are prefixed by ore_ from their exofs_ name.

    * Shift includes from exofs.h to osd_ore.h so osd_ore.h is
    independent, include it from exofs.h.

    Other than a pure rename there are no other changes. Next patch
    will move the ore into it's own module and will export the API
    to be used by exofs and later the layout driver

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Exofs raid engine was saving on memory space by having a single layout-info,
    single pid, and a single device-table, global to the filesystem. Then passing
    a credential and object_id info at the io_state level, private for each
    inode. It would also devise this contraption of rotating the device table
    view for each inode->ino to spread out the device usage.

    This is not compatible with the pnfs-objects standard, demanding that
    each inode can have it's own layout-info, device-table, and each object
    component it's own pid, oid and creds.

    So: Bring exofs raid engine to be usable for generic pnfs-objects use by:

    * Define an exofs_comp structure that holds obj_id and credential info.

    * Break up exofs_layout struct to an exofs_components structure that holds a
    possible array of exofs_comp and the array of devices + the size of the
    arrays.

    * Add a "comps" parameter to get_io_state() that specifies the ids creds
    and device array to use for each IO.

    This enables to keep the layout global, but the device-table view, creds
    and IDs at the inode level. It only adds two 64bit to each inode, since
    some of these members already existed in another form.

    * ios raid engine now access layout-info and comps-info through the passed
    pointers. Everything is pre-prepared by caller for generic access of
    these structures and arrays.

    At the exofs Level:

    * Super block holds an exofs_components struct that holds the device
    array, previously in layout. The devices there are in device-table
    order. The device-array is twice bigger and repeats the device-table
    twice so now each inode's device array can point to a random device
    and have a round-robin view of the table, making it compatible to
    previous exofs versions.

    * Each inode has an exofs_components struct that is initialized at
    load time, with it's own view of the device table IDs and creds.
    When doing IO this gets passed to the io_state together with the
    layout.

    While preforming this change. Bugs where found where credentials with the
    wrong IDs where used to access the different SB objects (super.c). As well
    as some dead code. It was never noticed because the target we use does not
    check the credentials.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • ios.c will be moving to an external library, for use by the
    objects-layout-driver. Remove from it some exofs specific functions.

    Also g_attr_logical_length is used both by inode.c and ios.c
    move definition to the later, to keep it independent

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • In future raid code we will need to know the IO offset/length
    and if it's a read or write to determine some of the array
    sizes we'll need.

    So add a new exofs_get_rw_state() API for use when
    writeing/reading. All other simple cases are left using the
    old way.

    The major change to this is that now we need to call
    exofs_get_io_state later at inode.c::read_exec and
    inode.c::write_exec when we actually know these things. So this
    patch is kept separate so I can test things apart from other
    changes.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

05 Aug, 2011

4 commits

  • In the general raid-group case the truncate was wrong in that
    it did not also fix the object length of the neighboring groups.

    There are two bad cases in the old code:
    1. Space that should be freed was not.
    2. If a file That was big is truncated small, then made bigger
    again, the holes would not contain zeros but could expose old data.
    (If the growing of the file expands to more than a full
    groups cycle + group size (> S + T))

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Small cleanup that unifies duplicated code used in both the
    error and success cases

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Since the beginning we realloced the sbi structure when a bigger
    then one device table was specified. (I know that was really stupid).

    Then much later when "register bdi" was added (By Jens) it was
    registering the pointer to sbi->bdi before the realloc.

    We never saw this problem because up till now the realloc did not
    do anything since the device table was small enough to fit in the
    original allocation. But once we starting testing with large device
    tables (Bigger then 28) we noticed the crash of writeback operating
    on a deallocated pointer.

    * Avoid the all mess by allocating the device-table as a second array
    and get rid of the variable-sized structure and the rest of this
    mess.
    * Take the chance to clean near by structures and comments.
    * Add a needed dprint on startup to indicate the loaded layout.
    * Also move the bdi registration to the very end because it will
    only fail in a low memory, which will probably fail before hand.
    There are many more likely causes to not load before that. This
    way the error handling is made simpler. (Just doing this would be
    enough to fix the BUG)

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Now that pnfs-osd has hit mainline we can remove exofs's
    private header. (And the FIXME comment)

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

21 Jul, 2011

1 commit

  • Btrfs needs to be able to control how filemap_write_and_wait_range() is called
    in fsync to make it less of a painful operation, so push down taking i_mutex and
    the calling of filemap_write_and_wait() down into the ->fsync() handlers. Some
    file systems can drop taking the i_mutex altogether it seems, like ext3 and
    ocfs2. For correctness sake I just pushed everything down in all cases to make
    sure that we keep the current behavior the same for everybody, and then each
    individual fs maintainer can make up their mind about what to do from there.
    Thanks,

    Acked-by: Jan Kara
    Signed-off-by: Josef Bacik
    Signed-off-by: Al Viro

    Josef Bacik
     

20 Jul, 2011

1 commit


18 Jul, 2011

1 commit


31 Mar, 2011

1 commit


25 Mar, 2011

1 commit

  • * 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block: (65 commits)
    Documentation/iostats.txt: bit-size reference etc.
    cfq-iosched: removing unnecessary think time checking
    cfq-iosched: Don't clear queue stats when preempt.
    blk-throttle: Reset group slice when limits are changed
    blk-cgroup: Only give unaccounted_time under debug
    cfq-iosched: Don't set active queue in preempt
    block: fix non-atomic access to genhd inflight structures
    block: attempt to merge with existing requests on plug flush
    block: NULL dereference on error path in __blkdev_get()
    cfq-iosched: Don't update group weights when on service tree
    fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away
    block: Require subsystems to explicitly allocate bio_set integrity mempool
    jbd2: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    jbd: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    fs: make fsync_buffers_list() plug
    mm: make generic_writepages() use plugging
    blk-cgroup: Add unaccounted time to timeslice_used.
    block: fixup plugging stubs for !CONFIG_BLOCK
    block: remove obsolete comments for blkdev_issue_zeroout.
    blktrace: Use rq->cmd_flags directly in blk_add_trace_rq.
    ...

    Fix up conflicts in fs/{aio.c,super.c}

    Linus Torvalds
     

15 Mar, 2011

8 commits

  • One leftover from the days of IBM's original code, is an SB counter
    that counts in-flight asynchronous commands. And a piece of code that
    waits for the counter to reach zero at unmount. I guess it might have
    been needed then, cause of some reference missing or something.

    I'm not removing it yet but am putting a warning message if ever this
    counter triggers at unmount. If I'll never see it triggers or reported
    I'll remove the counter for good.
    (I had this print as a debug output for a long time and never had it
    trigger)

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Before when creating a new inode, we'd set the sb->s_dirt flag,
    and sometime later the system would write out s_nextid as part
    of the sb_info. Also on inode sync we would force the sb sync
    as well.

    Define the s_nextid as a new partition attribute and set it
    every time we create a new object.
    At mount we read it from it's new place.

    We now never set sb->s_dirt anywhere in exofs. write_super
    is actually never called. The call to exofs_write_super from
    exofs_put_super is also removed because the VFS always calls
    ->sync_fs before calling ->put_super twice.

    To stay backward-and-forward compatible we also write the old
    s_nextid in the super_block object at unmount, and support zero
    length attribute on mount.

    This also fixes a BUG where in layouts when group_width was not
    a divisor of EXOFS_SUPER_ID (0x10000) the s_nextid was not read
    from the device it was written to. Because of the sliding window
    layout trick, and because the read was always done from the 0
    device but the write was done via the raid engine that might slide
    the device view. Now we read and write through the raid engine.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • If /dev/osd* devices are shuffled because more devices
    where added, and/or login order has changed. It is hard to
    mount the FS you want.

    Add an option to mount by osdname. osdname is any osd-device's
    osdname as specified to the mkfs.exofs command when formatting
    the osd-devices.
    The new mount format is:
    OPT="osdname=$UUID0,pid=$PID,_netdev"
    mount -t exofs -o $OPT $DEV_OSD0 $MOUNTDIR

    if "osdname=" is specified in options above $DEV_OSD0 is
    ignored and can be empty.

    Also while at it: Removed some old unused Opt_* enums.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • * Set all inode->i_mapping->backing_dev_info to point to
    the per super-block sb->s_bdi.

    * Calculating a read_ahead that is:
    - preferable 2 stripes long
    (Future patch will add a mount option to override this)
    - Minimum 128K aligned up to stripe-size
    - Caped to maximum-IO-sizes round down to stripe_size.
    (Max sizes are governed by max bio-size that fits in a page
    times number-of-devices)

    CC: Marc Dionne
    Signed-off-by: Boaz Harrosh

    bharrosh@panasas.com
     
  • It is incorrect to test inode dirty bits without participating in the inode
    writeback protocol. Inode writeback sets I_SYNC and clears I_DIRTY_?, then
    writes out the particular bits, then clears I_SYNC when it is done. BTW. it
    may not completely write all pages out, so I_DIRTY_PAGES would get set
    again.

    This is a standard pattern used throughout the kernel's writeback caches
    (I_SYNC ~= I_WRITEBACK, if that makes it clearer).

    And so it is not possible to determine an inode's dirty status just by
    checking I_DIRTY bits. Especially not for the purpose of data integrity
    syncs.

    Missing the check for these bits means that fsync can complete while
    writeback to the inode is underway. Inode writeback functions get this
    right, so call into them rather than try to shortcut things by testing
    dirty state improperly.

    Signed-off-by: Nick Piggin
    Signed-off-by: Boaz Harrosh

    Nick Piggin
     
  • Don't attempt a read passed i_size, just zero the page and be
    done with it.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • I stumbled on some of these prints in log files so, might
    just submit the fixes.

    * All i_ino prints in exofs should be hex
    * All OSD_ERR prints should end with a "\n"

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • IS_ERR() already implies unlikely(), so it can be omitted here.

    Signed-off-by: Tobias Klauser

    Tobias Klauser
     

10 Mar, 2011

1 commit

  • Code has been converted over to the new explicit on-stack plugging,
    and delay users have been converted to use the new API for that.
    So lets kill off the old plugging along with aops->sync_page().

    Signed-off-by: Jens Axboe

    Jens Axboe
     

03 Mar, 2011

1 commit


03 Feb, 2011

1 commit

  • This reverts commit 115e19c53501edc11f730191f7f047736815ae3d.

    Apparently setting inode->bdi to one's own sb->s_bdi stops VFS from
    sending *read-aheads*. This problem was bisected to this commit. A
    revert fixes it. I'll investigate farther why is this happening for the
    next Kernel, but for now a revert.

    I'm sending to stable@kernel.org as well, since it exists also in
    2.6.37. 2.6.36 is good and does not have this patch.

    CC: Stable Tree
    Signed-off-by: Boaz Harrosh
    Signed-off-by: Linus Torvalds

    Boaz Harrosh
     

07 Jan, 2011

1 commit

  • RCU free the struct inode. This will allow:

    - Subsequent store-free path walking patch. The inode must be consulted for
    permissions when walking, so an RCU inode reference is a must.
    - sb_inode_list_lock to be moved inside i_lock because sb list walkers who want
    to take i_lock no longer need to take sb_inode_list_lock to walk the list in
    the first place. This will simplify and optimize locking.
    - Could remove some nested trylock loops in dcache code
    - Could potentially simplify things a bit in VM land. Do not need to take the
    page lock to follow page->mapping.

    The downsides of this is the performance cost of using RCU. In a simple
    creat/unlink microbenchmark, performance drops by about 10% due to inability to
    reuse cache-hot slab objects. As iterations increase and RCU freeing starts
    kicking over, this increases to about 20%.

    In cases where inode lifetimes are longer (ie. many inodes may be allocated
    during the average life span of a single inode), a lot of this cache reuse is
    not applicable, so the regression caused by this patch is smaller.

    The cache-hot regression could largely be avoided by using SLAB_DESTROY_BY_RCU,
    however this adds some complexity to list walking and store-free path walking,
    so I prefer to implement this at a later date, if it is shown to be a win in
    real situations. I haven't found a regression in any non-micro benchmark so I
    doubt it will be a problem.

    Signed-off-by: Nick Piggin

    Nick Piggin
     

29 Oct, 2010

1 commit


26 Oct, 2010

4 commits

  • Clones an existing reference to inode; caller must already hold one.

    Signed-off-by: Al Viro

    Al Viro
     
  • Add a new helper to write out the inode using the writeback code,
    that is including the correct dirty bit and list manipulation. A few
    of filesystems already opencode this, and a lot of others should be
    using it instead of using write_inode_now which also writes out the
    data.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • exofs_new_inode() was incrementing the inode->i_count and
    decrementing it in create_done(), in a bad attempt to make sure
    the inode will still be there when the asynchronous create_done()
    finally arrives. This was very stupid because iput() was not called,
    and if it was actually needed, it would leak the inode.

    However all this is not needed, because at exofs_evict_inode()
    we already wait for create_done() by waiting for the
    object_created event. Therefore remove the superfluous ref counting
    and just Thicken the comment at exofs_evict_inode() a bit.

    While at it change places that open coded wait_obj_created()
    to call the already available wrapper.

    CC: Dave Chinner
    CC: Christoph Hellwig
    CC: Nick Piggin
    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Signed-off-by: Joe Perches
    Signed-off-by: Boaz Harrosh

    Joe Perches
     

19 Oct, 2010

2 commits

  • Though it has been promised that inode->i_mapping->backing_dev_info
    is not used and the supporting code is fine. Until the pointer
    will default to NULL, I'd rather it points to the correct thing
    regardless.

    At least for future infrastructure coder it is a clear indication
    of where are the key points that inodes are initialized.
    I know because it took me time to find this out.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Last BUG fix added a flag to the the page_collect structure
    to communicate with readpage_strip. This calls for a clean up
    removing that flag's reincarnations in the read functions
    parameters.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

08 Oct, 2010

1 commit


12 Aug, 2010

1 commit


11 Aug, 2010

1 commit

  • * 'for-2.6.36' of git://git.kernel.dk/linux-2.6-block: (149 commits)
    block: make sure that REQ_* types are seen even with CONFIG_BLOCK=n
    xen-blkfront: fix missing out label
    blkdev: fix blkdev_issue_zeroout return value
    block: update request stacking methods to support discards
    block: fix missing export of blk_types.h
    writeback: fix bad _bh spinlock nesting
    drbd: revert "delay probes", feature is being re-implemented differently
    drbd: Initialize all members of sync_conf to their defaults [Bugz 315]
    drbd: Disable delay probes for the upcomming release
    writeback: cleanup bdi_register
    writeback: add new tracepoints
    writeback: remove unnecessary init_timer call
    writeback: optimize periodic bdi thread wakeups
    writeback: prevent unnecessary bdi threads wakeups
    writeback: move bdi threads exiting logic to the forker thread
    writeback: restructure bdi forker loop a little
    writeback: move last_active to bdi
    writeback: do not remove bdi from bdi_list
    writeback: simplify bdi code a little
    writeback: do not lose wake-ups in bdi threads
    ...

    Fixed up pretty trivial conflicts in drivers/block/virtio_blk.c and
    drivers/scsi/scsi_error.c as per Jens.

    Linus Torvalds
     

10 Aug, 2010

3 commits

  • Signed-off-by: Al Viro

    Al Viro
     
  • These changes are crafted based on the similar
    conversion done to ext2 by Nick Piggin.

    * Remove the deprecated ->truncate vector. Let exofs_setattr
    take care of on-disk size updates.
    * Call truncate_pagecache on the unused pages if
    write_begin/end fails.
    * Cleanup exofs_delete_inode that did stupid inode
    writes and updates on an inode that will be
    removed.
    * And finally get rid of exofs_get_block. We never
    had any blocks it was all for calling nobh_truncate_page.
    nobh_truncate_page is not actually needed in exofs since
    the last page is complete and gone, just like all the other
    pages. There is no partial blocks in exofs.

    I've tested with this patch, and there are no apparent
    failures, so far.

    CC: Nick Piggin
    CC: Christoph Hellwig
    Signed-off-by: Boaz Harrosh
    Signed-off-by: Al Viro

    Boaz Harrosh
     
  • Replace inode_setattr with opencoded variants of it in all callers. This
    moves the remaining call to vmtruncate into the filesystem methods where it
    can be replaced with the proper truncate sequence.

    In a few cases it was obvious that we would never end up calling vmtruncate
    so it was left out in the opencoded variant:

    spufs: explicitly checks for ATTR_SIZE earlier
    btrfs,hugetlbfs,logfs,dlmfs: explicitly clears ATTR_SIZE earlier
    ufs: contains an opencoded simple_seattr + truncate that sets the filesize just above

    In addition to that ncpfs called inode_setattr with handcrafted iattrs,
    which allowed to trim down the opencoded variant.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig