aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAge
* ocfs2: Use proper parameter for some inode operation.Tao Ma2009-09-22
| | | | | | | | | | | | 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@oracle.com>
* ocfs2: Make transaction extend more efficient.Tao Ma2009-09-22
| | | | | | | | | | | | 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@oracle.com>
* ocfs2: Don't merge in 1st refcount ops of reflink.Tao Ma2009-09-22
| | | | | | | | | | | | | | | | | | | | 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@oracle.com>
* ocfs2: Modify removing xattr process for refcount.Tao Ma2009-09-22
| | | | | | | | | | | | 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@oracle.com>
* ocfs2: Add reflink support for xattr.Tao Ma2009-09-22
| | | | Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Create an xattr indexed block if needed.Tao Ma2009-09-22
| | | | | | | | 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@oracle.com>
* ocfs2: Call refcount tree remove process properly.Tao Ma2009-09-22
| | | | | | | | | | | | | 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@oracle.com>
* ocfs2: Attach xattr clusters to refcount tree.Tao Ma2009-09-22
| | | | | | | | | 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@oracle.com>
* ocfs2: Abstract ocfs2 xattr tree extend rec iteration process.Tao Ma2009-09-22
| | | | | | | | | | | | | | | 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@oracle.com>
* ocfs2: Abstract the creation of xattr block.Tao Ma2009-09-22
| | | | | | | In xattr reflink, we also need to create xattr block, so abstract the process out. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Remove inode from ocfs2_xattr_bucket_get_name_value.Tao Ma2009-09-22
| | | | | | | In ocfs2_xattr_bucket_get_name_value, actually we only use super_block. So use it. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add CoW support for xattr.Tao Ma2009-09-22
| | | | | | | 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@oracle.com>
* ocfs2: Abstract duplicate clusters process in CoW.Tao Ma2009-09-22
| | | | | | | | 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@oracle.com>
* ocfs2: Return extent flags for xattr value tree.Tao Ma2009-09-22
| | | | | | | | 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@oracle.com>
* ocfs2: handle file attributes issue for reflink.Tao Ma2009-09-22
| | | | | | | | | | | | | | | | | | | | | | | 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@oracle.com>
* ocfs2: Add normal functions for reflink a normal file's extents.Tao Ma2009-09-22
| | | | | | | | | | | | | | | | 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@oracle.com>
* ocfs2: CoW a reflinked cluster when it is truncated.Tao Ma2009-09-22
| | | | | | | | | | | 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@oracle.com>
* ocfs2: Integrate CoW in file write.Tao Ma2009-09-22
| | | | | | | | | 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@oracle.com>
* ocfs2: CoW refcount tree improvement.Tao Ma2009-09-22
| | | | | | | | | | | 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@oracle.com>
* ocfs2: Add CoW support.Tao Ma2009-09-22
| | | | | | | | | | | | | 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@oracle.com>
* ocfs2: Decrement refcount when truncating refcounted extents.Tao Ma2009-09-22
| | | | | | | | 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@oracle.com>
* ocfs2: Add functions for extents refcounted.Tao Ma2009-09-22
| | | | | | | Add function ocfs2_mark_extent_refcounted which can mark an extent refcounted. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add support of decrementing refcount for delete.Tao Ma2009-09-22
| | | | | | | | 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@oracle.com>
* ocfs2: Add support for incrementing refcount in the tree.Tao Ma2009-09-22
| | | | | | | | | 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@oracle.com>
* ocfs2: move tree path functions to alloc.h.Tao Ma2009-09-22
| | | | | | | | | | | 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@oracle.com>
* ocfs2: Add refcount b-tree as a new extent tree.Tao Ma2009-09-22
| | | | | | | Add refcount b-tree as a new extent tree so that it can use the b-tree to store and maniuplate ocfs2_refcount_rec. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Abstract extent split process.Tao Ma2009-09-22
| | | | | | | | | | | | | | | | | | | | | | | | | | ocfs2_mark_extent_written actually does the following things: 1. check the parameters. 2. initialize the left_path and split_rec. 3. call __ocfs2_mark_extent_written. it will do: 1) check the flags of unwritten 2) do the real split work. The whole process is packed tightly somehow. So this patch will abstract 2 different functions so that future b-tree operation can work with it. 1. __ocfs2_split_extent will accept path and split_rec and do the real split work. 2. ocfs2_change_extent_flag will accept a new flag and initialize path and split_rec. So now ocfs2_mark_extent_written will do: 1. check the parameters. 2. call ocfs2_change_extent_flag. 1) initalize the left_path and split_rec. 2) check whether the new flags conflict with the old one. 3) call __ocfs2_split_extent to do the split. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Wrap ocfs2_extent_contig in ocfs2_extent_tree.Tao Ma2009-09-22
| | | | | | | | | | Add a new operation eo_ocfs2_extent_contig int the extent tree's operations vector. So that with the new refcount tree, We want this so that refcount trees can always return CONTIG_NONE and prevent extent merging. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Basic tree root operation.Tao Ma2009-09-22
| | | | | | Add basic refcount tree root operation. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add refcount tree lock mechanism.Tao Ma2009-09-22
| | | | | | | | | | | | | | | | | 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: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add caching info for refcount tree.Tao Ma2009-09-22
| | | | | | | | 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: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add new refcount tree lock resource in dlmglue.Tao Ma2009-09-22
| | | | | | | refcount tree lock resource is used to protect refcount tree read/write among multiple nodes. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Abstract caching info checkpoint.Tao Ma2009-09-22
| | | | | | | In meta downconvert, we need to checkpoint the metadata in an inode. For refcount tree, we also need it. So abstract the process out. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add ocfs2_read_refcount_block.Tao Ma2009-09-22
| | | | Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Add metaecc for ocfs2_refcount_block.Tao Ma2009-09-22
| | | | | | Add metaecc and journal trigger for ocfs2_refcount_block. Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Define refcount tree structure.Tao Ma2009-09-22
| | | | Signed-off-by: Tao Ma <tao.ma@oracle.com>
* ocfs2: Pass ocfs2_caching_info into ocfs_init_*_extent_tree().Joel Becker2009-09-04
| | | | | | | With this commit, extent tree operations are divorced from inodes and rely on ocfs2_caching_info. Phew! Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: __ocfs2_mark_extent_written() doesn't need struct inode.Joel Becker2009-09-04
| | | | | | | | We only allow unwritten extents on data, so the toplevel ocfs2_mark_extent_written() can use an inode all it wants. But the subfunction isn't even using the inode argument. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: Teach ocfs2_replace_extent_rec() to use an extent_tree.Joel Becker2009-09-04
| | | | | | Don't use a struct inode anymore. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_split_and_insert() no longer needs struct inode.Joel Becker2009-09-04
| | | | | | It already has an extent_tree. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_remove_extent() no longer needs struct inode.Joel Becker2009-09-04
| | | | | | One more generic btree function that is isolated from struct inode. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_add_clusters_in_btree() no longer needs struct inode.Joel Becker2009-09-04
| | | | | | | One more function that doesn't need a struct inode to pass to its children. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_insert_extent() no longer needs struct inode.Joel Becker2009-09-04
| | | | | | One more function down, no inode in the entire insert-extent chain. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: Make extent map insertion an extent_tree_operation.Joel Becker2009-09-04
| | | | | | | | | ocfs2_insert_extent() wants to insert a record into the extent map if it's an inode data extent. But since many btrees can call that function, let's make it an op on ocfs2_extent_tree. Other tree types can leave it empty. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_figure_insert_type() no longer needs struct inode.Joel Becker2009-09-04
| | | | | | It's not using it, so remove it from the parameter list. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: Remove inode from ocfs2_figure_extent_contig().Joel Becker2009-09-04
| | | | | | It already has an ocfs2_extent_tree and doesn't need the inode. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: Swap inode for extent_tree in ocfs2_figure_merge_contig_type().Joel Becker2009-09-04
| | | | | | We don't want struct inode in generic btree operations. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_extent_contig() only requires the superblock.Joel Becker2009-09-04
| | | | | | | Don't pass the inode in. We don't want it around for generic btree operations. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: ocfs2_do_insert_extent() and ocfs2_insert_path() no longer need an inode.Joel Becker2009-09-04
| | | | | | They aren't using it, so remove it from their parameter lists. Signed-off-by: Joel Becker <joel.becker@oracle.com>
* ocfs2: Give ocfs2_split_record() an extent_tree instead of an inode.Joel Becker2009-09-04
| | | | | | Another on the way to generic btree functions. Signed-off-by: Joel Becker <joel.becker@oracle.com>