From nobody Sun Aug 20 04:28:27 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RT2fg6Dbbz4qgsW; Sun, 20 Aug 2023 04:28:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RT2fg57Hdz4QlC; Sun, 20 Aug 2023 04:28:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692505707; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=XI7AmTnWidvSpT3qL5NUhUdqAJuP5UUDx7Bi/YCIwDQ=; b=AXo6sQlEF3H9HT38BhL2kH6cXcM/mYOvZvXVCFVZhCKF2Sh3MSQsTzA0ETsyfRO/j/fwda bz2ZW7nGbY042tnRrJF7zRU9yur+AeuqBxmP8pH0FiIrhl/CrxWfFrzig1WT7rdspsUDNR ZV6Hrk/9CVO6NOl6WxKJp6xnV0aEWSxriZQL9yRMA/Ztj0o6lbVhbMfoVCqmb75Br2o9Fu AO9+jKsy7XIJ+ARjigFRa8sa/r4W6KcUGRhj+4TP05xAr/rmQNi1HMfS76xMY7UdPSROEq WPlTvn2zWk7y/spo4mlFNQ86fIQC49c7OYfimayBTd9tWNyp0F85FPTnt6F+Lg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692505707; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=XI7AmTnWidvSpT3qL5NUhUdqAJuP5UUDx7Bi/YCIwDQ=; b=s/GZwZLjxfhg2pnlkV1DnrIJuY4CRWU5GxAJ1zZ+po78Dv0zL2udk/J4fcFMziDp38xdzc 5QR8ofAzqmD19i2OZ9ZBsYJgbo2sUjwDHsQO26q6DC/VUqhqCPcnaWFKa4nj7o36+BJgfZ Qs3ALeVxBFV6IglnKb0WONMdkBd0OYQ58Bsh6XjEDqqlk5gD35V7l4wVF89Z/vscUyhZwA LcVeHqGKdFCPBkmwGGaz6uXXD63QcyPRHj17Xp48qaUK1r4s++RwPXA4p1VpG5GRmZ/cQ+ 8Ibc6tgSIZjdym9VAr1eZJCjTuUrlXVOzTiZ/0/DANSiZaDuCaap0qPahC78Kg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1692505707; a=rsa-sha256; cv=none; b=HZYZItjtMSlYLpkoWFq8sji3qEctpqxzOWRtIYZRvASV6l9b6zkCTsn6NQCVPlSisPllWp UQAmDaMfkZNP9FujJ5grLKRYChURj9/+Vy9RVpvnNKX3nvUZofjYYX2jgXhXv6CCMTZC5e gvRGEBrAwl35YXTYJmlVN3RQ5kPXLjgHWks5aju5Qfnt0g4jwL8k8HUPQ1qspNGRxO/nGS i0Rs8lI3mb0PWUm9+nYNV1RzoKPuWFEFS/tLo3ytPcfWn1aG0PiT4i7GM/DwGum2vZ0cDP K/Ztw553jawxdveh9/Ti1w54XrL+aOCZcspp/jQI9v2ov8z1mGXkrT4yqxu18w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RT2fg4F5xz9Gl; Sun, 20 Aug 2023 04:28:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37K4SRJI033747; Sun, 20 Aug 2023 04:28:27 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37K4SR8Y033744; Sun, 20 Aug 2023 04:28:27 GMT (envelope-from git) Date: Sun, 20 Aug 2023 04:28:27 GMT Message-Id: <202308200428.37K4SR8Y033744@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kirk McKusick Subject: git: 817bac9a6327 - stable/13 - Optimize operations on UFS/FFS filesystems with bad cylinder group(s). List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mckusick X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 817bac9a632745535febf2dc3489e038c540fc55 Auto-Submitted: auto-generated The branch stable/13 has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=817bac9a632745535febf2dc3489e038c540fc55 commit 817bac9a632745535febf2dc3489e038c540fc55 Author: Kirk McKusick AuthorDate: 2023-08-11 06:02:47 +0000 Commit: Kirk McKusick CommitDate: 2023-08-20 04:27:38 +0000 Optimize operations on UFS/FFS filesystems with bad cylinder group(s). Reported-by: Peter Holm Tested-by: Peter Holm Sponsored-by: The FreeBSD Foundation (cherry picked from commit c3046779b241768394a336de115e88cc7c10d922) --- sys/ufs/ffs/ffs_alloc.c | 53 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 04dbfd90dee4..a84202eccc05 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -116,6 +116,7 @@ static void ffs_blkfree_cg(struct ufsmount *, struct fs *, #ifdef INVARIANTS static int ffs_checkfreeblk(struct inode *, ufs2_daddr_t, long); #endif +static void ffs_checkcgintegrity(struct fs *, uint64_t, int); static ufs2_daddr_t ffs_clusteralloc(struct inode *, uint64_t, ufs2_daddr_t, int); static ino_t ffs_dirpref(struct inode *); @@ -1722,8 +1723,10 @@ ffs_fragextend(struct inode *ip, return (0); } UFS_UNLOCK(ump); - if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) + if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { + ffs_checkcgintegrity(fs, cg, error); goto fail; + } bno = dtogd(fs, bprev); blksfree = cg_blksfree(cgp); for (i = numfrags(fs, osize); i < frags; i++) @@ -1793,8 +1796,10 @@ ffs_alloccg(struct inode *ip, return (0); UFS_UNLOCK(ump); if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0 || - (cgp->cg_cs.cs_nbfree == 0 && size == fs->fs_bsize)) + (cgp->cg_cs.cs_nbfree == 0 && size == fs->fs_bsize)) { + ffs_checkcgintegrity(fs, cg, error); goto fail; + } if (size == fs->fs_bsize) { UFS_LOCK(ump); blkno = ffs_alloccgblk(ip, bp, bpref, rsize); @@ -1971,6 +1976,7 @@ ffs_clusteralloc(struct inode *ip, return (0); UFS_UNLOCK(ump); if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { + ffs_checkcgintegrity(fs, cg, error); UFS_LOCK(ump); return (0); } @@ -2115,6 +2121,7 @@ check_nifree: return (0); UFS_UNLOCK(ump); if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { + ffs_checkcgintegrity(fs, cg, error); UFS_LOCK(ump); return (0); } @@ -2762,7 +2769,7 @@ ffs_checkfreeblk(struct inode *ip, struct cg *cgp; struct buf *bp; ufs1_daddr_t cgbno; - int i, error, frags, blkalloced; + int i, frags, blkalloced; uint8_t *blksfree; fs = ITOFS(ip); @@ -2773,9 +2780,8 @@ ffs_checkfreeblk(struct inode *ip, } if ((uint64_t)bno >= fs->fs_size) panic("ffs_checkfreeblk: too big block %jd", (intmax_t)bno); - error = ffs_getcg(fs, ITODEVVP(ip), dtog(fs, bno), 0, &bp, &cgp); - if (error) - panic("ffs_checkfreeblk: cylinder group read failed"); + if (ffs_getcg(fs, ITODEVVP(ip), dtog(fs, bno), 0, &bp, &cgp) != 0) + return (0); blksfree = cg_blksfree(cgp); cgbno = dtogd(fs, bno); if (size == fs->fs_bsize) { @@ -3042,7 +3048,7 @@ ffs_getcg(struct fs *fs, bp->b_flags &= ~B_CKHASH; bp->b_flags |= B_INVAL | B_NOCACHE; brelse(bp); - return (EIO); + return (EINTEGRITY); } if (!cg_chkmagic(cgp) || cgp->cg_cgx != cg) { if (ppsratecheck(&VFSTOUFS(mp)->um_last_integritymsg, @@ -3062,7 +3068,7 @@ ffs_getcg(struct fs *fs, bp->b_flags &= ~B_CKHASH; bp->b_flags |= B_INVAL | B_NOCACHE; brelse(bp); - return (EIO); + return (EINTEGRITY); } bp->b_flags &= ~B_CKHASH; bp->b_xflags |= BX_BKGRDWRITE; @@ -3096,6 +3102,37 @@ ffs_ckhash_cg(struct buf *bp) cgp->cg_ckhash = ckhash; } +/* + * Called when a cylinder group read has failed. If an integrity check + * is the cause of failure then the cylinder group will not be usable + * until the filesystem has been unmounted and fsck has been run to + * repair it. To avoid future attempts to allocate resources from the + * cylinder group, its available resources are set to zero in the + * superblock summary information. Since it will appear to have no + * resources available, no further calls will be made to allocate + * resources from it. When resources are freed to the cylinder group + * the resource free routines will find the cylinder group unusable so + * the resource will simply be discarded and thus will not show up in + * the superblock summary information until they are recovered by fsck. + */ +static void +ffs_checkcgintegrity(struct fs *fs, + uint64_t cg, + int error) +{ + + if (error != EINTEGRITY) + return; + fs->fs_cstotal.cs_nffree -= fs->fs_cs(fs, cg).cs_nffree; + fs->fs_cs(fs, cg).cs_nffree = 0; + fs->fs_cstotal.cs_nbfree -= fs->fs_cs(fs, cg).cs_nbfree; + fs->fs_cs(fs, cg).cs_nbfree = 0; + fs->fs_cstotal.cs_nifree -= fs->fs_cs(fs, cg).cs_nifree; + fs->fs_cs(fs, cg).cs_nifree = 0; + fs->fs_maxcluster[cg] = 0; + fs->fs_fmod = 1; +} + /* * Fserr prints the name of a filesystem with an error diagnostic. *