diff options
author | gleb <gleb@FreeBSD.org> | 2012-04-07 15:27:34 +0000 |
---|---|---|
committer | gleb <gleb@FreeBSD.org> | 2012-04-07 15:27:34 +0000 |
commit | fb452e77b0bf349c6f07fac7be964a846910018d (patch) | |
tree | 00874eada13f023f0406076342f1eec9abf826b1 /sys/kern/vfs_mount.c | |
parent | c4ba84f86e0e1f38a9b7138ac26876c1b293d20f (diff) | |
download | FreeBSD-src-fb452e77b0bf349c6f07fac7be964a846910018d.zip FreeBSD-src-fb452e77b0bf349c6f07fac7be964a846910018d.tar.gz |
Add vfs_getopt_size. Support human readable file system options in tmpfs.
Increase maximum tmpfs file system size to 4GB*PAGE_SIZE on 32 bit archs.
Discussed with: delphij
MFC after: 2 weeks
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r-- | sys/kern/vfs_mount.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 93387ca..657fa92 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -1520,6 +1520,48 @@ vfs_getopt_pos(struct vfsoptlist *opts, const char *name) return (-1); } +int +vfs_getopt_size(struct vfsoptlist *opts, const char *name, off_t *value) +{ + char *opt_value, *vtp; + quad_t iv; + int error, opt_len; + + error = vfs_getopt(opts, name, (void **)&opt_value, &opt_len); + if (error != 0) + return (error); + if (opt_len == 0 || opt_value == NULL) + return (EINVAL); + if (opt_value[0] == '\0' || opt_value[opt_len - 1] != '\0') + return (EINVAL); + iv = strtoq(opt_value, &vtp, 0); + if (vtp == opt_value || (vtp[0] != '\0' && vtp[1] != '\0')) + return (EINVAL); + if (iv < 0) + return (EINVAL); + switch (vtp[0]) { + case 't': + case 'T': + iv *= 1024; + case 'g': + case 'G': + iv *= 1024; + case 'm': + case 'M': + iv *= 1024; + case 'k': + case 'K': + iv *= 1024; + case '\0': + break; + default: + return (EINVAL); + } + *value = iv; + + return (0); +} + char * vfs_getopts(struct vfsoptlist *opts, const char *name, int *error) { |