* RFC: remove the freevxfs driver
@ 2026-07-29 11:36 Christoph Hellwig
2026-07-29 11:36 ` [PATCH] freevxfs: remove the driver Christoph Hellwig
2026-07-29 18:35 ` RFC: remove the freevxfs driver Krzysztof Błaszkowski
0 siblings, 2 replies; 4+ messages in thread
From: Christoph Hellwig @ 2026-07-29 11:36 UTC (permalink / raw)
To: Christian Brauner; +Cc: Krzysztof Błaszkowski, linux-fsdevel
Hi all,
I've recently been getting a lot of AI fixes for "security" bugs on
untrusted freevxfs file systems. This driver had one known user in
the last 15 or so years, and I can't really spend the time on
dealing with all these automated report.
So I think the time has come and we should probably deleted it.
Unless Krzysztof as the only recent user and contributor wants to
take over, in which case I'd be happy to hand over the maintainership.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] freevxfs: remove the driver
2026-07-29 11:36 RFC: remove the freevxfs driver Christoph Hellwig
@ 2026-07-29 11:36 ` Christoph Hellwig
2026-07-29 15:50 ` Darrick J. Wong
2026-07-29 18:35 ` RFC: remove the freevxfs driver Krzysztof Błaszkowski
1 sibling, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2026-07-29 11:36 UTC (permalink / raw)
To: Christian Brauner; +Cc: Krzysztof Błaszkowski, linux-fsdevel
Providing compatibility to various old-school Unix systems from the 1990s
was fun 25 years ago, but today it just attracts automated bug checkers
that have no point in something like this used for retro-computing.
As there as only one known users (and contributor) in the last 15 years,
drop it. Anyone who needs to access such a file system can stay on an
older kernel, or maintain the code out of tree as it doesn't require
anything fancy.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
MAINTAINERS | 6 -
fs/Kconfig | 1 -
fs/Makefile | 1 -
fs/freevxfs/Kconfig | 27 ---
fs/freevxfs/Makefile | 9 -
fs/freevxfs/vxfs.h | 257 ----------------------------
fs/freevxfs/vxfs_bmap.c | 272 ------------------------------
fs/freevxfs/vxfs_dir.h | 68 --------
fs/freevxfs/vxfs_extern.h | 49 ------
fs/freevxfs/vxfs_fshead.c | 166 ------------------
fs/freevxfs/vxfs_fshead.h | 43 -----
fs/freevxfs/vxfs_immed.c | 53 ------
fs/freevxfs/vxfs_inode.c | 314 ----------------------------------
fs/freevxfs/vxfs_inode.h | 169 -------------------
fs/freevxfs/vxfs_lookup.c | 273 ------------------------------
fs/freevxfs/vxfs_olt.c | 105 ------------
fs/freevxfs/vxfs_olt.h | 120 -------------
fs/freevxfs/vxfs_subr.c | 152 -----------------
fs/freevxfs/vxfs_super.c | 347 --------------------------------------
19 files changed, 2432 deletions(-)
delete mode 100644 fs/freevxfs/Kconfig
delete mode 100644 fs/freevxfs/Makefile
delete mode 100644 fs/freevxfs/vxfs.h
delete mode 100644 fs/freevxfs/vxfs_bmap.c
delete mode 100644 fs/freevxfs/vxfs_dir.h
delete mode 100644 fs/freevxfs/vxfs_extern.h
delete mode 100644 fs/freevxfs/vxfs_fshead.c
delete mode 100644 fs/freevxfs/vxfs_fshead.h
delete mode 100644 fs/freevxfs/vxfs_immed.c
delete mode 100644 fs/freevxfs/vxfs_inode.c
delete mode 100644 fs/freevxfs/vxfs_inode.h
delete mode 100644 fs/freevxfs/vxfs_lookup.c
delete mode 100644 fs/freevxfs/vxfs_olt.c
delete mode 100644 fs/freevxfs/vxfs_olt.h
delete mode 100644 fs/freevxfs/vxfs_subr.c
delete mode 100644 fs/freevxfs/vxfs_super.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 2f9472c1a090..5518b5bc3efa 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10565,12 +10565,6 @@ L: linuxppc-dev@lists.ozlabs.org
S: Orphan
F: drivers/usb/phy/phy-fsl-usb*
-FREEVXFS FILESYSTEM
-M: Christoph Hellwig <hch@infradead.org>
-S: Maintained
-W: ftp://ftp.openlinux.org/pub/people/hch/vxfs
-F: fs/freevxfs/
-
FREEZER
M: "Rafael J. Wysocki" <rafael@kernel.org>
R: Pavel Machek <pavel@kernel.org>
diff --git a/fs/Kconfig b/fs/Kconfig
index cf6ae64776e6..6e7e63afae2b 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -321,7 +321,6 @@ source "fs/jffs2/Kconfig"
source "fs/ubifs/Kconfig"
source "fs/cramfs/Kconfig"
source "fs/squashfs/Kconfig"
-source "fs/freevxfs/Kconfig"
source "fs/minix/Kconfig"
source "fs/omfs/Kconfig"
source "fs/hpfs/Kconfig"
diff --git a/fs/Makefile b/fs/Makefile
index 89a8a9d207d1..ac0d1c00523f 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -80,7 +80,6 @@ obj-$(CONFIG_ISO9660_FS) += isofs/
obj-$(CONFIG_HFSPLUS_FS) += hfsplus/ # Before hfs to find wrapped HFS+
obj-$(CONFIG_HFS_FS) += hfs/
obj-$(CONFIG_ECRYPT_FS) += ecryptfs/
-obj-$(CONFIG_VXFS_FS) += freevxfs/
obj-$(CONFIG_NFS_FS) += nfs/
obj-$(CONFIG_EXPORTFS) += exportfs/
obj-$(CONFIG_NFSD) += nfsd/
diff --git a/fs/freevxfs/Kconfig b/fs/freevxfs/Kconfig
deleted file mode 100644
index 912107ebea6f..000000000000
--- a/fs/freevxfs/Kconfig
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-config VXFS_FS
- tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
- depends on BLOCK
- select BUFFER_HEAD
- help
- FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
- file system format. VERITAS VxFS(TM) is the standard file system
- of SCO UnixWare (and possibly others) and optionally available
- for Sunsoft Solaris, HP-UX and many other operating systems. However
- these particular OS implementations of vxfs may differ in on-disk
- data endianness and/or superblock offset. The vxfs module has been
- tested with SCO UnixWare and HP-UX B.10.20 (pa-risc 1.1 arch.)
- Currently only readonly access is supported and VxFX versions
- 2, 3 and 4. Tests were performed with HP-UX VxFS version 3.
-
- NOTE: the file system type as used by mount(1), mount(2) and
- fstab(5) is 'vxfs' as it describes the file system format, not
- the actual driver.
-
- There is a userspace utility for HP-UX logical volumes which makes
- creating HP-UX logical volumes easy from HP-UX disk block device file
- or regular file with image of the disk. See:
- https://sourceforge.net/projects/linux-vxfs/
-
- To compile this as a module, choose M here: the module will be
- called freevxfs. If unsure, say N.
diff --git a/fs/freevxfs/Makefile b/fs/freevxfs/Makefile
deleted file mode 100644
index e6ee59291521..000000000000
--- a/fs/freevxfs/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# VxFS Makefile
-#
-
-obj-$(CONFIG_VXFS_FS) += freevxfs.o
-
-freevxfs-objs := vxfs_bmap.o vxfs_fshead.o vxfs_immed.o vxfs_inode.o \
- vxfs_lookup.o vxfs_olt.o vxfs_subr.o vxfs_super.o
diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h
deleted file mode 100644
index bffd156d6434..000000000000
--- a/fs/freevxfs/vxfs.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-#ifndef _VXFS_SUPER_H_
-#define _VXFS_SUPER_H_
-
-/*
- * Veritas filesystem driver - superblock structure.
- *
- * This file contains the definition of the disk and core
- * superblocks of the Veritas Filesystem.
- */
-#include <linux/types.h>
-
-/*
- * Superblock magic number (vxfs_super->vs_magic).
- */
-#define VXFS_SUPER_MAGIC 0xa501FCF5
-
-/*
- * The root inode.
- */
-#define VXFS_ROOT_INO 2
-
-/*
- * Num of entries in free extent array
- */
-#define VXFS_NEFREE 32
-
-enum vxfs_byte_order {
- VXFS_BO_LE,
- VXFS_BO_BE,
-};
-
-typedef __u16 __bitwise __fs16;
-typedef __u32 __bitwise __fs32;
-typedef __u64 __bitwise __fs64;
-
-/*
- * VxFS superblock (disk).
- */
-struct vxfs_sb {
- /*
- * Readonly fields for the version 1 superblock.
- *
- * Lots of this fields are no more used by version 2
- * and never filesystems.
- */
- __fs32 vs_magic; /* Magic number */
- __fs32 vs_version; /* VxFS version */
- __fs32 vs_ctime; /* create time - secs */
- __fs32 vs_cutime; /* create time - usecs */
- __fs32 __unused1; /* unused */
- __fs32 __unused2; /* unused */
- __fs32 vs_old_logstart; /* obsolete */
- __fs32 vs_old_logend; /* obsolete */
- __fs32 vs_bsize; /* block size */
- __fs32 vs_size; /* number of blocks */
- __fs32 vs_dsize; /* number of data blocks */
- __fs32 vs_old_ninode; /* obsolete */
- __fs32 vs_old_nau; /* obsolete */
- __fs32 __unused3; /* unused */
- __fs32 vs_old_defiextsize; /* obsolete */
- __fs32 vs_old_ilbsize; /* obsolete */
- __fs32 vs_immedlen; /* size of immediate data area */
- __fs32 vs_ndaddr; /* number of direct extentes */
- __fs32 vs_firstau; /* address of first AU */
- __fs32 vs_emap; /* offset of extent map in AU */
- __fs32 vs_imap; /* offset of inode map in AU */
- __fs32 vs_iextop; /* offset of ExtOp. map in AU */
- __fs32 vs_istart; /* offset of inode list in AU */
- __fs32 vs_bstart; /* offset of fdblock in AU */
- __fs32 vs_femap; /* aufirst + emap */
- __fs32 vs_fimap; /* aufirst + imap */
- __fs32 vs_fiextop; /* aufirst + iextop */
- __fs32 vs_fistart; /* aufirst + istart */
- __fs32 vs_fbstart; /* aufirst + bstart */
- __fs32 vs_nindir; /* number of entries in indir */
- __fs32 vs_aulen; /* length of AU in blocks */
- __fs32 vs_auimlen; /* length of imap in blocks */
- __fs32 vs_auemlen; /* length of emap in blocks */
- __fs32 vs_auilen; /* length of ilist in blocks */
- __fs32 vs_aupad; /* length of pad in blocks */
- __fs32 vs_aublocks; /* data blocks in AU */
- __fs32 vs_maxtier; /* log base 2 of aublocks */
- __fs32 vs_inopb; /* number of inodes per blk */
- __fs32 vs_old_inopau; /* obsolete */
- __fs32 vs_old_inopilb; /* obsolete */
- __fs32 vs_old_ndiripau; /* obsolete */
- __fs32 vs_iaddrlen; /* size of indirect addr ext. */
- __fs32 vs_bshift; /* log base 2 of bsize */
- __fs32 vs_inoshift; /* log base 2 of inobp */
- __fs32 vs_bmask; /* ~( bsize - 1 ) */
- __fs32 vs_boffmask; /* bsize - 1 */
- __fs32 vs_old_inomask; /* old_inopilb - 1 */
- __fs32 vs_checksum; /* checksum of V1 data */
-
- /*
- * Version 1, writable
- */
- __fs32 vs_free; /* number of free blocks */
- __fs32 vs_ifree; /* number of free inodes */
- __fs32 vs_efree[VXFS_NEFREE]; /* number of free extents by size */
- __fs32 vs_flags; /* flags ?!? */
- __u8 vs_mod; /* filesystem has been changed */
- __u8 vs_clean; /* clean FS */
- __fs16 __unused4; /* unused */
- __fs32 vs_firstlogid; /* mount time log ID */
- __fs32 vs_wtime; /* last time written - sec */
- __fs32 vs_wutime; /* last time written - usec */
- __u8 vs_fname[6]; /* FS name */
- __u8 vs_fpack[6]; /* FS pack name */
- __fs32 vs_logversion; /* log format version */
- __u32 __unused5; /* unused */
-
- /*
- * Version 2, Read-only
- */
- __fs32 vs_oltext[2]; /* OLT extent and replica */
- __fs32 vs_oltsize; /* OLT extent size */
- __fs32 vs_iauimlen; /* size of inode map */
- __fs32 vs_iausize; /* size of IAU in blocks */
- __fs32 vs_dinosize; /* size of inode in bytes */
- __fs32 vs_old_dniaddr; /* indir levels per inode */
- __fs32 vs_checksum2; /* checksum of V2 RO */
-
- /*
- * Actually much more...
- */
-};
-
-
-/*
- * In core superblock filesystem private data for VxFS.
- */
-struct vxfs_sb_info {
- struct vxfs_sb *vsi_raw; /* raw (on disk) superblock */
- struct buffer_head *vsi_bp; /* buffer for raw superblock*/
- struct inode *vsi_fship; /* fileset header inode */
- struct inode *vsi_ilist; /* inode list inode */
- struct inode *vsi_stilist; /* structural inode list inode */
- u_long vsi_iext; /* initial inode list */
- ino_t vsi_fshino; /* fileset header inode */
- daddr_t vsi_oltext; /* OLT extent */
- daddr_t vsi_oltsize; /* OLT size */
- enum vxfs_byte_order byte_order;
-};
-
-static inline u16 fs16_to_cpu(struct vxfs_sb_info *sbi, __fs16 a)
-{
- if (sbi->byte_order == VXFS_BO_BE)
- return be16_to_cpu((__force __be16)a);
- else
- return le16_to_cpu((__force __le16)a);
-}
-
-static inline u32 fs32_to_cpu(struct vxfs_sb_info *sbi, __fs32 a)
-{
- if (sbi->byte_order == VXFS_BO_BE)
- return be32_to_cpu((__force __be32)a);
- else
- return le32_to_cpu((__force __le32)a);
-}
-
-static inline u64 fs64_to_cpu(struct vxfs_sb_info *sbi, __fs64 a)
-{
- if (sbi->byte_order == VXFS_BO_BE)
- return be64_to_cpu((__force __be64)a);
- else
- return le64_to_cpu((__force __le64)a);
-}
-
-/*
- * File modes. File types above 0xf000 are vxfs internal only, they should
- * not be passed back to higher levels of the system. vxfs file types must
- * never have one of the regular file type bits set.
- */
-enum vxfs_mode {
- VXFS_ISUID = 0x00000800, /* setuid */
- VXFS_ISGID = 0x00000400, /* setgid */
- VXFS_ISVTX = 0x00000200, /* sticky bit */
- VXFS_IREAD = 0x00000100, /* read */
- VXFS_IWRITE = 0x00000080, /* write */
- VXFS_IEXEC = 0x00000040, /* exec */
-
- VXFS_IFIFO = 0x00001000, /* Named pipe */
- VXFS_IFCHR = 0x00002000, /* Character device */
- VXFS_IFDIR = 0x00004000, /* Directory */
- VXFS_IFNAM = 0x00005000, /* Xenix device ?? */
- VXFS_IFBLK = 0x00006000, /* Block device */
- VXFS_IFREG = 0x00008000, /* Regular file */
- VXFS_IFCMP = 0x00009000, /* Compressed file ?!? */
- VXFS_IFLNK = 0x0000a000, /* Symlink */
- VXFS_IFSOC = 0x0000c000, /* Socket */
-
- /* VxFS internal */
- VXFS_IFFSH = 0x10000000, /* Fileset header */
- VXFS_IFILT = 0x20000000, /* Inode list */
- VXFS_IFIAU = 0x30000000, /* Inode allocation unit */
- VXFS_IFCUT = 0x40000000, /* Current usage table */
- VXFS_IFATT = 0x50000000, /* Attr. inode */
- VXFS_IFLCT = 0x60000000, /* Link count table */
- VXFS_IFIAT = 0x70000000, /* Indirect attribute file */
- VXFS_IFEMR = 0x80000000, /* Extent map reorg file */
- VXFS_IFQUO = 0x90000000, /* BSD quota file */
- VXFS_IFPTI = 0xa0000000, /* "Pass through" inode */
- VXFS_IFLAB = 0x11000000, /* Device label file */
- VXFS_IFOLT = 0x12000000, /* OLT file */
- VXFS_IFLOG = 0x13000000, /* Log file */
- VXFS_IFEMP = 0x14000000, /* Extent map file */
- VXFS_IFEAU = 0x15000000, /* Extent AU file */
- VXFS_IFAUS = 0x16000000, /* Extent AU summary file */
- VXFS_IFDEV = 0x17000000, /* Device config file */
-
-};
-
-#define VXFS_TYPE_MASK 0xfffff000
-
-#define VXFS_IS_TYPE(ip,type) (((ip)->vii_mode & VXFS_TYPE_MASK) == (type))
-#define VXFS_ISFIFO(x) VXFS_IS_TYPE((x),VXFS_IFIFO)
-#define VXFS_ISCHR(x) VXFS_IS_TYPE((x),VXFS_IFCHR)
-#define VXFS_ISDIR(x) VXFS_IS_TYPE((x),VXFS_IFDIR)
-#define VXFS_ISNAM(x) VXFS_IS_TYPE((x),VXFS_IFNAM)
-#define VXFS_ISBLK(x) VXFS_IS_TYPE((x),VXFS_IFBLK)
-#define VXFS_ISLNK(x) VXFS_IS_TYPE((x),VXFS_IFLNK)
-#define VXFS_ISREG(x) VXFS_IS_TYPE((x),VXFS_IFREG)
-#define VXFS_ISCMP(x) VXFS_IS_TYPE((x),VXFS_IFCMP)
-#define VXFS_ISSOC(x) VXFS_IS_TYPE((x),VXFS_IFSOC)
-
-#define VXFS_ISFSH(x) VXFS_IS_TYPE((x),VXFS_IFFSH)
-#define VXFS_ISILT(x) VXFS_IS_TYPE((x),VXFS_IFILT)
-
-/*
- * Inmode organisation types.
- */
-enum {
- VXFS_ORG_NONE = 0, /* Inode has *no* format ?!? */
- VXFS_ORG_EXT4 = 1, /* Ext4 */
- VXFS_ORG_IMMED = 2, /* All data stored in inode */
- VXFS_ORG_TYPED = 3, /* Typed extents */
-};
-
-#define VXFS_IS_ORG(ip,org) ((ip)->vii_orgtype == (org))
-#define VXFS_ISNONE(ip) VXFS_IS_ORG((ip), VXFS_ORG_NONE)
-#define VXFS_ISEXT4(ip) VXFS_IS_ORG((ip), VXFS_ORG_EXT4)
-#define VXFS_ISIMMED(ip) VXFS_IS_ORG((ip), VXFS_ORG_IMMED)
-#define VXFS_ISTYPED(ip) VXFS_IS_ORG((ip), VXFS_ORG_TYPED)
-
-/*
- * Get filesystem private data from VFS superblock.
- */
-#define VXFS_SBI(sbp) \
- ((struct vxfs_sb_info *)(sbp)->s_fs_info)
-
-#endif /* _VXFS_SUPER_H_ */
diff --git a/fs/freevxfs/vxfs_bmap.c b/fs/freevxfs/vxfs_bmap.c
deleted file mode 100644
index 1b8216eb1d90..000000000000
--- a/fs/freevxfs/vxfs_bmap.c
+++ /dev/null
@@ -1,272 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-
-/*
- * Veritas filesystem driver - filesystem to disk block mapping.
- */
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/kernel.h>
-
-#include "vxfs.h"
-#include "vxfs_inode.h"
-#include "vxfs_extern.h"
-
-
-#ifdef DIAGNOSTIC
-static void
-vxfs_typdump(struct vxfs_typed *typ)
-{
- printk(KERN_DEBUG "type=%Lu ", typ->vt_hdr >> VXFS_TYPED_TYPESHIFT);
- printk("offset=%Lx ", typ->vt_hdr & VXFS_TYPED_OFFSETMASK);
- printk("block=%x ", typ->vt_block);
- printk("size=%x\n", typ->vt_size);
-}
-#endif
-
-/**
- * vxfs_bmap_ext4 - do bmap for ext4 extents
- * @ip: pointer to the inode we do bmap for
- * @bn: logical block.
- *
- * Description:
- * vxfs_bmap_ext4 performs the bmap operation for inodes with
- * ext4-style extents (which are much like the traditional UNIX
- * inode organisation).
- *
- * Returns:
- * The physical block number on success, else Zero.
- */
-static daddr_t
-vxfs_bmap_ext4(struct inode *ip, long bn)
-{
- struct super_block *sb = ip->i_sb;
- struct vxfs_inode_info *vip = VXFS_INO(ip);
- struct vxfs_sb_info *sbi = VXFS_SBI(sb);
- unsigned long bsize = sb->s_blocksize;
- u32 indsize = fs32_to_cpu(sbi, vip->vii_ext4.ve4_indsize);
- int i;
-
- if (indsize > sb->s_blocksize)
- goto fail_size;
-
- for (i = 0; i < VXFS_NDADDR; i++) {
- struct direct *d = vip->vii_ext4.ve4_direct + i;
- if (bn >= 0 && bn < fs32_to_cpu(sbi, d->size))
- return (bn + fs32_to_cpu(sbi, d->extent));
- bn -= fs32_to_cpu(sbi, d->size);
- }
-
- if ((bn / (indsize * indsize * bsize / 4)) == 0) {
- struct buffer_head *buf;
- daddr_t bno;
- __fs32 *indir;
-
- buf = sb_bread(sb,
- fs32_to_cpu(sbi, vip->vii_ext4.ve4_indir[0]));
- if (!buf || !buffer_mapped(buf))
- goto fail_buf;
-
- indir = (__fs32 *)buf->b_data;
- bno = fs32_to_cpu(sbi, indir[(bn / indsize) % (indsize * bn)]) +
- (bn % indsize);
-
- brelse(buf);
- return bno;
- } else
- printk(KERN_WARNING "no matching indir?");
-
- return 0;
-
-fail_size:
- printk("vxfs: indirect extent too big!\n");
-fail_buf:
- return 0;
-}
-
-/**
- * vxfs_bmap_indir - recursion for vxfs_bmap_typed
- * @ip: pointer to the inode we do bmap for
- * @indir: indirect block we start reading at
- * @size: size of the typed area to search
- * @block: partially result from further searches
- *
- * Description:
- * vxfs_bmap_indir reads a &struct vxfs_typed at @indir
- * and performs the type-defined action.
- *
- * Returns:
- * The physical block number on success, else Zero.
- *
- * Note:
- * Kernelstack is rare. Unrecurse?
- */
-static daddr_t
-vxfs_bmap_indir(struct inode *ip, long indir, int size, long block)
-{
- struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
- struct buffer_head *bp = NULL;
- daddr_t pblock = 0;
- int i;
-
- for (i = 0; i < size * VXFS_TYPED_PER_BLOCK(ip->i_sb); i++) {
- struct vxfs_typed *typ;
- int64_t off;
-
- bp = sb_bread(ip->i_sb,
- indir + (i / VXFS_TYPED_PER_BLOCK(ip->i_sb)));
- if (!bp || !buffer_mapped(bp))
- return 0;
-
- typ = ((struct vxfs_typed *)bp->b_data) +
- (i % VXFS_TYPED_PER_BLOCK(ip->i_sb));
- off = fs64_to_cpu(sbi, typ->vt_hdr) & VXFS_TYPED_OFFSETMASK;
-
- if (block < off) {
- brelse(bp);
- continue;
- }
-
- switch ((u_int32_t)(fs64_to_cpu(sbi, typ->vt_hdr) >>
- VXFS_TYPED_TYPESHIFT)) {
- case VXFS_TYPED_INDIRECT:
- pblock = vxfs_bmap_indir(ip,
- fs32_to_cpu(sbi, typ->vt_block),
- fs32_to_cpu(sbi, typ->vt_size),
- block - off);
- if (pblock == -2)
- break;
- goto out;
- case VXFS_TYPED_DATA:
- if ((block - off) >= fs32_to_cpu(sbi, typ->vt_size))
- break;
- pblock = fs32_to_cpu(sbi, typ->vt_block) + block - off;
- goto out;
- case VXFS_TYPED_INDIRECT_DEV4:
- case VXFS_TYPED_DATA_DEV4: {
- struct vxfs_typed_dev4 *typ4 =
- (struct vxfs_typed_dev4 *)typ;
-
- printk(KERN_INFO "\n\nTYPED_DEV4 detected!\n");
- printk(KERN_INFO "block: %llu\tsize: %lld\tdev: %d\n",
- fs64_to_cpu(sbi, typ4->vd4_block),
- fs64_to_cpu(sbi, typ4->vd4_size),
- fs32_to_cpu(sbi, typ4->vd4_dev));
- goto fail;
- }
- default:
- printk(KERN_ERR "%s:%d vt_hdr %llu\n", __func__,
- __LINE__, fs64_to_cpu(sbi, typ->vt_hdr));
- BUG();
- }
- brelse(bp);
- }
-
-fail:
- pblock = 0;
-out:
- brelse(bp);
- return (pblock);
-}
-
-/**
- * vxfs_bmap_typed - bmap for typed extents
- * @ip: pointer to the inode we do bmap for
- * @iblock: logical block
- *
- * Description:
- * Performs the bmap operation for typed extents.
- *
- * Returns:
- * The physical block number on success, else Zero.
- */
-static daddr_t
-vxfs_bmap_typed(struct inode *ip, long iblock)
-{
- struct vxfs_inode_info *vip = VXFS_INO(ip);
- struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
- daddr_t pblock = 0;
- int i;
-
- for (i = 0; i < VXFS_NTYPED; i++) {
- struct vxfs_typed *typ = vip->vii_org.typed + i;
- u64 hdr = fs64_to_cpu(sbi, typ->vt_hdr);
- int64_t off = (hdr & VXFS_TYPED_OFFSETMASK);
-
-#ifdef DIAGNOSTIC
- vxfs_typdump(typ);
-#endif
- if (iblock < off)
- continue;
- switch ((u32)(hdr >> VXFS_TYPED_TYPESHIFT)) {
- case VXFS_TYPED_INDIRECT:
- pblock = vxfs_bmap_indir(ip,
- fs32_to_cpu(sbi, typ->vt_block),
- fs32_to_cpu(sbi, typ->vt_size),
- iblock - off);
- if (pblock == -2)
- break;
- return (pblock);
- case VXFS_TYPED_DATA:
- if ((iblock - off) < fs32_to_cpu(sbi, typ->vt_size))
- return (fs32_to_cpu(sbi, typ->vt_block) +
- iblock - off);
- break;
- case VXFS_TYPED_INDIRECT_DEV4:
- case VXFS_TYPED_DATA_DEV4: {
- struct vxfs_typed_dev4 *typ4 =
- (struct vxfs_typed_dev4 *)typ;
-
- printk(KERN_INFO "\n\nTYPED_DEV4 detected!\n");
- printk(KERN_INFO "block: %llu\tsize: %lld\tdev: %d\n",
- fs64_to_cpu(sbi, typ4->vd4_block),
- fs64_to_cpu(sbi, typ4->vd4_size),
- fs32_to_cpu(sbi, typ4->vd4_dev));
- return 0;
- }
- default:
- WARN_ON_ONCE(1);
- return 0;
- }
- }
-
- return 0;
-}
-
-/**
- * vxfs_bmap1 - vxfs-internal bmap operation
- * @ip: pointer to the inode we do bmap for
- * @iblock: logical block
- *
- * Description:
- * vxfs_bmap1 perfoms a logical to physical block mapping
- * for vxfs-internal purposes.
- *
- * Returns:
- * The physical block number on success, else Zero.
- */
-daddr_t
-vxfs_bmap1(struct inode *ip, long iblock)
-{
- struct vxfs_inode_info *vip = VXFS_INO(ip);
-
- if (VXFS_ISEXT4(vip))
- return vxfs_bmap_ext4(ip, iblock);
- if (VXFS_ISTYPED(vip))
- return vxfs_bmap_typed(ip, iblock);
- if (VXFS_ISNONE(vip))
- goto unsupp;
- if (VXFS_ISIMMED(vip))
- goto unsupp;
-
- printk(KERN_WARNING "vxfs: inode %llu has no valid orgtype (%x)\n",
- ip->i_ino, vip->vii_orgtype);
- BUG();
-
-unsupp:
- printk(KERN_WARNING "vxfs: inode %llu has an unsupported orgtype (%x)\n",
- ip->i_ino, vip->vii_orgtype);
- return 0;
-}
diff --git a/fs/freevxfs/vxfs_dir.h b/fs/freevxfs/vxfs_dir.h
deleted file mode 100644
index 8c67627f2a3d..000000000000
--- a/fs/freevxfs/vxfs_dir.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-#ifndef _VXFS_DIR_H_
-#define _VXFS_DIR_H_
-
-/*
- * Veritas filesystem driver - directory structure.
- *
- * This file contains the definition of the vxfs directory format.
- */
-
-
-/*
- * VxFS directory block header.
- *
- * This entry is the head of every filesystem block in a directory.
- * It is used for free space management and additionally includes
- * a hash for speeding up directory search (lookup).
- *
- * The hash may be empty and in fact we do not use it all in the
- * Linux driver for now.
- */
-struct vxfs_dirblk {
- __fs16 d_free; /* free space in dirblock */
- __fs16 d_nhash; /* no of hash chains */
- __fs16 d_hash[]; /* hash chain */
-};
-
-/*
- * VXFS_NAMELEN is the maximum length of the d_name field
- * of an VxFS directory entry.
- */
-#define VXFS_NAMELEN 256
-
-/*
- * VxFS directory entry.
- */
-struct vxfs_direct {
- __fs32 d_ino; /* inode number */
- __fs16 d_reclen; /* record length */
- __fs16 d_namelen; /* d_name length */
- __fs16 d_hashnext; /* next hash entry */
- char d_name[VXFS_NAMELEN]; /* name */
-};
-
-/*
- * VXFS_DIRPAD defines the directory entry boundaries, is _must_ be
- * a multiple of four.
- * VXFS_NAMEMIN is the length of a directory entry with a NULL d_name.
- * VXFS_DIRROUND is an internal macros that rounds a length to a value
- * usable for directory sizes.
- * VXFS_DIRLEN calculates the directory entry size for an entry with
- * a d_name with size len.
- */
-#define VXFS_DIRPAD 4
-#define VXFS_NAMEMIN offsetof(struct vxfs_direct, d_name)
-#define VXFS_DIRROUND(len) ((VXFS_DIRPAD + (len) - 1) & ~(VXFS_DIRPAD -1))
-#define VXFS_DIRLEN(len) (VXFS_DIRROUND(VXFS_NAMEMIN + (len)))
-
-/*
- * VXFS_DIRBLKOV is the overhead of a specific dirblock.
- */
-#define VXFS_DIRBLKOV(sbi, dbp) \
- ((sizeof(short) * fs16_to_cpu(sbi, dbp->d_nhash)) + 4)
-
-#endif /* _VXFS_DIR_H_ */
diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
deleted file mode 100644
index 3a2180c5e208..000000000000
--- a/fs/freevxfs/vxfs_extern.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-#ifndef _VXFS_EXTERN_H_
-#define _VXFS_EXTERN_H_
-
-/*
- * Veritas filesystem driver - external prototypes.
- *
- * This file contains prototypes for all vxfs functions used
- * outside their respective source files.
- */
-
-
-struct kmem_cache;
-struct super_block;
-struct vxfs_inode_info;
-struct inode;
-
-
-/* vxfs_bmap.c */
-extern daddr_t vxfs_bmap1(struct inode *, long);
-
-/* vxfs_fshead.c */
-extern int vxfs_read_fshead(struct super_block *);
-
-/* vxfs_inode.c */
-extern const struct address_space_operations vxfs_immed_aops;
-extern void vxfs_dumpi(struct vxfs_inode_info *, ino_t);
-extern struct inode *vxfs_blkiget(struct super_block *, u_long, ino_t);
-extern struct inode *vxfs_stiget(struct super_block *, ino_t);
-extern struct inode *vxfs_iget(struct super_block *, ino_t);
-extern void vxfs_evict_inode(struct inode *);
-
-/* vxfs_lookup.c */
-extern const struct inode_operations vxfs_dir_inode_ops;
-extern const struct file_operations vxfs_dir_operations;
-
-/* vxfs_olt.c */
-extern int vxfs_read_olt(struct super_block *, u_long);
-
-/* vxfs_subr.c */
-extern const struct address_space_operations vxfs_aops;
-extern struct page * vxfs_get_page(struct address_space *, u_long);
-extern void vxfs_put_page(struct page *);
-extern struct buffer_head * vxfs_bread(struct inode *, int);
-
-#endif /* _VXFS_EXTERN_H_ */
diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
deleted file mode 100644
index e6ab8bdf7a6c..000000000000
--- a/fs/freevxfs/vxfs_fshead.c
+++ /dev/null
@@ -1,166 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-
-/*
- * Veritas filesystem driver - fileset header routines.
- */
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-
-#include "vxfs.h"
-#include "vxfs_inode.h"
-#include "vxfs_extern.h"
-#include "vxfs_fshead.h"
-
-
-#ifdef DIAGNOSTIC
-static void
-vxfs_dumpfsh(struct vxfs_fsh *fhp)
-{
- printk("\n\ndumping fileset header:\n");
- printk("----------------------------\n");
- printk("version: %u\n", fhp->fsh_version);
- printk("fsindex: %u\n", fhp->fsh_fsindex);
- printk("iauino: %u\tninodes:%u\n",
- fhp->fsh_iauino, fhp->fsh_ninodes);
- printk("maxinode: %u\tlctino: %u\n",
- fhp->fsh_maxinode, fhp->fsh_lctino);
- printk("nau: %u\n", fhp->fsh_nau);
- printk("ilistino[0]: %u\tilistino[1]: %u\n",
- fhp->fsh_ilistino[0], fhp->fsh_ilistino[1]);
-}
-#endif
-
-/**
- * vxfs_getfsh - read fileset header into memory
- * @ip: the (fake) fileset header inode
- * @which: 0 for the structural, 1 for the primary fsh.
- *
- * Description:
- * vxfs_getfsh reads either the structural or primary fileset header
- * described by @ip into memory.
- *
- * Returns:
- * The fileset header structure on success, else Zero.
- */
-static struct vxfs_fsh *
-vxfs_getfsh(struct inode *ip, int which)
-{
- struct buffer_head *bp;
-
- bp = vxfs_bread(ip, which);
- if (bp) {
- struct vxfs_fsh *fhp;
-
- if (!(fhp = kmalloc_obj(*fhp)))
- goto out;
- memcpy(fhp, bp->b_data, sizeof(*fhp));
-
- put_bh(bp);
- return (fhp);
- }
-out:
- brelse(bp);
- return NULL;
-}
-
-/**
- * vxfs_read_fshead - read the fileset headers
- * @sbp: superblock to which the fileset belongs
- *
- * Description:
- * vxfs_read_fshead will fill the inode and structural inode list in @sb.
- *
- * Returns:
- * Zero on success, else a negative error code (-EINVAL).
- */
-int
-vxfs_read_fshead(struct super_block *sbp)
-{
- struct vxfs_sb_info *infp = VXFS_SBI(sbp);
- struct vxfs_fsh *pfp, *sfp;
- struct vxfs_inode_info *vip;
-
- infp->vsi_fship = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
- if (!infp->vsi_fship) {
- printk(KERN_ERR "vxfs: unable to read fsh inode\n");
- return -EINVAL;
- }
-
- vip = VXFS_INO(infp->vsi_fship);
- if (!VXFS_ISFSH(vip)) {
- printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
- vip->vii_mode & VXFS_TYPE_MASK);
- goto out_iput_fship;
- }
-
-#ifdef DIAGNOSTIC
- printk("vxfs: fsh inode dump:\n");
- vxfs_dumpi(vip, infp->vsi_fshino);
-#endif
-
- sfp = vxfs_getfsh(infp->vsi_fship, 0);
- if (!sfp) {
- printk(KERN_ERR "vxfs: unable to get structural fsh\n");
- goto out_iput_fship;
- }
-
-#ifdef DIAGNOSTIC
- vxfs_dumpfsh(sfp);
-#endif
-
- pfp = vxfs_getfsh(infp->vsi_fship, 1);
- if (!pfp) {
- printk(KERN_ERR "vxfs: unable to get primary fsh\n");
- goto out_free_sfp;
- }
-
-#ifdef DIAGNOSTIC
- vxfs_dumpfsh(pfp);
-#endif
-
- infp->vsi_stilist = vxfs_blkiget(sbp, infp->vsi_iext,
- fs32_to_cpu(infp, sfp->fsh_ilistino[0]));
- if (!infp->vsi_stilist) {
- printk(KERN_ERR "vxfs: unable to get structural list inode\n");
- goto out_free_pfp;
- }
- if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
- printk(KERN_ERR "vxfs: structural list inode is of wrong type (%x)\n",
- VXFS_INO(infp->vsi_stilist)->vii_mode & VXFS_TYPE_MASK);
- goto out_iput_stilist;
- }
-
- infp->vsi_ilist = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0]));
- if (!infp->vsi_ilist) {
- printk(KERN_ERR "vxfs: unable to get inode list inode\n");
- goto out_iput_stilist;
- }
- if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
- printk(KERN_ERR "vxfs: inode list inode is of wrong type (%x)\n",
- VXFS_INO(infp->vsi_ilist)->vii_mode & VXFS_TYPE_MASK);
- goto out_iput_ilist;
- }
-
- kfree(pfp);
- kfree(sfp);
- return 0;
-
- out_iput_ilist:
- iput(infp->vsi_ilist);
- out_iput_stilist:
- iput(infp->vsi_stilist);
- out_free_pfp:
- kfree(pfp);
- out_free_sfp:
- kfree(sfp);
- out_iput_fship:
- iput(infp->vsi_fship);
- return -EINVAL;
-}
diff --git a/fs/freevxfs/vxfs_fshead.h b/fs/freevxfs/vxfs_fshead.h
deleted file mode 100644
index dfd2147599c4..000000000000
--- a/fs/freevxfs/vxfs_fshead.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-#ifndef _VXFS_FSHEAD_H_
-#define _VXFS_FSHEAD_H_
-
-/*
- * Veritas filesystem driver - fileset header structures.
- *
- * This file contains the physical structure of the VxFS
- * fileset header.
- */
-
-
-/*
- * Fileset header
- */
-struct vxfs_fsh {
- __fs32 fsh_version; /* fileset header version */
- __fs32 fsh_fsindex; /* fileset index */
- __fs32 fsh_time; /* modification time - sec */
- __fs32 fsh_utime; /* modification time - usec */
- __fs32 fsh_extop; /* extop flags */
- __fs32 fsh_ninodes; /* allocated inodes */
- __fs32 fsh_nau; /* number of IAUs */
- __fs32 fsh_old_ilesize; /* old size of ilist */
- __fs32 fsh_dflags; /* flags */
- __fs32 fsh_quota; /* quota limit */
- __fs32 fsh_maxinode; /* maximum inode number */
- __fs32 fsh_iauino; /* IAU inode */
- __fs32 fsh_ilistino[2]; /* ilist inodes */
- __fs32 fsh_lctino; /* link count table inode */
-
- /*
- * Slightly more fields follow, but they
- * a) are not of any interest for us, and
- * b) differ a lot in different vxfs versions/ports
- */
-};
-
-#endif /* _VXFS_FSHEAD_H_ */
diff --git a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c
deleted file mode 100644
index ed51fcd34757..000000000000
--- a/fs/freevxfs/vxfs_immed.c
+++ /dev/null
@@ -1,53 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-
-/*
- * Veritas filesystem driver - support for 'immed' inodes.
- */
-#include <linux/fs.h>
-#include <linux/pagemap.h>
-
-#include "vxfs.h"
-#include "vxfs_extern.h"
-#include "vxfs_inode.h"
-
-/**
- * vxfs_immed_read_folio - read part of an immed inode into pagecache
- * @fp: file context (unused)
- * @folio: folio to fill in.
- *
- * Description:
- * vxfs_immed_read_folio reads a part of the immed area of the
- * file that hosts @folio into the pagecache.
- *
- * Returns:
- * Zero on success, else a negative error code.
- *
- * Locking status:
- * @folio is locked and will be unlocked.
- */
-static int vxfs_immed_read_folio(struct file *fp, struct folio *folio)
-{
- struct vxfs_inode_info *vip = VXFS_INO(folio->mapping->host);
- void *src = vip->vii_immed.vi_immed + folio_pos(folio);
- unsigned long i;
-
- for (i = 0; i < folio_nr_pages(folio); i++) {
- memcpy_to_page(folio_page(folio, i), 0, src, PAGE_SIZE);
- src += PAGE_SIZE;
- }
-
- folio_mark_uptodate(folio);
- folio_unlock(folio);
-
- return 0;
-}
-
-/*
- * Address space operations for immed files and directories.
- */
-const struct address_space_operations vxfs_immed_aops = {
- .read_folio = vxfs_immed_read_folio,
-};
diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
deleted file mode 100644
index 21fc94b98209..000000000000
--- a/fs/freevxfs/vxfs_inode.c
+++ /dev/null
@@ -1,314 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-
-/*
- * Veritas filesystem driver - inode routines.
- */
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/pagemap.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/namei.h>
-
-#include "vxfs.h"
-#include "vxfs_inode.h"
-#include "vxfs_extern.h"
-
-
-#ifdef DIAGNOSTIC
-/*
- * Dump inode contents (partially).
- */
-void
-vxfs_dumpi(struct vxfs_inode_info *vip, ino_t ino)
-{
- printk(KERN_DEBUG "\n\n");
- if (ino)
- printk(KERN_DEBUG "dumping vxfs inode %ld\n", ino);
- else
- printk(KERN_DEBUG "dumping unknown vxfs inode\n");
-
- printk(KERN_DEBUG "---------------------------\n");
- printk(KERN_DEBUG "mode is %x\n", vip->vii_mode);
- printk(KERN_DEBUG "nlink:%u, uid:%u, gid:%u\n",
- vip->vii_nlink, vip->vii_uid, vip->vii_gid);
- printk(KERN_DEBUG "size:%Lx, blocks:%u\n",
- vip->vii_size, vip->vii_blocks);
- printk(KERN_DEBUG "orgtype:%u\n", vip->vii_orgtype);
-}
-#endif
-
-/**
- * vxfs_transmod - mode for a VxFS inode
- * @vip: VxFS inode
- *
- * Description:
- * vxfs_transmod returns a Linux mode_t for a given
- * VxFS inode structure.
- */
-static __inline__ umode_t
-vxfs_transmod(struct vxfs_inode_info *vip)
-{
- umode_t ret = vip->vii_mode & ~VXFS_TYPE_MASK;
-
- if (VXFS_ISFIFO(vip))
- ret |= S_IFIFO;
- if (VXFS_ISCHR(vip))
- ret |= S_IFCHR;
- if (VXFS_ISDIR(vip))
- ret |= S_IFDIR;
- if (VXFS_ISBLK(vip))
- ret |= S_IFBLK;
- if (VXFS_ISLNK(vip))
- ret |= S_IFLNK;
- if (VXFS_ISREG(vip))
- ret |= S_IFREG;
- if (VXFS_ISSOC(vip))
- ret |= S_IFSOCK;
-
- return (ret);
-}
-
-static inline void dip2vip_cpy(struct vxfs_sb_info *sbi,
- struct vxfs_inode_info *vip, struct vxfs_dinode *dip)
-{
- struct inode *inode = &vip->vfs_inode;
-
- vip->vii_mode = fs32_to_cpu(sbi, dip->vdi_mode);
- vip->vii_nlink = fs32_to_cpu(sbi, dip->vdi_nlink);
- vip->vii_uid = fs32_to_cpu(sbi, dip->vdi_uid);
- vip->vii_gid = fs32_to_cpu(sbi, dip->vdi_gid);
- vip->vii_size = fs64_to_cpu(sbi, dip->vdi_size);
- vip->vii_atime = fs32_to_cpu(sbi, dip->vdi_atime);
- vip->vii_autime = fs32_to_cpu(sbi, dip->vdi_autime);
- vip->vii_mtime = fs32_to_cpu(sbi, dip->vdi_mtime);
- vip->vii_mutime = fs32_to_cpu(sbi, dip->vdi_mutime);
- vip->vii_ctime = fs32_to_cpu(sbi, dip->vdi_ctime);
- vip->vii_cutime = fs32_to_cpu(sbi, dip->vdi_cutime);
- vip->vii_orgtype = dip->vdi_orgtype;
-
- vip->vii_blocks = fs32_to_cpu(sbi, dip->vdi_blocks);
- vip->vii_gen = fs32_to_cpu(sbi, dip->vdi_gen);
-
- if (VXFS_ISDIR(vip))
- vip->vii_dotdot = fs32_to_cpu(sbi, dip->vdi_dotdot);
- else if (!VXFS_ISREG(vip) && !VXFS_ISLNK(vip))
- vip->vii_rdev = fs32_to_cpu(sbi, dip->vdi_rdev);
-
- /* don't endian swap the fields that differ by orgtype */
- memcpy(&vip->vii_org, &dip->vdi_org, sizeof(vip->vii_org));
-
- inode->i_mode = vxfs_transmod(vip);
- i_uid_write(inode, (uid_t)vip->vii_uid);
- i_gid_write(inode, (gid_t)vip->vii_gid);
-
- set_nlink(inode, vip->vii_nlink);
- inode->i_size = vip->vii_size;
-
- inode_set_atime(inode, vip->vii_atime, 0);
- inode_set_ctime(inode, vip->vii_ctime, 0);
- inode_set_mtime(inode, vip->vii_mtime, 0);
-
- inode->i_blocks = vip->vii_blocks;
- inode->i_generation = vip->vii_gen;
-}
-
-/**
- * vxfs_blkiget - find inode based on extent #
- * @sbp: superblock of the filesystem we search in
- * @extent: number of the extent to search
- * @ino: inode number to search
- *
- * Description:
- * vxfs_blkiget searches inode @ino in the filesystem described by
- * @sbp in the extent @extent.
- * Returns the matching VxFS inode on success, else a NULL pointer.
- *
- * NOTE:
- * While __vxfs_iget uses the pagecache vxfs_blkiget uses the
- * buffercache. This function should not be used outside the
- * read_super() method, otherwise the data may be incoherent.
- */
-struct inode *
-vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
-{
- struct buffer_head *bp;
- struct inode *inode;
- u_long block, offset;
-
- inode = new_inode(sbp);
- if (!inode)
- return NULL;
- inode->i_ino = get_next_ino();
-
- block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize);
- offset = ((ino % (sbp->s_blocksize / VXFS_ISIZE)) * VXFS_ISIZE);
- bp = sb_bread(sbp, block);
-
- if (bp && buffer_mapped(bp)) {
- struct vxfs_inode_info *vip = VXFS_INO(inode);
- struct vxfs_dinode *dip;
-
- dip = (struct vxfs_dinode *)(bp->b_data + offset);
- dip2vip_cpy(VXFS_SBI(sbp), vip, dip);
- vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
-#ifdef DIAGNOSTIC
- vxfs_dumpi(vip, ino);
-#endif
- brelse(bp);
- return inode;
- }
-
- printk(KERN_WARNING "vxfs: unable to read block %ld\n", block);
- brelse(bp);
- iput(inode);
- return NULL;
-}
-
-/**
- * __vxfs_iget - generic find inode facility
- * @ilistp: inode list
- * @vip: VxFS inode to fill in
- * @ino: inode number
- *
- * Description:
- * Search the for inode number @ino in the filesystem
- * described by @sbp. Use the specified inode table (@ilistp).
- * Returns the matching inode on success, else an error code.
- */
-static int
-__vxfs_iget(struct inode *ilistp, struct vxfs_inode_info *vip, ino_t ino)
-{
- struct page *pp;
- u_long offset;
-
- offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE;
- pp = vxfs_get_page(ilistp->i_mapping, ino * VXFS_ISIZE / PAGE_SIZE);
-
- if (!IS_ERR(pp)) {
- struct vxfs_dinode *dip;
- caddr_t kaddr = (char *)page_address(pp);
-
- dip = (struct vxfs_dinode *)(kaddr + offset);
- dip2vip_cpy(VXFS_SBI(ilistp->i_sb), vip, dip);
- vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
-#ifdef DIAGNOSTIC
- vxfs_dumpi(vip, ino);
-#endif
- vxfs_put_page(pp);
- return 0;
- }
-
- printk(KERN_WARNING "vxfs: error on page 0x%p for inode %ld\n",
- pp, (unsigned long)ino);
- return PTR_ERR(pp);
-}
-
-/**
- * vxfs_stiget - find inode using the structural inode list
- * @sbp: VFS superblock
- * @ino: inode #
- *
- * Description:
- * Find inode @ino in the filesystem described by @sbp using
- * the structural inode list.
- * Returns the matching inode on success, else a NULL pointer.
- */
-struct inode *
-vxfs_stiget(struct super_block *sbp, ino_t ino)
-{
- struct inode *inode;
- int error;
-
- inode = new_inode(sbp);
- if (!inode)
- return NULL;
- inode->i_ino = get_next_ino();
-
- error = __vxfs_iget(VXFS_SBI(sbp)->vsi_stilist, VXFS_INO(inode), ino);
- if (error) {
- iput(inode);
- return NULL;
- }
-
- return inode;
-}
-
-/**
- * vxfs_iget - get an inode
- * @sbp: the superblock to get the inode for
- * @ino: the number of the inode to get
- *
- * Description:
- * vxfs_read_inode creates an inode, reads the disk inode for @ino and fills
- * in all relevant fields in the new inode.
- */
-struct inode *
-vxfs_iget(struct super_block *sbp, ino_t ino)
-{
- struct vxfs_inode_info *vip;
- const struct address_space_operations *aops;
- struct inode *ip;
- int error;
-
- ip = iget_locked(sbp, ino);
- if (!ip)
- return ERR_PTR(-ENOMEM);
- if (!(inode_state_read_once(ip) & I_NEW))
- return ip;
-
- vip = VXFS_INO(ip);
- error = __vxfs_iget(VXFS_SBI(sbp)->vsi_ilist, vip, ino);
- if (error) {
- iget_failed(ip);
- return ERR_PTR(error);
- }
-
- if (VXFS_ISIMMED(vip))
- aops = &vxfs_immed_aops;
- else
- aops = &vxfs_aops;
-
- if (S_ISREG(ip->i_mode)) {
- ip->i_fop = &generic_ro_fops;
- ip->i_mapping->a_ops = aops;
- } else if (S_ISDIR(ip->i_mode)) {
- ip->i_op = &vxfs_dir_inode_ops;
- ip->i_fop = &vxfs_dir_operations;
- ip->i_mapping->a_ops = aops;
- } else if (S_ISLNK(ip->i_mode)) {
- if (!VXFS_ISIMMED(vip)) {
- ip->i_op = &page_symlink_inode_operations;
- inode_nohighmem(ip);
- ip->i_mapping->a_ops = &vxfs_aops;
- } else {
- ip->i_op = &simple_symlink_inode_operations;
- ip->i_link = vip->vii_immed.vi_immed;
- nd_terminate_link(ip->i_link, ip->i_size,
- sizeof(vip->vii_immed.vi_immed) - 1);
- }
- } else
- init_special_inode(ip, ip->i_mode, old_decode_dev(vip->vii_rdev));
-
- unlock_new_inode(ip);
- return ip;
-}
-
-/**
- * vxfs_evict_inode - remove inode from main memory
- * @ip: inode to discard.
- *
- * Description:
- * vxfs_evict_inode() is called on the final iput and frees the private
- * inode area.
- */
-void
-vxfs_evict_inode(struct inode *ip)
-{
- truncate_inode_pages_final(&ip->i_data);
- clear_inode(ip);
-}
diff --git a/fs/freevxfs/vxfs_inode.h b/fs/freevxfs/vxfs_inode.h
deleted file mode 100644
index 1e9e138d2b33..000000000000
--- a/fs/freevxfs/vxfs_inode.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-#ifndef _VXFS_INODE_H_
-#define _VXFS_INODE_H_
-
-/*
- * Veritas filesystem driver - inode structure.
- *
- * This file contains the definition of the disk and core
- * inodes of the Veritas Filesystem.
- */
-
-
-#define VXFS_ISIZE 0x100 /* Inode size */
-
-#define VXFS_NDADDR 10 /* Number of direct addrs in inode */
-#define VXFS_NIADDR 2 /* Number of indirect addrs in inode */
-#define VXFS_NIMMED 96 /* Size of immediate data in inode */
-#define VXFS_NTYPED 6 /* Num of typed extents */
-
-#define VXFS_TYPED_OFFSETMASK (0x00FFFFFFFFFFFFFFULL)
-#define VXFS_TYPED_TYPEMASK (0xFF00000000000000ULL)
-#define VXFS_TYPED_TYPESHIFT 56
-
-#define VXFS_TYPED_PER_BLOCK(sbp) \
- ((sbp)->s_blocksize / sizeof(struct vxfs_typed))
-
-/*
- * Possible extent descriptor types for %VXFS_ORG_TYPED extents.
- */
-enum {
- VXFS_TYPED_INDIRECT = 1,
- VXFS_TYPED_DATA = 2,
- VXFS_TYPED_INDIRECT_DEV4 = 3,
- VXFS_TYPED_DATA_DEV4 = 4,
-};
-
-/*
- * Data stored immediately in the inode.
- */
-struct vxfs_immed {
- __u8 vi_immed[VXFS_NIMMED];
-};
-
-struct vxfs_ext4 {
- __fs32 ve4_spare; /* ?? */
- __fs32 ve4_indsize; /* Indirect extent size */
- __fs32 ve4_indir[VXFS_NIADDR]; /* Indirect extents */
- struct direct { /* Direct extents */
- __fs32 extent; /* Extent number */
- __fs32 size; /* Size of extent */
- } ve4_direct[VXFS_NDADDR];
-};
-
-struct vxfs_typed {
- __fs64 vt_hdr; /* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
- __fs32 vt_block; /* Extent block */
- __fs32 vt_size; /* Size in blocks */
-};
-
-struct vxfs_typed_dev4 {
- __fs64 vd4_hdr; /* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
- __fs64 vd4_block; /* Extent block */
- __fs64 vd4_size; /* Size in blocks */
- __fs32 vd4_dev; /* Device ID */
- __u8 __pad1;
-};
-
-/*
- * The inode as contained on the physical device.
- */
-struct vxfs_dinode {
- __fs32 vdi_mode;
- __fs32 vdi_nlink; /* Link count */
- __fs32 vdi_uid; /* UID */
- __fs32 vdi_gid; /* GID */
- __fs64 vdi_size; /* Inode size in bytes */
- __fs32 vdi_atime; /* Last time accessed - sec */
- __fs32 vdi_autime; /* Last time accessed - usec */
- __fs32 vdi_mtime; /* Last modify time - sec */
- __fs32 vdi_mutime; /* Last modify time - usec */
- __fs32 vdi_ctime; /* Create time - sec */
- __fs32 vdi_cutime; /* Create time - usec */
- __u8 vdi_aflags; /* Allocation flags */
- __u8 vdi_orgtype; /* Organisation type */
- __fs16 vdi_eopflags;
- __fs32 vdi_eopdata;
- union {
- __fs32 rdev;
- __fs32 dotdot;
- struct {
- __u32 reserved;
- __fs32 fixextsize;
- } i_regular;
- struct {
- __fs32 matchino;
- __fs32 fsetindex;
- } i_vxspec;
- __u64 align;
- } vdi_ftarea;
- __fs32 vdi_blocks; /* How much blocks does inode occupy */
- __fs32 vdi_gen; /* Inode generation */
- __fs64 vdi_version; /* Version */
- union {
- struct vxfs_immed immed;
- struct vxfs_ext4 ext4;
- struct vxfs_typed typed[VXFS_NTYPED];
- } vdi_org;
- __fs32 vdi_iattrino;
-};
-
-#define vdi_rdev vdi_ftarea.rdev
-#define vdi_dotdot vdi_ftarea.dotdot
-#define vdi_fixextsize vdi_ftarea.regular.fixextsize
-#define vdi_matchino vdi_ftarea.vxspec.matchino
-#define vdi_fsetindex vdi_ftarea.vxspec.fsetindex
-
-#define vdi_immed vdi_org.immed
-#define vdi_ext4 vdi_org.ext4
-#define vdi_typed vdi_org.typed
-
-
-/*
- * The inode as represented in the main memory.
- */
-struct vxfs_inode_info {
- struct inode vfs_inode;
-
- __u32 vii_mode;
- __u32 vii_nlink; /* Link count */
- __u32 vii_uid; /* UID */
- __u32 vii_gid; /* GID */
- __u64 vii_size; /* Inode size in bytes */
- __u32 vii_atime; /* Last time accessed - sec */
- __u32 vii_autime; /* Last time accessed - usec */
- __u32 vii_mtime; /* Last modify time - sec */
- __u32 vii_mutime; /* Last modify time - usec */
- __u32 vii_ctime; /* Create time - sec */
- __u32 vii_cutime; /* Create time - usec */
- __u8 vii_orgtype; /* Organisation type */
- union {
- __u32 rdev;
- __u32 dotdot;
- } vii_ftarea;
- __u32 vii_blocks; /* How much blocks does inode occupy */
- __u32 vii_gen; /* Inode generation */
- union {
- struct vxfs_immed immed;
- struct vxfs_ext4 ext4;
- struct vxfs_typed typed[VXFS_NTYPED];
- } vii_org;
-};
-
-#define vii_rdev vii_ftarea.rdev
-#define vii_dotdot vii_ftarea.dotdot
-
-#define vii_immed vii_org.immed
-#define vii_ext4 vii_org.ext4
-#define vii_typed vii_org.typed
-
-static inline struct vxfs_inode_info *VXFS_INO(struct inode *inode)
-{
- return container_of(inode, struct vxfs_inode_info, vfs_inode);
-}
-
-#endif /* _VXFS_INODE_H_ */
diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c
deleted file mode 100644
index 138e08de976e..000000000000
--- a/fs/freevxfs/vxfs_lookup.c
+++ /dev/null
@@ -1,273 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-
-/*
- * Veritas filesystem driver - lookup and other directory related code.
- */
-#include <linux/fs.h>
-#include <linux/filelock.h>
-#include <linux/time.h>
-#include <linux/mm.h>
-#include <linux/highmem.h>
-#include <linux/kernel.h>
-#include <linux/pagemap.h>
-
-#include "vxfs.h"
-#include "vxfs_dir.h"
-#include "vxfs_inode.h"
-#include "vxfs_extern.h"
-
-/*
- * Number of VxFS blocks per page.
- */
-#define VXFS_BLOCK_PER_PAGE(sbp) ((PAGE_SIZE / (sbp)->s_blocksize))
-
-
-static struct dentry * vxfs_lookup(struct inode *, struct dentry *, unsigned int);
-static int vxfs_readdir(struct file *, struct dir_context *);
-
-const struct inode_operations vxfs_dir_inode_ops = {
- .lookup = vxfs_lookup,
-};
-
-const struct file_operations vxfs_dir_operations = {
- .llseek = generic_file_llseek,
- .read = generic_read_dir,
- .iterate_shared = vxfs_readdir,
- .setlease = generic_setlease,
-};
-
-
-/**
- * vxfs_find_entry - find a mathing directory entry for a dentry
- * @ip: directory inode
- * @dp: dentry for which we want to find a direct
- * @ppp: gets filled with the page the return value sits in
- *
- * Description:
- * vxfs_find_entry finds a &struct vxfs_direct for the VFS directory
- * cache entry @dp. @ppp will be filled with the page the return
- * value resides in.
- *
- * Returns:
- * The wanted direct on success, else a NULL pointer.
- */
-static struct vxfs_direct *
-vxfs_find_entry(struct inode *ip, struct dentry *dp, struct page **ppp)
-{
- u_long bsize = ip->i_sb->s_blocksize;
- const char *name = dp->d_name.name;
- int namelen = dp->d_name.len;
- loff_t limit = VXFS_DIRROUND(ip->i_size);
- struct vxfs_direct *de_exit = NULL;
- loff_t pos = 0;
- struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
-
- while (pos < limit) {
- struct page *pp;
- char *kaddr;
- int pg_ofs = pos & ~PAGE_MASK;
-
- pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_SHIFT);
- if (IS_ERR(pp))
- return NULL;
- kaddr = (char *)page_address(pp);
-
- while (pg_ofs < PAGE_SIZE && pos < limit) {
- struct vxfs_direct *de;
-
- if ((pos & (bsize - 1)) < 4) {
- struct vxfs_dirblk *dbp =
- (struct vxfs_dirblk *)
- (kaddr + (pos & ~PAGE_MASK));
- int overhead = VXFS_DIRBLKOV(sbi, dbp);
-
- pos += overhead;
- pg_ofs += overhead;
- }
- de = (struct vxfs_direct *)(kaddr + pg_ofs);
-
- if (!de->d_reclen) {
- pos += bsize - 1;
- pos &= ~(bsize - 1);
- break;
- }
-
- pg_ofs += fs16_to_cpu(sbi, de->d_reclen);
- pos += fs16_to_cpu(sbi, de->d_reclen);
- if (!de->d_ino)
- continue;
-
- if (namelen != fs16_to_cpu(sbi, de->d_namelen))
- continue;
- if (!memcmp(name, de->d_name, namelen)) {
- *ppp = pp;
- de_exit = de;
- break;
- }
- }
- if (!de_exit)
- vxfs_put_page(pp);
- else
- break;
- }
-
- return de_exit;
-}
-
-/**
- * vxfs_inode_by_name - find inode number for dentry
- * @dip: directory to search in
- * @dp: dentry we search for
- *
- * Description:
- * vxfs_inode_by_name finds out the inode number of
- * the path component described by @dp in @dip.
- *
- * Returns:
- * The wanted inode number on success, else Zero.
- */
-static ino_t
-vxfs_inode_by_name(struct inode *dip, struct dentry *dp)
-{
- struct vxfs_direct *de;
- struct page *pp;
- ino_t ino = 0;
-
- de = vxfs_find_entry(dip, dp, &pp);
- if (de) {
- ino = fs32_to_cpu(VXFS_SBI(dip->i_sb), de->d_ino);
- kunmap(pp);
- put_page(pp);
- }
-
- return (ino);
-}
-
-/**
- * vxfs_lookup - lookup pathname component
- * @dip: dir in which we lookup
- * @dp: dentry we lookup
- * @flags: lookup flags
- *
- * Description:
- * vxfs_lookup tries to lookup the pathname component described
- * by @dp in @dip.
- *
- * Returns:
- * A NULL-pointer on success, else a negative error code encoded
- * in the return pointer.
- */
-static struct dentry *
-vxfs_lookup(struct inode *dip, struct dentry *dp, unsigned int flags)
-{
- struct inode *ip = NULL;
- ino_t ino;
-
- if (dp->d_name.len > VXFS_NAMELEN)
- return ERR_PTR(-ENAMETOOLONG);
-
- ino = vxfs_inode_by_name(dip, dp);
- if (ino)
- ip = vxfs_iget(dip->i_sb, ino);
- return d_splice_alias(ip, dp);
-}
-
-/**
- * vxfs_readdir - read a directory
- * @fp: the directory to read
- * @ctx: dir_context for filldir/readdir
- *
- * Description:
- * vxfs_readdir fills @retp with directory entries from @fp
- * using the VFS supplied callback @filler.
- *
- * Returns:
- * Zero.
- */
-static int
-vxfs_readdir(struct file *fp, struct dir_context *ctx)
-{
- struct inode *ip = file_inode(fp);
- struct super_block *sbp = ip->i_sb;
- u_long bsize = sbp->s_blocksize;
- loff_t pos, limit;
- struct vxfs_sb_info *sbi = VXFS_SBI(sbp);
-
- if (ctx->pos == 0) {
- if (!dir_emit_dot(fp, ctx))
- goto out;
- ctx->pos++;
- }
- if (ctx->pos == 1) {
- if (!dir_emit(ctx, "..", 2, VXFS_INO(ip)->vii_dotdot, DT_DIR))
- goto out;
- ctx->pos++;
- }
-
- limit = VXFS_DIRROUND(ip->i_size);
- if (ctx->pos > limit)
- goto out;
-
- pos = ctx->pos & ~3L;
-
- while (pos < limit) {
- struct page *pp;
- char *kaddr;
- int pg_ofs = pos & ~PAGE_MASK;
- int rc = 0;
-
- pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_SHIFT);
- if (IS_ERR(pp))
- return -ENOMEM;
-
- kaddr = (char *)page_address(pp);
-
- while (pg_ofs < PAGE_SIZE && pos < limit) {
- struct vxfs_direct *de;
-
- if ((pos & (bsize - 1)) < 4) {
- struct vxfs_dirblk *dbp =
- (struct vxfs_dirblk *)
- (kaddr + (pos & ~PAGE_MASK));
- int overhead = VXFS_DIRBLKOV(sbi, dbp);
-
- pos += overhead;
- pg_ofs += overhead;
- }
- de = (struct vxfs_direct *)(kaddr + pg_ofs);
-
- if (!de->d_reclen) {
- pos += bsize - 1;
- pos &= ~(bsize - 1);
- break;
- }
-
- pg_ofs += fs16_to_cpu(sbi, de->d_reclen);
- pos += fs16_to_cpu(sbi, de->d_reclen);
- if (!de->d_ino)
- continue;
-
- rc = dir_emit(ctx, de->d_name,
- fs16_to_cpu(sbi, de->d_namelen),
- fs32_to_cpu(sbi, de->d_ino),
- DT_UNKNOWN);
- if (!rc) {
- /* the dir entry was not read, fix pos. */
- pos -= fs16_to_cpu(sbi, de->d_reclen);
- break;
- }
- }
- vxfs_put_page(pp);
- if (!rc)
- break;
- }
-
- ctx->pos = pos | 2;
-
-out:
- return 0;
-}
diff --git a/fs/freevxfs/vxfs_olt.c b/fs/freevxfs/vxfs_olt.c
deleted file mode 100644
index 23f35187c289..000000000000
--- a/fs/freevxfs/vxfs_olt.c
+++ /dev/null
@@ -1,105 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-
-/*
- * Veritas filesystem driver - object location table support.
- */
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/kernel.h>
-
-#include "vxfs.h"
-#include "vxfs_olt.h"
-#include "vxfs_extern.h"
-
-
-static inline void
-vxfs_get_fshead(struct vxfs_oltfshead *fshp, struct vxfs_sb_info *infp)
-{
- BUG_ON(infp->vsi_fshino);
- infp->vsi_fshino = fs32_to_cpu(infp, fshp->olt_fsino[0]);
-}
-
-static inline void
-vxfs_get_ilist(struct vxfs_oltilist *ilistp, struct vxfs_sb_info *infp)
-{
- BUG_ON(infp->vsi_iext);
- infp->vsi_iext = fs32_to_cpu(infp, ilistp->olt_iext[0]);
-}
-
-static inline u_long
-vxfs_oblock(struct super_block *sbp, daddr_t block, u_long bsize)
-{
- BUG_ON(sbp->s_blocksize % bsize);
- return (block * (sbp->s_blocksize / bsize));
-}
-
-
-/**
- * vxfs_read_olt - read olt
- * @sbp: superblock of the filesystem
- * @bsize: blocksize of the filesystem
- *
- * Description:
- * vxfs_read_olt reads the olt of the filesystem described by @sbp
- * into main memory and does some basic setup.
- *
- * Returns:
- * Zero on success, else a negative error code.
- */
-int
-vxfs_read_olt(struct super_block *sbp, u_long bsize)
-{
- struct vxfs_sb_info *infp = VXFS_SBI(sbp);
- struct buffer_head *bp;
- struct vxfs_olt *op;
- char *oaddr, *eaddr;
-
- bp = sb_bread(sbp, vxfs_oblock(sbp, infp->vsi_oltext, bsize));
- if (!bp || !bp->b_data)
- goto fail;
-
- op = (struct vxfs_olt *)bp->b_data;
- if (fs32_to_cpu(infp, op->olt_magic) != VXFS_OLT_MAGIC) {
- printk(KERN_NOTICE "vxfs: ivalid olt magic number\n");
- goto fail;
- }
-
- /*
- * It is in theory possible that vsi_oltsize is > 1.
- * I've not seen any such filesystem yet and I'm lazy.. --hch
- */
- if (infp->vsi_oltsize > 1) {
- printk(KERN_NOTICE "vxfs: oltsize > 1 detected.\n");
- printk(KERN_NOTICE "vxfs: please notify hch@infradead.org\n");
- goto fail;
- }
-
- oaddr = bp->b_data + fs32_to_cpu(infp, op->olt_size);
- eaddr = bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
-
- while (oaddr < eaddr) {
- struct vxfs_oltcommon *ocp =
- (struct vxfs_oltcommon *)oaddr;
-
- switch (fs32_to_cpu(infp, ocp->olt_type)) {
- case VXFS_OLT_FSHEAD:
- vxfs_get_fshead((struct vxfs_oltfshead *)oaddr, infp);
- break;
- case VXFS_OLT_ILIST:
- vxfs_get_ilist((struct vxfs_oltilist *)oaddr, infp);
- break;
- }
-
- oaddr += fs32_to_cpu(infp, ocp->olt_size);
- }
-
- brelse(bp);
- return (infp->vsi_fshino && infp->vsi_iext) ? 0 : -EINVAL;
-
-fail:
- brelse(bp);
- return -EINVAL;
-}
diff --git a/fs/freevxfs/vxfs_olt.h b/fs/freevxfs/vxfs_olt.h
deleted file mode 100644
index 53afba08d617..000000000000
--- a/fs/freevxfs/vxfs_olt.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-#ifndef _VXFS_OLT_H_
-#define _VXFS_OLT_H_
-
-/*
- * Veritas filesystem driver - Object Location Table data structures.
- *
- * This file contains definitions for the Object Location Table used
- * by the Veritas Filesystem version 2 and newer.
- */
-
-
-/*
- * OLT magic number (vxfs_olt->olt_magic).
- */
-#define VXFS_OLT_MAGIC 0xa504FCF5
-
-/*
- * VxFS OLT entry types.
- */
-enum {
- VXFS_OLT_FREE = 1,
- VXFS_OLT_FSHEAD = 2,
- VXFS_OLT_CUT = 3,
- VXFS_OLT_ILIST = 4,
- VXFS_OLT_DEV = 5,
- VXFS_OLT_SB = 6
-};
-
-/*
- * VxFS OLT header.
- *
- * The Object Location Table header is placed at the beginning of each
- * OLT extent. It is used to fing certain filesystem-wide metadata, e.g.
- * the initial inode list, the fileset header or the device configuration.
- */
-struct vxfs_olt {
- __fs32 olt_magic; /* magic number */
- __fs32 olt_size; /* size of this entry */
- __fs32 olt_checksum; /* checksum of extent */
- __u32 __unused1; /* ??? */
- __fs32 olt_mtime; /* time of last mod. (sec) */
- __fs32 olt_mutime; /* time of last mod. (usec) */
- __fs32 olt_totfree; /* free space in OLT extent */
- __fs32 olt_extents[2]; /* addr of this extent, replica */
- __fs32 olt_esize; /* size of this extent */
- __fs32 olt_next[2]; /* addr of next extent, replica */
- __fs32 olt_nsize; /* size of next extent */
- __u32 __unused2; /* align to 8 byte boundary */
-};
-
-/*
- * VxFS common OLT entry (on disk).
- */
-struct vxfs_oltcommon {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_size; /* size of this record */
-};
-
-/*
- * VxFS free OLT entry (on disk).
- */
-struct vxfs_oltfree {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_fsize; /* size of this free record */
-};
-
-/*
- * VxFS initial-inode list (on disk).
- */
-struct vxfs_oltilist {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_size; /* size of this record */
- __fs32 olt_iext[2]; /* initial inode list, replica */
-};
-
-/*
- * Current Usage Table
- */
-struct vxfs_oltcut {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_size; /* size of this record */
- __fs32 olt_cutino; /* inode of current usage table */
- __u8 __pad; /* unused, 8 byte align */
-};
-
-/*
- * Inodes containing Superblock, Intent log and OLTs
- */
-struct vxfs_oltsb {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_size; /* size of this record */
- __fs32 olt_sbino; /* inode of superblock file */
- __u32 __unused1; /* ??? */
- __fs32 olt_logino[2]; /* inode of log file,replica */
- __fs32 olt_oltino[2]; /* inode of OLT, replica */
-};
-
-/*
- * Inode containing device configuration + it's replica
- */
-struct vxfs_oltdev {
- __fs32 olt_type; /* type of this record */
- __fs32 olt_size; /* size of this record */
- __fs32 olt_devino[2]; /* inode of device config files */
-};
-
-/*
- * Fileset header
- */
-struct vxfs_oltfshead {
- __fs32 olt_type; /* type number */
- __fs32 olt_size; /* size of this record */
- __fs32 olt_fsino[2]; /* inodes of fileset header */
-};
-
-#endif /* _VXFS_OLT_H_ */
diff --git a/fs/freevxfs/vxfs_subr.c b/fs/freevxfs/vxfs_subr.c
deleted file mode 100644
index f439877ea6e8..000000000000
--- a/fs/freevxfs/vxfs_subr.c
+++ /dev/null
@@ -1,152 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- */
-
-/*
- * Veritas filesystem driver - shared subroutines.
- */
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/kernel.h>
-#include <linux/pagemap.h>
-
-#include "vxfs_extern.h"
-
-
-static int vxfs_read_folio(struct file *, struct folio *);
-static sector_t vxfs_bmap(struct address_space *, sector_t);
-
-const struct address_space_operations vxfs_aops = {
- .read_folio = vxfs_read_folio,
- .bmap = vxfs_bmap,
-};
-
-inline void
-vxfs_put_page(struct page *pp)
-{
- kunmap(pp);
- put_page(pp);
-}
-
-/**
- * vxfs_get_page - read a page into memory.
- * @mapping: mapping to read from
- * @n: page number
- *
- * Description:
- * vxfs_get_page reads the @n th page of @ip into the pagecache.
- *
- * Returns:
- * The wanted page on success, else a NULL pointer.
- */
-struct page *
-vxfs_get_page(struct address_space *mapping, u_long n)
-{
- struct page * pp;
-
- pp = read_mapping_page(mapping, n, NULL);
-
- if (!IS_ERR(pp)) {
- kmap(pp);
- /** if (!PageChecked(pp)) **/
- /** vxfs_check_page(pp); **/
- }
-
- return (pp);
-}
-
-/**
- * vxfs_bread - read buffer for a give inode,block tuple
- * @ip: inode
- * @block: logical block
- *
- * Description:
- * The vxfs_bread function reads block no @block of
- * @ip into the buffercache.
- *
- * Returns:
- * The resulting &struct buffer_head.
- */
-struct buffer_head *
-vxfs_bread(struct inode *ip, int block)
-{
- struct buffer_head *bp;
- daddr_t pblock;
-
- pblock = vxfs_bmap1(ip, block);
- bp = sb_bread(ip->i_sb, pblock);
-
- return (bp);
-}
-
-/**
- * vxfs_getblk - locate buffer for given inode,block tuple
- * @ip: inode
- * @iblock: logical block
- * @bp: buffer skeleton
- * @create: %TRUE if blocks may be newly allocated.
- *
- * Description:
- * The vxfs_getblk function fills @bp with the right physical
- * block and device number to perform a lowlevel read/write on
- * it.
- *
- * Returns:
- * Zero on success, else a negativ error code (-EIO).
- */
-static int
-vxfs_getblk(struct inode *ip, sector_t iblock,
- struct buffer_head *bp, int create)
-{
- daddr_t pblock;
-
- pblock = vxfs_bmap1(ip, iblock);
- if (pblock != 0) {
- map_bh(bp, ip->i_sb, pblock);
- return 0;
- }
-
- return -EIO;
-}
-
-/**
- * vxfs_read_folio - read one page synchronously into the pagecache
- * @file: file context (unused)
- * @folio: folio to fill in.
- *
- * Description:
- * The vxfs_read_folio routine reads @folio synchronously into the
- * pagecache.
- *
- * Returns:
- * Zero on success, else a negative error code.
- *
- * Locking status:
- * @folio is locked and will be unlocked.
- */
-static int vxfs_read_folio(struct file *file, struct folio *folio)
-{
- return block_read_full_folio(folio, vxfs_getblk);
-}
-
-/**
- * vxfs_bmap - perform logical to physical block mapping
- * @mapping: logical to physical mapping to use
- * @block: logical block (relative to @mapping).
- *
- * Description:
- * Vxfs_bmap find out the corresponding phsical block to the
- * @mapping, @block pair.
- *
- * Returns:
- * Physical block number on success, else Zero.
- *
- * Locking status:
- * We are under the bkl.
- */
-static sector_t
-vxfs_bmap(struct address_space *mapping, sector_t block)
-{
- return generic_block_bmap(mapping, block, vxfs_getblk);
-}
diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
deleted file mode 100644
index d7d847d75c3d..000000000000
--- a/fs/freevxfs/vxfs_super.c
+++ /dev/null
@@ -1,347 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2000-2001 Christoph Hellwig.
- * Copyright (c) 2016 Krzysztof Blaszkowski
- */
-
-/*
- * Veritas filesystem driver - superblock related routines.
- */
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include <linux/blkdev.h>
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/stat.h>
-#include <linux/vfs.h>
-#include <linux/fs_context.h>
-
-#include "vxfs.h"
-#include "vxfs_extern.h"
-#include "vxfs_dir.h"
-#include "vxfs_inode.h"
-
-
-MODULE_AUTHOR("Christoph Hellwig, Krzysztof Blaszkowski");
-MODULE_DESCRIPTION("Veritas Filesystem (VxFS) driver");
-MODULE_LICENSE("Dual BSD/GPL");
-
-static struct kmem_cache *vxfs_inode_cachep;
-
-/**
- * vxfs_put_super - free superblock resources
- * @sbp: VFS superblock.
- *
- * Description:
- * vxfs_put_super frees all resources allocated for @sbp
- * after the last instance of the filesystem is unmounted.
- */
-
-static void
-vxfs_put_super(struct super_block *sbp)
-{
- struct vxfs_sb_info *infp = VXFS_SBI(sbp);
-
- iput(infp->vsi_fship);
- iput(infp->vsi_ilist);
- iput(infp->vsi_stilist);
-
- brelse(infp->vsi_bp);
- kfree(infp);
-}
-
-/**
- * vxfs_statfs - get filesystem information
- * @dentry: VFS dentry to locate superblock
- * @bufp: output buffer
- *
- * Description:
- * vxfs_statfs fills the statfs buffer @bufp with information
- * about the filesystem described by @dentry.
- *
- * Returns:
- * Zero.
- *
- * Locking:
- * No locks held.
- *
- * Notes:
- * This is everything but complete...
- */
-static int
-vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp)
-{
- struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb);
- struct vxfs_sb *raw_sb = infp->vsi_raw;
- u64 id = huge_encode_dev(dentry->d_sb->s_bdev->bd_dev);
-
- bufp->f_type = VXFS_SUPER_MAGIC;
- bufp->f_bsize = dentry->d_sb->s_blocksize;
- bufp->f_blocks = fs32_to_cpu(infp, raw_sb->vs_dsize);
- bufp->f_bfree = fs32_to_cpu(infp, raw_sb->vs_free);
- bufp->f_bavail = 0;
- bufp->f_files = 0;
- bufp->f_ffree = fs32_to_cpu(infp, raw_sb->vs_ifree);
- bufp->f_fsid = u64_to_fsid(id);
- bufp->f_namelen = VXFS_NAMELEN;
-
- return 0;
-}
-
-static int vxfs_reconfigure(struct fs_context *fc)
-{
- sync_filesystem(fc->root->d_sb);
- fc->sb_flags |= SB_RDONLY;
- return 0;
-}
-
-static struct inode *vxfs_alloc_inode(struct super_block *sb)
-{
- struct vxfs_inode_info *vi;
-
- vi = alloc_inode_sb(sb, vxfs_inode_cachep, GFP_KERNEL);
- if (!vi)
- return NULL;
- inode_init_once(&vi->vfs_inode);
- return &vi->vfs_inode;
-}
-
-static void vxfs_free_inode(struct inode *inode)
-{
- kmem_cache_free(vxfs_inode_cachep, VXFS_INO(inode));
-}
-
-static const struct super_operations vxfs_super_ops = {
- .alloc_inode = vxfs_alloc_inode,
- .free_inode = vxfs_free_inode,
- .evict_inode = vxfs_evict_inode,
- .put_super = vxfs_put_super,
- .statfs = vxfs_statfs,
-};
-
-static int vxfs_try_sb_magic(struct super_block *sbp, struct fs_context *fc,
- unsigned blk, __fs32 magic)
-{
- struct buffer_head *bp;
- struct vxfs_sb *rsbp;
- struct vxfs_sb_info *infp = VXFS_SBI(sbp);
- int silent = fc->sb_flags & SB_SILENT;
- int rc = -ENOMEM;
-
- bp = sb_bread(sbp, blk);
- do {
- if (!bp || !buffer_mapped(bp)) {
- if (!silent) {
- warnf(fc,
- "vxfs: unable to read disk superblock at %u",
- blk);
- }
- break;
- }
-
- rc = -EINVAL;
- rsbp = (struct vxfs_sb *)bp->b_data;
- if (rsbp->vs_magic != magic) {
- if (!silent)
- infof(fc,
- "vxfs: WRONG superblock magic %08x at %u",
- rsbp->vs_magic, blk);
- break;
- }
-
- rc = 0;
- infp->vsi_raw = rsbp;
- infp->vsi_bp = bp;
- } while (0);
-
- if (rc) {
- infp->vsi_raw = NULL;
- infp->vsi_bp = NULL;
- brelse(bp);
- }
-
- return rc;
-}
-
-/**
- * vxfs_fill_super - read superblock into memory and initialize filesystem
- * @sbp: VFS superblock (to fill)
- * @fc: filesytem context
- *
- * Description:
- * We are called on the first mount of a filesystem to read the
- * superblock into memory and do some basic setup.
- *
- * Returns:
- * The superblock on success, else %NULL.
- *
- * Locking:
- * We are under @sbp->s_lock.
- */
-static int vxfs_fill_super(struct super_block *sbp, struct fs_context *fc)
-{
- struct vxfs_sb_info *infp;
- struct vxfs_sb *rsbp;
- u_long bsize;
- struct inode *root;
- int ret = -EINVAL;
- int silent = fc->sb_flags & SB_SILENT;
- u32 j;
-
- sbp->s_flags |= SB_RDONLY;
-
- infp = kzalloc_obj(*infp);
- if (!infp) {
- warnf(fc, "vxfs: unable to allocate incore superblock");
- return -ENOMEM;
- }
-
- bsize = sb_min_blocksize(sbp, BLOCK_SIZE);
- if (!bsize) {
- warnf(fc, "vxfs: unable to set blocksize");
- goto out;
- }
-
- sbp->s_op = &vxfs_super_ops;
- sbp->s_fs_info = infp;
- sbp->s_time_min = 0;
- sbp->s_time_max = U32_MAX;
-
- if (!vxfs_try_sb_magic(sbp, fc, 1,
- (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {
- /* Unixware, x86 */
- infp->byte_order = VXFS_BO_LE;
- } else if (!vxfs_try_sb_magic(sbp, fc, 8,
- (__force __fs32)cpu_to_be32(VXFS_SUPER_MAGIC))) {
- /* HP-UX, parisc */
- infp->byte_order = VXFS_BO_BE;
- } else {
- if (!silent)
- infof(fc, "vxfs: can't find superblock.");
- goto out;
- }
-
- rsbp = infp->vsi_raw;
- j = fs32_to_cpu(infp, rsbp->vs_version);
- if ((j < 2 || j > 4) && !silent) {
- infof(fc, "vxfs: unsupported VxFS version (%d)", j);
- goto out;
- }
-
-#ifdef DIAGNOSTIC
- printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", j);
- printk(KERN_DEBUG "vxfs: blocksize: %d\n",
- fs32_to_cpu(infp, rsbp->vs_bsize));
-#endif
-
- sbp->s_magic = fs32_to_cpu(infp, rsbp->vs_magic);
-
- infp->vsi_oltext = fs32_to_cpu(infp, rsbp->vs_oltext[0]);
- infp->vsi_oltsize = fs32_to_cpu(infp, rsbp->vs_oltsize);
-
- j = fs32_to_cpu(infp, rsbp->vs_bsize);
- if (!sb_set_blocksize(sbp, j)) {
- warnf(fc, "vxfs: unable to set final block size");
- goto out;
- }
-
- if (vxfs_read_olt(sbp, bsize)) {
- warnf(fc, "vxfs: unable to read olt");
- goto out;
- }
-
- if (vxfs_read_fshead(sbp)) {
- warnf(fc, "vxfs: unable to read fshead");
- goto out;
- }
-
- root = vxfs_iget(sbp, VXFS_ROOT_INO);
- if (IS_ERR(root)) {
- ret = PTR_ERR(root);
- goto out;
- }
- sbp->s_root = d_make_root(root);
- if (!sbp->s_root) {
- warnf(fc, "vxfs: unable to get root dentry.");
- goto out_free_ilist;
- }
-
- return 0;
-
-out_free_ilist:
- iput(infp->vsi_fship);
- iput(infp->vsi_ilist);
- iput(infp->vsi_stilist);
-out:
- brelse(infp->vsi_bp);
- kfree(infp);
- return ret;
-}
-
-/*
- * The usual module blurb.
- */
-static int vxfs_get_tree(struct fs_context *fc)
-{
- return get_tree_bdev(fc, vxfs_fill_super);
-}
-
-static const struct fs_context_operations vxfs_context_ops = {
- .get_tree = vxfs_get_tree,
- .reconfigure = vxfs_reconfigure,
-};
-
-static int vxfs_init_fs_context(struct fs_context *fc)
-{
- fc->ops = &vxfs_context_ops;
-
- return 0;
-}
-
-static struct file_system_type vxfs_fs_type = {
- .owner = THIS_MODULE,
- .name = "vxfs",
- .kill_sb = kill_block_super,
- .fs_flags = FS_REQUIRES_DEV,
- .init_fs_context = vxfs_init_fs_context,
-};
-MODULE_ALIAS_FS("vxfs"); /* makes mount -t vxfs autoload the module */
-MODULE_ALIAS("vxfs");
-
-static int __init
-vxfs_init(void)
-{
- int rv;
-
- vxfs_inode_cachep = kmem_cache_create_usercopy("vxfs_inode",
- sizeof(struct vxfs_inode_info), 0,
- SLAB_RECLAIM_ACCOUNT,
- offsetof(struct vxfs_inode_info, vii_immed.vi_immed),
- sizeof_field(struct vxfs_inode_info,
- vii_immed.vi_immed),
- NULL);
- if (!vxfs_inode_cachep)
- return -ENOMEM;
- rv = register_filesystem(&vxfs_fs_type);
- if (rv < 0)
- kmem_cache_destroy(vxfs_inode_cachep);
- return rv;
-}
-
-static void __exit
-vxfs_cleanup(void)
-{
- unregister_filesystem(&vxfs_fs_type);
- /*
- * Make sure all delayed rcu free inodes are flushed before we
- * destroy cache.
- */
- rcu_barrier();
- kmem_cache_destroy(vxfs_inode_cachep);
-}
-
-module_init(vxfs_init);
-module_exit(vxfs_cleanup);
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] freevxfs: remove the driver
2026-07-29 11:36 ` [PATCH] freevxfs: remove the driver Christoph Hellwig
@ 2026-07-29 15:50 ` Darrick J. Wong
0 siblings, 0 replies; 4+ messages in thread
From: Darrick J. Wong @ 2026-07-29 15:50 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Christian Brauner, Krzysztof Błaszkowski, linux-fsdevel
On Wed, Jul 29, 2026 at 01:36:40PM +0200, Christoph Hellwig wrote:
> Providing compatibility to various old-school Unix systems from the 1990s
> was fun 25 years ago, but today it just attracts automated bug checkers
> that have no point in something like this used for retro-computing.
>
> As there as only one known users (and contributor) in the last 15 years,
> drop it. Anyone who needs to access such a file system can stay on an
> older kernel, or maintain the code out of tree as it doesn't require
> anything fancy.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Yay less maintenance burden!
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> ---
> MAINTAINERS | 6 -
> fs/Kconfig | 1 -
> fs/Makefile | 1 -
> fs/freevxfs/Kconfig | 27 ---
> fs/freevxfs/Makefile | 9 -
> fs/freevxfs/vxfs.h | 257 ----------------------------
> fs/freevxfs/vxfs_bmap.c | 272 ------------------------------
> fs/freevxfs/vxfs_dir.h | 68 --------
> fs/freevxfs/vxfs_extern.h | 49 ------
> fs/freevxfs/vxfs_fshead.c | 166 ------------------
> fs/freevxfs/vxfs_fshead.h | 43 -----
> fs/freevxfs/vxfs_immed.c | 53 ------
> fs/freevxfs/vxfs_inode.c | 314 ----------------------------------
> fs/freevxfs/vxfs_inode.h | 169 -------------------
> fs/freevxfs/vxfs_lookup.c | 273 ------------------------------
> fs/freevxfs/vxfs_olt.c | 105 ------------
> fs/freevxfs/vxfs_olt.h | 120 -------------
> fs/freevxfs/vxfs_subr.c | 152 -----------------
> fs/freevxfs/vxfs_super.c | 347 --------------------------------------
> 19 files changed, 2432 deletions(-)
> delete mode 100644 fs/freevxfs/Kconfig
> delete mode 100644 fs/freevxfs/Makefile
> delete mode 100644 fs/freevxfs/vxfs.h
> delete mode 100644 fs/freevxfs/vxfs_bmap.c
> delete mode 100644 fs/freevxfs/vxfs_dir.h
> delete mode 100644 fs/freevxfs/vxfs_extern.h
> delete mode 100644 fs/freevxfs/vxfs_fshead.c
> delete mode 100644 fs/freevxfs/vxfs_fshead.h
> delete mode 100644 fs/freevxfs/vxfs_immed.c
> delete mode 100644 fs/freevxfs/vxfs_inode.c
> delete mode 100644 fs/freevxfs/vxfs_inode.h
> delete mode 100644 fs/freevxfs/vxfs_lookup.c
> delete mode 100644 fs/freevxfs/vxfs_olt.c
> delete mode 100644 fs/freevxfs/vxfs_olt.h
> delete mode 100644 fs/freevxfs/vxfs_subr.c
> delete mode 100644 fs/freevxfs/vxfs_super.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 2f9472c1a090..5518b5bc3efa 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -10565,12 +10565,6 @@ L: linuxppc-dev@lists.ozlabs.org
> S: Orphan
> F: drivers/usb/phy/phy-fsl-usb*
>
> -FREEVXFS FILESYSTEM
> -M: Christoph Hellwig <hch@infradead.org>
> -S: Maintained
> -W: ftp://ftp.openlinux.org/pub/people/hch/vxfs
> -F: fs/freevxfs/
> -
> FREEZER
> M: "Rafael J. Wysocki" <rafael@kernel.org>
> R: Pavel Machek <pavel@kernel.org>
> diff --git a/fs/Kconfig b/fs/Kconfig
> index cf6ae64776e6..6e7e63afae2b 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -321,7 +321,6 @@ source "fs/jffs2/Kconfig"
> source "fs/ubifs/Kconfig"
> source "fs/cramfs/Kconfig"
> source "fs/squashfs/Kconfig"
> -source "fs/freevxfs/Kconfig"
> source "fs/minix/Kconfig"
> source "fs/omfs/Kconfig"
> source "fs/hpfs/Kconfig"
> diff --git a/fs/Makefile b/fs/Makefile
> index 89a8a9d207d1..ac0d1c00523f 100644
> --- a/fs/Makefile
> +++ b/fs/Makefile
> @@ -80,7 +80,6 @@ obj-$(CONFIG_ISO9660_FS) += isofs/
> obj-$(CONFIG_HFSPLUS_FS) += hfsplus/ # Before hfs to find wrapped HFS+
> obj-$(CONFIG_HFS_FS) += hfs/
> obj-$(CONFIG_ECRYPT_FS) += ecryptfs/
> -obj-$(CONFIG_VXFS_FS) += freevxfs/
> obj-$(CONFIG_NFS_FS) += nfs/
> obj-$(CONFIG_EXPORTFS) += exportfs/
> obj-$(CONFIG_NFSD) += nfsd/
> diff --git a/fs/freevxfs/Kconfig b/fs/freevxfs/Kconfig
> deleted file mode 100644
> index 912107ebea6f..000000000000
> --- a/fs/freevxfs/Kconfig
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0-only
> -config VXFS_FS
> - tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
> - depends on BLOCK
> - select BUFFER_HEAD
> - help
> - FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
> - file system format. VERITAS VxFS(TM) is the standard file system
> - of SCO UnixWare (and possibly others) and optionally available
> - for Sunsoft Solaris, HP-UX and many other operating systems. However
> - these particular OS implementations of vxfs may differ in on-disk
> - data endianness and/or superblock offset. The vxfs module has been
> - tested with SCO UnixWare and HP-UX B.10.20 (pa-risc 1.1 arch.)
> - Currently only readonly access is supported and VxFX versions
> - 2, 3 and 4. Tests were performed with HP-UX VxFS version 3.
> -
> - NOTE: the file system type as used by mount(1), mount(2) and
> - fstab(5) is 'vxfs' as it describes the file system format, not
> - the actual driver.
> -
> - There is a userspace utility for HP-UX logical volumes which makes
> - creating HP-UX logical volumes easy from HP-UX disk block device file
> - or regular file with image of the disk. See:
> - https://sourceforge.net/projects/linux-vxfs/
> -
> - To compile this as a module, choose M here: the module will be
> - called freevxfs. If unsure, say N.
> diff --git a/fs/freevxfs/Makefile b/fs/freevxfs/Makefile
> deleted file mode 100644
> index e6ee59291521..000000000000
> --- a/fs/freevxfs/Makefile
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0-only
> -#
> -# VxFS Makefile
> -#
> -
> -obj-$(CONFIG_VXFS_FS) += freevxfs.o
> -
> -freevxfs-objs := vxfs_bmap.o vxfs_fshead.o vxfs_immed.o vxfs_inode.o \
> - vxfs_lookup.o vxfs_olt.o vxfs_subr.o vxfs_super.o
> diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h
> deleted file mode 100644
> index bffd156d6434..000000000000
> --- a/fs/freevxfs/vxfs.h
> +++ /dev/null
> @@ -1,257 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -#ifndef _VXFS_SUPER_H_
> -#define _VXFS_SUPER_H_
> -
> -/*
> - * Veritas filesystem driver - superblock structure.
> - *
> - * This file contains the definition of the disk and core
> - * superblocks of the Veritas Filesystem.
> - */
> -#include <linux/types.h>
> -
> -/*
> - * Superblock magic number (vxfs_super->vs_magic).
> - */
> -#define VXFS_SUPER_MAGIC 0xa501FCF5
> -
> -/*
> - * The root inode.
> - */
> -#define VXFS_ROOT_INO 2
> -
> -/*
> - * Num of entries in free extent array
> - */
> -#define VXFS_NEFREE 32
> -
> -enum vxfs_byte_order {
> - VXFS_BO_LE,
> - VXFS_BO_BE,
> -};
> -
> -typedef __u16 __bitwise __fs16;
> -typedef __u32 __bitwise __fs32;
> -typedef __u64 __bitwise __fs64;
> -
> -/*
> - * VxFS superblock (disk).
> - */
> -struct vxfs_sb {
> - /*
> - * Readonly fields for the version 1 superblock.
> - *
> - * Lots of this fields are no more used by version 2
> - * and never filesystems.
> - */
> - __fs32 vs_magic; /* Magic number */
> - __fs32 vs_version; /* VxFS version */
> - __fs32 vs_ctime; /* create time - secs */
> - __fs32 vs_cutime; /* create time - usecs */
> - __fs32 __unused1; /* unused */
> - __fs32 __unused2; /* unused */
> - __fs32 vs_old_logstart; /* obsolete */
> - __fs32 vs_old_logend; /* obsolete */
> - __fs32 vs_bsize; /* block size */
> - __fs32 vs_size; /* number of blocks */
> - __fs32 vs_dsize; /* number of data blocks */
> - __fs32 vs_old_ninode; /* obsolete */
> - __fs32 vs_old_nau; /* obsolete */
> - __fs32 __unused3; /* unused */
> - __fs32 vs_old_defiextsize; /* obsolete */
> - __fs32 vs_old_ilbsize; /* obsolete */
> - __fs32 vs_immedlen; /* size of immediate data area */
> - __fs32 vs_ndaddr; /* number of direct extentes */
> - __fs32 vs_firstau; /* address of first AU */
> - __fs32 vs_emap; /* offset of extent map in AU */
> - __fs32 vs_imap; /* offset of inode map in AU */
> - __fs32 vs_iextop; /* offset of ExtOp. map in AU */
> - __fs32 vs_istart; /* offset of inode list in AU */
> - __fs32 vs_bstart; /* offset of fdblock in AU */
> - __fs32 vs_femap; /* aufirst + emap */
> - __fs32 vs_fimap; /* aufirst + imap */
> - __fs32 vs_fiextop; /* aufirst + iextop */
> - __fs32 vs_fistart; /* aufirst + istart */
> - __fs32 vs_fbstart; /* aufirst + bstart */
> - __fs32 vs_nindir; /* number of entries in indir */
> - __fs32 vs_aulen; /* length of AU in blocks */
> - __fs32 vs_auimlen; /* length of imap in blocks */
> - __fs32 vs_auemlen; /* length of emap in blocks */
> - __fs32 vs_auilen; /* length of ilist in blocks */
> - __fs32 vs_aupad; /* length of pad in blocks */
> - __fs32 vs_aublocks; /* data blocks in AU */
> - __fs32 vs_maxtier; /* log base 2 of aublocks */
> - __fs32 vs_inopb; /* number of inodes per blk */
> - __fs32 vs_old_inopau; /* obsolete */
> - __fs32 vs_old_inopilb; /* obsolete */
> - __fs32 vs_old_ndiripau; /* obsolete */
> - __fs32 vs_iaddrlen; /* size of indirect addr ext. */
> - __fs32 vs_bshift; /* log base 2 of bsize */
> - __fs32 vs_inoshift; /* log base 2 of inobp */
> - __fs32 vs_bmask; /* ~( bsize - 1 ) */
> - __fs32 vs_boffmask; /* bsize - 1 */
> - __fs32 vs_old_inomask; /* old_inopilb - 1 */
> - __fs32 vs_checksum; /* checksum of V1 data */
> -
> - /*
> - * Version 1, writable
> - */
> - __fs32 vs_free; /* number of free blocks */
> - __fs32 vs_ifree; /* number of free inodes */
> - __fs32 vs_efree[VXFS_NEFREE]; /* number of free extents by size */
> - __fs32 vs_flags; /* flags ?!? */
> - __u8 vs_mod; /* filesystem has been changed */
> - __u8 vs_clean; /* clean FS */
> - __fs16 __unused4; /* unused */
> - __fs32 vs_firstlogid; /* mount time log ID */
> - __fs32 vs_wtime; /* last time written - sec */
> - __fs32 vs_wutime; /* last time written - usec */
> - __u8 vs_fname[6]; /* FS name */
> - __u8 vs_fpack[6]; /* FS pack name */
> - __fs32 vs_logversion; /* log format version */
> - __u32 __unused5; /* unused */
> -
> - /*
> - * Version 2, Read-only
> - */
> - __fs32 vs_oltext[2]; /* OLT extent and replica */
> - __fs32 vs_oltsize; /* OLT extent size */
> - __fs32 vs_iauimlen; /* size of inode map */
> - __fs32 vs_iausize; /* size of IAU in blocks */
> - __fs32 vs_dinosize; /* size of inode in bytes */
> - __fs32 vs_old_dniaddr; /* indir levels per inode */
> - __fs32 vs_checksum2; /* checksum of V2 RO */
> -
> - /*
> - * Actually much more...
> - */
> -};
> -
> -
> -/*
> - * In core superblock filesystem private data for VxFS.
> - */
> -struct vxfs_sb_info {
> - struct vxfs_sb *vsi_raw; /* raw (on disk) superblock */
> - struct buffer_head *vsi_bp; /* buffer for raw superblock*/
> - struct inode *vsi_fship; /* fileset header inode */
> - struct inode *vsi_ilist; /* inode list inode */
> - struct inode *vsi_stilist; /* structural inode list inode */
> - u_long vsi_iext; /* initial inode list */
> - ino_t vsi_fshino; /* fileset header inode */
> - daddr_t vsi_oltext; /* OLT extent */
> - daddr_t vsi_oltsize; /* OLT size */
> - enum vxfs_byte_order byte_order;
> -};
> -
> -static inline u16 fs16_to_cpu(struct vxfs_sb_info *sbi, __fs16 a)
> -{
> - if (sbi->byte_order == VXFS_BO_BE)
> - return be16_to_cpu((__force __be16)a);
> - else
> - return le16_to_cpu((__force __le16)a);
> -}
> -
> -static inline u32 fs32_to_cpu(struct vxfs_sb_info *sbi, __fs32 a)
> -{
> - if (sbi->byte_order == VXFS_BO_BE)
> - return be32_to_cpu((__force __be32)a);
> - else
> - return le32_to_cpu((__force __le32)a);
> -}
> -
> -static inline u64 fs64_to_cpu(struct vxfs_sb_info *sbi, __fs64 a)
> -{
> - if (sbi->byte_order == VXFS_BO_BE)
> - return be64_to_cpu((__force __be64)a);
> - else
> - return le64_to_cpu((__force __le64)a);
> -}
> -
> -/*
> - * File modes. File types above 0xf000 are vxfs internal only, they should
> - * not be passed back to higher levels of the system. vxfs file types must
> - * never have one of the regular file type bits set.
> - */
> -enum vxfs_mode {
> - VXFS_ISUID = 0x00000800, /* setuid */
> - VXFS_ISGID = 0x00000400, /* setgid */
> - VXFS_ISVTX = 0x00000200, /* sticky bit */
> - VXFS_IREAD = 0x00000100, /* read */
> - VXFS_IWRITE = 0x00000080, /* write */
> - VXFS_IEXEC = 0x00000040, /* exec */
> -
> - VXFS_IFIFO = 0x00001000, /* Named pipe */
> - VXFS_IFCHR = 0x00002000, /* Character device */
> - VXFS_IFDIR = 0x00004000, /* Directory */
> - VXFS_IFNAM = 0x00005000, /* Xenix device ?? */
> - VXFS_IFBLK = 0x00006000, /* Block device */
> - VXFS_IFREG = 0x00008000, /* Regular file */
> - VXFS_IFCMP = 0x00009000, /* Compressed file ?!? */
> - VXFS_IFLNK = 0x0000a000, /* Symlink */
> - VXFS_IFSOC = 0x0000c000, /* Socket */
> -
> - /* VxFS internal */
> - VXFS_IFFSH = 0x10000000, /* Fileset header */
> - VXFS_IFILT = 0x20000000, /* Inode list */
> - VXFS_IFIAU = 0x30000000, /* Inode allocation unit */
> - VXFS_IFCUT = 0x40000000, /* Current usage table */
> - VXFS_IFATT = 0x50000000, /* Attr. inode */
> - VXFS_IFLCT = 0x60000000, /* Link count table */
> - VXFS_IFIAT = 0x70000000, /* Indirect attribute file */
> - VXFS_IFEMR = 0x80000000, /* Extent map reorg file */
> - VXFS_IFQUO = 0x90000000, /* BSD quota file */
> - VXFS_IFPTI = 0xa0000000, /* "Pass through" inode */
> - VXFS_IFLAB = 0x11000000, /* Device label file */
> - VXFS_IFOLT = 0x12000000, /* OLT file */
> - VXFS_IFLOG = 0x13000000, /* Log file */
> - VXFS_IFEMP = 0x14000000, /* Extent map file */
> - VXFS_IFEAU = 0x15000000, /* Extent AU file */
> - VXFS_IFAUS = 0x16000000, /* Extent AU summary file */
> - VXFS_IFDEV = 0x17000000, /* Device config file */
> -
> -};
> -
> -#define VXFS_TYPE_MASK 0xfffff000
> -
> -#define VXFS_IS_TYPE(ip,type) (((ip)->vii_mode & VXFS_TYPE_MASK) == (type))
> -#define VXFS_ISFIFO(x) VXFS_IS_TYPE((x),VXFS_IFIFO)
> -#define VXFS_ISCHR(x) VXFS_IS_TYPE((x),VXFS_IFCHR)
> -#define VXFS_ISDIR(x) VXFS_IS_TYPE((x),VXFS_IFDIR)
> -#define VXFS_ISNAM(x) VXFS_IS_TYPE((x),VXFS_IFNAM)
> -#define VXFS_ISBLK(x) VXFS_IS_TYPE((x),VXFS_IFBLK)
> -#define VXFS_ISLNK(x) VXFS_IS_TYPE((x),VXFS_IFLNK)
> -#define VXFS_ISREG(x) VXFS_IS_TYPE((x),VXFS_IFREG)
> -#define VXFS_ISCMP(x) VXFS_IS_TYPE((x),VXFS_IFCMP)
> -#define VXFS_ISSOC(x) VXFS_IS_TYPE((x),VXFS_IFSOC)
> -
> -#define VXFS_ISFSH(x) VXFS_IS_TYPE((x),VXFS_IFFSH)
> -#define VXFS_ISILT(x) VXFS_IS_TYPE((x),VXFS_IFILT)
> -
> -/*
> - * Inmode organisation types.
> - */
> -enum {
> - VXFS_ORG_NONE = 0, /* Inode has *no* format ?!? */
> - VXFS_ORG_EXT4 = 1, /* Ext4 */
> - VXFS_ORG_IMMED = 2, /* All data stored in inode */
> - VXFS_ORG_TYPED = 3, /* Typed extents */
> -};
> -
> -#define VXFS_IS_ORG(ip,org) ((ip)->vii_orgtype == (org))
> -#define VXFS_ISNONE(ip) VXFS_IS_ORG((ip), VXFS_ORG_NONE)
> -#define VXFS_ISEXT4(ip) VXFS_IS_ORG((ip), VXFS_ORG_EXT4)
> -#define VXFS_ISIMMED(ip) VXFS_IS_ORG((ip), VXFS_ORG_IMMED)
> -#define VXFS_ISTYPED(ip) VXFS_IS_ORG((ip), VXFS_ORG_TYPED)
> -
> -/*
> - * Get filesystem private data from VFS superblock.
> - */
> -#define VXFS_SBI(sbp) \
> - ((struct vxfs_sb_info *)(sbp)->s_fs_info)
> -
> -#endif /* _VXFS_SUPER_H_ */
> diff --git a/fs/freevxfs/vxfs_bmap.c b/fs/freevxfs/vxfs_bmap.c
> deleted file mode 100644
> index 1b8216eb1d90..000000000000
> --- a/fs/freevxfs/vxfs_bmap.c
> +++ /dev/null
> @@ -1,272 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -
> -/*
> - * Veritas filesystem driver - filesystem to disk block mapping.
> - */
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/kernel.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_inode.h"
> -#include "vxfs_extern.h"
> -
> -
> -#ifdef DIAGNOSTIC
> -static void
> -vxfs_typdump(struct vxfs_typed *typ)
> -{
> - printk(KERN_DEBUG "type=%Lu ", typ->vt_hdr >> VXFS_TYPED_TYPESHIFT);
> - printk("offset=%Lx ", typ->vt_hdr & VXFS_TYPED_OFFSETMASK);
> - printk("block=%x ", typ->vt_block);
> - printk("size=%x\n", typ->vt_size);
> -}
> -#endif
> -
> -/**
> - * vxfs_bmap_ext4 - do bmap for ext4 extents
> - * @ip: pointer to the inode we do bmap for
> - * @bn: logical block.
> - *
> - * Description:
> - * vxfs_bmap_ext4 performs the bmap operation for inodes with
> - * ext4-style extents (which are much like the traditional UNIX
> - * inode organisation).
> - *
> - * Returns:
> - * The physical block number on success, else Zero.
> - */
> -static daddr_t
> -vxfs_bmap_ext4(struct inode *ip, long bn)
> -{
> - struct super_block *sb = ip->i_sb;
> - struct vxfs_inode_info *vip = VXFS_INO(ip);
> - struct vxfs_sb_info *sbi = VXFS_SBI(sb);
> - unsigned long bsize = sb->s_blocksize;
> - u32 indsize = fs32_to_cpu(sbi, vip->vii_ext4.ve4_indsize);
> - int i;
> -
> - if (indsize > sb->s_blocksize)
> - goto fail_size;
> -
> - for (i = 0; i < VXFS_NDADDR; i++) {
> - struct direct *d = vip->vii_ext4.ve4_direct + i;
> - if (bn >= 0 && bn < fs32_to_cpu(sbi, d->size))
> - return (bn + fs32_to_cpu(sbi, d->extent));
> - bn -= fs32_to_cpu(sbi, d->size);
> - }
> -
> - if ((bn / (indsize * indsize * bsize / 4)) == 0) {
> - struct buffer_head *buf;
> - daddr_t bno;
> - __fs32 *indir;
> -
> - buf = sb_bread(sb,
> - fs32_to_cpu(sbi, vip->vii_ext4.ve4_indir[0]));
> - if (!buf || !buffer_mapped(buf))
> - goto fail_buf;
> -
> - indir = (__fs32 *)buf->b_data;
> - bno = fs32_to_cpu(sbi, indir[(bn / indsize) % (indsize * bn)]) +
> - (bn % indsize);
> -
> - brelse(buf);
> - return bno;
> - } else
> - printk(KERN_WARNING "no matching indir?");
> -
> - return 0;
> -
> -fail_size:
> - printk("vxfs: indirect extent too big!\n");
> -fail_buf:
> - return 0;
> -}
> -
> -/**
> - * vxfs_bmap_indir - recursion for vxfs_bmap_typed
> - * @ip: pointer to the inode we do bmap for
> - * @indir: indirect block we start reading at
> - * @size: size of the typed area to search
> - * @block: partially result from further searches
> - *
> - * Description:
> - * vxfs_bmap_indir reads a &struct vxfs_typed at @indir
> - * and performs the type-defined action.
> - *
> - * Returns:
> - * The physical block number on success, else Zero.
> - *
> - * Note:
> - * Kernelstack is rare. Unrecurse?
> - */
> -static daddr_t
> -vxfs_bmap_indir(struct inode *ip, long indir, int size, long block)
> -{
> - struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
> - struct buffer_head *bp = NULL;
> - daddr_t pblock = 0;
> - int i;
> -
> - for (i = 0; i < size * VXFS_TYPED_PER_BLOCK(ip->i_sb); i++) {
> - struct vxfs_typed *typ;
> - int64_t off;
> -
> - bp = sb_bread(ip->i_sb,
> - indir + (i / VXFS_TYPED_PER_BLOCK(ip->i_sb)));
> - if (!bp || !buffer_mapped(bp))
> - return 0;
> -
> - typ = ((struct vxfs_typed *)bp->b_data) +
> - (i % VXFS_TYPED_PER_BLOCK(ip->i_sb));
> - off = fs64_to_cpu(sbi, typ->vt_hdr) & VXFS_TYPED_OFFSETMASK;
> -
> - if (block < off) {
> - brelse(bp);
> - continue;
> - }
> -
> - switch ((u_int32_t)(fs64_to_cpu(sbi, typ->vt_hdr) >>
> - VXFS_TYPED_TYPESHIFT)) {
> - case VXFS_TYPED_INDIRECT:
> - pblock = vxfs_bmap_indir(ip,
> - fs32_to_cpu(sbi, typ->vt_block),
> - fs32_to_cpu(sbi, typ->vt_size),
> - block - off);
> - if (pblock == -2)
> - break;
> - goto out;
> - case VXFS_TYPED_DATA:
> - if ((block - off) >= fs32_to_cpu(sbi, typ->vt_size))
> - break;
> - pblock = fs32_to_cpu(sbi, typ->vt_block) + block - off;
> - goto out;
> - case VXFS_TYPED_INDIRECT_DEV4:
> - case VXFS_TYPED_DATA_DEV4: {
> - struct vxfs_typed_dev4 *typ4 =
> - (struct vxfs_typed_dev4 *)typ;
> -
> - printk(KERN_INFO "\n\nTYPED_DEV4 detected!\n");
> - printk(KERN_INFO "block: %llu\tsize: %lld\tdev: %d\n",
> - fs64_to_cpu(sbi, typ4->vd4_block),
> - fs64_to_cpu(sbi, typ4->vd4_size),
> - fs32_to_cpu(sbi, typ4->vd4_dev));
> - goto fail;
> - }
> - default:
> - printk(KERN_ERR "%s:%d vt_hdr %llu\n", __func__,
> - __LINE__, fs64_to_cpu(sbi, typ->vt_hdr));
> - BUG();
> - }
> - brelse(bp);
> - }
> -
> -fail:
> - pblock = 0;
> -out:
> - brelse(bp);
> - return (pblock);
> -}
> -
> -/**
> - * vxfs_bmap_typed - bmap for typed extents
> - * @ip: pointer to the inode we do bmap for
> - * @iblock: logical block
> - *
> - * Description:
> - * Performs the bmap operation for typed extents.
> - *
> - * Returns:
> - * The physical block number on success, else Zero.
> - */
> -static daddr_t
> -vxfs_bmap_typed(struct inode *ip, long iblock)
> -{
> - struct vxfs_inode_info *vip = VXFS_INO(ip);
> - struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
> - daddr_t pblock = 0;
> - int i;
> -
> - for (i = 0; i < VXFS_NTYPED; i++) {
> - struct vxfs_typed *typ = vip->vii_org.typed + i;
> - u64 hdr = fs64_to_cpu(sbi, typ->vt_hdr);
> - int64_t off = (hdr & VXFS_TYPED_OFFSETMASK);
> -
> -#ifdef DIAGNOSTIC
> - vxfs_typdump(typ);
> -#endif
> - if (iblock < off)
> - continue;
> - switch ((u32)(hdr >> VXFS_TYPED_TYPESHIFT)) {
> - case VXFS_TYPED_INDIRECT:
> - pblock = vxfs_bmap_indir(ip,
> - fs32_to_cpu(sbi, typ->vt_block),
> - fs32_to_cpu(sbi, typ->vt_size),
> - iblock - off);
> - if (pblock == -2)
> - break;
> - return (pblock);
> - case VXFS_TYPED_DATA:
> - if ((iblock - off) < fs32_to_cpu(sbi, typ->vt_size))
> - return (fs32_to_cpu(sbi, typ->vt_block) +
> - iblock - off);
> - break;
> - case VXFS_TYPED_INDIRECT_DEV4:
> - case VXFS_TYPED_DATA_DEV4: {
> - struct vxfs_typed_dev4 *typ4 =
> - (struct vxfs_typed_dev4 *)typ;
> -
> - printk(KERN_INFO "\n\nTYPED_DEV4 detected!\n");
> - printk(KERN_INFO "block: %llu\tsize: %lld\tdev: %d\n",
> - fs64_to_cpu(sbi, typ4->vd4_block),
> - fs64_to_cpu(sbi, typ4->vd4_size),
> - fs32_to_cpu(sbi, typ4->vd4_dev));
> - return 0;
> - }
> - default:
> - WARN_ON_ONCE(1);
> - return 0;
> - }
> - }
> -
> - return 0;
> -}
> -
> -/**
> - * vxfs_bmap1 - vxfs-internal bmap operation
> - * @ip: pointer to the inode we do bmap for
> - * @iblock: logical block
> - *
> - * Description:
> - * vxfs_bmap1 perfoms a logical to physical block mapping
> - * for vxfs-internal purposes.
> - *
> - * Returns:
> - * The physical block number on success, else Zero.
> - */
> -daddr_t
> -vxfs_bmap1(struct inode *ip, long iblock)
> -{
> - struct vxfs_inode_info *vip = VXFS_INO(ip);
> -
> - if (VXFS_ISEXT4(vip))
> - return vxfs_bmap_ext4(ip, iblock);
> - if (VXFS_ISTYPED(vip))
> - return vxfs_bmap_typed(ip, iblock);
> - if (VXFS_ISNONE(vip))
> - goto unsupp;
> - if (VXFS_ISIMMED(vip))
> - goto unsupp;
> -
> - printk(KERN_WARNING "vxfs: inode %llu has no valid orgtype (%x)\n",
> - ip->i_ino, vip->vii_orgtype);
> - BUG();
> -
> -unsupp:
> - printk(KERN_WARNING "vxfs: inode %llu has an unsupported orgtype (%x)\n",
> - ip->i_ino, vip->vii_orgtype);
> - return 0;
> -}
> diff --git a/fs/freevxfs/vxfs_dir.h b/fs/freevxfs/vxfs_dir.h
> deleted file mode 100644
> index 8c67627f2a3d..000000000000
> --- a/fs/freevxfs/vxfs_dir.h
> +++ /dev/null
> @@ -1,68 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -#ifndef _VXFS_DIR_H_
> -#define _VXFS_DIR_H_
> -
> -/*
> - * Veritas filesystem driver - directory structure.
> - *
> - * This file contains the definition of the vxfs directory format.
> - */
> -
> -
> -/*
> - * VxFS directory block header.
> - *
> - * This entry is the head of every filesystem block in a directory.
> - * It is used for free space management and additionally includes
> - * a hash for speeding up directory search (lookup).
> - *
> - * The hash may be empty and in fact we do not use it all in the
> - * Linux driver for now.
> - */
> -struct vxfs_dirblk {
> - __fs16 d_free; /* free space in dirblock */
> - __fs16 d_nhash; /* no of hash chains */
> - __fs16 d_hash[]; /* hash chain */
> -};
> -
> -/*
> - * VXFS_NAMELEN is the maximum length of the d_name field
> - * of an VxFS directory entry.
> - */
> -#define VXFS_NAMELEN 256
> -
> -/*
> - * VxFS directory entry.
> - */
> -struct vxfs_direct {
> - __fs32 d_ino; /* inode number */
> - __fs16 d_reclen; /* record length */
> - __fs16 d_namelen; /* d_name length */
> - __fs16 d_hashnext; /* next hash entry */
> - char d_name[VXFS_NAMELEN]; /* name */
> -};
> -
> -/*
> - * VXFS_DIRPAD defines the directory entry boundaries, is _must_ be
> - * a multiple of four.
> - * VXFS_NAMEMIN is the length of a directory entry with a NULL d_name.
> - * VXFS_DIRROUND is an internal macros that rounds a length to a value
> - * usable for directory sizes.
> - * VXFS_DIRLEN calculates the directory entry size for an entry with
> - * a d_name with size len.
> - */
> -#define VXFS_DIRPAD 4
> -#define VXFS_NAMEMIN offsetof(struct vxfs_direct, d_name)
> -#define VXFS_DIRROUND(len) ((VXFS_DIRPAD + (len) - 1) & ~(VXFS_DIRPAD -1))
> -#define VXFS_DIRLEN(len) (VXFS_DIRROUND(VXFS_NAMEMIN + (len)))
> -
> -/*
> - * VXFS_DIRBLKOV is the overhead of a specific dirblock.
> - */
> -#define VXFS_DIRBLKOV(sbi, dbp) \
> - ((sizeof(short) * fs16_to_cpu(sbi, dbp->d_nhash)) + 4)
> -
> -#endif /* _VXFS_DIR_H_ */
> diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
> deleted file mode 100644
> index 3a2180c5e208..000000000000
> --- a/fs/freevxfs/vxfs_extern.h
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -#ifndef _VXFS_EXTERN_H_
> -#define _VXFS_EXTERN_H_
> -
> -/*
> - * Veritas filesystem driver - external prototypes.
> - *
> - * This file contains prototypes for all vxfs functions used
> - * outside their respective source files.
> - */
> -
> -
> -struct kmem_cache;
> -struct super_block;
> -struct vxfs_inode_info;
> -struct inode;
> -
> -
> -/* vxfs_bmap.c */
> -extern daddr_t vxfs_bmap1(struct inode *, long);
> -
> -/* vxfs_fshead.c */
> -extern int vxfs_read_fshead(struct super_block *);
> -
> -/* vxfs_inode.c */
> -extern const struct address_space_operations vxfs_immed_aops;
> -extern void vxfs_dumpi(struct vxfs_inode_info *, ino_t);
> -extern struct inode *vxfs_blkiget(struct super_block *, u_long, ino_t);
> -extern struct inode *vxfs_stiget(struct super_block *, ino_t);
> -extern struct inode *vxfs_iget(struct super_block *, ino_t);
> -extern void vxfs_evict_inode(struct inode *);
> -
> -/* vxfs_lookup.c */
> -extern const struct inode_operations vxfs_dir_inode_ops;
> -extern const struct file_operations vxfs_dir_operations;
> -
> -/* vxfs_olt.c */
> -extern int vxfs_read_olt(struct super_block *, u_long);
> -
> -/* vxfs_subr.c */
> -extern const struct address_space_operations vxfs_aops;
> -extern struct page * vxfs_get_page(struct address_space *, u_long);
> -extern void vxfs_put_page(struct page *);
> -extern struct buffer_head * vxfs_bread(struct inode *, int);
> -
> -#endif /* _VXFS_EXTERN_H_ */
> diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
> deleted file mode 100644
> index e6ab8bdf7a6c..000000000000
> --- a/fs/freevxfs/vxfs_fshead.c
> +++ /dev/null
> @@ -1,166 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -
> -/*
> - * Veritas filesystem driver - fileset header routines.
> - */
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/string.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_inode.h"
> -#include "vxfs_extern.h"
> -#include "vxfs_fshead.h"
> -
> -
> -#ifdef DIAGNOSTIC
> -static void
> -vxfs_dumpfsh(struct vxfs_fsh *fhp)
> -{
> - printk("\n\ndumping fileset header:\n");
> - printk("----------------------------\n");
> - printk("version: %u\n", fhp->fsh_version);
> - printk("fsindex: %u\n", fhp->fsh_fsindex);
> - printk("iauino: %u\tninodes:%u\n",
> - fhp->fsh_iauino, fhp->fsh_ninodes);
> - printk("maxinode: %u\tlctino: %u\n",
> - fhp->fsh_maxinode, fhp->fsh_lctino);
> - printk("nau: %u\n", fhp->fsh_nau);
> - printk("ilistino[0]: %u\tilistino[1]: %u\n",
> - fhp->fsh_ilistino[0], fhp->fsh_ilistino[1]);
> -}
> -#endif
> -
> -/**
> - * vxfs_getfsh - read fileset header into memory
> - * @ip: the (fake) fileset header inode
> - * @which: 0 for the structural, 1 for the primary fsh.
> - *
> - * Description:
> - * vxfs_getfsh reads either the structural or primary fileset header
> - * described by @ip into memory.
> - *
> - * Returns:
> - * The fileset header structure on success, else Zero.
> - */
> -static struct vxfs_fsh *
> -vxfs_getfsh(struct inode *ip, int which)
> -{
> - struct buffer_head *bp;
> -
> - bp = vxfs_bread(ip, which);
> - if (bp) {
> - struct vxfs_fsh *fhp;
> -
> - if (!(fhp = kmalloc_obj(*fhp)))
> - goto out;
> - memcpy(fhp, bp->b_data, sizeof(*fhp));
> -
> - put_bh(bp);
> - return (fhp);
> - }
> -out:
> - brelse(bp);
> - return NULL;
> -}
> -
> -/**
> - * vxfs_read_fshead - read the fileset headers
> - * @sbp: superblock to which the fileset belongs
> - *
> - * Description:
> - * vxfs_read_fshead will fill the inode and structural inode list in @sb.
> - *
> - * Returns:
> - * Zero on success, else a negative error code (-EINVAL).
> - */
> -int
> -vxfs_read_fshead(struct super_block *sbp)
> -{
> - struct vxfs_sb_info *infp = VXFS_SBI(sbp);
> - struct vxfs_fsh *pfp, *sfp;
> - struct vxfs_inode_info *vip;
> -
> - infp->vsi_fship = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
> - if (!infp->vsi_fship) {
> - printk(KERN_ERR "vxfs: unable to read fsh inode\n");
> - return -EINVAL;
> - }
> -
> - vip = VXFS_INO(infp->vsi_fship);
> - if (!VXFS_ISFSH(vip)) {
> - printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
> - vip->vii_mode & VXFS_TYPE_MASK);
> - goto out_iput_fship;
> - }
> -
> -#ifdef DIAGNOSTIC
> - printk("vxfs: fsh inode dump:\n");
> - vxfs_dumpi(vip, infp->vsi_fshino);
> -#endif
> -
> - sfp = vxfs_getfsh(infp->vsi_fship, 0);
> - if (!sfp) {
> - printk(KERN_ERR "vxfs: unable to get structural fsh\n");
> - goto out_iput_fship;
> - }
> -
> -#ifdef DIAGNOSTIC
> - vxfs_dumpfsh(sfp);
> -#endif
> -
> - pfp = vxfs_getfsh(infp->vsi_fship, 1);
> - if (!pfp) {
> - printk(KERN_ERR "vxfs: unable to get primary fsh\n");
> - goto out_free_sfp;
> - }
> -
> -#ifdef DIAGNOSTIC
> - vxfs_dumpfsh(pfp);
> -#endif
> -
> - infp->vsi_stilist = vxfs_blkiget(sbp, infp->vsi_iext,
> - fs32_to_cpu(infp, sfp->fsh_ilistino[0]));
> - if (!infp->vsi_stilist) {
> - printk(KERN_ERR "vxfs: unable to get structural list inode\n");
> - goto out_free_pfp;
> - }
> - if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
> - printk(KERN_ERR "vxfs: structural list inode is of wrong type (%x)\n",
> - VXFS_INO(infp->vsi_stilist)->vii_mode & VXFS_TYPE_MASK);
> - goto out_iput_stilist;
> - }
> -
> - infp->vsi_ilist = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0]));
> - if (!infp->vsi_ilist) {
> - printk(KERN_ERR "vxfs: unable to get inode list inode\n");
> - goto out_iput_stilist;
> - }
> - if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
> - printk(KERN_ERR "vxfs: inode list inode is of wrong type (%x)\n",
> - VXFS_INO(infp->vsi_ilist)->vii_mode & VXFS_TYPE_MASK);
> - goto out_iput_ilist;
> - }
> -
> - kfree(pfp);
> - kfree(sfp);
> - return 0;
> -
> - out_iput_ilist:
> - iput(infp->vsi_ilist);
> - out_iput_stilist:
> - iput(infp->vsi_stilist);
> - out_free_pfp:
> - kfree(pfp);
> - out_free_sfp:
> - kfree(sfp);
> - out_iput_fship:
> - iput(infp->vsi_fship);
> - return -EINVAL;
> -}
> diff --git a/fs/freevxfs/vxfs_fshead.h b/fs/freevxfs/vxfs_fshead.h
> deleted file mode 100644
> index dfd2147599c4..000000000000
> --- a/fs/freevxfs/vxfs_fshead.h
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -#ifndef _VXFS_FSHEAD_H_
> -#define _VXFS_FSHEAD_H_
> -
> -/*
> - * Veritas filesystem driver - fileset header structures.
> - *
> - * This file contains the physical structure of the VxFS
> - * fileset header.
> - */
> -
> -
> -/*
> - * Fileset header
> - */
> -struct vxfs_fsh {
> - __fs32 fsh_version; /* fileset header version */
> - __fs32 fsh_fsindex; /* fileset index */
> - __fs32 fsh_time; /* modification time - sec */
> - __fs32 fsh_utime; /* modification time - usec */
> - __fs32 fsh_extop; /* extop flags */
> - __fs32 fsh_ninodes; /* allocated inodes */
> - __fs32 fsh_nau; /* number of IAUs */
> - __fs32 fsh_old_ilesize; /* old size of ilist */
> - __fs32 fsh_dflags; /* flags */
> - __fs32 fsh_quota; /* quota limit */
> - __fs32 fsh_maxinode; /* maximum inode number */
> - __fs32 fsh_iauino; /* IAU inode */
> - __fs32 fsh_ilistino[2]; /* ilist inodes */
> - __fs32 fsh_lctino; /* link count table inode */
> -
> - /*
> - * Slightly more fields follow, but they
> - * a) are not of any interest for us, and
> - * b) differ a lot in different vxfs versions/ports
> - */
> -};
> -
> -#endif /* _VXFS_FSHEAD_H_ */
> diff --git a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c
> deleted file mode 100644
> index ed51fcd34757..000000000000
> --- a/fs/freevxfs/vxfs_immed.c
> +++ /dev/null
> @@ -1,53 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -
> -/*
> - * Veritas filesystem driver - support for 'immed' inodes.
> - */
> -#include <linux/fs.h>
> -#include <linux/pagemap.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_extern.h"
> -#include "vxfs_inode.h"
> -
> -/**
> - * vxfs_immed_read_folio - read part of an immed inode into pagecache
> - * @fp: file context (unused)
> - * @folio: folio to fill in.
> - *
> - * Description:
> - * vxfs_immed_read_folio reads a part of the immed area of the
> - * file that hosts @folio into the pagecache.
> - *
> - * Returns:
> - * Zero on success, else a negative error code.
> - *
> - * Locking status:
> - * @folio is locked and will be unlocked.
> - */
> -static int vxfs_immed_read_folio(struct file *fp, struct folio *folio)
> -{
> - struct vxfs_inode_info *vip = VXFS_INO(folio->mapping->host);
> - void *src = vip->vii_immed.vi_immed + folio_pos(folio);
> - unsigned long i;
> -
> - for (i = 0; i < folio_nr_pages(folio); i++) {
> - memcpy_to_page(folio_page(folio, i), 0, src, PAGE_SIZE);
> - src += PAGE_SIZE;
> - }
> -
> - folio_mark_uptodate(folio);
> - folio_unlock(folio);
> -
> - return 0;
> -}
> -
> -/*
> - * Address space operations for immed files and directories.
> - */
> -const struct address_space_operations vxfs_immed_aops = {
> - .read_folio = vxfs_immed_read_folio,
> -};
> diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> deleted file mode 100644
> index 21fc94b98209..000000000000
> --- a/fs/freevxfs/vxfs_inode.c
> +++ /dev/null
> @@ -1,314 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -
> -/*
> - * Veritas filesystem driver - inode routines.
> - */
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/pagemap.h>
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/namei.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_inode.h"
> -#include "vxfs_extern.h"
> -
> -
> -#ifdef DIAGNOSTIC
> -/*
> - * Dump inode contents (partially).
> - */
> -void
> -vxfs_dumpi(struct vxfs_inode_info *vip, ino_t ino)
> -{
> - printk(KERN_DEBUG "\n\n");
> - if (ino)
> - printk(KERN_DEBUG "dumping vxfs inode %ld\n", ino);
> - else
> - printk(KERN_DEBUG "dumping unknown vxfs inode\n");
> -
> - printk(KERN_DEBUG "---------------------------\n");
> - printk(KERN_DEBUG "mode is %x\n", vip->vii_mode);
> - printk(KERN_DEBUG "nlink:%u, uid:%u, gid:%u\n",
> - vip->vii_nlink, vip->vii_uid, vip->vii_gid);
> - printk(KERN_DEBUG "size:%Lx, blocks:%u\n",
> - vip->vii_size, vip->vii_blocks);
> - printk(KERN_DEBUG "orgtype:%u\n", vip->vii_orgtype);
> -}
> -#endif
> -
> -/**
> - * vxfs_transmod - mode for a VxFS inode
> - * @vip: VxFS inode
> - *
> - * Description:
> - * vxfs_transmod returns a Linux mode_t for a given
> - * VxFS inode structure.
> - */
> -static __inline__ umode_t
> -vxfs_transmod(struct vxfs_inode_info *vip)
> -{
> - umode_t ret = vip->vii_mode & ~VXFS_TYPE_MASK;
> -
> - if (VXFS_ISFIFO(vip))
> - ret |= S_IFIFO;
> - if (VXFS_ISCHR(vip))
> - ret |= S_IFCHR;
> - if (VXFS_ISDIR(vip))
> - ret |= S_IFDIR;
> - if (VXFS_ISBLK(vip))
> - ret |= S_IFBLK;
> - if (VXFS_ISLNK(vip))
> - ret |= S_IFLNK;
> - if (VXFS_ISREG(vip))
> - ret |= S_IFREG;
> - if (VXFS_ISSOC(vip))
> - ret |= S_IFSOCK;
> -
> - return (ret);
> -}
> -
> -static inline void dip2vip_cpy(struct vxfs_sb_info *sbi,
> - struct vxfs_inode_info *vip, struct vxfs_dinode *dip)
> -{
> - struct inode *inode = &vip->vfs_inode;
> -
> - vip->vii_mode = fs32_to_cpu(sbi, dip->vdi_mode);
> - vip->vii_nlink = fs32_to_cpu(sbi, dip->vdi_nlink);
> - vip->vii_uid = fs32_to_cpu(sbi, dip->vdi_uid);
> - vip->vii_gid = fs32_to_cpu(sbi, dip->vdi_gid);
> - vip->vii_size = fs64_to_cpu(sbi, dip->vdi_size);
> - vip->vii_atime = fs32_to_cpu(sbi, dip->vdi_atime);
> - vip->vii_autime = fs32_to_cpu(sbi, dip->vdi_autime);
> - vip->vii_mtime = fs32_to_cpu(sbi, dip->vdi_mtime);
> - vip->vii_mutime = fs32_to_cpu(sbi, dip->vdi_mutime);
> - vip->vii_ctime = fs32_to_cpu(sbi, dip->vdi_ctime);
> - vip->vii_cutime = fs32_to_cpu(sbi, dip->vdi_cutime);
> - vip->vii_orgtype = dip->vdi_orgtype;
> -
> - vip->vii_blocks = fs32_to_cpu(sbi, dip->vdi_blocks);
> - vip->vii_gen = fs32_to_cpu(sbi, dip->vdi_gen);
> -
> - if (VXFS_ISDIR(vip))
> - vip->vii_dotdot = fs32_to_cpu(sbi, dip->vdi_dotdot);
> - else if (!VXFS_ISREG(vip) && !VXFS_ISLNK(vip))
> - vip->vii_rdev = fs32_to_cpu(sbi, dip->vdi_rdev);
> -
> - /* don't endian swap the fields that differ by orgtype */
> - memcpy(&vip->vii_org, &dip->vdi_org, sizeof(vip->vii_org));
> -
> - inode->i_mode = vxfs_transmod(vip);
> - i_uid_write(inode, (uid_t)vip->vii_uid);
> - i_gid_write(inode, (gid_t)vip->vii_gid);
> -
> - set_nlink(inode, vip->vii_nlink);
> - inode->i_size = vip->vii_size;
> -
> - inode_set_atime(inode, vip->vii_atime, 0);
> - inode_set_ctime(inode, vip->vii_ctime, 0);
> - inode_set_mtime(inode, vip->vii_mtime, 0);
> -
> - inode->i_blocks = vip->vii_blocks;
> - inode->i_generation = vip->vii_gen;
> -}
> -
> -/**
> - * vxfs_blkiget - find inode based on extent #
> - * @sbp: superblock of the filesystem we search in
> - * @extent: number of the extent to search
> - * @ino: inode number to search
> - *
> - * Description:
> - * vxfs_blkiget searches inode @ino in the filesystem described by
> - * @sbp in the extent @extent.
> - * Returns the matching VxFS inode on success, else a NULL pointer.
> - *
> - * NOTE:
> - * While __vxfs_iget uses the pagecache vxfs_blkiget uses the
> - * buffercache. This function should not be used outside the
> - * read_super() method, otherwise the data may be incoherent.
> - */
> -struct inode *
> -vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
> -{
> - struct buffer_head *bp;
> - struct inode *inode;
> - u_long block, offset;
> -
> - inode = new_inode(sbp);
> - if (!inode)
> - return NULL;
> - inode->i_ino = get_next_ino();
> -
> - block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize);
> - offset = ((ino % (sbp->s_blocksize / VXFS_ISIZE)) * VXFS_ISIZE);
> - bp = sb_bread(sbp, block);
> -
> - if (bp && buffer_mapped(bp)) {
> - struct vxfs_inode_info *vip = VXFS_INO(inode);
> - struct vxfs_dinode *dip;
> -
> - dip = (struct vxfs_dinode *)(bp->b_data + offset);
> - dip2vip_cpy(VXFS_SBI(sbp), vip, dip);
> - vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
> -#ifdef DIAGNOSTIC
> - vxfs_dumpi(vip, ino);
> -#endif
> - brelse(bp);
> - return inode;
> - }
> -
> - printk(KERN_WARNING "vxfs: unable to read block %ld\n", block);
> - brelse(bp);
> - iput(inode);
> - return NULL;
> -}
> -
> -/**
> - * __vxfs_iget - generic find inode facility
> - * @ilistp: inode list
> - * @vip: VxFS inode to fill in
> - * @ino: inode number
> - *
> - * Description:
> - * Search the for inode number @ino in the filesystem
> - * described by @sbp. Use the specified inode table (@ilistp).
> - * Returns the matching inode on success, else an error code.
> - */
> -static int
> -__vxfs_iget(struct inode *ilistp, struct vxfs_inode_info *vip, ino_t ino)
> -{
> - struct page *pp;
> - u_long offset;
> -
> - offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE;
> - pp = vxfs_get_page(ilistp->i_mapping, ino * VXFS_ISIZE / PAGE_SIZE);
> -
> - if (!IS_ERR(pp)) {
> - struct vxfs_dinode *dip;
> - caddr_t kaddr = (char *)page_address(pp);
> -
> - dip = (struct vxfs_dinode *)(kaddr + offset);
> - dip2vip_cpy(VXFS_SBI(ilistp->i_sb), vip, dip);
> - vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
> -#ifdef DIAGNOSTIC
> - vxfs_dumpi(vip, ino);
> -#endif
> - vxfs_put_page(pp);
> - return 0;
> - }
> -
> - printk(KERN_WARNING "vxfs: error on page 0x%p for inode %ld\n",
> - pp, (unsigned long)ino);
> - return PTR_ERR(pp);
> -}
> -
> -/**
> - * vxfs_stiget - find inode using the structural inode list
> - * @sbp: VFS superblock
> - * @ino: inode #
> - *
> - * Description:
> - * Find inode @ino in the filesystem described by @sbp using
> - * the structural inode list.
> - * Returns the matching inode on success, else a NULL pointer.
> - */
> -struct inode *
> -vxfs_stiget(struct super_block *sbp, ino_t ino)
> -{
> - struct inode *inode;
> - int error;
> -
> - inode = new_inode(sbp);
> - if (!inode)
> - return NULL;
> - inode->i_ino = get_next_ino();
> -
> - error = __vxfs_iget(VXFS_SBI(sbp)->vsi_stilist, VXFS_INO(inode), ino);
> - if (error) {
> - iput(inode);
> - return NULL;
> - }
> -
> - return inode;
> -}
> -
> -/**
> - * vxfs_iget - get an inode
> - * @sbp: the superblock to get the inode for
> - * @ino: the number of the inode to get
> - *
> - * Description:
> - * vxfs_read_inode creates an inode, reads the disk inode for @ino and fills
> - * in all relevant fields in the new inode.
> - */
> -struct inode *
> -vxfs_iget(struct super_block *sbp, ino_t ino)
> -{
> - struct vxfs_inode_info *vip;
> - const struct address_space_operations *aops;
> - struct inode *ip;
> - int error;
> -
> - ip = iget_locked(sbp, ino);
> - if (!ip)
> - return ERR_PTR(-ENOMEM);
> - if (!(inode_state_read_once(ip) & I_NEW))
> - return ip;
> -
> - vip = VXFS_INO(ip);
> - error = __vxfs_iget(VXFS_SBI(sbp)->vsi_ilist, vip, ino);
> - if (error) {
> - iget_failed(ip);
> - return ERR_PTR(error);
> - }
> -
> - if (VXFS_ISIMMED(vip))
> - aops = &vxfs_immed_aops;
> - else
> - aops = &vxfs_aops;
> -
> - if (S_ISREG(ip->i_mode)) {
> - ip->i_fop = &generic_ro_fops;
> - ip->i_mapping->a_ops = aops;
> - } else if (S_ISDIR(ip->i_mode)) {
> - ip->i_op = &vxfs_dir_inode_ops;
> - ip->i_fop = &vxfs_dir_operations;
> - ip->i_mapping->a_ops = aops;
> - } else if (S_ISLNK(ip->i_mode)) {
> - if (!VXFS_ISIMMED(vip)) {
> - ip->i_op = &page_symlink_inode_operations;
> - inode_nohighmem(ip);
> - ip->i_mapping->a_ops = &vxfs_aops;
> - } else {
> - ip->i_op = &simple_symlink_inode_operations;
> - ip->i_link = vip->vii_immed.vi_immed;
> - nd_terminate_link(ip->i_link, ip->i_size,
> - sizeof(vip->vii_immed.vi_immed) - 1);
> - }
> - } else
> - init_special_inode(ip, ip->i_mode, old_decode_dev(vip->vii_rdev));
> -
> - unlock_new_inode(ip);
> - return ip;
> -}
> -
> -/**
> - * vxfs_evict_inode - remove inode from main memory
> - * @ip: inode to discard.
> - *
> - * Description:
> - * vxfs_evict_inode() is called on the final iput and frees the private
> - * inode area.
> - */
> -void
> -vxfs_evict_inode(struct inode *ip)
> -{
> - truncate_inode_pages_final(&ip->i_data);
> - clear_inode(ip);
> -}
> diff --git a/fs/freevxfs/vxfs_inode.h b/fs/freevxfs/vxfs_inode.h
> deleted file mode 100644
> index 1e9e138d2b33..000000000000
> --- a/fs/freevxfs/vxfs_inode.h
> +++ /dev/null
> @@ -1,169 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -#ifndef _VXFS_INODE_H_
> -#define _VXFS_INODE_H_
> -
> -/*
> - * Veritas filesystem driver - inode structure.
> - *
> - * This file contains the definition of the disk and core
> - * inodes of the Veritas Filesystem.
> - */
> -
> -
> -#define VXFS_ISIZE 0x100 /* Inode size */
> -
> -#define VXFS_NDADDR 10 /* Number of direct addrs in inode */
> -#define VXFS_NIADDR 2 /* Number of indirect addrs in inode */
> -#define VXFS_NIMMED 96 /* Size of immediate data in inode */
> -#define VXFS_NTYPED 6 /* Num of typed extents */
> -
> -#define VXFS_TYPED_OFFSETMASK (0x00FFFFFFFFFFFFFFULL)
> -#define VXFS_TYPED_TYPEMASK (0xFF00000000000000ULL)
> -#define VXFS_TYPED_TYPESHIFT 56
> -
> -#define VXFS_TYPED_PER_BLOCK(sbp) \
> - ((sbp)->s_blocksize / sizeof(struct vxfs_typed))
> -
> -/*
> - * Possible extent descriptor types for %VXFS_ORG_TYPED extents.
> - */
> -enum {
> - VXFS_TYPED_INDIRECT = 1,
> - VXFS_TYPED_DATA = 2,
> - VXFS_TYPED_INDIRECT_DEV4 = 3,
> - VXFS_TYPED_DATA_DEV4 = 4,
> -};
> -
> -/*
> - * Data stored immediately in the inode.
> - */
> -struct vxfs_immed {
> - __u8 vi_immed[VXFS_NIMMED];
> -};
> -
> -struct vxfs_ext4 {
> - __fs32 ve4_spare; /* ?? */
> - __fs32 ve4_indsize; /* Indirect extent size */
> - __fs32 ve4_indir[VXFS_NIADDR]; /* Indirect extents */
> - struct direct { /* Direct extents */
> - __fs32 extent; /* Extent number */
> - __fs32 size; /* Size of extent */
> - } ve4_direct[VXFS_NDADDR];
> -};
> -
> -struct vxfs_typed {
> - __fs64 vt_hdr; /* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
> - __fs32 vt_block; /* Extent block */
> - __fs32 vt_size; /* Size in blocks */
> -};
> -
> -struct vxfs_typed_dev4 {
> - __fs64 vd4_hdr; /* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
> - __fs64 vd4_block; /* Extent block */
> - __fs64 vd4_size; /* Size in blocks */
> - __fs32 vd4_dev; /* Device ID */
> - __u8 __pad1;
> -};
> -
> -/*
> - * The inode as contained on the physical device.
> - */
> -struct vxfs_dinode {
> - __fs32 vdi_mode;
> - __fs32 vdi_nlink; /* Link count */
> - __fs32 vdi_uid; /* UID */
> - __fs32 vdi_gid; /* GID */
> - __fs64 vdi_size; /* Inode size in bytes */
> - __fs32 vdi_atime; /* Last time accessed - sec */
> - __fs32 vdi_autime; /* Last time accessed - usec */
> - __fs32 vdi_mtime; /* Last modify time - sec */
> - __fs32 vdi_mutime; /* Last modify time - usec */
> - __fs32 vdi_ctime; /* Create time - sec */
> - __fs32 vdi_cutime; /* Create time - usec */
> - __u8 vdi_aflags; /* Allocation flags */
> - __u8 vdi_orgtype; /* Organisation type */
> - __fs16 vdi_eopflags;
> - __fs32 vdi_eopdata;
> - union {
> - __fs32 rdev;
> - __fs32 dotdot;
> - struct {
> - __u32 reserved;
> - __fs32 fixextsize;
> - } i_regular;
> - struct {
> - __fs32 matchino;
> - __fs32 fsetindex;
> - } i_vxspec;
> - __u64 align;
> - } vdi_ftarea;
> - __fs32 vdi_blocks; /* How much blocks does inode occupy */
> - __fs32 vdi_gen; /* Inode generation */
> - __fs64 vdi_version; /* Version */
> - union {
> - struct vxfs_immed immed;
> - struct vxfs_ext4 ext4;
> - struct vxfs_typed typed[VXFS_NTYPED];
> - } vdi_org;
> - __fs32 vdi_iattrino;
> -};
> -
> -#define vdi_rdev vdi_ftarea.rdev
> -#define vdi_dotdot vdi_ftarea.dotdot
> -#define vdi_fixextsize vdi_ftarea.regular.fixextsize
> -#define vdi_matchino vdi_ftarea.vxspec.matchino
> -#define vdi_fsetindex vdi_ftarea.vxspec.fsetindex
> -
> -#define vdi_immed vdi_org.immed
> -#define vdi_ext4 vdi_org.ext4
> -#define vdi_typed vdi_org.typed
> -
> -
> -/*
> - * The inode as represented in the main memory.
> - */
> -struct vxfs_inode_info {
> - struct inode vfs_inode;
> -
> - __u32 vii_mode;
> - __u32 vii_nlink; /* Link count */
> - __u32 vii_uid; /* UID */
> - __u32 vii_gid; /* GID */
> - __u64 vii_size; /* Inode size in bytes */
> - __u32 vii_atime; /* Last time accessed - sec */
> - __u32 vii_autime; /* Last time accessed - usec */
> - __u32 vii_mtime; /* Last modify time - sec */
> - __u32 vii_mutime; /* Last modify time - usec */
> - __u32 vii_ctime; /* Create time - sec */
> - __u32 vii_cutime; /* Create time - usec */
> - __u8 vii_orgtype; /* Organisation type */
> - union {
> - __u32 rdev;
> - __u32 dotdot;
> - } vii_ftarea;
> - __u32 vii_blocks; /* How much blocks does inode occupy */
> - __u32 vii_gen; /* Inode generation */
> - union {
> - struct vxfs_immed immed;
> - struct vxfs_ext4 ext4;
> - struct vxfs_typed typed[VXFS_NTYPED];
> - } vii_org;
> -};
> -
> -#define vii_rdev vii_ftarea.rdev
> -#define vii_dotdot vii_ftarea.dotdot
> -
> -#define vii_immed vii_org.immed
> -#define vii_ext4 vii_org.ext4
> -#define vii_typed vii_org.typed
> -
> -static inline struct vxfs_inode_info *VXFS_INO(struct inode *inode)
> -{
> - return container_of(inode, struct vxfs_inode_info, vfs_inode);
> -}
> -
> -#endif /* _VXFS_INODE_H_ */
> diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c
> deleted file mode 100644
> index 138e08de976e..000000000000
> --- a/fs/freevxfs/vxfs_lookup.c
> +++ /dev/null
> @@ -1,273 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -
> -/*
> - * Veritas filesystem driver - lookup and other directory related code.
> - */
> -#include <linux/fs.h>
> -#include <linux/filelock.h>
> -#include <linux/time.h>
> -#include <linux/mm.h>
> -#include <linux/highmem.h>
> -#include <linux/kernel.h>
> -#include <linux/pagemap.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_dir.h"
> -#include "vxfs_inode.h"
> -#include "vxfs_extern.h"
> -
> -/*
> - * Number of VxFS blocks per page.
> - */
> -#define VXFS_BLOCK_PER_PAGE(sbp) ((PAGE_SIZE / (sbp)->s_blocksize))
> -
> -
> -static struct dentry * vxfs_lookup(struct inode *, struct dentry *, unsigned int);
> -static int vxfs_readdir(struct file *, struct dir_context *);
> -
> -const struct inode_operations vxfs_dir_inode_ops = {
> - .lookup = vxfs_lookup,
> -};
> -
> -const struct file_operations vxfs_dir_operations = {
> - .llseek = generic_file_llseek,
> - .read = generic_read_dir,
> - .iterate_shared = vxfs_readdir,
> - .setlease = generic_setlease,
> -};
> -
> -
> -/**
> - * vxfs_find_entry - find a mathing directory entry for a dentry
> - * @ip: directory inode
> - * @dp: dentry for which we want to find a direct
> - * @ppp: gets filled with the page the return value sits in
> - *
> - * Description:
> - * vxfs_find_entry finds a &struct vxfs_direct for the VFS directory
> - * cache entry @dp. @ppp will be filled with the page the return
> - * value resides in.
> - *
> - * Returns:
> - * The wanted direct on success, else a NULL pointer.
> - */
> -static struct vxfs_direct *
> -vxfs_find_entry(struct inode *ip, struct dentry *dp, struct page **ppp)
> -{
> - u_long bsize = ip->i_sb->s_blocksize;
> - const char *name = dp->d_name.name;
> - int namelen = dp->d_name.len;
> - loff_t limit = VXFS_DIRROUND(ip->i_size);
> - struct vxfs_direct *de_exit = NULL;
> - loff_t pos = 0;
> - struct vxfs_sb_info *sbi = VXFS_SBI(ip->i_sb);
> -
> - while (pos < limit) {
> - struct page *pp;
> - char *kaddr;
> - int pg_ofs = pos & ~PAGE_MASK;
> -
> - pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_SHIFT);
> - if (IS_ERR(pp))
> - return NULL;
> - kaddr = (char *)page_address(pp);
> -
> - while (pg_ofs < PAGE_SIZE && pos < limit) {
> - struct vxfs_direct *de;
> -
> - if ((pos & (bsize - 1)) < 4) {
> - struct vxfs_dirblk *dbp =
> - (struct vxfs_dirblk *)
> - (kaddr + (pos & ~PAGE_MASK));
> - int overhead = VXFS_DIRBLKOV(sbi, dbp);
> -
> - pos += overhead;
> - pg_ofs += overhead;
> - }
> - de = (struct vxfs_direct *)(kaddr + pg_ofs);
> -
> - if (!de->d_reclen) {
> - pos += bsize - 1;
> - pos &= ~(bsize - 1);
> - break;
> - }
> -
> - pg_ofs += fs16_to_cpu(sbi, de->d_reclen);
> - pos += fs16_to_cpu(sbi, de->d_reclen);
> - if (!de->d_ino)
> - continue;
> -
> - if (namelen != fs16_to_cpu(sbi, de->d_namelen))
> - continue;
> - if (!memcmp(name, de->d_name, namelen)) {
> - *ppp = pp;
> - de_exit = de;
> - break;
> - }
> - }
> - if (!de_exit)
> - vxfs_put_page(pp);
> - else
> - break;
> - }
> -
> - return de_exit;
> -}
> -
> -/**
> - * vxfs_inode_by_name - find inode number for dentry
> - * @dip: directory to search in
> - * @dp: dentry we search for
> - *
> - * Description:
> - * vxfs_inode_by_name finds out the inode number of
> - * the path component described by @dp in @dip.
> - *
> - * Returns:
> - * The wanted inode number on success, else Zero.
> - */
> -static ino_t
> -vxfs_inode_by_name(struct inode *dip, struct dentry *dp)
> -{
> - struct vxfs_direct *de;
> - struct page *pp;
> - ino_t ino = 0;
> -
> - de = vxfs_find_entry(dip, dp, &pp);
> - if (de) {
> - ino = fs32_to_cpu(VXFS_SBI(dip->i_sb), de->d_ino);
> - kunmap(pp);
> - put_page(pp);
> - }
> -
> - return (ino);
> -}
> -
> -/**
> - * vxfs_lookup - lookup pathname component
> - * @dip: dir in which we lookup
> - * @dp: dentry we lookup
> - * @flags: lookup flags
> - *
> - * Description:
> - * vxfs_lookup tries to lookup the pathname component described
> - * by @dp in @dip.
> - *
> - * Returns:
> - * A NULL-pointer on success, else a negative error code encoded
> - * in the return pointer.
> - */
> -static struct dentry *
> -vxfs_lookup(struct inode *dip, struct dentry *dp, unsigned int flags)
> -{
> - struct inode *ip = NULL;
> - ino_t ino;
> -
> - if (dp->d_name.len > VXFS_NAMELEN)
> - return ERR_PTR(-ENAMETOOLONG);
> -
> - ino = vxfs_inode_by_name(dip, dp);
> - if (ino)
> - ip = vxfs_iget(dip->i_sb, ino);
> - return d_splice_alias(ip, dp);
> -}
> -
> -/**
> - * vxfs_readdir - read a directory
> - * @fp: the directory to read
> - * @ctx: dir_context for filldir/readdir
> - *
> - * Description:
> - * vxfs_readdir fills @retp with directory entries from @fp
> - * using the VFS supplied callback @filler.
> - *
> - * Returns:
> - * Zero.
> - */
> -static int
> -vxfs_readdir(struct file *fp, struct dir_context *ctx)
> -{
> - struct inode *ip = file_inode(fp);
> - struct super_block *sbp = ip->i_sb;
> - u_long bsize = sbp->s_blocksize;
> - loff_t pos, limit;
> - struct vxfs_sb_info *sbi = VXFS_SBI(sbp);
> -
> - if (ctx->pos == 0) {
> - if (!dir_emit_dot(fp, ctx))
> - goto out;
> - ctx->pos++;
> - }
> - if (ctx->pos == 1) {
> - if (!dir_emit(ctx, "..", 2, VXFS_INO(ip)->vii_dotdot, DT_DIR))
> - goto out;
> - ctx->pos++;
> - }
> -
> - limit = VXFS_DIRROUND(ip->i_size);
> - if (ctx->pos > limit)
> - goto out;
> -
> - pos = ctx->pos & ~3L;
> -
> - while (pos < limit) {
> - struct page *pp;
> - char *kaddr;
> - int pg_ofs = pos & ~PAGE_MASK;
> - int rc = 0;
> -
> - pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_SHIFT);
> - if (IS_ERR(pp))
> - return -ENOMEM;
> -
> - kaddr = (char *)page_address(pp);
> -
> - while (pg_ofs < PAGE_SIZE && pos < limit) {
> - struct vxfs_direct *de;
> -
> - if ((pos & (bsize - 1)) < 4) {
> - struct vxfs_dirblk *dbp =
> - (struct vxfs_dirblk *)
> - (kaddr + (pos & ~PAGE_MASK));
> - int overhead = VXFS_DIRBLKOV(sbi, dbp);
> -
> - pos += overhead;
> - pg_ofs += overhead;
> - }
> - de = (struct vxfs_direct *)(kaddr + pg_ofs);
> -
> - if (!de->d_reclen) {
> - pos += bsize - 1;
> - pos &= ~(bsize - 1);
> - break;
> - }
> -
> - pg_ofs += fs16_to_cpu(sbi, de->d_reclen);
> - pos += fs16_to_cpu(sbi, de->d_reclen);
> - if (!de->d_ino)
> - continue;
> -
> - rc = dir_emit(ctx, de->d_name,
> - fs16_to_cpu(sbi, de->d_namelen),
> - fs32_to_cpu(sbi, de->d_ino),
> - DT_UNKNOWN);
> - if (!rc) {
> - /* the dir entry was not read, fix pos. */
> - pos -= fs16_to_cpu(sbi, de->d_reclen);
> - break;
> - }
> - }
> - vxfs_put_page(pp);
> - if (!rc)
> - break;
> - }
> -
> - ctx->pos = pos | 2;
> -
> -out:
> - return 0;
> -}
> diff --git a/fs/freevxfs/vxfs_olt.c b/fs/freevxfs/vxfs_olt.c
> deleted file mode 100644
> index 23f35187c289..000000000000
> --- a/fs/freevxfs/vxfs_olt.c
> +++ /dev/null
> @@ -1,105 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -
> -/*
> - * Veritas filesystem driver - object location table support.
> - */
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/kernel.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_olt.h"
> -#include "vxfs_extern.h"
> -
> -
> -static inline void
> -vxfs_get_fshead(struct vxfs_oltfshead *fshp, struct vxfs_sb_info *infp)
> -{
> - BUG_ON(infp->vsi_fshino);
> - infp->vsi_fshino = fs32_to_cpu(infp, fshp->olt_fsino[0]);
> -}
> -
> -static inline void
> -vxfs_get_ilist(struct vxfs_oltilist *ilistp, struct vxfs_sb_info *infp)
> -{
> - BUG_ON(infp->vsi_iext);
> - infp->vsi_iext = fs32_to_cpu(infp, ilistp->olt_iext[0]);
> -}
> -
> -static inline u_long
> -vxfs_oblock(struct super_block *sbp, daddr_t block, u_long bsize)
> -{
> - BUG_ON(sbp->s_blocksize % bsize);
> - return (block * (sbp->s_blocksize / bsize));
> -}
> -
> -
> -/**
> - * vxfs_read_olt - read olt
> - * @sbp: superblock of the filesystem
> - * @bsize: blocksize of the filesystem
> - *
> - * Description:
> - * vxfs_read_olt reads the olt of the filesystem described by @sbp
> - * into main memory and does some basic setup.
> - *
> - * Returns:
> - * Zero on success, else a negative error code.
> - */
> -int
> -vxfs_read_olt(struct super_block *sbp, u_long bsize)
> -{
> - struct vxfs_sb_info *infp = VXFS_SBI(sbp);
> - struct buffer_head *bp;
> - struct vxfs_olt *op;
> - char *oaddr, *eaddr;
> -
> - bp = sb_bread(sbp, vxfs_oblock(sbp, infp->vsi_oltext, bsize));
> - if (!bp || !bp->b_data)
> - goto fail;
> -
> - op = (struct vxfs_olt *)bp->b_data;
> - if (fs32_to_cpu(infp, op->olt_magic) != VXFS_OLT_MAGIC) {
> - printk(KERN_NOTICE "vxfs: ivalid olt magic number\n");
> - goto fail;
> - }
> -
> - /*
> - * It is in theory possible that vsi_oltsize is > 1.
> - * I've not seen any such filesystem yet and I'm lazy.. --hch
> - */
> - if (infp->vsi_oltsize > 1) {
> - printk(KERN_NOTICE "vxfs: oltsize > 1 detected.\n");
> - printk(KERN_NOTICE "vxfs: please notify hch@infradead.org\n");
> - goto fail;
> - }
> -
> - oaddr = bp->b_data + fs32_to_cpu(infp, op->olt_size);
> - eaddr = bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
> -
> - while (oaddr < eaddr) {
> - struct vxfs_oltcommon *ocp =
> - (struct vxfs_oltcommon *)oaddr;
> -
> - switch (fs32_to_cpu(infp, ocp->olt_type)) {
> - case VXFS_OLT_FSHEAD:
> - vxfs_get_fshead((struct vxfs_oltfshead *)oaddr, infp);
> - break;
> - case VXFS_OLT_ILIST:
> - vxfs_get_ilist((struct vxfs_oltilist *)oaddr, infp);
> - break;
> - }
> -
> - oaddr += fs32_to_cpu(infp, ocp->olt_size);
> - }
> -
> - brelse(bp);
> - return (infp->vsi_fshino && infp->vsi_iext) ? 0 : -EINVAL;
> -
> -fail:
> - brelse(bp);
> - return -EINVAL;
> -}
> diff --git a/fs/freevxfs/vxfs_olt.h b/fs/freevxfs/vxfs_olt.h
> deleted file mode 100644
> index 53afba08d617..000000000000
> --- a/fs/freevxfs/vxfs_olt.h
> +++ /dev/null
> @@ -1,120 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -#ifndef _VXFS_OLT_H_
> -#define _VXFS_OLT_H_
> -
> -/*
> - * Veritas filesystem driver - Object Location Table data structures.
> - *
> - * This file contains definitions for the Object Location Table used
> - * by the Veritas Filesystem version 2 and newer.
> - */
> -
> -
> -/*
> - * OLT magic number (vxfs_olt->olt_magic).
> - */
> -#define VXFS_OLT_MAGIC 0xa504FCF5
> -
> -/*
> - * VxFS OLT entry types.
> - */
> -enum {
> - VXFS_OLT_FREE = 1,
> - VXFS_OLT_FSHEAD = 2,
> - VXFS_OLT_CUT = 3,
> - VXFS_OLT_ILIST = 4,
> - VXFS_OLT_DEV = 5,
> - VXFS_OLT_SB = 6
> -};
> -
> -/*
> - * VxFS OLT header.
> - *
> - * The Object Location Table header is placed at the beginning of each
> - * OLT extent. It is used to fing certain filesystem-wide metadata, e.g.
> - * the initial inode list, the fileset header or the device configuration.
> - */
> -struct vxfs_olt {
> - __fs32 olt_magic; /* magic number */
> - __fs32 olt_size; /* size of this entry */
> - __fs32 olt_checksum; /* checksum of extent */
> - __u32 __unused1; /* ??? */
> - __fs32 olt_mtime; /* time of last mod. (sec) */
> - __fs32 olt_mutime; /* time of last mod. (usec) */
> - __fs32 olt_totfree; /* free space in OLT extent */
> - __fs32 olt_extents[2]; /* addr of this extent, replica */
> - __fs32 olt_esize; /* size of this extent */
> - __fs32 olt_next[2]; /* addr of next extent, replica */
> - __fs32 olt_nsize; /* size of next extent */
> - __u32 __unused2; /* align to 8 byte boundary */
> -};
> -
> -/*
> - * VxFS common OLT entry (on disk).
> - */
> -struct vxfs_oltcommon {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_size; /* size of this record */
> -};
> -
> -/*
> - * VxFS free OLT entry (on disk).
> - */
> -struct vxfs_oltfree {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_fsize; /* size of this free record */
> -};
> -
> -/*
> - * VxFS initial-inode list (on disk).
> - */
> -struct vxfs_oltilist {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_size; /* size of this record */
> - __fs32 olt_iext[2]; /* initial inode list, replica */
> -};
> -
> -/*
> - * Current Usage Table
> - */
> -struct vxfs_oltcut {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_size; /* size of this record */
> - __fs32 olt_cutino; /* inode of current usage table */
> - __u8 __pad; /* unused, 8 byte align */
> -};
> -
> -/*
> - * Inodes containing Superblock, Intent log and OLTs
> - */
> -struct vxfs_oltsb {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_size; /* size of this record */
> - __fs32 olt_sbino; /* inode of superblock file */
> - __u32 __unused1; /* ??? */
> - __fs32 olt_logino[2]; /* inode of log file,replica */
> - __fs32 olt_oltino[2]; /* inode of OLT, replica */
> -};
> -
> -/*
> - * Inode containing device configuration + it's replica
> - */
> -struct vxfs_oltdev {
> - __fs32 olt_type; /* type of this record */
> - __fs32 olt_size; /* size of this record */
> - __fs32 olt_devino[2]; /* inode of device config files */
> -};
> -
> -/*
> - * Fileset header
> - */
> -struct vxfs_oltfshead {
> - __fs32 olt_type; /* type number */
> - __fs32 olt_size; /* size of this record */
> - __fs32 olt_fsino[2]; /* inodes of fileset header */
> -};
> -
> -#endif /* _VXFS_OLT_H_ */
> diff --git a/fs/freevxfs/vxfs_subr.c b/fs/freevxfs/vxfs_subr.c
> deleted file mode 100644
> index f439877ea6e8..000000000000
> --- a/fs/freevxfs/vxfs_subr.c
> +++ /dev/null
> @@ -1,152 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - */
> -
> -/*
> - * Veritas filesystem driver - shared subroutines.
> - */
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/kernel.h>
> -#include <linux/pagemap.h>
> -
> -#include "vxfs_extern.h"
> -
> -
> -static int vxfs_read_folio(struct file *, struct folio *);
> -static sector_t vxfs_bmap(struct address_space *, sector_t);
> -
> -const struct address_space_operations vxfs_aops = {
> - .read_folio = vxfs_read_folio,
> - .bmap = vxfs_bmap,
> -};
> -
> -inline void
> -vxfs_put_page(struct page *pp)
> -{
> - kunmap(pp);
> - put_page(pp);
> -}
> -
> -/**
> - * vxfs_get_page - read a page into memory.
> - * @mapping: mapping to read from
> - * @n: page number
> - *
> - * Description:
> - * vxfs_get_page reads the @n th page of @ip into the pagecache.
> - *
> - * Returns:
> - * The wanted page on success, else a NULL pointer.
> - */
> -struct page *
> -vxfs_get_page(struct address_space *mapping, u_long n)
> -{
> - struct page * pp;
> -
> - pp = read_mapping_page(mapping, n, NULL);
> -
> - if (!IS_ERR(pp)) {
> - kmap(pp);
> - /** if (!PageChecked(pp)) **/
> - /** vxfs_check_page(pp); **/
> - }
> -
> - return (pp);
> -}
> -
> -/**
> - * vxfs_bread - read buffer for a give inode,block tuple
> - * @ip: inode
> - * @block: logical block
> - *
> - * Description:
> - * The vxfs_bread function reads block no @block of
> - * @ip into the buffercache.
> - *
> - * Returns:
> - * The resulting &struct buffer_head.
> - */
> -struct buffer_head *
> -vxfs_bread(struct inode *ip, int block)
> -{
> - struct buffer_head *bp;
> - daddr_t pblock;
> -
> - pblock = vxfs_bmap1(ip, block);
> - bp = sb_bread(ip->i_sb, pblock);
> -
> - return (bp);
> -}
> -
> -/**
> - * vxfs_getblk - locate buffer for given inode,block tuple
> - * @ip: inode
> - * @iblock: logical block
> - * @bp: buffer skeleton
> - * @create: %TRUE if blocks may be newly allocated.
> - *
> - * Description:
> - * The vxfs_getblk function fills @bp with the right physical
> - * block and device number to perform a lowlevel read/write on
> - * it.
> - *
> - * Returns:
> - * Zero on success, else a negativ error code (-EIO).
> - */
> -static int
> -vxfs_getblk(struct inode *ip, sector_t iblock,
> - struct buffer_head *bp, int create)
> -{
> - daddr_t pblock;
> -
> - pblock = vxfs_bmap1(ip, iblock);
> - if (pblock != 0) {
> - map_bh(bp, ip->i_sb, pblock);
> - return 0;
> - }
> -
> - return -EIO;
> -}
> -
> -/**
> - * vxfs_read_folio - read one page synchronously into the pagecache
> - * @file: file context (unused)
> - * @folio: folio to fill in.
> - *
> - * Description:
> - * The vxfs_read_folio routine reads @folio synchronously into the
> - * pagecache.
> - *
> - * Returns:
> - * Zero on success, else a negative error code.
> - *
> - * Locking status:
> - * @folio is locked and will be unlocked.
> - */
> -static int vxfs_read_folio(struct file *file, struct folio *folio)
> -{
> - return block_read_full_folio(folio, vxfs_getblk);
> -}
> -
> -/**
> - * vxfs_bmap - perform logical to physical block mapping
> - * @mapping: logical to physical mapping to use
> - * @block: logical block (relative to @mapping).
> - *
> - * Description:
> - * Vxfs_bmap find out the corresponding phsical block to the
> - * @mapping, @block pair.
> - *
> - * Returns:
> - * Physical block number on success, else Zero.
> - *
> - * Locking status:
> - * We are under the bkl.
> - */
> -static sector_t
> -vxfs_bmap(struct address_space *mapping, sector_t block)
> -{
> - return generic_block_bmap(mapping, block, vxfs_getblk);
> -}
> diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> deleted file mode 100644
> index d7d847d75c3d..000000000000
> --- a/fs/freevxfs/vxfs_super.c
> +++ /dev/null
> @@ -1,347 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (c) 2000-2001 Christoph Hellwig.
> - * Copyright (c) 2016 Krzysztof Blaszkowski
> - */
> -
> -/*
> - * Veritas filesystem driver - superblock related routines.
> - */
> -#include <linux/init.h>
> -#include <linux/module.h>
> -
> -#include <linux/blkdev.h>
> -#include <linux/fs.h>
> -#include <linux/buffer_head.h>
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/stat.h>
> -#include <linux/vfs.h>
> -#include <linux/fs_context.h>
> -
> -#include "vxfs.h"
> -#include "vxfs_extern.h"
> -#include "vxfs_dir.h"
> -#include "vxfs_inode.h"
> -
> -
> -MODULE_AUTHOR("Christoph Hellwig, Krzysztof Blaszkowski");
> -MODULE_DESCRIPTION("Veritas Filesystem (VxFS) driver");
> -MODULE_LICENSE("Dual BSD/GPL");
> -
> -static struct kmem_cache *vxfs_inode_cachep;
> -
> -/**
> - * vxfs_put_super - free superblock resources
> - * @sbp: VFS superblock.
> - *
> - * Description:
> - * vxfs_put_super frees all resources allocated for @sbp
> - * after the last instance of the filesystem is unmounted.
> - */
> -
> -static void
> -vxfs_put_super(struct super_block *sbp)
> -{
> - struct vxfs_sb_info *infp = VXFS_SBI(sbp);
> -
> - iput(infp->vsi_fship);
> - iput(infp->vsi_ilist);
> - iput(infp->vsi_stilist);
> -
> - brelse(infp->vsi_bp);
> - kfree(infp);
> -}
> -
> -/**
> - * vxfs_statfs - get filesystem information
> - * @dentry: VFS dentry to locate superblock
> - * @bufp: output buffer
> - *
> - * Description:
> - * vxfs_statfs fills the statfs buffer @bufp with information
> - * about the filesystem described by @dentry.
> - *
> - * Returns:
> - * Zero.
> - *
> - * Locking:
> - * No locks held.
> - *
> - * Notes:
> - * This is everything but complete...
> - */
> -static int
> -vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp)
> -{
> - struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb);
> - struct vxfs_sb *raw_sb = infp->vsi_raw;
> - u64 id = huge_encode_dev(dentry->d_sb->s_bdev->bd_dev);
> -
> - bufp->f_type = VXFS_SUPER_MAGIC;
> - bufp->f_bsize = dentry->d_sb->s_blocksize;
> - bufp->f_blocks = fs32_to_cpu(infp, raw_sb->vs_dsize);
> - bufp->f_bfree = fs32_to_cpu(infp, raw_sb->vs_free);
> - bufp->f_bavail = 0;
> - bufp->f_files = 0;
> - bufp->f_ffree = fs32_to_cpu(infp, raw_sb->vs_ifree);
> - bufp->f_fsid = u64_to_fsid(id);
> - bufp->f_namelen = VXFS_NAMELEN;
> -
> - return 0;
> -}
> -
> -static int vxfs_reconfigure(struct fs_context *fc)
> -{
> - sync_filesystem(fc->root->d_sb);
> - fc->sb_flags |= SB_RDONLY;
> - return 0;
> -}
> -
> -static struct inode *vxfs_alloc_inode(struct super_block *sb)
> -{
> - struct vxfs_inode_info *vi;
> -
> - vi = alloc_inode_sb(sb, vxfs_inode_cachep, GFP_KERNEL);
> - if (!vi)
> - return NULL;
> - inode_init_once(&vi->vfs_inode);
> - return &vi->vfs_inode;
> -}
> -
> -static void vxfs_free_inode(struct inode *inode)
> -{
> - kmem_cache_free(vxfs_inode_cachep, VXFS_INO(inode));
> -}
> -
> -static const struct super_operations vxfs_super_ops = {
> - .alloc_inode = vxfs_alloc_inode,
> - .free_inode = vxfs_free_inode,
> - .evict_inode = vxfs_evict_inode,
> - .put_super = vxfs_put_super,
> - .statfs = vxfs_statfs,
> -};
> -
> -static int vxfs_try_sb_magic(struct super_block *sbp, struct fs_context *fc,
> - unsigned blk, __fs32 magic)
> -{
> - struct buffer_head *bp;
> - struct vxfs_sb *rsbp;
> - struct vxfs_sb_info *infp = VXFS_SBI(sbp);
> - int silent = fc->sb_flags & SB_SILENT;
> - int rc = -ENOMEM;
> -
> - bp = sb_bread(sbp, blk);
> - do {
> - if (!bp || !buffer_mapped(bp)) {
> - if (!silent) {
> - warnf(fc,
> - "vxfs: unable to read disk superblock at %u",
> - blk);
> - }
> - break;
> - }
> -
> - rc = -EINVAL;
> - rsbp = (struct vxfs_sb *)bp->b_data;
> - if (rsbp->vs_magic != magic) {
> - if (!silent)
> - infof(fc,
> - "vxfs: WRONG superblock magic %08x at %u",
> - rsbp->vs_magic, blk);
> - break;
> - }
> -
> - rc = 0;
> - infp->vsi_raw = rsbp;
> - infp->vsi_bp = bp;
> - } while (0);
> -
> - if (rc) {
> - infp->vsi_raw = NULL;
> - infp->vsi_bp = NULL;
> - brelse(bp);
> - }
> -
> - return rc;
> -}
> -
> -/**
> - * vxfs_fill_super - read superblock into memory and initialize filesystem
> - * @sbp: VFS superblock (to fill)
> - * @fc: filesytem context
> - *
> - * Description:
> - * We are called on the first mount of a filesystem to read the
> - * superblock into memory and do some basic setup.
> - *
> - * Returns:
> - * The superblock on success, else %NULL.
> - *
> - * Locking:
> - * We are under @sbp->s_lock.
> - */
> -static int vxfs_fill_super(struct super_block *sbp, struct fs_context *fc)
> -{
> - struct vxfs_sb_info *infp;
> - struct vxfs_sb *rsbp;
> - u_long bsize;
> - struct inode *root;
> - int ret = -EINVAL;
> - int silent = fc->sb_flags & SB_SILENT;
> - u32 j;
> -
> - sbp->s_flags |= SB_RDONLY;
> -
> - infp = kzalloc_obj(*infp);
> - if (!infp) {
> - warnf(fc, "vxfs: unable to allocate incore superblock");
> - return -ENOMEM;
> - }
> -
> - bsize = sb_min_blocksize(sbp, BLOCK_SIZE);
> - if (!bsize) {
> - warnf(fc, "vxfs: unable to set blocksize");
> - goto out;
> - }
> -
> - sbp->s_op = &vxfs_super_ops;
> - sbp->s_fs_info = infp;
> - sbp->s_time_min = 0;
> - sbp->s_time_max = U32_MAX;
> -
> - if (!vxfs_try_sb_magic(sbp, fc, 1,
> - (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {
> - /* Unixware, x86 */
> - infp->byte_order = VXFS_BO_LE;
> - } else if (!vxfs_try_sb_magic(sbp, fc, 8,
> - (__force __fs32)cpu_to_be32(VXFS_SUPER_MAGIC))) {
> - /* HP-UX, parisc */
> - infp->byte_order = VXFS_BO_BE;
> - } else {
> - if (!silent)
> - infof(fc, "vxfs: can't find superblock.");
> - goto out;
> - }
> -
> - rsbp = infp->vsi_raw;
> - j = fs32_to_cpu(infp, rsbp->vs_version);
> - if ((j < 2 || j > 4) && !silent) {
> - infof(fc, "vxfs: unsupported VxFS version (%d)", j);
> - goto out;
> - }
> -
> -#ifdef DIAGNOSTIC
> - printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", j);
> - printk(KERN_DEBUG "vxfs: blocksize: %d\n",
> - fs32_to_cpu(infp, rsbp->vs_bsize));
> -#endif
> -
> - sbp->s_magic = fs32_to_cpu(infp, rsbp->vs_magic);
> -
> - infp->vsi_oltext = fs32_to_cpu(infp, rsbp->vs_oltext[0]);
> - infp->vsi_oltsize = fs32_to_cpu(infp, rsbp->vs_oltsize);
> -
> - j = fs32_to_cpu(infp, rsbp->vs_bsize);
> - if (!sb_set_blocksize(sbp, j)) {
> - warnf(fc, "vxfs: unable to set final block size");
> - goto out;
> - }
> -
> - if (vxfs_read_olt(sbp, bsize)) {
> - warnf(fc, "vxfs: unable to read olt");
> - goto out;
> - }
> -
> - if (vxfs_read_fshead(sbp)) {
> - warnf(fc, "vxfs: unable to read fshead");
> - goto out;
> - }
> -
> - root = vxfs_iget(sbp, VXFS_ROOT_INO);
> - if (IS_ERR(root)) {
> - ret = PTR_ERR(root);
> - goto out;
> - }
> - sbp->s_root = d_make_root(root);
> - if (!sbp->s_root) {
> - warnf(fc, "vxfs: unable to get root dentry.");
> - goto out_free_ilist;
> - }
> -
> - return 0;
> -
> -out_free_ilist:
> - iput(infp->vsi_fship);
> - iput(infp->vsi_ilist);
> - iput(infp->vsi_stilist);
> -out:
> - brelse(infp->vsi_bp);
> - kfree(infp);
> - return ret;
> -}
> -
> -/*
> - * The usual module blurb.
> - */
> -static int vxfs_get_tree(struct fs_context *fc)
> -{
> - return get_tree_bdev(fc, vxfs_fill_super);
> -}
> -
> -static const struct fs_context_operations vxfs_context_ops = {
> - .get_tree = vxfs_get_tree,
> - .reconfigure = vxfs_reconfigure,
> -};
> -
> -static int vxfs_init_fs_context(struct fs_context *fc)
> -{
> - fc->ops = &vxfs_context_ops;
> -
> - return 0;
> -}
> -
> -static struct file_system_type vxfs_fs_type = {
> - .owner = THIS_MODULE,
> - .name = "vxfs",
> - .kill_sb = kill_block_super,
> - .fs_flags = FS_REQUIRES_DEV,
> - .init_fs_context = vxfs_init_fs_context,
> -};
> -MODULE_ALIAS_FS("vxfs"); /* makes mount -t vxfs autoload the module */
> -MODULE_ALIAS("vxfs");
> -
> -static int __init
> -vxfs_init(void)
> -{
> - int rv;
> -
> - vxfs_inode_cachep = kmem_cache_create_usercopy("vxfs_inode",
> - sizeof(struct vxfs_inode_info), 0,
> - SLAB_RECLAIM_ACCOUNT,
> - offsetof(struct vxfs_inode_info, vii_immed.vi_immed),
> - sizeof_field(struct vxfs_inode_info,
> - vii_immed.vi_immed),
> - NULL);
> - if (!vxfs_inode_cachep)
> - return -ENOMEM;
> - rv = register_filesystem(&vxfs_fs_type);
> - if (rv < 0)
> - kmem_cache_destroy(vxfs_inode_cachep);
> - return rv;
> -}
> -
> -static void __exit
> -vxfs_cleanup(void)
> -{
> - unregister_filesystem(&vxfs_fs_type);
> - /*
> - * Make sure all delayed rcu free inodes are flushed before we
> - * destroy cache.
> - */
> - rcu_barrier();
> - kmem_cache_destroy(vxfs_inode_cachep);
> -}
> -
> -module_init(vxfs_init);
> -module_exit(vxfs_cleanup);
> --
> 2.53.0
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: RFC: remove the freevxfs driver
2026-07-29 11:36 RFC: remove the freevxfs driver Christoph Hellwig
2026-07-29 11:36 ` [PATCH] freevxfs: remove the driver Christoph Hellwig
@ 2026-07-29 18:35 ` Krzysztof Błaszkowski
1 sibling, 0 replies; 4+ messages in thread
From: Krzysztof Błaszkowski @ 2026-07-29 18:35 UTC (permalink / raw)
To: Christoph Hellwig, Christian Brauner; +Cc: linux-fsdevel
let it be removed.
On Wed, 2026-07-29 at 13:36 +0200, Christoph Hellwig wrote:
> Hi all,
>
> I've recently been getting a lot of AI fixes for "security" bugs on
> untrusted freevxfs file systems. This driver had one known user in
> the last 15 or so years, and I can't really spend the time on
> dealing with all these automated report.
>
> So I think the time has come and we should probably deleted it.
> Unless Krzysztof as the only recent user and contributor wants to
> take over, in which case I'd be happy to hand over the
> maintainership.
--
Krzysztof Blaszkowski
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-29 18:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-29 11:36 RFC: remove the freevxfs driver Christoph Hellwig
2026-07-29 11:36 ` [PATCH] freevxfs: remove the driver Christoph Hellwig
2026-07-29 15:50 ` Darrick J. Wong
2026-07-29 18:35 ` RFC: remove the freevxfs driver Krzysztof Błaszkowski
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.