From nobody Sun May 21 05:20:28 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 4QP86h6m0Cz4C326; Sun, 21 May 2023 05:20:28 +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 4QP86h61Tdz3M6b; Sun, 21 May 2023 05:20:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684646428; 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=YbUUkOHDwfnrfy20HzMBMX1CRbS3ibO1tRwJZIK0+OI=; b=jADFCg01CvMmv3q6Shc4Il9f7mkTqYo6rwLCcdXdpunSO0rZXpwABk08dTtwqD2ujksxcD RkbOfOvlwfiq8lkqYHbuwmq5GJiMx4fxM4pFFimSILMIkZd9mP8y0dbPCof8FoO9EoiMqR Ag7bnIxJ/Z3iNaNh183lVlbRB+NfQl3nHkbb61n8GHHT+C1Tga7JkES9GoUodGFH3WtFG6 cbcWfIK3/pzKuVR5QuxnWtG5RwG3RfbFXi2s3EVZSWigzQCP6Nu+gPkqQHIuxwKzN2wW9a PJdOC0CeVFtzflkUvHQ1HZwGMcDccrAtjVGb6cid//xAsjk8lt5ftIfHxxhNRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684646428; 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=YbUUkOHDwfnrfy20HzMBMX1CRbS3ibO1tRwJZIK0+OI=; b=mu8+kkCjrXcUrCjIHgvuS+o2eQ0UdgQhqIdj3Rkqgqc4g9i2mHhe9yDHOQE9AzbBsq7Duq XjirENTnyyPdYuYBdSDzqIxf01s5fGy3cm4oCrRythElW131ZIH0VE29LeTctpdQf+ixtf lLH0MwK7hm4LosN9v4tyL4MTdMa+3DntI3N0jet55ZIYPKbg7wD1f5NMLpJ687n6zN5hEK NyCCPSMMBh0BiPziUaaUEL42Qc3IxUCr/BPj0g8XEeQQolkIfyXU8V+Mikpmm57yWdq9tG tjYaXbv9KikRsIU5Ze5YFza7uut5eKr1aVIkSj+yetzx/lnCR0MbLhOM+967Ew== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1684646428; a=rsa-sha256; cv=none; b=ZxACAWdgEWGc8nudUtdL+LQ3tc7bSeF+EKG6a5mnutoW9sUqDWdmxzhGd2c+kR++/udw4H /V8w+jrwvy820aK2o9V2FYvdl0uzNJFCKWm7I8R3JkIZ37KUePm2jfT69mFCJ86qPsocGi 9wtAnJ9oRL6pQAUhZBvUWoaqZcomuu9pE4PIE262RUi2mIbrFdgleR2Seb03UizAi+ImmF bpbFqPMs5lGt147HSdYGlsSLtcEoez3TwSEAHo9/BqUAyewBzotKYDhiwmtw31noUhiXXR +YCHgjEFs/NcE5JPIlq46+PbKH3+kuS5l20W2N26A65KYMXeu7Tf09i4lnScPg== 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 4QP86h53p3zfGh; Sun, 21 May 2023 05:20:28 +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 34L5KSOZ071916; Sun, 21 May 2023 05:20:28 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 34L5KSqR071915; Sun, 21 May 2023 05:20:28 GMT (envelope-from git) Date: Sun, 21 May 2023 05:20:28 GMT Message-Id: <202305210520.34L5KSqR071915@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Fedor Uporov Subject: git: 50be18cc77b2 - main - ext2fs: Add large sectorsize disks support 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: fsu X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 50be18cc77b25891306f64192bf6f75e55d8903c Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by fsu: URL: https://cgit.FreeBSD.org/src/commit/?id=50be18cc77b25891306f64192bf6f75e55d8903c commit 50be18cc77b25891306f64192bf6f75e55d8903c Author: Fedor Uporov AuthorDate: 2023-05-08 16:14:02 +0000 Commit: Fedor Uporov CommitDate: 2023-05-21 05:17:47 +0000 ext2fs: Add large sectorsize disks support The ext2fs does not support disks with sectorsize more 512 bytes. The main issue is in reading/writing superblock, which is not aligned with 4k value. Reimplement the superblock reading logic to make it indifferent to disk logical sector size. The logical sector size more then page size is not supported, like it is doing on Linux side. PR: 271105 Reported by: k(at)vodka.home.kg Reviewed by: pfg MFC after: 2 week Differential Revision: https://reviews.freebsd.org/D40047 --- sys/fs/ext2fs/ext2_vfsops.c | 48 ++++++++++++++++++++++++--------------------- sys/fs/ext2fs/fs.h | 6 ++++-- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/sys/fs/ext2fs/ext2_vfsops.c b/sys/fs/ext2fs/ext2_vfsops.c index 9f76dc63300d..551597180465 100644 --- a/sys/fs/ext2fs/ext2_vfsops.c +++ b/sys/fs/ext2fs/ext2_vfsops.c @@ -111,7 +111,7 @@ static int ext2_check_sb_compat(struct ext2fs *es, struct cdev *dev, static int ext2_compute_sb_data(struct vnode * devvp, struct ext2fs * es, struct m_ext2fs * fs); -static const char *ext2_opts[] = { "acls", "async", "noatime", "noclusterr", +static const char *ext2_opts[] = { "acls", "async", "noatime", "noclusterr", "noclusterw", "noexec", "export", "force", "from", "multilabel", "suiddir", "nosymfollow", "sync", "union", NULL }; @@ -343,7 +343,7 @@ ext2_cg_location(struct m_ext2fs *fs, int number) * Godmar thinks: if the blocksize is greater than 1024, then * the superblock is logically part of block zero. */ - logical_sb = fs->e2fs_bsize > SBSIZE ? 0 : 1; + logical_sb = fs->e2fs_bsize > SBLOCKSIZE ? 0 : 1; if (!EXT2_HAS_INCOMPAT_FEATURE(fs, EXT2F_INCOMPAT_META_BG) || number < le32toh(fs->e2fs->e3fs_first_meta_bg)) @@ -760,9 +760,9 @@ ext2_reload(struct mount *mp, struct thread *td) * Step 2: re-read superblock from disk. * constants have been adjusted for ext2 */ - if ((error = bread(devvp, SBLOCK, SBSIZE, NOCRED, &bp)) != 0) + if ((error = bread(devvp, SBLOCK, SBLOCKBLKSIZE, NOCRED, &bp)) != 0) return (error); - es = (struct ext2fs *)bp->b_data; + es = (struct ext2fs *)((char *)bp->b_data + SBLOCKOFFSET); if (ext2_check_sb_compat(es, devvp->v_rdev, 0) != 0) { brelse(bp); return (EIO); /* XXX needs translation */ @@ -774,10 +774,7 @@ ext2_reload(struct mount *mp, struct thread *td) brelse(bp); return (error); } -#ifdef UNKLAR - if (fs->fs_sbsize < SBSIZE) - bp->b_flags |= B_INVAL; -#endif + brelse(bp); /* @@ -852,6 +849,9 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) int32_t *lp; int32_t e2fs_maxcontig; + bp = NULL; + ump = NULL; + ronly = vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0); /* XXX: use VOP_ACESS to check FS perms */ g_topology_lock(); @@ -861,13 +861,16 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) if (error) return (error); - /* XXX: should we check for some sectorsize or 512 instead? */ - if (((SBSIZE % cp->provider->sectorsize) != 0) || - (SBSIZE < cp->provider->sectorsize)) { - g_topology_lock(); - g_vfs_close(cp); - g_topology_unlock(); - return (EINVAL); + if (PAGE_SIZE != SBLOCKBLKSIZE) { + printf("WARNING: Unsupported page size %d\n", PAGE_SIZE); + error = EINVAL; + goto out; + } + if (cp->provider->sectorsize > PAGE_SIZE) { + printf("WARNING: Device sectorsize(%d) is more than %d\n", + cp->provider->sectorsize, PAGE_SIZE); + error = EINVAL; + goto out; } bo = &devvp->v_bufobj; @@ -877,12 +880,9 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max; if (mp->mnt_iosize_max > maxphys) mp->mnt_iosize_max = maxphys; - - bp = NULL; - ump = NULL; - if ((error = bread(devvp, SBLOCK, SBSIZE, NOCRED, &bp)) != 0) + if ((error = bread(devvp, SBLOCK, SBLOCKBLKSIZE, NOCRED, &bp)) != 0) goto out; - es = (struct ext2fs *)bp->b_data; + es = (struct ext2fs *)((char *)bp->b_data + SBLOCKOFFSET); if (ext2_check_sb_compat(es, dev, ronly) != 0) { error = EINVAL; /* XXX needs translation */ goto out; @@ -1377,8 +1377,12 @@ ext2_sbupdate(struct ext2mount *mp, int waitfor) if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM)) ext2_sb_csum_set(fs); - bp = getblk(mp->um_devvp, SBLOCK, SBSIZE, 0, 0, 0); - bcopy((caddr_t)es, bp->b_data, (u_int)sizeof(struct ext2fs)); + error = bread(mp->um_devvp, SBLOCK, SBLOCKBLKSIZE, NOCRED, &bp); + if (error != 0) + return (error); + + memcpy((char *)bp->b_data + SBLOCKOFFSET, (caddr_t)es, + (u_int)sizeof(struct ext2fs)); if (waitfor == MNT_WAIT) error = bwrite(bp); else diff --git a/sys/fs/ext2fs/fs.h b/sys/fs/ext2fs/fs.h index c09200af3935..ee7537253a27 100644 --- a/sys/fs/ext2fs/fs.h +++ b/sys/fs/ext2fs/fs.h @@ -56,8 +56,10 @@ * The first boot and super blocks are given in absolute disk addresses. * The byte-offset forms are preferred, as they don't imply a sector size. */ -#define SBSIZE 1024 -#define SBLOCK 2 +#define SBLOCK 0 +#define SBLOCKSIZE 1024 +#define SBLOCKOFFSET 1024 +#define SBLOCKBLKSIZE 4096 /* * The path name on which the file system is mounted is maintained