Date: Sat, 27 Nov 1999 13:35:31 +0100 From: Marcel Moolenaar <marcel@scc.nl> To: emulation@FreeBSD.org Subject: PLEASE REVIEW: implementation of linux_ustat syscall Message-ID: <383FD013.703DD84D@scc.nl>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------29A391E6669B317013714B37 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, Please review the following implementation of the linux_ustat syscall. It will be committed shortly when noone objects. thanks, -- Marcel Moolenaar mailto:marcel@scc.nl SCC Internetworking & Databases http://www.scc.nl/ The FreeBSD project mailto:marcel@FreeBSD.org --------------29A391E6669B317013714B37 Content-Type: text/plain; charset=us-ascii; name="diff.out" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diff.out" Index: linux_stats.c =================================================================== RCS file: /home/ncvs/src/sys/i386/linux/linux_stats.c,v retrieving revision 1.16 diff -u -r1.16 linux_stats.c --- linux_stats.c 1999/11/08 03:33:21 1.16 +++ linux_stats.c 1999/11/27 12:25:59 @@ -40,6 +40,7 @@ #include <sys/stat.h> #include <sys/vnode.h> #include <sys/pipe.h> +#include <sys/conf.h> #include <i386/linux/linux.h> #include <i386/linux/linux_proto.h> @@ -68,6 +69,14 @@ u_long __unused5; }; +struct linux_ustat +{ + int f_tfree; + u_long f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + static int newstat_copyout(struct stat *buf, void *ubuf) { @@ -271,4 +280,57 @@ linux_statfs_buf.fnamelen = MAXNAMLEN; return copyout((caddr_t)&linux_statfs_buf, (caddr_t)args->buf, sizeof(struct linux_statfs_buf)); +} + +int +linux_ustat(p, uap) + struct proc *p; + struct linux_ustat_args *uap; +{ + struct linux_ustat lu; + dev_t dev; + struct vnode *vp; + struct statfs *stat; + int error; + +#ifdef DEBUG + printf("Linux-emul(%ld): ustat(%d, *)\n", (long)p->p_pid, uap->dev); +#endif + + /* Allow only root */ + error = suser(p); + if (error) + return (error); + + /* + * lu.f_fname and lu.f_fpack are not used. They are always zeroed. + * lu.f_tinode and lu.f_tfree are set from the device's super block. + */ + bzero(&lu, sizeof(lu)); + + /* + * XXX - Don't return an error if we can't find a vnode for the + * device. Our dev_t is 32-bits whereas Linux only has a 16-bits + * dev_t. The dev_t that is used now may as well be a truncated + * dev_t returned from previous syscalls. Just return a bzeroed + * ustat in that case. + */ + dev = makebdev(uap->dev >> 8, uap->dev & 0xFF); + if (vfinddev(dev, VBLK, &vp)) { + simple_lock(&mountlist_slock); + error = (vp->v_mount == NULL) ? EINVAL : 0; + if (!error) { + stat = &(vp->v_mount->mnt_stat); + error = VFS_STATFS(vp->v_mount, stat, p); + if (!error) { + lu.f_tfree = stat->f_bfree; + lu.f_tinode = stat->f_ffree; + } + } + simple_unlock(&mountlist_slock); + if (error) + return (error); + } + + return (copyout(&lu, uap->ubuf, sizeof(lu))); } --------------29A391E6669B317013714B37-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-emulation" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?383FD013.703DD84D>