1. 07 8月, 2011 4 次提交
    • B
      exofs: Rename raid engine from exofs/ios.c => ore · 8ff660ab
      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: NBoaz Harrosh <bharrosh@panasas.com>
      8ff660ab
    • B
      exofs: ios: Move to a per inode components & device-table · 9e9db456
      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: NBoaz Harrosh <bharrosh@panasas.com>
      9e9db456
    • B
      exofs: Move exofs specific osd operations out of ios.c · 85e44df4
      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: NBoaz Harrosh <bharrosh@panasas.com>
      85e44df4
    • B
      exofs: Add offset/length to exofs_get_io_state · e1042ba0
      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: NBoaz Harrosh <bharrosh@panasas.com>
      e1042ba0
  2. 05 8月, 2011 4 次提交
    • B
      exofs: Fix truncate for the raid-groups case · 16f75bb3
      Boaz Harrosh 提交于
      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: NBoaz Harrosh <bharrosh@panasas.com>
      16f75bb3
    • B
      exofs: Small cleanup of exofs_fill_super · 9ce73047
      Boaz Harrosh 提交于
      Small cleanup that unifies duplicated code used in both the
      error and success cases
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      9ce73047
    • B
      exofs: BUG: Avoid sbi realloc · 6d4073e8
      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: NBoaz Harrosh <bharrosh@panasas.com>
      6d4073e8
    • B
      exofs: Remove pnfs-osd private definitions · 26ae93c2
      Boaz Harrosh 提交于
      Now that pnfs-osd has hit mainline we can remove exofs's
      private header. (And the FIXME comment)
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      26ae93c2
  3. 18 7月, 2011 1 次提交
  4. 26 5月, 2011 3 次提交
  5. 31 3月, 2011 1 次提交
  6. 15 3月, 2011 8 次提交
    • B
      exofs: deprecate the commands pending counter · a49fb4c3
      Boaz Harrosh 提交于
      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: NBoaz Harrosh <bharrosh@panasas.com>
      a49fb4c3
    • B
      exofs: Write sbi->s_nextid as part of the Create command · 1cea312a
      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: NBoaz Harrosh <bharrosh@panasas.com>
      1cea312a
    • B
      exofs: Add option to mount by osdname · 9ed96484
      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: NBoaz Harrosh <bharrosh@panasas.com>
      9ed96484
    • B
      exofs: Override read-ahead to align on stripe_size · 66cd6cad
      bharrosh@panasas.com 提交于
      * 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 <marc.c.dionne@gmail.com>
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      66cd6cad
    • N
      exofs: simple fsync race fix · 97178b7b
      Nick Piggin 提交于
      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: NNick Piggin <npiggin@kernel.dk>
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      97178b7b
    • B
      exofs: Optimize read_4_write · a8f1418f
      Boaz Harrosh 提交于
      Don't attempt a read passed i_size, just zero the page and be
      done with it.
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      a8f1418f
    • B
      exofs: Trivial: fix some indentation and debug prints · 0a935519
      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: NBoaz Harrosh <bharrosh@panasas.com>
      0a935519
    • T
      exofs: Remove redundant unlikely() · 2c722c9a
      Tobias Klauser 提交于
      IS_ERR() already implies unlikely(), so it can be omitted here.
      Signed-off-by: NTobias Klauser <tklauser@distanz.ch>
      2c722c9a
  7. 10 3月, 2011 1 次提交
  8. 03 3月, 2011 1 次提交
  9. 03 2月, 2011 1 次提交
  10. 07 1月, 2011 1 次提交
    • N
      fs: icache RCU free inodes · fa0d7e3d
      Nick Piggin 提交于
      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: NNick Piggin <npiggin@kernel.dk>
      fa0d7e3d
  11. 29 10月, 2010 1 次提交
  12. 26 10月, 2010 4 次提交
  13. 19 10月, 2010 2 次提交
    • B
      exofs: Set i_mapping->backing_dev_info anyway · 115e19c5
      Boaz Harrosh 提交于
      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 bharrosh@panasas.com>
      115e19c5
    • B
      exofs: Cleaup read path in regard with read_for_write · 7aebf410
      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 bharrosh@panasas.com>
      7aebf410
  14. 08 10月, 2010 1 次提交
    • B
      exofs: Fix double page_unlock BUG in write_begin/end · f17b1f9f
      Boaz Harrosh 提交于
      This BUG is there since the first submit of the code, but only triggered
      in last Kernel. It's timing related do to the asynchronous object-creation
      behaviour of exofs. (Which should be investigated farther)
      
      The bug is obvious hence the fixed.
      
      Signed-off-by: Boaz Harrosh <Boaz Harrosh bharrosh@panasas.com>
      f17b1f9f
  15. 10 8月, 2010 3 次提交
    • A
      convert exofs to ->evict_inode() · 4ec70c9b
      Al Viro 提交于
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      4ec70c9b
    • B
      exofs: New truncate sequence · 2f246fd0
      Boaz Harrosh 提交于
      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 <npiggin@suse.de>
      CC: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      2f246fd0
    • C
      remove inode_setattr · 1025774c
      Christoph Hellwig 提交于
      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: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      1025774c
  16. 09 8月, 2010 1 次提交
  17. 08 8月, 2010 1 次提交
    • C
      block: unify flags for struct bio and struct request · 7b6d91da
      Christoph Hellwig 提交于
      Remove the current bio flags and reuse the request flags for the bio, too.
      This allows to more easily trace the type of I/O from the filesystem
      down to the block driver.  There were two flags in the bio that were
      missing in the requests:  BIO_RW_UNPLUG and BIO_RW_AHEAD.  Also I've
      renamed two request flags that had a superflous RW in them.
      
      Note that the flags are in bio.h despite having the REQ_ name - as
      blkdev.h includes bio.h that is the only way to go for now.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
      7b6d91da
  18. 04 8月, 2010 2 次提交
    • B
      exofs: Fix groups code when num_devices is not divisible by group_width · 5002dd18
      Boaz Harrosh 提交于
      There is a bug when num_devices is not divisible by group_width * mirrors.
      We would not return to the proper device and offset when looping on to the
      next group.
      
      The fix makes code simpler actually.
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      5002dd18
    • B
      exofs: Remove useless optimization · 6e31609b
      Boaz Harrosh 提交于
      We used to compact all used devices in an IO to the beginning
      of the device array in an io_state. And keep a last device used
      so in later loops we don't iterate on all device slots. This
      does not prevent us from checking if slots are empty since in
      reads we only read from a single mirror and jump to the next
      mirror-set.
      
      This optimization is marginal, and needlessly complicates the
      code. Specially when we will later want to support raid/456
      with same abstract code. So remove the distinction between
      "dev" and "comp". Only "dev" is used both as the device used
      and as the index (component) in the device array.
      
      [Note that now the io_state->dev member is redundant but I
       keep it because I might want to optimize by only IOing a
       single group, though keeping a group_width*mirrors devices
       in io_state, we now keep num-devices in each io_state]
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      6e31609b