Re: Calling finish_unfinished() too often?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu 08-05-08 15:44:27, Edward Shishkin wrote:
> Jan Kara wrote:
> > On Wed 30-04-08 22:13:35, Edward Shishkin wrote:
> >   
> >> Jan Kara wrote:
> >>
> >>     
> >>>  Hi,
> >>>
> >>>  I was just looking into reiserfs remount code and it seems it calls
> >>> finish_unfinished() whenever filesystem is remounted and isn't in 
> >>> read-only
> >>> mode. Isn't this unnecessary? I thought finish_unfinished() is needed only
> >>> when we remount from read-only to read-write state for the first time...
> >>>  
> >>>       
> >> Perhaps, you are right (if we don't miss some points). But we need to keep 
> >> a track
> >> of first successful remounts to rw state, and it requires a special flag in 
> >> in-memory
> >> superblock (I don't see another way).
> >>
> >>     
> >>>  Well, I wouldn't mind the performance impact to remount that much
> >>>
> >>>       
> >> yeah,  definitely benchmarks lack "1000 remounts"statistics ;)
> >>
> >>     
> >>> but it
> >>> would make my life with journaled quota a bit easier ;). Thanks for an
> >>> answer in advance.
> >>>       
> >   OK, so would you accept the patch below?
> >
> >   
> 
> I think it should work properly, however Linus doesn't like mysterious
> values.
> The attached patch might look better: it does the same things, but uses
> status flags.
  Great. Thanks. The patch looks fine, only I think you've added some
whitespace noise before reiserfs_xattr_init() call...

								Honza

> We need to call finish_unfinished() only when the filesystem is remounted
> read-write for the first time. This not only saves a few cycles on remount
> (rather irrelevant) but also makes reiserfs handle journaled quota on remount
> better - quota is the correctly reenabled on remount read-write.
> So:
> . add a field to the in-memory superblock for mount status flags;
> . keep a track of the first completed finish_unfinished().
> 
> Signed-off-by: Edward Shishkin <edward.shishkin@xxxxxxxxx>
> ---
>  linux-2.6.25-mm1/fs/reiserfs/inode.c            |    2 +-
>  linux-2.6.25-mm1/fs/reiserfs/super.c            |   10 ++++++----
>  linux-2.6.25-mm1/include/linux/reiserfs_fs_sb.h |   13 +++++++++----
>  3 files changed, 16 insertions(+), 9 deletions(-)
> 
> --- linux-2.6.25-mm1/fs/reiserfs/inode.c.orig
> +++ linux-2.6.25-mm1/fs/reiserfs/inode.c
> @@ -1454,7 +1454,7 @@
>  	   nlink==0: processing of open-unlinked and half-truncated files
>  	   during mount (fs/reiserfs/super.c:finish_unfinished()). */
>  	if ((inode->i_nlink == 0) &&
> -	    !REISERFS_SB(inode->i_sb)->s_is_unlinked_ok) {
> +	    !(REISERFS_SB(inode->i_sb)->s_mnt_status_flags & UNLINKED_OK)) {
>  		reiserfs_warning(inode->i_sb,
>  				 "vs-13075: reiserfs_read_locked_inode: "
>  				 "dead inode read from disk %K. "
> --- linux-2.6.25-mm1/fs/reiserfs/super.c.orig
> +++ linux-2.6.25-mm1/fs/reiserfs/super.c
> @@ -189,7 +189,7 @@
>  #endif
>  
>  	done = 0;
> -	REISERFS_SB(s)->s_is_unlinked_ok = 1;
> +	REISERFS_SB(s)->s_mnt_status_flags |= UNLINKED_OK;
>  	while (!retval) {
>  		retval = search_item(s, &max_cpu_key, &path);
>  		if (retval != ITEM_NOT_FOUND) {
> @@ -298,7 +298,8 @@
>  		printk("done\n");
>  		done++;
>  	}
> -	REISERFS_SB(s)->s_is_unlinked_ok = 0;
> +	REISERFS_SB(s)->s_mnt_status_flags &= ~UNLINKED_OK;
> +	REISERFS_SB(s)->s_mnt_status_flags |= UNFINISHED_OK;
>  
>  #ifdef CONFIG_QUOTA
>  	/* Turn quotas off */
> @@ -1256,8 +1257,9 @@
>  	s->s_dirt = 0;
>  
>  	if (!(*mount_flags & MS_RDONLY)) {
> -		finish_unfinished(s);
> -		reiserfs_xattr_init(s, *mount_flags);
> +	        if (!(REISERFS_SB(s)->s_mnt_status_flags & UNFINISHED_OK))
> +			finish_unfinished(s);
> +	        reiserfs_xattr_init(s, *mount_flags);
>  	}
>  
>  out_ok:
> --- linux-2.6.25-mm1/include/linux/reiserfs_fs_sb.h.orig
> +++ linux-2.6.25-mm1/include/linux/reiserfs_fs_sb.h
> @@ -341,6 +341,14 @@
>  } reiserfs_proc_info_data_t;
>  #endif
>  
> +/* (re)mount status flags */
> +#define UNLINKED_OK 1 /* set up when it's ok for reiserfs_read_inode2()
> +		       * to read from disk inode with nlink==0.
> +		       * Currently this is only used during
> +		       * finish_unfinished() processing at mount time */
> +#define UNFINISHED_OK 2 /* indicates that finish_unfinished() was
> +			 * completed successfully */
> +
>  /* reiserfs union of in-core super block data */
>  struct reiserfs_sb_info {
>  	struct buffer_head *s_sbh;	/* Buffer containing the super block */
> @@ -389,10 +397,7 @@
>  	int s_bmaps_without_search;
>  	int s_direct2indirect;
>  	int s_indirect2direct;
> -	/* set up when it's ok for reiserfs_read_inode2() to read from
> -	   disk inode with nlink==0. Currently this is only used during
> -	   finish_unfinished() processing at mount time */
> -	int s_is_unlinked_ok;
> +	unsigned s_mnt_status_flags; /* these flags are set in (re)mount time */
>  	reiserfs_proc_info_data_t s_proc_info_data;
>  	struct proc_dir_entry *procdir;
>  	int reserved_blocks;	/* amount of blocks reserved for further allocations */

-- 
Jan Kara <jack@xxxxxxx>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux File System Development]     [Linux BTRFS]     [Linux NFS]     [Linux Filesystems]     [Ext4 Filesystem]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Resources]

  Powered by Linux