On Sat, Feb 27, 2016 at 05:44:49PM -0500, Michael McConville wrote:
> * There wasn't yet a list of possible errors for tmpfs in mount(2).
> That said, I question the value of maintaining these lists. It's
> almost impossible for them to be comprehensive - for example, some
> *_mount() functions return the error value of library functions like
> copyin(9) and copyout(9) if they fail. Errors like ENOMEM are
> probably sufficiently self-explanatory to be excluded. These lists
> likely make sense for explaining anomalous errors, though.
I think maintaining the error list is a worthy effort. It's not only
about explaining what the error codes mean, but also giving the
application developer a chance to know which error codes _can_ be
returned by a function in order to be able to handle them correctly. I
don't see why mount(2) should be an exception.
> * The KASSERT() on sys/tmpfs/tmpfs_vfsops.c:160 checks root against
> NULL after calling tmpfs_alloc_node(). However, tmpfs_alloc_node()
> only sets root on success, and in that case the value will always be
> non-null. We should therefore initialize root to NULL. We should
> maybe consider just returning tmpfs_alloc_node()'s error code instead
> of KASSERTing.
Initializing root to NULL is fine with me.
I don't think the KASSERT() should be converted to a return, because it
checks a condition that is not supposed to happen, except in the
presence of programming error in the kernel. Let's have a look at the
possible return values of tmpfs_alloc_node():
[ENOSPC] tmpfs_node_get() returned NULL, which can only
happen when a pool_get with PR_WAITOK does the
same, which must not happen.
[ENOSPC] inode number overflow; must not happen on a
fresh filesystem
IMHO, calling panic() there is the right thing to do.
natano
> Index: lib/libc/sys/mount.2
> ===================================================================
> RCS file: /cvs/src/lib/libc/sys/mount.2,v
> retrieving revision 1.45
> diff -u -p -r1.45 mount.2
> --- lib/libc/sys/mount.2 23 Nov 2015 10:01:45 -0000 1.45
> +++ lib/libc/sys/mount.2 27 Feb 2016 22:21:51 -0000
> @@ -384,6 +384,18 @@ An I/O error occurred while writing cach
> .Fa dir
> points outside the process's allocated address space.
> .El
> +.Pp
> +The following errors can occur for a
> +.Em tmpfs
> +filesystem mount:
> +.Bl -tag -width [ENOMEM]
> +.It Bq Er ENOMEM
> +There is not enough memory available to allocate the mount structures.
> +.It Bq Er ENOTSUPP
> +The
> +.Dv MNT_UPDATE
> +flag, which is not yet supported, was set.
> +.El
> .Sh SEE ALSO
> .Xr statfs 2 ,
> .Xr mount 8 ,
> Index: sys/tmpfs/tmpfs_vfsops.c
> ===================================================================
> RCS file: /cvs/src/sys/tmpfs/tmpfs_vfsops.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 tmpfs_vfsops.c
> --- sys/tmpfs/tmpfs_vfsops.c 13 Jan 2016 13:01:40 -0000 1.8
> +++ sys/tmpfs/tmpfs_vfsops.c 27 Feb 2016 22:21:55 -0000
> @@ -87,7 +87,7 @@ tmpfs_mount(struct mount *mp, const char
> {
> struct tmpfs_args args;
> tmpfs_mount_t *tmp;
> - tmpfs_node_t *root;
> + tmpfs_node_t *root = NULL;
> uint64_t memlimit;
> uint64_t nodes;
> int error;
> @@ -120,7 +120,7 @@ tmpfs_mount(struct mount *mp, const char
>
> /* Prohibit mounts if there is not enough memory. */
> if (tmpfs_mem_info(1) < TMPFS_PAGES_RESERVED)
> - return EINVAL;
> + return ENOMEM;
>
> error = copyin(data, &args, sizeof(struct tmpfs_args));
> if (error)
> @@ -180,9 +180,12 @@ tmpfs_mount(struct mount *mp, const char
>
> mp->mnt_stat.mount_info.tmpfs_args = args;
>
> - bzero(&mp->mnt_stat.f_mntonname, sizeof(mp->mnt_stat.f_mntonname));
> - bzero(&mp->mnt_stat.f_mntfromname, sizeof(mp->mnt_stat.f_mntfromname));
> - bzero(&mp->mnt_stat.f_mntfromspec, sizeof(mp->mnt_stat.f_mntfromspec));
> + memset(&mp->mnt_stat.f_mntonname, 0,
> + sizeof(mp->mnt_stat.f_mntonname));
> + memset(&mp->mnt_stat.f_mntfromname, 0,
> + sizeof(mp->mnt_stat.f_mntfromname));
> + memset(&mp->mnt_stat.f_mntfromspec, 0,
> + sizeof(mp->mnt_stat.f_mntfromspec));
>
> strlcpy(mp->mnt_stat.f_mntonname, path,
> sizeof(mp->mnt_stat.f_mntonname) - 1);
>