svn commit: r347199 - stable/12/sbin/fsck_ffs

Konstantin Belousov kostikbel at gmail.com
Tue May 7 00:47:53 UTC 2019


On Mon, May 06, 2019 at 07:13:04PM +0000, Kirk McKusick wrote:
> Author: mckusick
> Date: Mon May  6 19:13:04 2019
> New Revision: 347199
> URL: https://svnweb.freebsd.org/changeset/base/347199
> 
> Log:
>   MFC of 345758
I think this was an MFC of r346185.

>   
>   Properly flush outstanding I/Os when forcibly deleteing a memory disk device.
>   
>   Sponsored by: Netflix
> 
> Modified:
>   stable/12/sbin/fsck_ffs/fsck.h
>   stable/12/sbin/fsck_ffs/inode.c
>   stable/12/sbin/fsck_ffs/pass1.c
> Directory Properties:
>   stable/12/   (props changed)
> 
> Modified: stable/12/sbin/fsck_ffs/fsck.h
> ==============================================================================
> --- stable/12/sbin/fsck_ffs/fsck.h	Mon May  6 19:08:03 2019	(r347198)
> +++ stable/12/sbin/fsck_ffs/fsck.h	Mon May  6 19:13:04 2019	(r347199)
> @@ -231,6 +231,7 @@ struct inodesc {
>  	ino_t id_parent;	/* for DATA nodes, their parent */
>  	ufs_lbn_t id_lbn;	/* logical block number of current block */
>  	ufs2_daddr_t id_blkno;	/* current block number being examined */
> +	int id_level;		/* level of indirection of this block */
>  	int id_numfrags;	/* number of frags contained in block */
>  	ufs_lbn_t id_lballoc;	/* pass1: last LBN that is allocated */
>  	off_t id_filesize;	/* for DATA nodes, the size of the directory */
> 
> Modified: stable/12/sbin/fsck_ffs/inode.c
> ==============================================================================
> --- stable/12/sbin/fsck_ffs/inode.c	Mon May  6 19:08:03 2019	(r347198)
> +++ stable/12/sbin/fsck_ffs/inode.c	Mon May  6 19:13:04 2019	(r347199)
> @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$");
>  
>  static ino_t startinum;
>  
> -static int iblock(struct inodesc *, long ilevel, off_t isize, int type);
> +static int iblock(struct inodesc *, off_t isize, int type);
>  
>  int
>  ckinode(union dinode *dp, struct inodesc *idesc)
> @@ -69,6 +69,8 @@ ckinode(union dinode *dp, struct inodesc *idesc)
>  	if (idesc->id_fix != IGNORE)
>  		idesc->id_fix = DONTKNOW;
>  	idesc->id_lbn = -1;
> +	idesc->id_lballoc = -1;
> +	idesc->id_level = 0;
>  	idesc->id_entryno = 0;
>  	idesc->id_filesize = DIP(dp, di_size);
>  	mode = DIP(dp, di_mode) & IFMT;
> @@ -121,9 +123,10 @@ ckinode(union dinode *dp, struct inodesc *idesc)
>  	sizepb = sblock.fs_bsize;
>  	for (i = 0; i < UFS_NIADDR; i++) {
>  		sizepb *= NINDIR(&sblock);
> +		idesc->id_level = i + 1;
>  		if (DIP(&dino, di_ib[i])) {
>  			idesc->id_blkno = DIP(&dino, di_ib[i]);
> -			ret = iblock(idesc, i + 1, remsize, BT_LEVEL1 + i);
> +			ret = iblock(idesc, remsize, BT_LEVEL1 + i);
>  			if (ret & STOP)
>  				return (ret);
>  		} else if (remsize > 0) {
> @@ -153,7 +156,7 @@ ckinode(union dinode *dp, struct inodesc *idesc)
>  }
>  
>  static int
> -iblock(struct inodesc *idesc, long ilevel, off_t isize, int type)
> +iblock(struct inodesc *idesc, off_t isize, int type)
>  {
>  	struct bufarea *bp;
>  	int i, n, (*func)(struct inodesc *), nif;
> @@ -171,8 +174,8 @@ iblock(struct inodesc *idesc, long ilevel, off_t isize
>  	if (chkrange(idesc->id_blkno, idesc->id_numfrags))
>  		return (SKIP);
>  	bp = getdatablk(idesc->id_blkno, sblock.fs_bsize, type);
> -	ilevel--;
> -	for (sizepb = sblock.fs_bsize, i = 0; i < ilevel; i++)
> +	idesc->id_level--;
> +	for (sizepb = sblock.fs_bsize, i = 0; i < idesc->id_level; i++)
>  		sizepb *= NINDIR(&sblock);
>  	if (howmany(isize, sizepb) > NINDIR(&sblock))
>  		nif = NINDIR(&sblock);
> @@ -194,19 +197,21 @@ iblock(struct inodesc *idesc, long ilevel, off_t isize
>  		flush(fswritefd, bp);
>  	}
>  	for (i = 0; i < nif; i++) {
> -		if (ilevel == 0)
> -			idesc->id_lbn++;
>  		if (IBLK(bp, i)) {
>  			idesc->id_blkno = IBLK(bp, i);
> -			if (ilevel == 0)
> +			if (idesc->id_level == 0) {
> +				idesc->id_lbn++;
>  				n = (*func)(idesc);
> -			else
> -				n = iblock(idesc, ilevel, isize, type);
> +			} else {
> +				n = iblock(idesc, isize, type);
> +				idesc->id_level++;
> +			}
>  			if (n & STOP) {
>  				bp->b_flags &= ~B_INUSE;
>  				return (n);
>  			}
>  		} else {
> +			idesc->id_lbn += sizepb / sblock.fs_bsize;
>  			if (idesc->id_type == DATA && isize > 0) {
>  				/* An empty block in a directory XXX */
>  				getpathname(pathbuf, idesc->id_number,
> 
> Modified: stable/12/sbin/fsck_ffs/pass1.c
> ==============================================================================
> --- stable/12/sbin/fsck_ffs/pass1.c	Mon May  6 19:08:03 2019	(r347198)
> +++ stable/12/sbin/fsck_ffs/pass1.c	Mon May  6 19:13:04 2019	(r347199)
> @@ -378,7 +378,6 @@ checkinode(ino_t inumber, struct inodesc *idesc, int r
>  		idesc->id_type = SNAP;
>  	else
>  		idesc->id_type = ADDR;
> -	idesc->id_lballoc = -1;
>  	(void)ckinode(dp, idesc);
>  	if (sblock.fs_magic == FS_UFS2_MAGIC && dp->dp2.di_extsize > 0) {
>  		idesc->id_type = ADDR;
> @@ -565,7 +564,7 @@ pass1check(struct inodesc *idesc)
>  		 */
>  		idesc->id_entryno++;
>  	}
> -	if (idesc->id_lballoc == -1 || idesc->id_lballoc < idesc->id_lbn)
> +	if (idesc->id_level == 0 && idesc->id_lballoc < idesc->id_lbn)
>  		idesc->id_lballoc = idesc->id_lbn;
>  	return (res);
>  }


More information about the svn-src-all mailing list