Re: [PATCH 3/3] More comments about block allocation/reservation code

"Randy.Dunlap" <[email protected]> Tue, 22 Aug 2006 21:18:49 -0700
Newsgroups gmane.comp.file-systems.ext2.devel
Organization YPO4
Message-ID <[email protected]>
On Tue, 22 Aug 2006 17:52:46 -0700 Mingming Cao wrote:

> Add more comments in block allocation/reservation code.
> 
> Signed-Off-By: Mingming Cao <[email protected]>
> ---
> 
>  linux-2.6.18-rc4-ming/fs/ext3/balloc.c |  143 +++++++++++++++++++++++++++------
>  1 files changed, 119 insertions(+), 24 deletions(-)
> 
> diff -puN fs/ext3/balloc.c~ext3-balloc.c-comment-fix fs/ext3/balloc.c
> --- linux-2.6.18-rc4/fs/ext3/balloc.c~ext3-balloc.c-comment-fix	2006-08-22 17:30:51.769252421 -0700
> +++ linux-2.6.18-rc4-ming/fs/ext3/balloc.c	2006-08-22 17:49:29.075254168 -0700
> @@ -103,13 +103,19 @@ error_out:
> +
> +/**

"/**" indicates the start of a kernel-doc comment block, which is
a specific format.  This comment block is not kernel-doc format,
so please make it kernel-doc format or change the comment start
to just /*.

kernel-doc format: Documentation/kernel-doc-nano-HOWTO.txt

> + * __rsv_window_dump() -- Dump the filesystem block allocation
> + *			  reservation map
> + *
> + * if verbose is turned on, it will print the whole block reservation
> + * windows(start, end).
> + * Otherwise, it will only print out the "bad" windows: those window overlaps
> + * with it's immediate neighbors.

Otherwise...: those windows that overlap with their immediate neighbors.

>   */
>  #if 1
>  static void __rsv_window_dump(struct rb_root *root, int verbose,
> @@ -161,6 +167,17 @@ restart:
>  #define rsv_window_dump(root, verbose) do {} while (0)
>  #endif
>  
> +/**

Comment is not in kernel-doc format.

> + * goal_in_my_reservation() -- test if the given goal block (group relative)
> + *				is within the file's own block reservation
> + *				window range.
> + *
> + * if the reservation window is outside the goal allocation group, return 0;
> + * grp_goal (given goal block) could be -1, which means no specific
> + * goal block. In this case, always return 1.
> + * If the goal block is within the reservation window, return 1;
> + * otherwise, return 0;
> + */
>  static int
>  goal_in_my_reservation(struct ext3_reserve_window *rsv, ext3_grpblk_t grp_goal,
>  			unsigned int group, struct super_block * sb)
> @@ -216,6 +233,11 @@ search_reserve_window(struct rb_root *ro
>  	return rsv;
>  }
>  
> +/**

Comment block is not in kernel-doc format.

> + * ext3_rsv_window_add() -- Insert a block window to the block
> + *			    reservation rb tree.
> + * Must be called with rsv_lock hold.
> + */
>  void ext3_rsv_window_add(struct super_block *sb,
>  		    struct ext3_reserve_window_node *rsv)
>  {
> @@ -246,6 +268,12 @@ void ext3_rsv_window_add(struct super_bl
>  	rb_insert_color(node, root);
>  }
>  
> +/**

Ditto.

> + * ext3_rsv_window_remove() -- Mark the block reservation window as
> + *	uninitialized and unlink it from the filesystem reservation
> + *	window rb tree.
> + * Must be called with rsv_lock hold.
> + */
>  static void rsv_window_remove(struct super_block *sb,
>  			      struct ext3_reserve_window_node *rsv)
>  {
> @@ -255,11 +283,37 @@ static void rsv_window_remove(struct sup
>  	rb_erase(&rsv->rsv_node, &EXT3_SB(sb)->s_rsv_window_root);
>  }
>  
> +/*
> + * rsv_is_empty() -- Check if the reservation window is allocated.
> + *
> + * returns 1 if the end block is EXT3_RESERVE_WINDOW_NOT_ALLOCATED.
> + */
>  static inline int rsv_is_empty(struct ext3_reserve_window *rsv)
>  {
>  	/* a valid reservation end block could not be 0 */
>  	return (rsv->_rsv_end == EXT3_RESERVE_WINDOW_NOT_ALLOCATED);
>  }
> +
> +/**

Ditto.

> + * ext3_init_block_alloc_info() -- Allocate and initialize the
> + *	reservation window structure, and link the window to
> + * 	the ext3 inode structure at last
> + *
> + *
> + * The reservation window structure is only dynamically allocated
> + * and linked to ext3 inode whenever the first time the open file

drop "whenever".

> + * needs a new block. So, before every ext3_new_block(s) call, for
> + * regular files, we should check whether the reservation window
> + * structure exists or not. In the later case, this function is called.

s/later/latter/

> + * Fail to do so will result in block reservation turns off for that

s/turns/being turned/

> + * open file.
> + *
> + * This function is called from ext3_get_blocks_handle(), also called
> + * when setting the reservation window size through ioctl before the file
> + * is open for write (needs block allocation).
> + *
> + * Needs truncate_mutex protection prior to call this function.
> + */
>  void ext3_init_block_alloc_info(struct inode *inode)
>  {
>  	struct ext3_inode_info *ei = EXT3_I(inode);
> @@ -289,6 +343,16 @@ void ext3_init_block_alloc_info(struct i
>  	ei->i_block_alloc_info = block_i;
>  }
>  
> +/**

Not kernel-doc format:

> + * ext3_discard_reservation() -- discard(free) block reservation window
> + *	on last file close.
> + *
> + *	It is being called in three cases:
> + *	ext3_release_file(): last writer close the file
> + *	ext3_clear_inode(): last iput(), when nobody link to this file.
> + *	ext3_truncate(): when the block indirect map is about to change.
> + *
> + */
>  void ext3_discard_reservation(struct inode *inode)
>  {
>  	struct ext3_inode_info *ei = EXT3_I(inode);
> @@ -543,6 +607,14 @@ static int ext3_test_allocatable(ext3_gr
>  	return ret;
>  }
>  
> +/**

Not kernel-doc format:

> + * bitmap_search_next_usable_block()
> + *
> + * The bitmap search --- search forward alternately through the actual
> + * bitmap and the last-committed copy, until we find a bit free in
> + * both bitmaps
> + */
> +	while (start < maxblocks) {
>  static ext3_grpblk_t
>  bitmap_search_next_usable_block(ext3_grpblk_t start, struct buffer_head *bh,
>  					ext3_grpblk_t maxblocks)
> @@ -570,8 +637,10 @@ bitmap_search_next_usable_block(ext3_grp
>  	return -1;
>  }
>  
> -/*
> - * Find an allocatable block in a bitmap.  We honour both the bitmap and
> +/**

Ditto.

> + * find_next_usable_block()
> + *
> + * Find an allocatable block in a bitmap.  We honor both the bitmap and
>   * its last-committed copy (if that exists), and perform the "most
>   * appropriate allocation" algorithm of looking for a free block near
>   * the initial goal; then for a free byte somewhere in the bitmap; then
> @@ -648,7 +717,19 @@ claim_block(spinlock_t *lock, ext3_grpbl
>  	return ret;
>  }
>  
> -/*
> +/**

Ditto.

> + * ext3_try_to_allocate()
> + *
> + * Attempt to allocate blocks within a give range. Set the range of allocation
> + * first, then find the first free bit(s) from the bitmap (within the range),
> + * and at last, allocate the blocks by claiming the found free bit as allocated.
> + *
> + * To set the range of this allocation:
> + * 	if there is a reservation window, only try to allocate block(s) from the
> + *	file's own reservation window;
> + *	Otherwise, the allocation range starts from the give goal block, ends at
> + * 	the block group's last block.
> + *
>   * If we failed to allocate the desired block then we may end up crossing to a
>   * new bitmap.  In that case we must release write access to the old one via
>   * ext3_journal_release_buffer(), else we'll run out of credits.
> @@ -1012,6 +1093,18 @@ retry:
>  	goto retry;
>  }
>  
> +/**

Ditto.

> + * try_to_extend_reservation() -- try to expand the reservation window
> + * 	to large enough to have required number of free blocks
> + *
> + *	Since ext3_try_to_allocate() will always allocate blocks within
> + * 	the reservation window range, if the window size is too small,
> + *	multiple blocks allocation has to stop at the end of the reservation
> + * 	window. To make this more efficient, given the total number of
> + * 	blocks needed and the current size of the window, we try to
> + *	expand the reservation 	window size if necessary on a best-effort
> + *	basis before ext3_new_blocks() tries to allocate blocks,
> + */
>  static void try_to_extend_reservation(struct ext3_reserve_window_node *my_rsv,
>  			struct super_block *sb, int size)
>  {
> @@ -1165,6 +1256,10 @@ out:
>  	return ret;
>  }
>  
> +/**

Ditto.

> + * ext3_has_free_blocks() -- check if filesystem has at least 1 free block
> + *	available for allocation.
> + */
>  static int ext3_has_free_blocks(struct ext3_sb_info *sbi)
>  {
>  	ext3_fsblk_t free_blocks, root_blocks;
> @@ -1195,13 +1290,13 @@ int ext3_should_retry_alloc(struct super
>  	return journal_force_commit_nested(EXT3_SB(sb)->s_journal);
>  }
>  
> -/*
> - * ext3_new_block uses a goal block to assist allocation.  If the goal is
> - * free, or there is a free block within 32 blocks of the goal, that block
> - * is allocated.  Otherwise a forward search is made for a free block; within
> - * each block group the search first looks for an entire free byte in the block
> - * bitmap, and then for any free bit if that fails.
> - * This function also updates quota and i_blocks field.
> +/**

Ditto.

> + * ext3_new_blocks() -- core block(s) allocation function
> + * ext3_new_blocks uses a goal block to assist allocation.  It tries to
> + * allocate block(s) from the block group contains the goal block first. If that
> + * fails, it will try to allocate block(s) from other block groups without
> + * any specific goal block.
> + *
>   */
>  ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode,
>  			ext3_fsblk_t goal, unsigned long *count, int *errp)


I would love to see you make all of these function comment blocks
be in kernel-doc format, where each function's parameters are listed
and described.  However, that's up to you.  But please don't mark them
as being in kernel-doc format until they are.

Thanks.
---
~Randy

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642