[Ocfs2-devel] [PATCH 12/14] ocfs2: Let ocfs2_xa_prepare_entry() do space checks.

Tao Ma tao.ma at oracle.com
Tue Sep 1 18:54:31 PDT 2009


Hi Joel,

Joel Becker wrote:
> ocfs2_xattr_set_in_bucket() doesn't need to do its own hacky space
> checking.  Let's let ocfs2_xa_prepare_entry() (via ocfs2_xa_set()) do
> the more accurate work.  Whenever it doesn't have space,
> ocfs2_xattr_set_in_bucket() can try to get more space.
> 
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  fs/ocfs2/xattr.c |  239 ++++++++++++++++-------------------------------------
>  1 files changed, 72 insertions(+), 167 deletions(-)
> 
> diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
> index b4cda7e..e400d64 100644
> --- a/fs/ocfs2/xattr.c
> +++ b/fs/ocfs2/xattr.c
<snip>
> -	free = xh_free_start - header_size - OCFS2_XATTR_HEADER_GAP;
> +	/* Ack, need more space.  Let's try to get another bucket! */
> +
>  	/*
> -	 * We need to make sure the new name/value pair
> -	 * can exist in the same block.
> +	 * We do not allow for overlapping ranges between buckets. And
> +	 * the maximum number of collisions we will allow for then is
> +	 * one bucket's worth, so check it here whether we need to
> +	 * add a new bucket for the insert.
>  	 */
> -	if (xh_free_start % blocksize < need)
> -		free -= xh_free_start % blocksize;
> -
> -	mlog(0, "xs->not_found = %d, in xattr bucket %llu: free = %d, "
> -	     "need = %d, max_free = %d, xh_free_start = %u, xh_name_value_len ="
> -	     " %u\n", xs->not_found,
> -	     (unsigned long long)bucket_blkno(xs->bucket),
> -	     free, need, max_free, le16_to_cpu(xh->xh_free_start),
> -	     le16_to_cpu(xh->xh_name_value_len));
> -
> -	if (free < need ||
> -	    (xs->not_found &&
> -	     count == ocfs2_xattr_max_xe_in_bucket(inode->i_sb))) {
> -		if (need <= max_free &&
> -		    count < ocfs2_xattr_max_xe_in_bucket(inode->i_sb)) {
I just have one concern. Here we used to check whether count == 
ocfs2_xattr_max_xe_in_bucket(inode->i_sb) which make sure 
ocfs2_xattr_entry to be stored only in the first block of a bucket(this 
is a legacy issue before you added ocfs2_xattr_bucket abstraction), so 
now you remove this restriction. Maybe it is ok since now we already 
read the whole bucket and it looks that your current xa_* abstraction 
can handle it. Just want to remind you of it.

Regards,
Tao



More information about the Ocfs2-devel mailing list