svn commit: r246877 - head/sys/ufs/ffs

Gennady Proskurin gprspb at mail.ru
Mon Feb 18 09:57:03 UTC 2013


May be a dumb question, but I want to be explicit here.

Can system before this commit crash here or filesystem corruption happen during
ordinary work? (I mean no power loss and no crashes in other kernel code)

Or filesystem can be corrupted only if system crashes by other means (power
loss or something) during inode block allocation?

On Sat, Feb 16, 2013 at 03:11:40PM +0000, Kirk McKusick wrote:
> Author: mckusick
> Date: Sat Feb 16 15:11:40 2013
> New Revision: 246877
> URL: http://svnweb.freebsd.org/changeset/base/246877
> 
> Log:
>   The UFS2 filesystem allocates new blocks of inodes as they are needed.
>   When a cylinder group runs short of inodes, a new block for inodes is
>   allocated, zero'ed, and written to the disk. The zero'ed inodes must
>   be on the disk before the cylinder group can be updated to claim them.
>   If the cylinder group claiming the new inodes were written before the
>   zero'ed block of inodes, the system could crash with the filesystem in
>   an unrecoverable state.
>   
>   Rather than adding a soft updates dependency to ensure that the new
>   inode block is written before it is claimed by the cylinder group
>   map, we just do a barrier write of the zero'ed inode block to ensure
>   that it will get written before the updated cylinder group map can
>   be written. This change should only slow down bulk loading of newly
>   created filesystems since that is the primary time that new inode
>   blocks need to be created.
>   
>   Reported by: Robert Watson
>   Reviewed by: kib
>   Tested by:   Peter Holm
> 
> Modified:
>   head/sys/ufs/ffs/ffs_alloc.c
> 
> Modified: head/sys/ufs/ffs/ffs_alloc.c
> ==============================================================================
> --- head/sys/ufs/ffs/ffs_alloc.c	Sat Feb 16 14:51:30 2013	(r246876)
> +++ head/sys/ufs/ffs/ffs_alloc.c	Sat Feb 16 15:11:40 2013	(r246877)
> @@ -1861,7 +1861,6 @@ gotit:
>  	/*
>  	 * Check to see if we need to initialize more inodes.
>  	 */
> -	ibp = NULL;
>  	if (fs->fs_magic == FS_UFS2_MAGIC &&
>  	    ipref + INOPB(fs) > cgp->cg_initediblk &&
>  	    cgp->cg_initediblk < cgp->cg_niblk) {
> @@ -1874,6 +1873,16 @@ gotit:
>  			dp2->di_gen = arc4random() / 2 + 1;
>  			dp2++;
>  		}
> +		/*
> +		 * Rather than adding a soft updates dependency to ensure
> +		 * that the new inode block is written before it is claimed
> +		 * by the cylinder group map, we just do a barrier write
> +		 * here. The barrier write will ensure that the inode block
> +		 * gets written before the updated cylinder group map can be
> +		 * written. The barrier write should only slow down bulk
> +		 * loading of newly created filesystems.
> +		 */
> +		babarrierwrite(ibp);
>  		cgp->cg_initediblk += INOPB(fs);
>  	}
>  	UFS_LOCK(ump);
> @@ -1892,8 +1901,6 @@ gotit:
>  	if (DOINGSOFTDEP(ITOV(ip)))
>  		softdep_setup_inomapdep(bp, ip, cg * fs->fs_ipg + ipref, mode);
>  	bdwrite(bp);
> -	if (ibp != NULL)
> -		bawrite(ibp);
>  	return ((ino_t)(cg * fs->fs_ipg + ipref));
>  }
>  
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
> 


More information about the svn-src-head mailing list