1. 30 3月, 2010 1 次提交
    • T
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking... · 5a0e3ad6
      Tejun Heo 提交于
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
      
      percpu.h is included by sched.h and module.h and thus ends up being
      included when building most .c files.  percpu.h includes slab.h which
      in turn includes gfp.h making everything defined by the two files
      universally available and complicating inclusion dependencies.
      
      percpu.h -> slab.h dependency is about to be removed.  Prepare for
      this change by updating users of gfp and slab facilities include those
      headers directly instead of assuming availability.  As this conversion
      needs to touch large number of source files, the following script is
      used as the basis of conversion.
      
        http://userweb.kernel.org/~tj/misc/slabh-sweep.py
      
      The script does the followings.
      
      * Scan files for gfp and slab usages and update includes such that
        only the necessary includes are there.  ie. if only gfp is used,
        gfp.h, if slab is used, slab.h.
      
      * When the script inserts a new include, it looks at the include
        blocks and try to put the new include such that its order conforms
        to its surrounding.  It's put in the include block which contains
        core kernel includes, in the same order that the rest are ordered -
        alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
        doesn't seem to be any matching order.
      
      * If the script can't find a place to put a new include (mostly
        because the file doesn't have fitting include block), it prints out
        an error message indicating which .h file needs to be added to the
        file.
      
      The conversion was done in the following steps.
      
      1. The initial automatic conversion of all .c files updated slightly
         over 4000 files, deleting around 700 includes and adding ~480 gfp.h
         and ~3000 slab.h inclusions.  The script emitted errors for ~400
         files.
      
      2. Each error was manually checked.  Some didn't need the inclusion,
         some needed manual addition while adding it to implementation .h or
         embedding .c file was more appropriate for others.  This step added
         inclusions to around 150 files.
      
      3. The script was run again and the output was compared to the edits
         from #2 to make sure no file was left behind.
      
      4. Several build tests were done and a couple of problems were fixed.
         e.g. lib/decompress_*.c used malloc/free() wrappers around slab
         APIs requiring slab.h to be added manually.
      
      5. The script was run on all .h files but without automatically
         editing them as sprinkling gfp.h and slab.h inclusions around .h
         files could easily lead to inclusion dependency hell.  Most gfp.h
         inclusion directives were ignored as stuff from gfp.h was usually
         wildly available and often used in preprocessor macros.  Each
         slab.h inclusion directive was examined and added manually as
         necessary.
      
      6. percpu.h was updated not to include slab.h.
      
      7. Build test were done on the following configurations and failures
         were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
         distributed build env didn't work with gcov compiles) and a few
         more options had to be turned off depending on archs to make things
         build (like ipr on powerpc/64 which failed due to missing writeq).
      
         * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
         * powerpc and powerpc64 SMP allmodconfig
         * sparc and sparc64 SMP allmodconfig
         * ia64 SMP allmodconfig
         * s390 SMP allmodconfig
         * alpha SMP allmodconfig
         * um on x86_64 SMP allmodconfig
      
      8. percpu.h modifications were reverted so that it could be applied as
         a separate patch and serve as bisection point.
      
      Given the fact that I had only a couple of failures from tests on step
      6, I'm fairly confident about the coverage of this conversion patch.
      If there is a breakage, it's likely to be something in one of the arch
      headers which should be easily discoverable easily on most builds of
      the specific arch.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Guess-its-ok-by: NChristoph Lameter <cl@linux-foundation.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
      5a0e3ad6
  2. 18 3月, 2010 1 次提交
  3. 05 3月, 2010 1 次提交
    • C
      dquot: cleanup dquot initialize routine · 871a2931
      Christoph Hellwig 提交于
      Get rid of the initialize dquot operation - it is now always called from
      the filesystem and if a filesystem really needs it's own (which none
      currently does) it can just call into it's own routine directly.
      
      Rename the now static low-level dquot_initialize helper to __dquot_initialize
      and vfs_dq_init to dquot_initialize to have a consistent namespace.
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NJan Kara <jack@suse.cz>
      871a2931
  4. 27 2月, 2010 1 次提交
  5. 03 2月, 2010 2 次提交
    • T
      ocfs2: Only bug out when page size is larger than cluster size. · 0a1ea437
      Tao Ma 提交于
      In CoW, we have to make sure that the page is already written
      out to the disk. So we have a BUG_ON(PageDirty(page)).
      
      In ppc platform we have pagesize=64K, so if the cs=4K, if the
      file have fragmented clusters, we will map the page many times.
      See this file as an example.
      Tree Depth: 0   Count: 19   Next Free Rec: 14
      	## Offset        Clusters       Block#          Flags
      	0  0             4              2164864         0x2 Refcounted
      	1  4             2              9302792         0x2 Refcounted
      ...
      
      We have to replace the extent recs one by one, so the page with index 0
      will be mapped and dirtied twice.
      
      I'd like to leave the BUG_ON there while adding a check so that in
      case we meet with an error in other platforms, we can find it easily.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      0a1ea437
    • T
      ocfs2: Fix memory overflow in cow_by_page. · d622b89a
      Tao Ma 提交于
      In ocfs2_duplicate_clusters_by_page, we calculate map_end
      by shifting page_index. But actually in case we meet with
      a large offset(say in a i686 box, poff_t is only 32 bits
      and page_index=2056240), we will overflow. So change the
      type of page_index to loff_t.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      d622b89a
  6. 04 12月, 2009 1 次提交
  7. 03 12月, 2009 2 次提交
    • T
      ocfs2: refcounttree.c cleanup. · 12d4cec9
      Tao Ma 提交于
      sparse check finds some endian problem and some other minor issues.
      There is an obsolete function which should be removed.
      So this patch resolve all these.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      12d4cec9
    • T
      ocfs2: Find proper end cpos for a leaf refcount block. · 38a04e43
      Tao Ma 提交于
      ocfs2 refcount tree is stored as an extent tree while
      the leaf ocfs2_refcount_rec points to a refcount block.
      
      The following step can trip a kernel panic.
      mkfs.ocfs2 -b 512 -C 1M --fs-features=refcount $DEVICE
      mount -t ocfs2 $DEVICE $MNT_DIR
      FILE_NAME=$RANDOM
      FILE_NAME_1=$RANDOM
      FILE_REF="${FILE_NAME}_ref"
      FILE_REF_1="${FILE_NAME}_ref_1"
      for((i=0;i<305;i++))
      do
      # /mnt/1048576 is a file with 1048576 sizes.
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME_1
      done
      for((i=0;i<3;i++))
      do
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME
      done
      
      for((i=0;i<2;i++))
      do
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME_1
      done
      
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME
      
      for((i=0;i<11;i++))
      do
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME
      cat /mnt/1048576 >> $MNT_DIR/$FILE_NAME_1
      done
      reflink $MNT_DIR/$FILE_NAME $MNT_DIR/$FILE_REF
      # write_f is a program which will write some bytes to a file at offset.
      # write_f -f file_name -l offset -w write_bytes.
      ./write_f -f $MNT_DIR/$FILE_REF -l $[310*1048576] -w 4096
      ./write_f -f $MNT_DIR/$FILE_REF -l $[306*1048576] -w 4096
      ./write_f -f $MNT_DIR/$FILE_REF -l $[311*1048576] -w 4096
      ./write_f -f $MNT_DIR/$FILE_NAME -l $[310*1048576] -w 4096
      ./write_f -f $MNT_DIR/$FILE_NAME -l $[311*1048576] -w 4096
      reflink $MNT_DIR/$FILE_NAME $MNT_DIR/$FILE_REF_1
      ./write_f -f $MNT_DIR/$FILE_NAME -l $[311*1048576] -w 4096
      #kernel panic here.
      
      The reason is that if the ocfs2_extent_rec is the last record
      in a leaf extent block, the old solution fails to find the
      suitable end cpos. So this patch try to walk through the b-tree,
      find the next sub root and get the c_pos the next sub-tree starts
      from.
      
      btw, I have runned tristan's test case against the patched kernel
      for several days and this type of kernel panic never happens again.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      38a04e43
  8. 29 10月, 2009 2 次提交
  9. 23 9月, 2009 22 次提交
    • T
      ocfs2: Add ioctl for reflink. · bd50873d
      Tao Ma 提交于
      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: NTao Ma <tao.ma@oracle.com>
      bd50873d
    • T
      ocfs2: Implement ocfs2_reflink. · 09bf27a0
      Tao Ma 提交于
      Implement ocfs2_reflink.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      09bf27a0
    • T
      ocfs2: Add preserve to reflink. · 0fe9b66c
      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: NTao Ma <tao.ma@oracle.com>
      0fe9b66c
    • T
      ocfs2: Don't merge in 1st refcount ops of reflink. · 7540c1a7
      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: NTao Ma <tao.ma@oracle.com>
      7540c1a7
    • T
      ocfs2: Add reflink support for xattr. · 2999d12f
      Tao Ma 提交于
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      2999d12f
    • T
      ocfs2: Call refcount tree remove process properly. · 8b2c0dba
      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: NTao Ma <tao.ma@oracle.com>
      8b2c0dba
    • T
      ocfs2: Attach xattr clusters to refcount tree. · 0129241e
      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: NTao Ma <tao.ma@oracle.com>
      0129241e
    • T
      ocfs2: Add CoW support for xattr. · 492a8a33
      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: NTao Ma <tao.ma@oracle.com>
      492a8a33
    • T
      ocfs2: Abstract duplicate clusters process in CoW. · 913580b4
      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: NTao Ma <tao.ma@oracle.com>
      913580b4
    • T
      ocfs2: handle file attributes issue for reflink. · a9063ab9
      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: NTao Ma <tao.ma@oracle.com>
      a9063ab9
    • T
      ocfs2: Add normal functions for reflink a normal file's extents. · 110a045a
      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: NTao Ma <tao.ma@oracle.com>
      110a045a
    • T
      ocfs2: CoW a reflinked cluster when it is truncated. · 37f8a2bf
      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: NTao Ma <tao.ma@oracle.com>
      37f8a2bf
    • T
      ocfs2: CoW refcount tree improvement. · 6ae23c55
      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: NTao Ma <tao.ma@oracle.com>
      6ae23c55
    • T
      ocfs2: Add CoW support. · 6f70fa51
      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: NTao Ma <tao.ma@oracle.com>
      6f70fa51
    • T
      ocfs2: Decrement refcount when truncating refcounted extents. · bcbbb24a
      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: NTao Ma <tao.ma@oracle.com>
      bcbbb24a
    • T
      ocfs2: Add functions for extents refcounted. · 1aa75fea
      Tao Ma 提交于
      Add function ocfs2_mark_extent_refcounted which can mark
      an extent refcounted.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      1aa75fea
    • T
      ocfs2: Add support of decrementing refcount for delete. · 1823cb0b
      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: NTao Ma <tao.ma@oracle.com>
      1823cb0b
    • T
      ocfs2: Add support for incrementing refcount in the tree. · e73a819d
      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: NTao Ma <tao.ma@oracle.com>
      e73a819d
    • T
      ocfs2: Basic tree root operation. · 8bf396de
      Tao Ma 提交于
      Add basic refcount tree root operation.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      8bf396de
    • T
      ocfs2: Add refcount tree lock mechanism. · 374a263e
      Tao Ma 提交于
      Implement locking around struct ocfs2_refcount_tree.  This protects
      all read/write operations on refcount trees.  ocfs2_refcount_tree
      has its own lock and its own caching_info, protecting buffers among
      multiple nodes.
      
      User must call ocfs2_lock_refcount_tree before his operation on
      the tree and unlock it after that.
      
      ocfs2_refcount_trees are referenced by the block number of the
      refcount tree root block, So we create an rb-tree on the ocfs2_super
      to look them up.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      374a263e
    • T
      ocfs2: Add caching info for refcount tree. · c732eb16
      Tao Ma 提交于
      refcount tree should use its own caching info so that when
      we downconvert the refcount tree lock, we can drop all the
      cached buffer head.
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      c732eb16
    • T
      ocfs2: Add ocfs2_read_refcount_block. · f2c870e3
      Tao Ma 提交于
      Signed-off-by: NTao Ma <tao.ma@oracle.com>
      f2c870e3