diff options
author | 2016-02-27 18:50:38 +0000 | |
---|---|---|
committer | 2016-02-27 18:50:38 +0000 | |
commit | 3484f39e521e2cbedf2e0a8b8c025df31c8e8ab1 (patch) | |
tree | bebca404106d53c4f1804ce526f8029ab43b7189 | |
parent | Fix STANDARDS: use the appropriate .St argument and add the information (diff) | |
download | wireguard-openbsd-3484f39e521e2cbedf2e0a8b8c025df31c8e8ab1.tar.xz wireguard-openbsd-3484f39e521e2cbedf2e0a8b8c025df31c8e8ab1.zip |
Move mnt_maxsymlink from struct mount to struct ufsmount.
The concept of differentiating between "short" and "long" symlinks is
specific to ufs/, so it shouldn't creep into the generic fs layer.
Inspired by a similar commit to NetBSD.
While there replace 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.
input and ok stefan@
ok millert@
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 3 | ||||
-rw-r--r-- | sys/ntfs/ntfs_vfsops.c | 3 | ||||
-rw-r--r-- | sys/sys/mount.h | 3 | ||||
-rw-r--r-- | sys/ufs/ext2fs/ext2fs_inode.c | 7 | ||||
-rw-r--r-- | sys/ufs/ext2fs/ext2fs_readwrite.c | 6 | ||||
-rw-r--r-- | sys/ufs/ext2fs/ext2fs_vfsops.c | 4 | ||||
-rw-r--r-- | sys/ufs/ext2fs/ext2fs_vnops.c | 7 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_inode.c | 6 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 6 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 7 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_dirhash.c | 6 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_lookup.c | 56 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 14 | ||||
-rw-r--r-- | sys/ufs/ufs/ufsmount.h | 3 |
14 files changed, 62 insertions, 69 deletions
diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index 20d6552dd5b..659c5ec8579 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cd9660_vfsops.c,v 1.71 2015/09/09 15:59:19 krw Exp $ */ +/* $OpenBSD: cd9660_vfsops.c,v 1.72 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: cd9660_vfsops.c,v 1.26 1997/06/13 15:38:58 pk Exp $ */ /*- @@ -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; diff --git a/sys/ntfs/ntfs_vfsops.c b/sys/ntfs/ntfs_vfsops.c index d7ef07b85dd..f81873584ca 100644 --- a/sys/ntfs/ntfs_vfsops.c +++ b/sys/ntfs/ntfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntfs_vfsops.c,v 1.44 2015/03/14 03:38:52 jsg Exp $ */ +/* $OpenBSD: ntfs_vfsops.c,v 1.45 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ntfs_vfsops.c,v 1.7 2003/04/24 07:50:19 christos Exp $ */ /*- @@ -436,7 +436,6 @@ ntfs_mountfs(struct vnode *devvp, struct mount *mp, struct ntfs_args *argsp, 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); diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 72e84f46680..1939f0c1e4b 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mount.h,v 1.122 2016/02/26 08:56:10 natano Exp $ */ +/* $OpenBSD: mount.h,v 1.123 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $ */ /* @@ -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 */ }; diff --git a/sys/ufs/ext2fs/ext2fs_inode.c b/sys/ufs/ext2fs/ext2fs_inode.c index 97349af5fcd..c3edcad6ad2 100644 --- a/sys/ufs/ext2fs/ext2fs_inode.c +++ b/sys/ufs/ext2fs/ext2fs_inode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_inode.c,v 1.56 2015/03/14 03:38:52 jsg Exp $ */ +/* $OpenBSD: ext2fs_inode.c,v 1.57 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ext2fs_inode.c,v 1.24 2001/06/19 12:59:18 wiz Exp $ */ /* @@ -227,10 +227,7 @@ ext2fs_truncate(struct inode *oip, off_t length, int flags, struct ucred *cred) 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"); diff --git a/sys/ufs/ext2fs/ext2fs_readwrite.c b/sys/ufs/ext2fs/ext2fs_readwrite.c index f836bee528b..ef73a2a34cb 100644 --- a/sys/ufs/ext2fs/ext2fs_readwrite.c +++ b/sys/ufs/ext2fs/ext2fs_readwrite.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_readwrite.c,v 1.38 2016/02/26 08:56:10 natano Exp $ */ +/* $OpenBSD: ext2fs_readwrite.c,v 1.39 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ext2fs_readwrite.c,v 1.16 2001/02/27 04:37:47 chs Exp $ */ /*- @@ -95,9 +95,7 @@ ext2_ind_read(struct vnode *vp, struct inode *ip, struct m_ext2fs *fs, 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); diff --git a/sys/ufs/ext2fs/ext2fs_vfsops.c b/sys/ufs/ext2fs/ext2fs_vfsops.c index f1b81e51b74..4acfa333d58 100644 --- a/sys/ufs/ext2fs/ext2fs_vfsops.c +++ b/sys/ufs/ext2fs/ext2fs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_vfsops.c,v 1.85 2015/03/14 03:38:52 jsg Exp $ */ +/* $OpenBSD: ext2fs_vfsops.c,v 1.86 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ext2fs_vfsops.c,v 1.1 1997/06/11 09:34:07 bouyer Exp $ */ /* @@ -583,7 +583,6 @@ ext2fs_mountfs(struct vnode *devvp, struct mount *mp, struct proc *p) 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, struct mount *mp, struct proc *p) 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: diff --git a/sys/ufs/ext2fs/ext2fs_vnops.c b/sys/ufs/ext2fs/ext2fs_vnops.c index 1c39a2b61b8..7d1ad1e2784 100644 --- a/sys/ufs/ext2fs/ext2fs_vnops.c +++ b/sys/ufs/ext2fs/ext2fs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_vnops.c,v 1.75 2016/02/26 08:56:10 natano Exp $ */ +/* $OpenBSD: ext2fs_vnops.c,v 1.76 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ext2fs_vnops.c,v 1.1 1997/06/11 09:34:09 bouyer Exp $ */ /* @@ -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)); } diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c index 82c1b87c3e1..fd956ebefb4 100644 --- a/sys/ufs/ffs/ffs_inode.c +++ b/sys/ufs/ffs/ffs_inode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs_inode.c,v 1.75 2015/11/28 21:52:02 beck Exp $ */ +/* $OpenBSD: ffs_inode.c,v 1.76 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ffs_inode.c,v 1.10 1996/05/11 18:27:19 mycroft Exp $ */ /* @@ -152,8 +152,8 @@ ffs_truncate(struct inode *oip, off_t length, int flags, struct ucred *cred) 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) diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 530d66368a5..5b605ef4a8f 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs_vfsops.c,v 1.151 2016/02/26 08:56:10 natano Exp $ */ +/* $OpenBSD: ffs_vfsops.c,v 1.152 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ffs_vfsops.c,v 1.19 1996/02/09 22:22:26 christos Exp $ */ /* @@ -573,7 +573,7 @@ ffs_reload(struct mount *mountp, struct ucred *cred, struct proc *p) 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 mount *mp, struct proc *p) 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 mount *mp, struct proc *p) 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; diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 64d50aa615d..dec55d218cf 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs_vnops.c,v 1.83 2016/02/26 08:56:10 natano Exp $ */ +/* $OpenBSD: ffs_vnops.c,v 1.84 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ffs_vnops.c,v 1.7 1996/05/11 18:27:24 mycroft Exp $ */ /* @@ -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); diff --git a/sys/ufs/ufs/ufs_dirhash.c b/sys/ufs/ufs/ufs_dirhash.c index 44f9cac582e..af501244a49 100644 --- a/sys/ufs/ufs/ufs_dirhash.c +++ b/sys/ufs/ufs/ufs_dirhash.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_dirhash.c,v 1.33 2015/03/14 03:38:53 jsg Exp $ */ +/* $OpenBSD: ufs_dirhash.c,v 1.34 2016/02/27 18:50:38 natano Exp $ */ /* * Copyright (c) 2001, 2002 Ian Dowse. All rights reserved. * @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_dirhash.c,v 1.18 2004/02/15 21:39:35 dwm #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. */ diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c index f55afdfd509..4126332f1a7 100644 --- a/sys/ufs/ufs/ufs_lookup.c +++ b/sys/ufs/ufs/ufs_lookup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_lookup.c,v 1.47 2015/03/14 03:38:53 jsg Exp $ */ +/* $OpenBSD: ufs_lookup.c,v 1.48 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ufs_lookup.c,v 1.7 1996/02/09 22:36:06 christos Exp $ */ /* @@ -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 offset, char *how) * 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,15 @@ ufs_makedirentry(struct inode *ip, struct componentname *cnp, 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 +710,7 @@ ufs_direnter(struct vnode *dvp, struct vnode *tvp, struct direct *dirp, 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 +825,7 @@ ufs_direnter(struct vnode *dvp, struct vnode *tvp, struct direct *dirp, * 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 +850,7 @@ ufs_direnter(struct vnode *dvp, struct vnode *tvp, struct direct *dirp, 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 +1028,7 @@ ufs_dirrewrite(struct inode *dp, struct inode *oip, ufsino_t newinum, 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 +1086,10 @@ ufs_dirempty(struct inode *ip, ufsino_t parentino, struct ucred *cred) 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 +1144,10 @@ ufs_checkpath(struct inode *source, struct inode *target, struct ucred *cred) 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 diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index efc42ceb5af..a6372174e06 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_vnops.c,v 1.125 2016/02/16 17:56:12 stefan Exp $ */ +/* $OpenBSD: ufs_vnops.c,v 1.126 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ufs_vnops.c,v 1.18 1996/05/11 18:28:04 mycroft Exp $ */ /* @@ -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)); diff --git a/sys/ufs/ufs/ufsmount.h b/sys/ufs/ufs/ufsmount.h index 9d4c93517d2..3ad8938e422 100644 --- a/sys/ufs/ufs/ufsmount.h +++ b/sys/ufs/ufs/ufsmount.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ufsmount.h,v 1.12 2006/10/29 00:53:37 thib Exp $ */ +/* $OpenBSD: ufsmount.h,v 1.13 2016/02/27 18:50:38 natano Exp $ */ /* $NetBSD: ufsmount.h,v 1.4 1994/12/21 20:00:23 mycroft Exp $ */ /* @@ -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 */ }; /* |