02 Oct, 2009

1 commit


28 Sep, 2009

1 commit


24 Sep, 2009

3 commits

  • * 'hwpoison' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6: (21 commits)
    HWPOISON: Enable error_remove_page on btrfs
    HWPOISON: Add simple debugfs interface to inject hwpoison on arbitary PFNs
    HWPOISON: Add madvise() based injector for hardware poisoned pages v4
    HWPOISON: Enable error_remove_page for NFS
    HWPOISON: Enable .remove_error_page for migration aware file systems
    HWPOISON: The high level memory error handler in the VM v7
    HWPOISON: Add PR_MCE_KILL prctl to control early kill behaviour per process
    HWPOISON: shmem: call set_page_dirty() with locked page
    HWPOISON: Define a new error_remove_page address space op for async truncation
    HWPOISON: Add invalidate_inode_page
    HWPOISON: Refactor truncate to allow direct truncating of page v2
    HWPOISON: check and isolate corrupted free pages v2
    HWPOISON: Handle hardware poisoned pages in try_to_unmap
    HWPOISON: Use bitmask/action code for try_to_unmap behaviour
    HWPOISON: x86: Add VM_FAULT_HWPOISON handling to x86 page fault handler v2
    HWPOISON: Add poison check to page fault handling
    HWPOISON: Add basic support for poisoned pages in fault handler v3
    HWPOISON: Add new SIGBUS error codes for hardware poison signals
    HWPOISON: Add support for poison swap entries v2
    HWPOISON: Export some rmap vma locking to outside world
    ...

    Linus Torvalds
     
  • * remove asm/atomic.h inclusion from linux/utsname.h --
    not needed after kref conversion
    * remove linux/utsname.h inclusion from files which do not need it

    NOTE: it looks like fs/binfmt_elf.c do not need utsname.h, however
    due to some personality stuff it _is_ needed -- cowardly leave ELF-related
    headers and files alone.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: Linus Torvalds

    Alexey Dobriyan
     
  • * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: (85 commits)
    ocfs2: Use buffer IO if we are appending a file.
    ocfs2: add spinlock protection when dealing with lockres->purge.
    dlmglue.c: add missed mlog lines
    ocfs2: __ocfs2_abort() should not enable panic for local mounts
    ocfs2: Add ioctl for reflink.
    ocfs2: Enable refcount tree support.
    ocfs2: Implement ocfs2_reflink.
    ocfs2: Add preserve to reflink.
    ocfs2: Create reflinked file in orphan dir.
    ocfs2: Use proper parameter for some inode operation.
    ocfs2: Make transaction extend more efficient.
    ocfs2: Don't merge in 1st refcount ops of reflink.
    ocfs2: Modify removing xattr process for refcount.
    ocfs2: Add reflink support for xattr.
    ocfs2: Create an xattr indexed block if needed.
    ocfs2: Call refcount tree remove process properly.
    ocfs2: Attach xattr clusters to refcount tree.
    ocfs2: Abstract ocfs2 xattr tree extend rec iteration process.
    ocfs2: Abstract the creation of xattr block.
    ocfs2: Remove inode from ocfs2_xattr_bucket_get_name_value.
    ...

    Linus Torvalds
     

23 Sep, 2009

