summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornatano <natano@openbsd.org>2016-02-27 18:50:38 +0000
committernatano <natano@openbsd.org>2016-02-27 18:50:38 +0000
commit3484f39e521e2cbedf2e0a8b8c025df31c8e8ab1 (patch)
treebebca404106d53c4f1804ce526f8029ab43b7189
parentFix STANDARDS: use the appropriate .St argument and add the information (diff)
downloadwireguard-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.c3
-rw-r--r--sys/ntfs/ntfs_vfsops.c3
-rw-r--r--sys/sys/mount.h3
-rw-r--r--sys/ufs/ext2fs/ext2fs_inode.c7
-rw-r--r--sys/ufs/ext2fs/ext2fs_readwrite.c6
-rw-r--r--sys/ufs/ext2fs/ext2fs_vfsops.c4
-rw-r--r--sys/ufs/ext2fs/ext2fs_vnops.c7
-rw-r--r--sys/ufs/ffs/ffs_inode.c6
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c6
-rw-r--r--sys/ufs/ffs/ffs_vnops.c7
-rw-r--r--sys/ufs/ufs/ufs_dirhash.c6
-rw-r--r--sys/ufs/ufs/ufs_lookup.c56
-rw-r--r--sys/ufs/ufs/ufs_vnops.c14
-rw-r--r--sys/ufs/ufs/ufsmount.h3
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 */
};
/*