summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_mount.c
diff options
context:
space:
mode:
authorgleb <gleb@FreeBSD.org>2012-04-07 15:27:34 +0000
committergleb <gleb@FreeBSD.org>2012-04-07 15:27:34 +0000
commitfb452e77b0bf349c6f07fac7be964a846910018d (patch)
tree00874eada13f023f0406076342f1eec9abf826b1 /sys/kern/vfs_mount.c
parentc4ba84f86e0e1f38a9b7138ac26876c1b293d20f (diff)
downloadFreeBSD-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.c42
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)
{
OpenPOWER on IntegriCloud