35 commits

  • Make all seq_operations structs const, to help mitigate against
    revectoring user-triggerable function pointers.

    This is derived from the grsecurity patch, although generated from scratch
    because it's simpler than extracting the changes from there.

    Signed-off-by: James Morris
    Acked-by: Serge Hallyn
    Acked-by: Casey Schaufler
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    James Morris
     
  • In ocfs2_file_aio_write, we will prevent direct io if
    we find that we are appending(changing i_size) and call
    generic_file_aio_write_nolock. But actually O_DIRECT flag
    is there and this function will call generic_file_direct_write
    eventually which will update i_size and leave di->i_size
    alone. The bug is
    http://oss.oracle.com/bugzilla/show_bug.cgi?id=1173.

    So this patch let ocfs2_direct_IO returns 0 directly if we
    are appending so that buffered write will be called and
    di->i_size get updated successfully. And this is also
    what we want in ocfs2_file_aio_write.

    Signed-off-by: Tao Ma
    Signed-off-by: Joel Becker

    Tao Ma
     
  • when we check/modify lockres->purge, we should with the protection of lockres->spinlock.
    in dlm_purge_lockres(), the checking/modifying is not with the protectin.
    this patch fixes it.

    Signed-off-by: Wengang Wang
    Signed-off-by: Joel Becker

    Wengang Wang
     
  • This patch adds the missed mlog_exit() and mlog_exit_void() lines when routines
    return.

    Signed-off-by: Coly Li
    Acked-by: Mark Fasheh
    Signed-off-by: Joel Becker

    Coly Li
     
  • In a clustered setup, we have to panic the box on journal abort. This is
    because we don't have the facility to go hard readonly. With hard ro, another
    node would detect node failure and initiate recovery.

    Having said that, we shouldn't force panic if the volume is mounted locally.
    This patch defers the handling to the mount option, errors.

    Signed-off-by: Sunil Mushran
    Signed-off-by: Joel Becker

    Sunil Mushran
     
  • The ioctl will take 3 parameters: old_path, new_path and
    preserve and call vfs_reflink. It is useful when we backport
    reflink features to old kernels.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Signed-off-by: Tao Ma

    Tao Ma
     
  • Implement ocfs2_reflink.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • reflink has 2 options for the destination file:
    1. snapshot: reflink will attempt to preserve ownership, permissions,
    and all other security state in order to create a full snapshot.
    2. new file: it will acquire the data extent sharing but will see the
    file's security state and attributes initialized as a new file.

    So add the option to ocfs2.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • reflink is a very complicated process, so it can't be integrated
    into one transaction. So if the system panic in the operation, we
    may leave a unfinished inode in the destication directory.

    So we will try to create an inode in orphan_dir first, reflink it
    to the src file and then move it to the destication file in the end.
    In that way we won't be afraid of any corruption during the reflink.

    This patch adds 2 functions for orphan_dir operation:
    1. Create a new inode in orphand dir.
    2. Move an inode to a target dir.

    Note:
    fsck.ocfs2 should work for us to remove the unfinished file in the
    orphan_dir.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In order to make the original function more suitable for reflink,
    we modify the following inode operations. Both are tiny.

    1. ocfs2_mknod_locked only use dentry for mlog, so move it to
    the caller so that reflink can use it without dentry.
    2. ocfs2_prepare_orphan_dir only want inode to get its ip_blkno.
    So use ip_blkno instead.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In ocfs2_extend_rotate_transaction, op_credits is the orignal
    credits in the handle and we only want to extend the credits
    for the rotation, but the old solution always double it. It
    is harmless for some minor operations, but for actions like
    reflink we may rotate tree many times and cause the credits
    increase dramatically. So this patch try to only increase
    the desired credits.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Actually the whole reflink will touch refcount tree 2 times:
    1. It will add the clusters in the extent record to the tree if it
    isn't refcounted before.
    2. It will add 1 refcount to these clusters when it add these
    extent records to the tree.

    So actually we shouldn't do merge in the 1st operation since the 2nd
    one will soon be called and we may have to split it again. Do a merge
    first and split soon is a waste of time. So we only merge in the 2nd
    round. This is done by adding a new internal __ocfs2_increase_refcount
    and call it with "not-merge" for 1st refcount operation in reflink.

    This also has a side-effect that we don't need to worry too much about
    the metadata allocation in the 2nd round since it will only merge and
    no split will happen for those records.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • The old xattr value remove is quite simple, it just erase the
    tree and free the clusters. But as we have added refcount support,
    The process is a little complicated.

    We have to lock the refcount tree at the beginning, what's more,
    we may split the refcount tree in some cases, so meta/credits are
    needed.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Signed-off-by: Tao Ma

    Tao Ma
     
  • With reflink, there is a need that we create a new xattr indexed
    block from the very beginning. So add a new parameter for
    ocfs2_create_xattr_block.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Now with xattr refcount support, we need to check whether
    we have xattr refcounted before we remove the refcount tree.

    Now the mechanism is:
    1) Check whether i_clusters == 0, if no, exit.
    2) check whether we have i_xattr_loc in dinode. if yes, exit.
    2) Check whether we have inline xattr stored outside, if yes, exit.
    4) Remove the tree.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In ocfs2, when xattr's value is larger than OCFS2_XATTR_INLINE_SIZE,
    it will be kept outside of the blocks we store xattr entry. And they
    are stored in a b-tree also. So this patch try to attach all these
    clusters to refcount tree also.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Currently we have ocfs2_iterate_xattr_buckets which can receive
    a para and a callback to iterate a series of bucket. It is good.
    But actually the 2 callers ocfs2_xattr_tree_list_index_block and
    ocfs2_delete_xattr_index_block are almost the same. The only
    difference is that the latter need to handle the extent record
    also. So add a new function named ocfs2_iterate_xattr_index_block.
    It can be given func callback which are used for exten record.
    So now we only have one iteration function for the xattr index
    block. Ane what's more, it is useful for our future reflink
    operations.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In xattr reflink, we also need to create xattr block, so
    abstract the process out.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In ocfs2_xattr_bucket_get_name_value, actually we only use
    super_block. So use it.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • In order to make 2 transcation(xattr and cow) independent with each other,
    we CoW the whole xattr out in case we are setting them.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • We currently use pagecache to duplicate clusters in CoW,
    but it isn't suitable for xattr case. So abstract it out
    so that the caller can decide which method it use.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • With the new refcount tree, xattr value can also be refcounted
    among multiple files. So return the appropriate extent flags
    so that CoW can used it later.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • A reflink creates a snapshot of a file, that means the attributes
    must be identical except for three exceptions - nlink, ino, and ctime.

    As for time changes, Here is a brief description:

    1. Source file:
    1) atime: Ignore. Let the lazy atime code handle that.
    2) mtime: don't touch.
    3) ctime: If we change the tree (adding REFCOUNTED to at least one
    extent), update it.
    2. Destination file:
    1) atime: ignore.
    2) mtime: we want it to appear identical to the source.
    3) ctime: update.

    The idea here is that an ls -l will show the same time for the
    src and target - it shows mtime. Backup software like rsync and tar
    will treat the new file correctly too.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • 2 major functions are added in this patch.

    ocfs2_attach_refcount_tree will create a new refcount tree to the
    old file if it doesn't have one and insert all the extent records
    to the tree if they are not refcounted.

    ocfs2_create_reflink_node will:
    1. set the refcount tree to the new file.
    2. call ocfs2_duplicate_extent_list which will iterate all the
    extents for the old file, insert it to the new file and increase
    the corresponding referennce count.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • When we truncate a file to a specific size which resides in a reflinked
    cluster, we need to CoW it since ocfs2_zero_range_for_truncate will
    zero the space after the size(just another type of write).

    So we add a "max_cpos" in ocfs2_refcount_cow so that it will stop when
    it hit the max cluster offset.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • When we use mmap, we CoW the refcountd clusters in
    ocfs2_write_begin_nolock. While for normal file
    io(including directio), we do CoW in
    ocfs2_prepare_inode_for_write.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • During CoW, if the old extent record is refcounted, we allocate
    som new clusters and do CoW. Actually we can have some improvement
    here. If the old extent has refcount=1, that means now it is only
    used by this file. So we don't need to allocate new clusters, just
    remove the refcounted flag and it is OK. We also have to remove
    it from the refcount tree while not deleting it.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • This patch try CoW support for a refcounted record.

    the whole process will be:
    1. Calculate how many clusters we need to CoW and where we start.
    Extents that are not completely encompassed by the write will
    be broken on 1MB boundaries.
    2. Do CoW for the clusters with the help of page cache.
    3. Change the b-tree structure with the new allocated clusters.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Add 'Decrement refcount for delete' in to the normal truncate
    process. So for a refcounted extent record, call refcount rec
    decrementation instead of cluster free.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Add function ocfs2_mark_extent_refcounted which can mark
    an extent refcounted.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Given a physical cpos and length, decrement the refcount
    in the tree. If the refcount for any portion of the extent goes
    to zero, that portion is queued for freeing.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Given a physical cpos and length, increment the refcount
    in the tree. If the extent has not been seen before, a refcount
    record is created for it. Refcount records may be merged or
    split by this operation.

    Signed-off-by: Tao Ma

    Tao Ma
     
  • Now fs/ocfs2/alloc.c has more than 7000 lines. It contains our
    basic b-tree operation. Although we have already make our b-tree
    operation generic, the basic structrue ocfs2_path which is used
    to iterate one b-tree branch is still static and limited to only
    used in alloc.c. As refcount tree need them and I don't want to
    add any more b-tree unrelated code to alloc.c, export them out.

    Signed-off-by: Tao Ma

    Tao Ma