Module Name: src
Committed By: christos
Date: Sun Dec 14 00:36:07 UTC 2014
Modified Files:
src/sys/ufs/ffs: ffs_vfsops.c
Log Message:
- Add debugging for mount...
- Merge some error returns
- Check more errors
To generate a diff of this commit:
cvs rdiff -u -r1.302 -r1.303 src/sys/ufs/ffs/ffs_vfsops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.302 src/sys/ufs/ffs/ffs_vfsops.c:1.303
--- src/sys/ufs/ffs/ffs_vfsops.c:1.302 Fri Nov 14 05:09:50 2014
+++ src/sys/ufs/ffs/ffs_vfsops.c Sat Dec 13 19:36:07 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_vfsops.c,v 1.302 2014/11/14 10:09:50 manu Exp $ */
+/* $NetBSD: ffs_vfsops.c,v 1.303 2014/12/14 00:36:07 christos Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.302 2014/11/14 10:09:50 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.303 2014/12/14 00:36:07 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -120,6 +120,12 @@ static kauth_listener_t ffs_snapshot_lis
/* how many times ffs_init() was called */
int ffs_initcount = 0;
+#ifdef DEBUG_FFS_MOUNT
+#define DPRINTF(a) printf a
+#else
+#define DPRINTF(a) do {} while (/*CONSTCOND*/0)
+#endif
+
extern const struct vnodeopv_desc ffs_vnodeop_opv_desc;
extern const struct vnodeopv_desc ffs_specop_opv_desc;
extern const struct vnodeopv_desc ffs_fifoop_opv_desc;
@@ -346,15 +352,22 @@ ffs_mount(struct mount *mp, const char *
int error = 0, flags, update;
mode_t accessmode;
- if (args == NULL)
+ if (args == NULL) {
+ DPRINTF(("%s: NULL args\n", __func__));
return EINVAL;
- if (*data_len < sizeof *args)
+ }
+ if (*data_len < sizeof(*args)) {
+ DPRINTF(("%s: bad size args %zu != %zu\n",
+ __func__, *data_len, sizeof(*args)));
return EINVAL;
+ }
if (mp->mnt_flag & MNT_GETARGS) {
ump = VFSTOUFS(mp);
- if (ump == NULL)
+ if (ump == NULL) {
+ DPRINTF(("%s: no ump\n", __func__));
return EIO;
+ }
args->fspec = NULL;
*data_len = sizeof *args;
return 0;
@@ -368,18 +381,26 @@ ffs_mount(struct mount *mp, const char *
* Look up the name and verify that it's sane.
*/
error = namei_simple_user(args->fspec,
- NSM_FOLLOW_NOEMULROOT, &devvp);
- if (error != 0)
- return (error);
+ NSM_FOLLOW_NOEMULROOT, &devvp);
+ if (error != 0) {
+ DPRINTF(("%s: namei_simple_user %d\n", __func__,
+ error));
+ return error;
+ }
if (!update) {
/*
* Be sure this is a valid block device
*/
- if (devvp->v_type != VBLK)
+ if (devvp->v_type != VBLK) {
+ DPRINTF(("%s: non block device %d\n",
+ __func__, devvp->v_type));
error = ENOTBLK;
- else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+ } else if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+ DPRINTF(("%s: can't find block device 0x%jx\n",
+ __func__, devvp->v_rdev));
error = ENXIO;
+ }
} else {
/*
* Be sure we're still naming the same device
@@ -387,9 +408,13 @@ ffs_mount(struct mount *mp, const char *
*/
ump = VFSTOUFS(mp);
if (devvp != ump->um_devvp) {
- if (devvp->v_rdev != ump->um_devvp->v_rdev)
+ if (devvp->v_rdev != ump->um_devvp->v_rdev) {
+ DPRINTF(("%s: wrong device 0x%jx"
+ " != 0x%jx\n", __func__,
+ (uintmax_t)devvp->v_rdev,
+ (uintmax_t)ump->um_devvp->v_rdev));
error = EINVAL;
- else {
+ } else {
vrele(devvp);
devvp = ump->um_devvp;
vref(devvp);
@@ -399,7 +424,8 @@ ffs_mount(struct mount *mp, const char *
} else {
if (!update) {
/* New mounts must have a filename for the device */
- return (EINVAL);
+ DPRINTF(("%s: no filename for mount\n", __func__));
+ return EINVAL;
} else {
/* Use the extant mount */
ump = VFSTOUFS(mp);
@@ -426,6 +452,9 @@ ffs_mount(struct mount *mp, const char *
error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_MOUNT,
KAUTH_REQ_SYSTEM_MOUNT_DEVICE, mp, devvp,
KAUTH_ARG(accessmode));
+ if (error) {
+ DPRINTF(("%s: kauth %d\n", __func__, error));
+ }
VOP_UNLOCK(devvp);
}
@@ -453,10 +482,13 @@ ffs_mount(struct mount *mp, const char *
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
error = VOP_OPEN(devvp, xflags, FSCRED);
VOP_UNLOCK(devvp);
- if (error)
+ if (error) {
+ DPRINTF(("%s: VOP_OPEN %d\n", __func__, error));
goto fail;
+ }
error = ffs_mountfs(devvp, mp, l);
if (error) {
+ DPRINTF(("%s: ffs_mountfs %d\n", __func__, error));
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
(void)VOP_CLOSE(devvp, xflags, NOCRED);
VOP_UNLOCK(devvp);
@@ -497,17 +529,21 @@ ffs_mount(struct mount *mp, const char *
fs->fs_clean = FS_ISCLEAN;
(void) ffs_sbupdate(ump, MNT_WAIT);
}
- if (error == 0)
- UFS_WAPBL_END(mp);
- if (error)
- return (error);
+ if (error) {
+ DPRINTF(("%s: wapbl %d\n", __func__, error));
+ return error;
+ }
+ UFS_WAPBL_END(mp);
}
#ifdef WAPBL
if ((mp->mnt_flag & MNT_LOG) == 0) {
error = ffs_wapbl_stop(mp, mp->mnt_flag & MNT_FORCE);
- if (error)
+ if (error) {
+ DPRINTF(("%s: ffs_wapbl_stop %d\n",
+ __func__, error));
return error;
+ }
}
#endif /* WAPBL */
@@ -521,8 +557,11 @@ ffs_mount(struct mount *mp, const char *
if (mp->mnt_flag & MNT_RELOAD) {
error = ffs_reload(mp, l->l_cred, l);
- if (error)
- return (error);
+ if (error) {
+ DPRINTF(("%s: ffs_reload %d\n",
+ __func__, error));
+ return error;
+ }
}
if (fs->fs_ronly && (mp->mnt_iflag & IMNT_WANTRDWR)) {
@@ -536,6 +575,8 @@ ffs_mount(struct mount *mp, const char *
mp->mnt_stat.f_mntonname,
(mp->mnt_flag & MNT_FORCE) ? "" :
", not mounting");
+ DPRINTF(("%s: ffs_quota2 %d\n",
+ __func__, EINVAL));
return EINVAL;
}
#endif
@@ -550,6 +591,8 @@ ffs_mount(struct mount *mp, const char *
error = wapbl_replay_write(mp->mnt_wapbl_replay,
devvp);
if (error) {
+ DPRINTF(("%s: wapbl_replay_write %d\n",
+ __func__, error));
return error;
}
wapbl_replay_stop(mp->mnt_wapbl_replay);
@@ -562,14 +605,19 @@ ffs_mount(struct mount *mp, const char *
#ifdef WAPBL
error = ffs_wapbl_start(mp);
- if (error)
+ if (error) {
+ DPRINTF(("%s: ffs_wapbl_start %d\n",
+ __func__, error));
return error;
+ }
#endif /* WAPBL */
#ifdef QUOTA2
if (!fs->fs_ronly) {
error = ffs_quota2_mount(mp);
if (error) {
+ DPRINTF(("%s: ffs_quota2_mount %d\n",
+ __func__, error));
return error;
}
}
@@ -587,6 +635,9 @@ ffs_mount(struct mount *mp, const char *
if (error == 0)
(void)strncpy(fs->fs_fsmnt, mp->mnt_stat.f_mntonname,
sizeof(fs->fs_fsmnt));
+ else {
+ DPRINTF(("%s: set_statvfs_info %d\n", __func__, error));
+ }
fs->fs_flags &= ~FS_DOSOFTDEP;
if (fs->fs_fmod != 0) { /* XXX */
int err;
@@ -877,8 +928,10 @@ ffs_mountfs(struct vnode *devvp, struct
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
error = vinvalbuf(devvp, V_SAVE, cred, l, 0, 0);
VOP_UNLOCK(devvp);
- if (error)
- return (error);
+ if (error) {
+ DPRINTF(("%s: vinvalbuf %d\n", __func__, error));
+ return error;
+ }
ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
@@ -889,14 +942,18 @@ ffs_mountfs(struct vnode *devvp, struct
fstype = 0;
error = fstrans_mount(mp);
- if (error)
+ if (error) {
+ DPRINTF(("%s: fstrans_mount %d\n", __func__, error));
return error;
+ }
ump = kmem_zalloc(sizeof(*ump), KM_SLEEP);
mutex_init(&ump->um_lock, MUTEX_DEFAULT, IPL_NONE);
error = ffs_snapshot_init(ump);
- if (error)
+ if (error) {
+ DPRINTF(("%s: ffs_snapshot_init %d\n", __func__, error));
goto out;
+ }
ump->um_ops = &ffs_ufsops;
#ifdef WAPBL
@@ -911,18 +968,22 @@ ffs_mountfs(struct vnode *devvp, struct
bp = NULL;
}
if (sblock_try[i] == -1) {
+ DPRINTF(("%s: sblock_try\n", __func__));
error = EINVAL;
fs = NULL;
goto out;
}
- error = bread(devvp, sblock_try[i] / DEV_BSIZE, SBLOCKSIZE, cred,
- 0, &bp);
+ error = bread(devvp, sblock_try[i] / DEV_BSIZE, SBLOCKSIZE,
+ cred, 0, &bp);
if (error) {
+ DPRINTF(("%s: bread@0x%x %d\n", __func__,
+ sblock_try[i] / DEV_BSIZE, error));
fs = NULL;
goto out;
}
fs = (struct fs*)bp->b_data;
fsblockloc = sblockloc = sblock_try[i];
+ DPRINTF(("%s: fs_magic 0x%x\n", __func__, fs->fs_magic));
if (fs->fs_magic == FS_UFS1_MAGIC) {
sbsize = fs->fs_sbsize;
fstype = UFS1;
@@ -1003,8 +1064,11 @@ ffs_mountfs(struct vnode *devvp, struct
#ifdef WAPBL
if ((mp->mnt_wapbl_replay == 0) && (fs->fs_flags & FS_DOWAPBL)) {
error = ffs_wapbl_replay_start(mp, fs, devvp);
- if (error && (mp->mnt_flag & MNT_FORCE) == 0)
+ if (error && (mp->mnt_flag & MNT_FORCE) == 0) {
+ DPRINTF(("%s: ffs_wapbl_replay_start %d\n", __func__,
+ error));
goto out;
+ }
if (!error) {
if (!ronly) {
/* XXX fsmnt may be stale. */
@@ -1012,8 +1076,11 @@ ffs_mountfs(struct vnode *devvp, struct
fs->fs_fsmnt);
error = wapbl_replay_write(mp->mnt_wapbl_replay,
devvp);
- if (error)
+ if (error) {
+ DPRINTF(("%s: wapbl_replay_write %d\n",
+ __func__, error));
goto out;
+ }
wapbl_replay_stop(mp->mnt_wapbl_replay);
fs->fs_clean = FS_WASCLEAN;
} else {
@@ -1033,6 +1100,7 @@ ffs_mountfs(struct vnode *devvp, struct
#else /* !WAPBL */
if ((fs->fs_flags & FS_DOWAPBL) && (mp->mnt_flag & MNT_FORCE) == 0) {
error = EPERM;
+ DPRINTF(("%s: no force %d\n", __func__, error));
goto out;
}
#endif /* !WAPBL */
@@ -1046,6 +1114,7 @@ ffs_mountfs(struct vnode *devvp, struct
(mp->mnt_flag & MNT_FORCE) ? "" : ", not mounting");
if ((mp->mnt_flag & MNT_FORCE) == 0) {
error = EINVAL;
+ DPRINTF(("%s: no force %d\n", __func__, error));
goto out;
}
}
@@ -1073,20 +1142,30 @@ ffs_mountfs(struct vnode *devvp, struct
/* Manually look for an apple ufs label, and if a valid one
* is found, then treat it like an Apple UFS filesystem anyway
*/
- error = bread(devvp, (daddr_t)(APPLEUFS_LABEL_OFFSET / DEV_BSIZE),
- APPLEUFS_LABEL_SIZE, cred, 0, &bp);
- if (error)
+ error = bread(devvp,
+ (daddr_t)(APPLEUFS_LABEL_OFFSET / DEV_BSIZE),
+ APPLEUFS_LABEL_SIZE, cred, 0, &bp);
+ if (error) {
+ DPRINTF(("%s: apple bread@0x%jx %d\n", __func__,
+ (intmax_t)(APPLEUFS_LABEL_OFFSET / DEV_BSIZE),
+ error));
goto out;
+ }
error = ffs_appleufs_validate(fs->fs_fsmnt,
+ (struct appleufslabel *)bp->b_data, NULL);
(struct appleufslabel *)bp->b_data, NULL);
- if (error == 0) {
ump->um_flags |= UFS_ISAPPLEUFS;
- }
brelse(bp, 0);
bp = NULL;
+ if (error) {
+ DPRINTF(("%s: ffs_appleufs_validate %d\n", __func__,
+ error));
+ goto out;
+ }
}
#else
if (ump->um_flags & UFS_ISAPPLEUFS) {
+ DPRINTF(("%s: bad apple\n", __func__));
error = EINVAL;
goto out;
}
@@ -1131,11 +1210,17 @@ ffs_mountfs(struct vnode *devvp, struct
error = bread(devvp, FFS_FSBTODB(fs, fs->fs_size - 1),
fs->fs_fsize, cred, 0, &bp);
if (error) {
+ DPRINTF(("%s: bread@0x%jx %d\n", __func__,
+ (intmax_t)FFS_FSBTODB(fs, fs->fs_size - 1),
+ error));
bset = BC_INVAL;
goto out;
}
- if (bp->b_bcount != fs->fs_fsize)
+ if (bp->b_bcount != fs->fs_fsize) {
+ DPRINTF(("%s: bcount %x != fsize %x\n", __func__,
+ bp->b_bcount, fs->fs_fsize));
error = EINVAL;
+ }
brelse(bp, BC_INVAL);
bp = NULL;
}
@@ -1162,8 +1247,10 @@ ffs_mountfs(struct vnode *devvp, struct
error = bread(devvp, FFS_FSBTODB(fs, fs->fs_csaddr + i), bsize,
cred, 0, &bp);
if (error) {
- kmem_free(fs->fs_csp, allocsbsize);
- goto out;
+ DPRINTF(("%s: bread@0x%jx %d\n", __func__,
+ (intmax_t)FFS_FSBTODB(fs, fs->fs_csaddr + i),
+ error));
+ goto out1;
}
#ifdef FFS_EI
if (needswap)
@@ -1242,12 +1329,16 @@ ffs_mountfs(struct vnode *devvp, struct
* ffs_wapbl_start() needs mp->mnt_stat initialised if it
* needs to create a new log file in-filesystem.
*/
- ffs_statvfs(mp, &mp->mnt_stat);
+ error = ffs_statvfs(mp, &mp->mnt_stat);
+ if (error) {
+ DPRINTF(("%s: ffs_statvfs %d\n", __func__, error));
+ goto out1;
+ }
error = ffs_wapbl_start(mp);
if (error) {
- kmem_free(fs->fs_csp, allocsbsize);
- goto out;
+ DPRINTF(("%s: ffs_wapbl_start %d\n", __func__, error));
+ goto out1;
}
}
#endif /* WAPBL */
@@ -1255,8 +1346,8 @@ ffs_mountfs(struct vnode *devvp, struct
#ifdef QUOTA2
error = ffs_quota2_mount(mp);
if (error) {
- kmem_free(fs->fs_csp, allocsbsize);
- goto out;
+ DPRINTF(("%s: ffs_quota2_mount %d\n", __func__, error));
+ goto out1;
}
#else
if (fs->fs_flags & FS_DOQUOTA2) {
@@ -1266,8 +1357,9 @@ ffs_mountfs(struct vnode *devvp, struct
(mp->mnt_flag & MNT_FORCE) ? "" : ", not mounting");
if ((mp->mnt_flag & MNT_FORCE) == 0) {
error = EINVAL;
- kmem_free(fs->fs_csp, allocsbsize);
- goto out;
+ DPRINTF(("%s: quota disabled %d\n", __func__,
+ error));
+ goto out1;
}
}
#endif
@@ -1277,6 +1369,8 @@ ffs_mountfs(struct vnode *devvp, struct
ump->um_discarddata = ffs_discard_init(devvp, fs);
return (0);
+out1:
+ kmem_free(fs->fs_csp, allocsbsize);
out:
#ifdef WAPBL
if (mp->mnt_wapbl_replay) {