summaryrefslogtreecommitdiffstats
path: root/sys/compat/linux
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2002-01-14 00:13:45 +0000
committeralfred <alfred@FreeBSD.org>2002-01-14 00:13:45 +0000
commit1f82bc18d1d1e906cd9ed68039acb051fa6e11cf (patch)
treefe7842143c9585ef2ebb793d812ec71cc4488a51 /sys/compat/linux
parentc4988e25d265bba2c63409a8c8b8708c13d8525e (diff)
downloadFreeBSD-src-1f82bc18d1d1e906cd9ed68039acb051fa6e11cf.zip
FreeBSD-src-1f82bc18d1d1e906cd9ed68039acb051fa6e11cf.tar.gz
Replace ffind_* with fget calls.
Make fget MPsafe. Make fgetvp and fgetsock use the fget subsystem to reduce code bloat. Push giant down in fpathconf().
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/linux_file.c16
-rw-r--r--sys/compat/linux/linux_ioctl.c26
-rw-r--r--sys/compat/linux/linux_stats.c5
3 files changed, 22 insertions, 25 deletions
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index 54f4584..1dfa4a1 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -137,11 +137,13 @@ linux_open(struct thread *td, struct linux_open_args *args)
SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
struct file *fp;
- fp = ffind_hold(td, td->td_retval[0]);
+ error = fget(td, td->td_retval[0], &fp);
PROC_UNLOCK(p);
- if (fp->f_type == DTYPE_VNODE)
- fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0, td);
- fdrop(fp, td);
+ if (!error) {
+ if (fp->f_type == DTYPE_VNODE)
+ fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0, td);
+ fdrop(fp, td);
+ }
} else
PROC_UNLOCK(p);
#ifdef DEBUG
@@ -996,9 +998,9 @@ fcntl_common(struct thread *td, struct linux_fcntl64_args *args)
* significant effect for pipes (SIGIO is not delivered for
* pipes under Linux-2.2.35 at least).
*/
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return EBADF;
+ error = fget(td, args->fd, &fp);
+ if (error)
+ return (error);
if (fp->f_type == DTYPE_PIPE) {
fdrop(fp, td);
return (EINVAL);
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index baafb5b..acf71d9 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -109,9 +109,8 @@ linux_ioctl_disk(struct thread *td, struct linux_ioctl_args *args)
int error;
struct disklabel dl;
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
switch (args->cmd & 0xffff) {
case LINUX_BLKGETSIZE:
error = fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, td);
@@ -555,9 +554,9 @@ linux_ioctl_termio(struct thread *td, struct linux_ioctl_args *args)
struct file *fp;
int error;
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
+
switch (args->cmd & 0xffff) {
case LINUX_TCGETS:
@@ -1249,9 +1248,8 @@ linux_ioctl_cdrom(struct thread *td, struct linux_ioctl_args *args)
struct file *fp;
int error;
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
switch (args->cmd & 0xffff) {
case LINUX_CDROMPAUSE:
@@ -1706,9 +1704,8 @@ linux_ioctl_console(struct thread *td, struct linux_ioctl_args *args)
struct file *fp;
int error;
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
switch (args->cmd & 0xffff) {
case LINUX_KIOCSOUND:
@@ -2259,9 +2256,8 @@ linux_ioctl(struct thread *td, struct linux_ioctl_args *args)
(unsigned long)args->cmd);
#endif
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
fdrop(fp, td);
return (EBADF);
diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c
index 8f1799c..80b1c02 100644
--- a/sys/compat/linux/linux_stats.c
+++ b/sys/compat/linux/linux_stats.c
@@ -160,9 +160,8 @@ linux_newfstat(struct thread *td, struct linux_newfstat_args *args)
printf(ARGS(newfstat, "%d, *"), args->fd);
#endif
- fp = ffind_hold(td, args->fd);
- if (fp == NULL)
- return (EBADF);
+ if ((error = fget(td, args->fd, &fp)) != 0)
+ return (error);
error = fo_stat(fp, &buf, td);
fdrop(fp, td);
OpenPOWER on IntegriCloud