patch-2.1.89 linux/fs/buffer.c
Next file: linux/fs/coda/cache.c
Previous file: linux/fs/binfmt_elf.c
Back to the patch index
Back to the overall index
- Lines: 126
- Date:
Tue Mar 3 21:22:19 1998
- Orig file:
v2.1.88/linux/fs/buffer.c
- Orig date:
Mon Feb 23 18:12:10 1998
diff -u --recursive --new-file v2.1.88/linux/fs/buffer.c linux/fs/buffer.c
@@ -37,6 +37,7 @@
#include <linux/vmalloc.h>
#include <linux/blkdev.h>
#include <linux/sysrq.h>
+#include <linux/file.h>
#include <asm/system.h>
#include <asm/uaccess.h>
@@ -332,31 +333,29 @@
lock_kernel();
err = -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;
err = -EINVAL;
if (!file->f_op || !file->f_op->fsync)
- goto out;
+ goto out_putf;
/* We need to protect against concurrent writers.. */
down(&inode->i_sem);
- err = file->f_op->fsync(file, file->f_dentry);
+ err = file->f_op->fsync(file, dentry);
up(&inode->i_sem);
+out_putf:
+ fput(file);
out:
unlock_kernel();
return err;
@@ -371,29 +370,27 @@
lock_kernel();
err = -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;
err = -EINVAL;
if (!file->f_op || !file->f_op->fsync)
- goto out;
+ goto out_putf;
/* this needs further work, at the moment it is identical to fsync() */
- err = file->f_op->fsync(file, file->f_dentry);
+ err = file->f_op->fsync(file, dentry);
+out_putf:
+ fput(file);
out:
unlock_kernel();
return err;
@@ -870,8 +867,7 @@
/*
* Convert a reserved page into buffers ... should happen only rarely.
*/
- if (nr_free_pages > (min_free_pages >> 1) &&
- grow_buffers(GFP_ATOMIC, size)) {
+ if (grow_buffers(GFP_ATOMIC, size)) {
#ifdef BUFFER_DEBUG
printk("refill_freelist: used reserve page\n");
#endif
@@ -1321,14 +1317,13 @@
/* Run the hooks that have to be done when a page I/O has completed. */
static inline void after_unlock_page (struct page * page)
{
- if (test_and_clear_bit(PG_decr_after, &page->flags))
+ if (test_and_clear_bit(PG_decr_after, &page->flags)) {
atomic_dec(&nr_async_pages);
- if (test_and_clear_bit(PG_swap_unlock_after, &page->flags)) {
- /*
- * We're doing a swap, so check that this page is
- * swap-cached and do the necessary cleanup.
- */
- swap_after_unlock_page(page->offset);
+#ifdef DEBUG_SWAP
+ printk ("DebugVM: Finished IO on page %p, nr_async_pages %d\n",
+ (char *) page_address(page),
+ atomic_read(&nr_async_pages));
+#endif
}
if (test_and_clear_bit(PG_free_after, &page->flags))
__free_page(page);
@@ -1531,8 +1526,9 @@
* mark_buffer_uptodate() functions propagate buffer state into the
* page struct once IO has completed.
*/
-int generic_readpage(struct dentry * dentry, struct page * page)
+int generic_readpage(struct file * file, struct page * page)
{
+ struct dentry *dentry = file->f_dentry;
struct inode *inode = dentry->d_inode;
unsigned long block;
int *p, nr[PAGE_SIZE/512];
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov