From nobody Sat Jan 15 00:51:44 2022 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 19B5E1951717; Sat, 15 Jan 2022 00:51:46 +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 4JbKPF2RwZz4kDg; Sat, 15 Jan 2022 00:51:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642207905; 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=wOFaKc2teyxU7ftFxqmJsp5SEB6PI+ZTAVrH4tY0W3w=; b=FI26jgMmfB7ThKD02o6dt/DcTpxwL+DPt6mxO/DfjEoDc4CX4u24t2xyzyEaxG6ue52zEF FFWzPM+K7UmmbUc/hD+YedQTZnruEfhnXbIh+o0C8wTzYSPWyCIyeAofClDuH5EcHgGawR Wvi4JjOFUCiAODfShjCOPT0uz58fRs5ElkwI6MH6n7gRK+xLO+k8rlR0TohXtT5sE3gRJ/ TT7T9dHIzOkM1+VnDV3DbAZTDY6eIwVFpctnbFSV2iomnx8Q+tGgqmT2nHhekih/v83iXA Uo8L7AKkEsjBqgGo0ZbP94RYqTGWailU2Ng420ugAxDsReVoCRQVUNFCqNIPsg== 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 88A711DD9F; Sat, 15 Jan 2022 00:51:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20F0pibg031278; Sat, 15 Jan 2022 00:51:44 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20F0piLt031277; Sat, 15 Jan 2022 00:51:44 GMT (envelope-from git) Date: Sat, 15 Jan 2022 00:51:44 GMT Message-Id: <202201150051.20F0piLt031277@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 171b75b0efd0 - stable/13 - msdosfs: add msdosfs_integrity_error() 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 171b75b0efd0bb56597acb3c12f57db03fabc660 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642207905; 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=wOFaKc2teyxU7ftFxqmJsp5SEB6PI+ZTAVrH4tY0W3w=; b=ELMd9y1vWjzksr9VfINPjyUtTEpqxnNiDnjQzSFZvnkbnogE2OPFf/tKC1YygWoUIDHtkb koZf9frbGSQvL40AAqAquMJfjliBr+LSmnS1b7AQ4R6xH3bsA4PcQEuUm1ji6YQGliNKZE yszelkVyHirhLWCgjx81TV7dEaja+gg7CA+jAZoV1Kyw2SHygMMzc/+zRs9DRd7ViPcZIV AUJqkt7i+gnmbNaVS9RelLa6AVySiMlw+nqvyg/2BivTWJPaBBPNMkJB/2phVUbJieC/i7 RaUWmTWSljYiIaktufTgfP/dHF7KS0RRzX5tWezYdzNvfNvb0+T37EXGgYi9wA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1642207905; a=rsa-sha256; cv=none; b=u9JrCwMwALEKeQN1mp6H5TWBuNwbgfF9nZZPM6Y12vQeKWg0sxQklFRNApYI2BYRJnbUl7 AZMyMzZvae9ZozN1k+oB1se+EbiTpMegNhUNL/pZm0TrfHF/vfQFv1Xl9ohQG/sfsYKP0A kuy8NyQbn1A2nCNfXaD8SAmpaWFceCVdMKWInSw+/bK25YCCRV4X690sVRnJjdJpofInx/ UM1+TTeEv3ma+HJs8nf5yNXwHZOM4TqSFkcNhpcZNM6+VPuAcWC+ZuHC4/JdjfrRvql+Q3 OFFT/WQiyfByoJTRF6zvmhEOnf0lQ8IlgE7HkqE2+Fcfllkao88Cwl1X9cKunw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=171b75b0efd0bb56597acb3c12f57db03fabc660 commit 171b75b0efd0bb56597acb3c12f57db03fabc660 Author: Konstantin Belousov AuthorDate: 2021-12-25 21:20:56 +0000 Commit: Konstantin Belousov CommitDate: 2022-01-14 18:11:02 +0000 msdosfs: add msdosfs_integrity_error() (cherry picked from commit b2e4b635844091de0601f5b7157d87115386b2a9) --- sys/fs/msdosfs/msdosfs_vfsops.c | 58 +++++++++++++++++++++++++++++++++++++++++ sys/fs/msdosfs/msdosfsmount.h | 7 +++++ 2 files changed, 65 insertions(+) diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index 77942ed88ce4..e09a75a698d7 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -65,6 +65,7 @@ #include #include #include +#include #include #include @@ -112,6 +113,7 @@ struct iconv_functions *msdosfs_iconv; static int update_mp(struct mount *mp, struct thread *td); static int mountmsdosfs(struct vnode *devvp, struct mount *mp); +static void msdosfs_remount_ro(void *arg, int pending); static vfs_fhtovp_t msdosfs_fhtovp; static vfs_mount_t msdosfs_mount; static vfs_root_t msdosfs_root; @@ -337,6 +339,13 @@ msdosfs_mount(struct mount *mp) mp->mnt_flag &= ~MNT_RDONLY; MNT_IUNLOCK(mp); } + + /* + * Avoid namei() below. The "from" option is not set. + * Update of the devvp is pointless for this case. + */ + if ((pmp->pm_flags & MSDOSFS_ERR_RO) != 0) + return (0); } /* * Not an update, or updating the name: look up the name @@ -471,6 +480,8 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp) lockinit(&pmp->pm_fatlock, 0, msdosfs_lock_msg, 0, 0); lockinit(&pmp->pm_checkpath_lock, 0, "msdoscp", 0, 0); + TASK_INIT(&pmp->pm_rw2ro_task, 0, msdosfs_remount_ro, pmp); + /* * Initialize ownerships and permissions, since nothing else will * initialize them iff we are mounting root. @@ -847,6 +858,53 @@ msdosfs_unmount(struct mount *mp, int mntflags) return (error); } +static void +msdosfs_remount_ro(void *arg, int pending) +{ + struct msdosfsmount *pmp; + int error; + + pmp = arg; + + MSDOSFS_LOCK_MP(pmp); + if ((pmp->pm_flags & MSDOSFS_ERR_RO) != 0) { + while ((pmp->pm_flags & MSDOSFS_ERR_RO) != 0) + msleep(&pmp->pm_flags, &pmp->pm_fatlock, PVFS, + "msdoserrro", hz); + } else if ((pmp->pm_mountp->mnt_flag & MNT_RDONLY) == 0) { + pmp->pm_flags |= MSDOSFS_ERR_RO; + MSDOSFS_UNLOCK_MP(pmp); + printf("%s: remounting read-only due to corruption\n", + pmp->pm_mountp->mnt_stat.f_mntfromname); + error = vfs_remount_ro(pmp->pm_mountp); + if (error != 0) + printf("%s: remounting read-only failed: error %d\n", + pmp->pm_mountp->mnt_stat.f_mntfromname, error); + else + printf("remounted %s read-only\n", + pmp->pm_mountp->mnt_stat.f_mntfromname); + MSDOSFS_LOCK_MP(pmp); + pmp->pm_flags &= ~MSDOSFS_ERR_RO; + wakeup(&pmp->pm_flags); + } + MSDOSFS_UNLOCK_MP(pmp); + + vfs_unbusy(pmp->pm_mountp); +} + +void +msdosfs_integrity_error(struct msdosfsmount *pmp) +{ + int error; + + error = vfs_busy(pmp->pm_mountp, MBF_NOWAIT); + if (error == 0) + taskqueue_enqueue(taskqueue_thread, &pmp->pm_rw2ro_task); + else + printf("%s: integrity error busying failed, error %d\n", + pmp->pm_mountp->mnt_stat.f_mntfromname, error); +} + static int msdosfs_root(struct mount *mp, int flags, struct vnode **vpp) { diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index 46a02e611cf5..6a0ba896dff5 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -59,6 +59,7 @@ #ifndef MAKEFS #include #include +#include #endif #include @@ -115,6 +116,7 @@ struct msdosfsmount { #ifndef MAKEFS struct lock pm_fatlock; /* lockmgr protecting allocations */ struct lock pm_checkpath_lock; /* protects doscheckpath result */ + struct task pm_rw2ro_task; /* context for emergency remount ro */ #endif }; @@ -263,5 +265,10 @@ struct msdosfs_args { #define MSDOSFSMNT_WAITONFAT 0x40000000 /* mounted synchronous */ #define MSDOSFS_FATMIRROR 0x20000000 /* FAT is mirrored */ #define MSDOSFS_FSIMOD 0x01000000 +#define MSDOSFS_ERR_RO 0x00800000 /* remouning ro due to error */ + +#ifdef _KERNEL +void msdosfs_integrity_error(struct msdosfsmount *pmp); +#endif #endif /* !_MSDOSFS_MSDOSFSMOUNT_H_ */