From: Pekka Enberg <[EMAIL PROTECTED]>

This adds a f_light flag to struct file to indicate that the file was
looked up with fget_light().  Needed by revoke to ensure we don't
close a file pointer while someone is using it without actually
holding a reference.

These bits were taken from the forced unmount patches by Tigran
Aivazian.

Signed-off-by: Pekka Enberg <[EMAIL PROTECTED]>
---
 fs/file_table.c      |    1 +
 include/linux/file.h |   14 ++++++++++++++
 include/linux/fs.h   |    2 ++
 3 files changed, 17 insertions(+)

Index: uml-2.6/fs/file_table.c
===================================================================
--- uml-2.6.orig/fs/file_table.c        2007-03-08 10:24:24.000000000 +0200
+++ uml-2.6/fs/file_table.c     2007-03-08 10:24:31.000000000 +0200
@@ -219,6 +219,7 @@
        *fput_needed = 0;
        if (likely((atomic_read(&files->count) == 1))) {
                file = fcheck_files(files, fd);
+               set_f_light(file);
        } else {
                rcu_read_lock();
                file = fcheck_files(files, fd);
Index: uml-2.6/include/linux/file.h
===================================================================
--- uml-2.6.orig/include/linux/file.h   2007-03-08 10:24:24.000000000 +0200
+++ uml-2.6/include/linux/file.h        2007-03-08 10:24:31.000000000 +0200
@@ -6,6 +6,7 @@
 #define __LINUX_FILE_H
 
 #include <asm/atomic.h>
+#include <linux/fs.h>
 #include <linux/posix_types.h>
 #include <linux/compiler.h>
 #include <linux/spinlock.h>
@@ -62,10 +63,23 @@
 extern void FASTCALL(__fput(struct file *));
 extern void FASTCALL(fput(struct file *));
 
+static inline void clear_f_light(struct file *file)
+{
+       file->f_light = 0;
+}
+
+static inline void set_f_light(struct file *file)
+{
+       if (file)
+               file->f_light = 1;
+}
+
 static inline void fput_light(struct file *file, int fput_needed)
 {
        if (unlikely(fput_needed))
                fput(file);
+       else
+               clear_f_light(file);
 }
 
 extern struct file * FASTCALL(fget(unsigned int fd));
Index: uml-2.6/include/linux/fs.h
===================================================================
--- uml-2.6.orig/include/linux/fs.h     2007-03-08 10:24:24.000000000 +0200
+++ uml-2.6/include/linux/fs.h  2007-03-08 10:24:31.000000000 +0200
@@ -739,6 +739,8 @@
        struct list_head        f_ep_links;
        spinlock_t              f_ep_lock;
 #endif /* #ifdef CONFIG_EPOLL */
+       /* This instance is being used without holding a reference. */
+       int                     f_light;
        struct address_space    *f_mapping;
 };
 extern spinlock_t files_lock;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to