summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorrodrigc <rodrigc@FreeBSD.org>2005-11-16 02:26:25 +0000
committerrodrigc <rodrigc@FreeBSD.org>2005-11-16 02:26:25 +0000
commitbda951e1164669108d22ffa80eec70c9ff1cfcf1 (patch)
treea3b3ad6d84f46d46aeea3470f9ec657ea66b4681 /sys/fs
parentb6bd744326afe4135b44dfa824e7c26219583b8c (diff)
downloadFreeBSD-src-bda951e1164669108d22ffa80eec70c9ff1cfcf1.zip
FreeBSD-src-bda951e1164669108d22ffa80eec70c9ff1cfcf1.tar.gz
- Add errmsg to the list of smbfs mount options.
- Use vfs_mount_error() to propagate smbfs mount errors back to userspace. Reviewed by: bp (smbfs maintainer)
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/smbfs/smbfs_vfsops.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/sys/fs/smbfs/smbfs_vfsops.c b/sys/fs/smbfs/smbfs_vfsops.c
index aed0c72..f8ddd42 100644
--- a/sys/fs/smbfs/smbfs_vfsops.c
+++ b/sys/fs/smbfs/smbfs_vfsops.c
@@ -138,7 +138,7 @@ smbfs_cmount(struct mntarg *ma, void * data, int flags, struct thread *td)
static const char *smbfs_opts[] = {
"dev", "soft", "intr", "strong", "have_nls", "long",
"mountpoint", "rootpath", "uid", "gid", "file_mode", "dir_mode",
- "caseopt", NULL
+ "caseopt", "errmsg", NULL
};
static int
@@ -155,15 +155,20 @@ smbfs_mount(struct mount *mp, struct thread *td)
if (mp->mnt_flag & (MNT_UPDATE | MNT_ROOTFS))
return EOPNOTSUPP;
- if (vfs_filteropt(mp->mnt_optnew, smbfs_opts))
+ if (vfs_filteropt(mp->mnt_optnew, smbfs_opts)) {
+ vfs_mount_error(mp, "%s", "Invalid option");
return (EINVAL);
+ }
smb_makescred(&scred, td, td->td_ucred);
- if (1 != vfs_scanopt(mp->mnt_optnew, "dev", "%d", &v))
+ if (1 != vfs_scanopt(mp->mnt_optnew, "dev", "%d", &v)) {
+ vfs_mount_error(mp, "No dev option");
return (EINVAL);
+ }
error = smb_dev2share(v, SMBM_EXEC, &scred, &ssp);
if (error) {
printf("invalid device handle %d (%d)\n", v, error);
+ vfs_mount_error(mp, "invalid device handle %d (%d)\n", v, error);
return error;
}
vcp = SSTOVC(ssp);
@@ -177,8 +182,9 @@ smbfs_mount(struct mount *mp, struct thread *td)
M_WAITOK|M_USE_RESERVE);
#endif
if (smp == NULL) {
- printf("could not alloc smbmount\n");
- error = ENOMEM;
+ printf("could not alloc smbmount\n");
+ vfs_mount_error(mp, "could not alloc smbmount", v, error);
+ error = ENOMEM;
goto bad;
}
bzero(smp, sizeof(*smp));
@@ -191,28 +197,33 @@ smbfs_mount(struct mount *mp, struct thread *td)
smp->sm_root = NULL;
if (1 != vfs_scanopt(mp->mnt_optnew,
"caseopt", "%d", &smp->sm_caseopt)) {
+ vfs_mount_error(mp, "Invalid caseopt");
error = EINVAL;
goto bad;
}
if (1 != vfs_scanopt(mp->mnt_optnew, "uid", "%d", &v)) {
+ vfs_mount_error(mp, "Invalid uid");
error = EINVAL;
goto bad;
}
smp->sm_uid = v;
if (1 != vfs_scanopt(mp->mnt_optnew, "gid", "%d", &v)) {
+ vfs_mount_error(mp, "Invalid gid");
error = EINVAL;
goto bad;
}
smp->sm_gid = v;
if (1 != vfs_scanopt(mp->mnt_optnew, "file_mode", "%d", &v)) {
+ vfs_mount_error(mp, "Invalid file_mode");
error = EINVAL;
goto bad;
}
smp->sm_file_mode = (v & (S_IRWXU|S_IRWXG|S_IRWXO)) | S_IFREG;
if (1 != vfs_scanopt(mp->mnt_optnew, "dir_mode", "%d", &v)) {
+ vfs_mount_error(mp, "Invalid dir_mode");
error = EINVAL;
goto bad;
}
@@ -240,8 +251,10 @@ smbfs_mount(struct mount *mp, struct thread *td)
}
vfs_getnewfsid(mp);
error = smbfs_root(mp, LK_EXCLUSIVE, &vp, td);
- if (error)
+ if (error) {
+ vfs_mount_error(mp, "smbfs_root error: %d", error);
goto bad;
+ }
VOP_UNLOCK(vp, 0, td);
SMBVDEBUG("root.v_usecount = %d\n", vrefcnt(vp));
@@ -324,6 +337,7 @@ smbfs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
if (smp == NULL) {
SMBERROR("smp == NULL (bug in umount)\n");
+ vfs_mount_error(mp, "smp == NULL (bug in umount)");
return EINVAL;
}
if (smp->sm_root) {
@@ -394,8 +408,10 @@ smbfs_statfs(struct mount *mp, struct statfs *sbp, struct thread *td)
struct smb_cred scred;
int error = 0;
- if (np == NULL)
+ if (np == NULL) {
+ vfs_mount_error(mp, "np == NULL");
return EINVAL;
+ }
sbp->f_iosize = SSTOVC(ssp)->vc_txmax; /* optimal transfer block size */
smb_makescred(&scred, td, td->td_ucred);
OpenPOWER on IntegriCloud