19 Jul, 2007

1 commit


18 Jul, 2007

1 commit


11 Jul, 2007

8 commits

  • We re-use the RESVSP/UNRESVSP ioctls from xfs which allow the user to
    allocate and deallocate regions to a file without zeroing data or changing
    i_size.

    Though renamed, the structure passed in from user is identical to struct
    xfs_flock64. The three fields that are actually used right now are l_whence,
    l_start and l_len.

    This should get ocfs2 immediate compatibility with userspace software using
    the pre-existing xfs ioctls.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Provide an internal interface for the removal of arbitrary file regions.

    ocfs2_remove_inode_range() takes a byte range within a file and will remove
    existing extents within that range. Partial clusters will be zeroed so that
    any read from within the region will return zeros.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • The partial cluster zeroing code used during truncate usually assumes that
    the rightmost byte in the range to be zeroed lies on a cluster boundary.
    This makes sense for truncate, but punching holes might require zeroing on
    non-aligned rightmost boundaries.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • This can now be trivially supported with re-use of our existing extend code.

    ocfs2_allocate_unwritten_extents() takes a start offset and a byte length
    and iterates over the inode, adding extents (marked as unwritten) until len
    is reached. Existing extents are skipped over.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Update the write code to detect when the user is asking to write to an
    unwritten extent. Like writing to a hole, we must zero the region between
    the write and the cluster boundaries. Most of the existing cluster zeroing
    logic can be re-used with some additional checks for the unwritten flag on
    extent records.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Implement cluster consistent shared writeable mappings using the
    ->page_mkwrite() callback.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Use some ideas from the new-aops patch series and turn
    ocfs2_buffered_write_cluster() into a 2 stage operation with the caller
    copying data in between. The code now understands multiple cluster writes as
    a result of having to deal with a full page write for greater than 4k pages.

    This sets us up to easily call into the write path during ->page_mkwrite().

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Use of the alloc sem during truncate was too narrow - we want to protect
    the i_size change and page truncation against mmap now.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     

10 Jul, 2007

5 commits


26 May, 2007

2 commits


03 May, 2007

3 commits


27 Apr, 2007

11 commits

  • Cluster locking might have been redone because a direct write won't
    complete, so this needs to be reflected in the iocb.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Older file systems which didn't support holes did a dumb calculation of
    i_blocks based on i_size. This is no longer accurate, so fix things up to
    take actual allocation into account.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Return an optional extent flags field from our lookup functions and wire up
    callers to treat unwritten regions as holes for the purpose of returning
    zeros to the user.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Due to the size of our group bitmaps, we'll never have a leaf node extent
    record with more than 16 bits worth of clusters. Split e_clusters up so that
    leaf nodes can get a flags field where we can mark unwritten extents.
    Interior nodes whose length references all the child nodes beneath it can't
    split their e_clusters field, so we use a union to preserve sizing there.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • We need to fill holes during a splice write. Provide our own splice write
    actor which can call ocfs2_file_buffered_write() with a splice-specific
    callback.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Since we don't zero on extend anymore, truncate needs to be fixed up to zero
    the part of a file between i_size and and end of it's cluster. Otherwise a
    subsequent extend could expose bad data.

    This introduced a new helper, which can be used in ocfs2_write().

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Unfortunately, ocfs2 can no longer make use of generic_file_aio_write_nlock()
    because allocating writes will require zeroing of pages adjacent to the I/O
    for cluster sizes greater than page size.

    Implement a custom file write here, which can order page locks for zeroing.
    This also has the advantage that cluster locks can easily be ordered outside
    of the page locks.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Right now, file allocation for ocfs2 is done within ocfs2_extend_file(),
    which is either called from ->setattr() (for an i_size change), or at the
    top of ocfs2_file_aio_write().

    Inodes on file systems with sparse file support will want to do their
    allocation during the actual write call.

    In either case the cluster locking decisions are the same. We abstract out
    that code into a new function, ocfs2_lock_allocators() which will be used by
    a later patch to enable writing to sparse files.

    This also provides a nice cleanup of ocfs2_extend_allocation().

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • For ocfs2_truncate_file(), we eliminate the "simple" truncate case which no
    longer exists since i_size is not tied to i_clusters. In
    ocfs2_extend_file(), we skip the allocation / page zeroing code for file
    systems which understand sparse files.

    The core truncate code is changed to do a bottom up tree traversal. This
    gets abstracted out into it's own function. To make things more readable,
    most of the special case handling for in-inode extents from
    ocfs2_do_truncate() is also removed.

    Though write support for sparse files comes in a later patch, we at least
    update ocfs2_prepare_inode_for_write() to skip allocation for sparse files.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • Introduce tree rotations into the b-tree code. This will allow ocfs2 to
    support sparse files. Much of the added code is designed to be generic (in
    the ocfs2 sense) so that it can later be re-used to implement large
    extended attributes.

    This patch only adds the rotation code and does minimal updates to callers
    of the extent api.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     
  • We don't want to print anything at all in ocfs2_lookup() when getting an
    error from ocfs2_iget() - it could be something as innocuous as a signal
    being detected in the dlm.

    ocfs2_permission() should filter on -ENOENT which ocfs2_meta_lock() can
    return if the inode was deleted on another node.

    Signed-off-by: Mark Fasheh

    Mark Fasheh
     

13 Feb, 2007

1 commit

  • Many struct inode_operations in the kernel can be "const". Marking them const
    moves these to the .rodata section, which avoids false sharing with potential
    dirty data. In addition it'll catch accidental writes at compile time to
    these shared resources.

    Signed-off-by: Arjan van de Ven
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arjan van de Ven
     

29 Dec, 2006

2 commits


14 Dec, 2006

1 commit

  • Update ocfs2_should_update_atime() to understand the MNT_RELATIME flag and
    to test against mtime / ctime accordingly.

    [akpm@osdl.org: cleanups]
    Signed-off-by: Mark Fasheh
    Cc: Valerie Henson
    Cc: Al Viro
    Cc: Christoph Hellwig
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mark Fasheh
     

09 Dec, 2006

1 commit


02 Dec, 2006

4 commits