Hello Todd, Stefan,
this is the logical continuation of the previous maxsymlinklen diff. At
least in my mind it is logical. ;)
I have a dream that one day filesystem code will be actually readable
and changeable without being a UFS lawyer.
I would appreciate if you could have a look at this.
natano
On Fri, Feb 26, 2016 at 11:32:08PM +0100, Martin Natano wrote:
> The concept of differentiating between "short" and "long" symlinks is
> specific to ufs/, but the relevant variable is contained in struct
> mount, which is used by all filesystems. I think it would be a worthwile
> effort to clear this up by moving maxsymlinklen to struct ufsmount
> instead. Filesystem code is already hard enough to understand without
> such layering violations.
>
> Note, that I replaced all references to mnt_maxsymlinklen in ufs/ext2fs
> with EXT2_MAXSYMLINKLEN, which is the constant max short symlink len for
> ext2fs. This allows to get rid of some (mnt_maxsymlinklen == 0) checks
> there, which is always false for ext2fs.
>
> Comments?
>
> natano
>
>
> Index: isofs/cd9660/cd9660_vfsops.c
> ===================================================================
> RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vfsops.c,v
> retrieving revision 1.71
> diff -u -p -r1.71 cd9660_vfsops.c
> --- isofs/cd9660/cd9660_vfsops.c 9 Sep 2015 15:59:19 -0000 1.71
> +++ isofs/cd9660/cd9660_vfsops.c 26 Feb 2016 21:30:15 -0000
> @@ -383,7 +383,6 @@ iso_mountfs(devvp, mp, p, argp)
> mp->mnt_data = (qaddr_t)isomp;
> mp->mnt_stat.f_fsid.val[0] = (long)dev;
> mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
> - mp->mnt_maxsymlinklen = 0;
> mp->mnt_flag |= MNT_LOCAL;
> isomp->im_mountp = mp;
> isomp->im_dev = dev;
> Index: ntfs/ntfs_vfsops.c
> ===================================================================
> RCS file: /cvs/src/sys/ntfs/ntfs_vfsops.c,v
> retrieving revision 1.44
> diff -u -p -r1.44 ntfs_vfsops.c
> --- ntfs/ntfs_vfsops.c 14 Mar 2015 03:38:52 -0000 1.44
> +++ ntfs/ntfs_vfsops.c 26 Feb 2016 21:30:16 -0000
> @@ -436,7 +436,6 @@ ntfs_mountfs(struct vnode *devvp, struct
>
> mp->mnt_stat.f_fsid.val[0] = dev;
> mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
> - mp->mnt_maxsymlinklen = 0;
> mp->mnt_flag |= MNT_LOCAL;
> devvp->v_specmountpoint = mp;
> return (0);
> Index: sys/mount.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/mount.h,v
> retrieving revision 1.122
> diff -u -p -r1.122 mount.h
> --- sys/mount.h 26 Feb 2016 08:56:10 -0000 1.122
> +++ sys/mount.h 26 Feb 2016 21:30:16 -0000
> @@ -355,7 +355,6 @@ struct mount {
> struct vnodelst mnt_vnodelist; /* list of vnodes this mount */
> struct rwlock mnt_lock; /* mount structure lock */
> int mnt_flag; /* flags */
> - unsigned int mnt_maxsymlinklen; /* max size of short symlink */
> struct statfs mnt_stat; /* cache of filesystem stats */
> void *mnt_data; /* private data */
> };
> Index: ufs/ext2fs/ext2fs_inode.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_inode.c,v
> retrieving revision 1.56
> diff -u -p -r1.56 ext2fs_inode.c
> --- ufs/ext2fs/ext2fs_inode.c 14 Mar 2015 03:38:52 -0000 1.56
> +++ ufs/ext2fs/ext2fs_inode.c 26 Feb 2016 21:30:16 -0000
> @@ -227,10 +227,7 @@ ext2fs_truncate(struct inode *oip, off_t
> ovp->v_type != VLNK)
> return (0);
>
> - if (ovp->v_type == VLNK &&
> - (ext2fs_size(oip) < ovp->v_mount->mnt_maxsymlinklen ||
> - (ovp->v_mount->mnt_maxsymlinklen == 0 &&
> - oip->i_e2fs_nblock == 0))) {
> + if (ovp->v_type == VLNK && ext2fs_size(oip) < EXT2_MAXSYMLINKLEN) {
> #ifdef DIAGNOSTIC
> if (length != 0)
> panic("ext2fs_truncate: partial truncate of symlink");
> Index: ufs/ext2fs/ext2fs_readwrite.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_readwrite.c,v
> retrieving revision 1.38
> diff -u -p -r1.38 ext2fs_readwrite.c
> --- ufs/ext2fs/ext2fs_readwrite.c 26 Feb 2016 08:56:10 -0000 1.38
> +++ ufs/ext2fs/ext2fs_readwrite.c 26 Feb 2016 21:30:16 -0000
> @@ -95,9 +95,7 @@ ext2_ind_read(struct vnode *vp, struct i
> panic("%s: mode", "ext2fs_read");
>
> if (vp->v_type == VLNK) {
> - if (ext2fs_size(ip) < vp->v_mount->mnt_maxsymlinklen ||
> - (vp->v_mount->mnt_maxsymlinklen == 0 &&
> - ip->i_e2fs_nblock == 0))
> + if (ext2fs_size(ip) < EXT2_MAXSYMLINKLEN)
> panic("%s: short symlink", "ext2fs_read");
> } else if (vp->v_type != VREG && vp->v_type != VDIR)
> panic("%s: type %d", "ext2fs_read", vp->v_type);
> Index: ufs/ext2fs/ext2fs_vfsops.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_vfsops.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 ext2fs_vfsops.c
> --- ufs/ext2fs/ext2fs_vfsops.c 14 Mar 2015 03:38:52 -0000 1.85
> +++ ufs/ext2fs/ext2fs_vfsops.c 26 Feb 2016 21:30:16 -0000
> @@ -583,7 +583,6 @@ ext2fs_mountfs(struct vnode *devvp, stru
> mp->mnt_data = (qaddr_t)ump;
> mp->mnt_stat.f_fsid.val[0] = (long)dev;
> mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
> - mp->mnt_maxsymlinklen = EXT2_MAXSYMLINKLEN;
> mp->mnt_flag |= MNT_LOCAL;
> ump->um_mountp = mp;
> ump->um_dev = dev;
> @@ -591,6 +590,7 @@ ext2fs_mountfs(struct vnode *devvp, stru
> ump->um_nindir = NINDIR(ump->um_e2fs);
> ump->um_bptrtodb = ump->um_e2fs->e2fs_fsbtodb;
> ump->um_seqinc = 1; /* no frags */
> + ump->um_maxsymlinklen = EXT2_MAXSYMLINKLEN;
> devvp->v_specmountpoint = mp;
> return (0);
> out:
> Index: ufs/ext2fs/ext2fs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_vnops.c,v
> retrieving revision 1.75
> diff -u -p -r1.75 ext2fs_vnops.c
> --- ufs/ext2fs/ext2fs_vnops.c 26 Feb 2016 08:56:10 -0000 1.75
> +++ ufs/ext2fs/ext2fs_vnops.c 26 Feb 2016 21:30:16 -0000
> @@ -1091,7 +1091,7 @@ ext2fs_symlink(void *v)
> return (error);
> vp = *vpp;
> len = strlen(ap->a_target);
> - if (len < vp->v_mount->mnt_maxsymlinklen) {
> + if (len < EXT2_MAXSYMLINKLEN) {
> ip = VTOI(vp);
> memcpy(ip->i_e2din->e2di_shortlink, ap->a_target, len);
> error = ext2fs_setsize(ip, len);
> @@ -1119,8 +1119,7 @@ ext2fs_readlink(void *v)
> u_int64_t isize;
>
> isize = ext2fs_size(ip);
> - if (isize < vp->v_mount->mnt_maxsymlinklen ||
> - (vp->v_mount->mnt_maxsymlinklen == 0 && ip->i_e2fs_nblock == 0)) {
> + if (isize < EXT2_MAXSYMLINKLEN) {
> return (uiomove((char *)ip->i_e2din->e2di_shortlink, isize,
> ap->a_uio));
> }
> Index: ufs/ffs/ffs_inode.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ffs/ffs_inode.c,v
> retrieving revision 1.75
> diff -u -p -r1.75 ffs_inode.c
> --- ufs/ffs/ffs_inode.c 28 Nov 2015 21:52:02 -0000 1.75
> +++ ufs/ffs/ffs_inode.c 26 Feb 2016 21:30:16 -0000
> @@ -152,8 +152,8 @@ ffs_truncate(struct inode *oip, off_t le
> return (0);
>
> if (ovp->v_type == VLNK &&
> - (DIP(oip, size) < ovp->v_mount->mnt_maxsymlinklen ||
> - (ovp->v_mount->mnt_maxsymlinklen == 0 &&
> + (DIP(oip, size) < oip->i_ump->um_maxsymlinklen ||
> + (oip->i_ump->um_maxsymlinklen == 0 &&
> oip->i_din1->di_blocks == 0))) {
> #ifdef DIAGNOSTIC
> if (length != 0)
> Index: ufs/ffs/ffs_vfsops.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ffs/ffs_vfsops.c,v
> retrieving revision 1.151
> diff -u -p -r1.151 ffs_vfsops.c
> --- ufs/ffs/ffs_vfsops.c 26 Feb 2016 08:56:10 -0000 1.151
> +++ ufs/ffs/ffs_vfsops.c 26 Feb 2016 21:30:16 -0000
> @@ -573,7 +573,7 @@ ffs_reload(struct mount *mountp, struct
> if (fs->fs_sbsize < SBSIZE)
> bp->b_flags |= B_INVAL;
> brelse(bp);
> - mountp->mnt_maxsymlinklen = fs->fs_maxsymlinklen;
> + VFSTOUFS(mountp)->um_maxsymlinklen = fs->fs_maxsymlinklen;
> ffs1_compat_read(fs, VFSTOUFS(mountp), fs->fs_sblockloc);
> ffs_oldfscompat(fs);
> (void)ffs_statfs(mountp, &mountp->mnt_stat, p);
> @@ -834,7 +834,6 @@ ffs_mountfs(struct vnode *devvp, struct
> else
> mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
> mp->mnt_stat.f_namemax = MAXNAMLEN;
> - mp->mnt_maxsymlinklen = fs->fs_maxsymlinklen;
> mp->mnt_flag |= MNT_LOCAL;
> ump->um_mountp = mp;
> ump->um_dev = dev;
> @@ -842,6 +841,7 @@ ffs_mountfs(struct vnode *devvp, struct
> ump->um_nindir = fs->fs_nindir;
> ump->um_bptrtodb = fs->fs_fsbtodb;
> ump->um_seqinc = fs->fs_frag;
> + ump->um_maxsymlinklen = fs->fs_maxsymlinklen;
> for (i = 0; i < MAXQUOTAS; i++)
> ump->um_quotas[i] = NULLVP;
>
> Index: ufs/ffs/ffs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ffs/ffs_vnops.c,v
> retrieving revision 1.83
> diff -u -p -r1.83 ffs_vnops.c
> --- ufs/ffs/ffs_vnops.c 26 Feb 2016 08:56:10 -0000 1.83
> +++ ufs/ffs/ffs_vnops.c 26 Feb 2016 21:30:16 -0000
> @@ -207,9 +207,8 @@ ffs_read(void *v)
> panic("ffs_read: mode");
>
> if (vp->v_type == VLNK) {
> - if (DIP(ip, size) < vp->v_mount->mnt_maxsymlinklen ||
> - (vp->v_mount->mnt_maxsymlinklen == 0 &&
> - DIP(ip, blocks) == 0))
> + if (DIP(ip, size) < ip->i_ump->um_maxsymlinklen ||
> + (ip->i_ump->um_maxsymlinklen == 0 && DIP(ip, blocks) == 0))
> panic("ffs_read: short symlink");
> } else if (vp->v_type != VREG && vp->v_type != VDIR)
> panic("ffs_read: type %d", vp->v_type);
> Index: ufs/ufs/ufs_dirhash.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ufs/ufs_dirhash.c,v
> retrieving revision 1.33
> diff -u -p -r1.33 ufs_dirhash.c
> --- ufs/ufs/ufs_dirhash.c 14 Mar 2015 03:38:53 -0000 1.33
> +++ ufs/ufs/ufs_dirhash.c 26 Feb 2016 21:30:16 -0000
> @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_
>
> #define WRAPINCR(val, limit) (((val) + 1 == (limit)) ? 0 : ((val) + 1))
> #define WRAPDECR(val, limit) (((val) == 0) ? ((limit) - 1) : ((val) - 1))
> -#define OFSFMT(vp) ((vp)->v_mount->mnt_maxsymlinklen <= 0)
> +#define OFSFMT(ip) ((ip)->i_ump->um_maxsymlinklen == 0)
> #define BLKFREE2IDX(n) ((n) > DH_NFSTATS ? DH_NFSTATS : (n))
>
> int ufs_mindirhashsize;
> @@ -116,7 +116,7 @@ ufsdirhash_build(struct inode *ip)
>
> /* Check if we can/should use dirhash. */
> if (ip->i_dirhash == NULL) {
> - if (DIP(ip, size) < ufs_mindirhashsize || OFSFMT(ip->i_vnode))
> + if (DIP(ip, size) < ufs_mindirhashsize || OFSFMT(ip))
> return (-1);
> } else {
> /* Hash exists, but sysctls could have changed. */
> Index: ufs/ufs/ufs_lookup.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ufs/ufs_lookup.c,v
> retrieving revision 1.47
> diff -u -p -r1.47 ufs_lookup.c
> --- ufs/ufs/ufs_lookup.c 14 Mar 2015 03:38:53 -0000 1.47
> +++ ufs/ufs/ufs_lookup.c 26 Feb 2016 21:30:16 -0000
> @@ -64,7 +64,7 @@ int dirchk = 1;
> int dirchk = 0;
> #endif
>
> -#define FSFMT(vp) ((vp)->v_mount->mnt_maxsymlinklen <= 0)
> +#define OFSFMT(ip) ((ip)->i_ump->um_maxsymlinklen == 0)
>
> /*
> * Convert a component of a pathname into a pointer to a locked inode.
> @@ -300,7 +300,7 @@ searchloop:
> int size = ep->d_reclen;
>
> if (ep->d_ino != 0)
> - size -= DIRSIZ(FSFMT(vdp), ep);
> + size -= DIRSIZ(OFSFMT(dp), ep);
> if (size > 0) {
> if (size >= slotneeded) {
> slotstatus = FOUND;
> @@ -324,10 +324,10 @@ searchloop:
> */
> if (ep->d_ino) {
> # if (BYTE_ORDER == LITTLE_ENDIAN)
> - if (vdp->v_mount->mnt_maxsymlinklen > 0)
> - namlen = ep->d_namlen;
> - else
> + if (OFSFMT(dp))
> namlen = ep->d_type;
> + else
> + namlen = ep->d_namlen;
> # else
> namlen = ep->d_namlen;
> # endif
> @@ -441,9 +441,9 @@ found:
> * Check that directory length properly reflects presence
> * of this entry.
> */
> - if (dp->i_offset + DIRSIZ(FSFMT(vdp), ep) > DIP(dp, size)) {
> + if (dp->i_offset + DIRSIZ(OFSFMT(dp), ep) > DIP(dp, size)) {
> ufs_dirbad(dp, dp->i_offset, "i_ffs_size too small");
> - DIP_ASSIGN(dp, size, dp->i_offset + DIRSIZ(FSFMT(vdp), ep));
> + DIP_ASSIGN(dp, size, dp->i_offset + DIRSIZ(OFSFMT(dp), ep));
> dp->i_flag |= IN_CHANGE | IN_UPDATE;
> }
> brelse(bp);
> @@ -618,22 +618,25 @@ ufs_dirbad(struct inode *ip, doff_t offs
> * name must be as long as advertised, and null terminated
> */
> int
> -ufs_dirbadentry(struct vnode *dp, struct direct *ep, int entryoffsetinblock)
> +ufs_dirbadentry(struct vnode *vdp, struct direct *ep, int entryoffsetinblock)
> {
> + struct inode *dp;
> int i;
> int namlen;
>
> + dp = VTOI(vdp);
> +
> # if (BYTE_ORDER == LITTLE_ENDIAN)
> - if (dp->v_mount->mnt_maxsymlinklen > 0)
> - namlen = ep->d_namlen;
> - else
> + if (OFSFMT(dp))
> namlen = ep->d_type;
> + else
> + namlen = ep->d_namlen;
> # else
> namlen = ep->d_namlen;
> # endif
> if ((ep->d_reclen & 0x3) != 0 ||
> ep->d_reclen > DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1)) ||
> - ep->d_reclen < DIRSIZ(FSFMT(dp), ep) || namlen > MAXNAMLEN) {
> + ep->d_reclen < DIRSIZ(OFSFMT(dp), ep) || namlen > MAXNAMLEN) {
> /*return (1); */
> printf("First bad\n");
> goto bad;
> @@ -669,16 +672,16 @@ ufs_makedirentry(struct inode *ip, struc
> newdirp->d_ino = ip->i_number;
> newdirp->d_namlen = cnp->cn_namelen;
> memcpy(newdirp->d_name, cnp->cn_nameptr, cnp->cn_namelen + 1);
> - if (ITOV(ip)->v_mount->mnt_maxsymlinklen > 0)
> - newdirp->d_type = IFTODT(DIP(ip, mode));
> - else {
> + if (OFSFMT(ip)) {
> newdirp->d_type = 0;
> # if (BYTE_ORDER == LITTLE_ENDIAN)
> { u_char tmp = newdirp->d_namlen;
> newdirp->d_namlen = newdirp->d_type;
> newdirp->d_type = tmp; }
> # endif
> - }
> + } else {
> + newdirp->d_type = IFTODT(DIP(ip, mode));
> + }
> }
>
> /*
> @@ -708,7 +711,7 @@ ufs_direnter(struct vnode *dvp, struct v
> cr = cnp->cn_cred;
> p = cnp->cn_proc;
> dp = VTOI(dvp);
> - newentrysize = DIRSIZ(FSFMT(dvp), dirp);
> + newentrysize = DIRSIZ(OFSFMT(dp), dirp);
>
> if (dp->i_count == 0) {
> /*
> @@ -823,7 +826,7 @@ ufs_direnter(struct vnode *dvp, struct v
> * dp->i_offset + dp->i_count would yield the space.
> */
> ep = (struct direct *)dirbuf;
> - dsize = ep->d_ino ? DIRSIZ(FSFMT(dvp), ep) : 0;
> + dsize = ep->d_ino ? DIRSIZ(OFSFMT(dp), ep) : 0;
> spacefree = ep->d_reclen - dsize;
> for (loc = ep->d_reclen; loc < dp->i_count; ) {
> nep = (struct direct *)(dirbuf + loc);
> @@ -848,7 +851,7 @@ ufs_direnter(struct vnode *dvp, struct v
> dsize = 0;
> continue;
> }
> - dsize = DIRSIZ(FSFMT(dvp), nep);
> + dsize = DIRSIZ(OFSFMT(dp), nep);
> spacefree += nep->d_reclen - dsize;
> #ifdef UFS_DIRHASH
> if (dp->i_dirhash != NULL)
> @@ -1026,7 +1029,7 @@ ufs_dirrewrite(struct inode *dp, struct
> if (error)
> return (error);
> ep->d_ino = newinum;
> - if (vdp->v_mount->mnt_maxsymlinklen > 0)
> + if (!OFSFMT(dp))
> ep->d_type = newtype;
> oip->i_effnlink--;
> if (DOINGSOFTDEP(vdp)) {
> @@ -1084,10 +1087,10 @@ ufs_dirempty(struct inode *ip, ufsino_t
> continue;
> /* accept only "." and ".." */
> # if (BYTE_ORDER == LITTLE_ENDIAN)
> - if (ITOV(ip)->v_mount->mnt_maxsymlinklen > 0)
> - namlen = dp->d_namlen;
> - else
> + if (OFSFMT(ip))
> namlen = dp->d_type;
> + else
> + namlen = dp->d_namlen;
> # else
> namlen = dp->d_namlen;
> # endif
> @@ -1142,10 +1145,10 @@ ufs_checkpath(struct inode *source, stru
> if (error != 0)
> break;
> # if (BYTE_ORDER == LITTLE_ENDIAN)
> - if (vp->v_mount->mnt_maxsymlinklen > 0)
> - namlen = dirbuf.dotdot_namlen;
> - else
> + if (OFSFMT(VTOI(vp)))
> namlen = dirbuf.dotdot_type;
> + else
> + namlen = dirbuf.dotdot_namlen;
> # else
> namlen = dirbuf.dotdot_namlen;
> # endif
> Index: ufs/ufs/ufs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ufs/ufs_vnops.c,v
> retrieving revision 1.125
> diff -u -p -r1.125 ufs_vnops.c
> --- ufs/ufs/ufs_vnops.c 16 Feb 2016 17:56:12 -0000 1.125
> +++ ufs/ufs/ufs_vnops.c 26 Feb 2016 21:30:16 -0000
> @@ -1189,7 +1189,7 @@ ufs_mkdir(void *v)
> /*
> * Initialize directory with "." and ".." from static template.
> */
> - if (dvp->v_mount->mnt_maxsymlinklen > 0)
> + if (dp->i_ump->um_maxsymlinklen > 0)
> dtp = &mastertemplate;
> else
> dtp = (struct dirtemplate *)&omastertemplate;
> @@ -1385,9 +1385,9 @@ ufs_symlink(void *v)
> return (error);
> VN_KNOTE(ap->a_dvp, NOTE_WRITE);
> vp = *vpp;
> + ip = VTOI(vp);
> len = strlen(ap->a_target);
> - if (len < vp->v_mount->mnt_maxsymlinklen) {
> - ip = VTOI(vp);
> + if (len < ip->i_ump->um_maxsymlinklen) {
> memcpy(SHORTLINK(ip), ap->a_target, len);
> DIP_ASSIGN(ip, size, len);
> ip->i_flag |= IN_CHANGE | IN_UPDATE;
> @@ -1422,7 +1422,7 @@ ufs_readdir(void *v)
> size_t count, entries;
> int readcnt, error;
> #if (BYTE_ORDER == LITTLE_ENDIAN)
> - int ofmt = ap->a_vp->v_mount->mnt_maxsymlinklen <= 0;
> + int ofmt = VTOI(ap->a_vp)->i_ump->um_maxsymlinklen == 0;
> #endif
>
> if (uio->uio_rw != UIO_READ)
> @@ -1522,8 +1522,8 @@ ufs_readlink(void *v)
> u_int64_t isize;
>
> isize = DIP(ip, size);
> - if (isize < vp->v_mount->mnt_maxsymlinklen ||
> - (vp->v_mount->mnt_maxsymlinklen == 0 && DIP(ip, blocks) == 0)) {
> + if (isize < ip->i_ump->um_maxsymlinklen ||
> + (ip->i_ump->um_maxsymlinklen == 0 && DIP(ip, blocks) == 0)) {
> return (uiomove((char *)SHORTLINK(ip), isize, ap->a_uio));
> }
> return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred));
> Index: ufs/ufs/ufsmount.h
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ufs/ufsmount.h,v
> retrieving revision 1.12
> diff -u -p -r1.12 ufsmount.h
> --- ufs/ufs/ufsmount.h 29 Oct 2006 00:53:37 -0000 1.12
> +++ ufs/ufs/ufsmount.h 26 Feb 2016 21:30:16 -0000
> @@ -66,6 +66,7 @@ struct ufsmount {
> char um_qflags[MAXQUOTAS]; /* quota specific flags */
> struct netexport um_export; /* export information */
> u_int64_t um_savedmaxfilesize; /* XXX - limit maxfilesize */
> + u_int um_maxsymlinklen; /* max size of short symlink */
> };
>
> /*