patch-2.1.89 linux/fs/readdir.c
Next file: linux/fs/romfs/inode.c
Previous file: linux/fs/read_write.c
Back to the patch index
Back to the overall index
- Lines: 113
- Date:
Mon Feb 23 12:55:58 1998
- Orig file:
v2.1.88/linux/fs/readdir.c
- Orig date:
Sat Sep 20 12:21:34 1997
diff -u --recursive --new-file v2.1.88/linux/fs/readdir.c linux/fs/readdir.c
@@ -4,12 +4,13 @@
* Copyright (C) 1995 Linus Torvalds
*/
+#include <linux/sched.h>
+#include <linux/mm.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/stat.h>
+#include <linux/file.h>
#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
@@ -65,27 +66,24 @@
lock_kernel();
error = -EBADF;
- if (fd >= NR_OPEN)
- goto out;
-
- file = current->files->fd[fd];
+ file = fget(fd);
if (!file)
goto out;
dentry = file->f_dentry;
if (!dentry)
- goto out;
+ goto out_putf;
inode = dentry->d_inode;
if (!inode)
- goto out;
+ goto out_putf;
buf.count = 0;
buf.dirent = dirent;
error = -ENOTDIR;
if (!file->f_op || !file->f_op->readdir)
- goto out;
+ goto out_putf;
/*
* Get the inode's semaphore to prevent changes
@@ -95,8 +93,11 @@
error = file->f_op->readdir(file, &buf, fillonedir);
up(&inode->i_sem);
if (error < 0)
- goto out;
+ goto out_putf;
error = buf.count;
+
+out_putf:
+ fput(file);
out:
unlock_kernel();
return error;
@@ -155,20 +156,17 @@
lock_kernel();
error = -EBADF;
- if (fd >= NR_OPEN)
- goto out;
-
- file = current->files->fd[fd];
+ file = fget(fd);
if (!file)
goto out;
dentry = file->f_dentry;
if (!dentry)
- goto out;
+ goto out_putf;
inode = dentry->d_inode;
if (!inode)
- goto out;
+ goto out_putf;
buf.current_dir = (struct linux_dirent *) dirent;
buf.previous = NULL;
@@ -177,7 +175,7 @@
error = -ENOTDIR;
if (!file->f_op || !file->f_op->readdir)
- goto out;
+ goto out_putf;
/*
* Get the inode's semaphore to prevent changes
@@ -187,13 +185,16 @@
error = file->f_op->readdir(file, &buf, filldir);
up(&inode->i_sem);
if (error < 0)
- goto out;
- lastdirent = buf.previous;
+ goto out_putf;
error = buf.error;
+ lastdirent = buf.previous;
if (lastdirent) {
put_user(file->f_pos, &lastdirent->d_off);
error = count - buf.count;
}
+
+out_putf:
+ fput(file);
out:
unlock_kernel();
return error;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov