[Ocfs2-devel] [PATCH] Ocfs2: Teach truncating and punching-hole codes to handle fastsymlink.

tristan tristan.ye at oracle.com
Tue Mar 23 01:34:56 PDT 2010


Oops!

Forgot to include header 'symlink.h' in alloc and file.c. a revised one 
will be posted soon, sorry for the noise.

Tristan.

Tristan Ye wrote:
> Fast symlink can be treated the same way as inline file for truncating
> and hole punching, since the mechanism is quite simliar per se.
>
> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
> ---
>  fs/ocfs2/alloc.c |   17 +++++++++++++----
>  fs/ocfs2/file.c  |    6 ++++--
>  2 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
> index 9f8bd91..a4d43b8 100644
> --- a/fs/ocfs2/alloc.c
> +++ b/fs/ocfs2/alloc.c
> @@ -7668,6 +7668,10 @@ bail:
>  
>  /*
>   * 'start' is inclusive, 'end' is not.
> + *
> + * The name ocfs2_truncate_inline() may be misleading a little bit, since
> + * it handles truncating for fast symlink as well, cause they actually will
> + * be doing one thing per se.
>   */
>  int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
>  			  unsigned int start, unsigned int end, int trunc)
> @@ -7684,12 +7688,14 @@ int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
>  
>  	BUG_ON(start >= end);
>  
> -	if (!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) ||
> +	if ((!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) ||
>  	    !(le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_DATA_FL) ||
> -	    !ocfs2_supports_inline_data(osb)) {
> +	    !ocfs2_supports_inline_data(osb)) &&
> +	    (!ocfs2_inode_is_fast_symlink(inode))) {
>  		ocfs2_error(inode->i_sb,
>  			    "Inline data flags for inode %llu don't agree! "
> -			    "Disk: 0x%x, Memory: 0x%x, Superblock: 0x%x\n",
> +			    "Disk: 0x%x, Memory: 0x%x, Superblock: 0x%x, "
> +			    "and it's not a fast symlink as well.\n",
>  			    (unsigned long long)OCFS2_I(inode)->ip_blkno,
>  			    le16_to_cpu(di->i_dyn_features),
>  			    OCFS2_I(inode)->ip_dyn_features,
> @@ -7713,7 +7719,10 @@ int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
>  	}
>  
>  	numbytes = end - start;
> -	memset(idata->id_data + start, 0, numbytes);
> +	if (ocfs2_inode_is_fast_symlink(inode))
> +		memset(di->id2.i_symlink + start, 0, numbytes);
> +	else
> +		memset(idata->id_data + start, 0, numbytes);
>  
>  	/*
>  	 * No need to worry about the data page here - it's been
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index 17947dc..b377f84 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -498,7 +498,8 @@ static int ocfs2_truncate_file(struct inode *inode,
>  	unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
>  	truncate_inode_pages(inode->i_mapping, new_i_size);
>  
> -	if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
> +	if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) ||
> +	    (ocfs2_inode_is_fast_symlink(inode))) {
>  		status = ocfs2_truncate_inline(inode, di_bh, new_i_size,
>  					       i_size_read(inode), 1);
>  		if (status)
> @@ -1450,7 +1451,8 @@ static int ocfs2_remove_inode_range(struct inode *inode,
>  	if (byte_len == 0)
>  		return 0;
>  
> -	if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
> +	if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) ||
> +	    (ocfs2_inode_is_fast_symlink(inode))) {
>  		ret = ocfs2_truncate_inline(inode, di_bh, byte_start,
>  					    byte_start + byte_len, 0);
>  		if (ret) {
>   




More information about the Ocfs2-devel mailing list