patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / fs / autofs4 / autofs_i.h
index 0a4b954..94a12ae 100644 (file)
 #include <linux/string.h>
 #include <linux/wait.h>
 #include <linux/sched.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
 #include <asm/current.h>
 #include <asm/uaccess.h>
 
 /* #define DEBUG */
 
 #ifdef DEBUG
-#define DPRINTK(D) do{ printk("pid %d: ", current->pid); printk D; } while(0)
+#define DPRINTK(fmt,args...) do { printk(KERN_DEBUG "pid %d: %s: " fmt "\n" , current->pid , __FUNCTION__ , ##args); } while(0)
 #else
-#define DPRINTK(D) do {} while(0)
+#define DPRINTK(fmt,args...) do {} while(0)
 #endif
 
 #define AUTOFS_SUPER_MAGIC 0x0187
@@ -82,7 +84,7 @@ struct autofs_wait_queue {
        char *name;
        /* This is for status reporting upon return */
        int status;
-       int wait_ctr;
+       atomic_t wait_ctr;
 };
 
 #define AUTOFS_SBI_MAGIC 0x6d4a556d
@@ -93,8 +95,12 @@ struct autofs_sb_info {
        pid_t oz_pgrp;
        int catatonic;
        int version;
+       int sub_version;
        unsigned long exp_timeout;
+       int reghost_enabled;
+       int needs_reghost;
        struct super_block *sb;
+       struct semaphore wq_sem;
        struct autofs_wait_queue *queues; /* Wait queue pointer */
 };
 
@@ -125,6 +131,12 @@ static inline int autofs4_ispending(struct dentry *dentry)
                (inf != NULL && inf->flags & AUTOFS_INF_EXPIRING);
 }
 
+static inline void autofs4_copy_atime(struct file *src, struct file *dst)
+{
+       dst->f_dentry->d_inode->i_atime = src->f_dentry->d_inode->i_atime;
+       return;
+}
+
 struct inode *autofs4_get_inode(struct super_block *, struct autofs_info *);
 struct autofs_info *autofs4_init_inf(struct autofs_sb_info *, mode_t mode);
 void autofs4_free_ino(struct autofs_info *);
@@ -132,15 +144,17 @@ void autofs4_free_ino(struct autofs_info *);
 /* Expiration */
 int is_autofs4_dentry(struct dentry *);
 int autofs4_expire_run(struct super_block *, struct vfsmount *,
-                       struct autofs_sb_info *, struct autofs_packet_expire *);
+                       struct autofs_sb_info *,
+                       struct autofs_packet_expire __user *);
 int autofs4_expire_multi(struct super_block *, struct vfsmount *,
-                       struct autofs_sb_info *, int *);
+                       struct autofs_sb_info *, int __user *);
 
 /* Operations structures */
 
 extern struct inode_operations autofs4_symlink_inode_operations;
 extern struct inode_operations autofs4_dir_inode_operations;
 extern struct inode_operations autofs4_root_inode_operations;
+extern struct file_operations autofs4_dir_operations;
 extern struct file_operations autofs4_root_operations;
 
 /* Initializing function */
@@ -157,6 +171,24 @@ enum autofs_notify
        NFY_EXPIRE
 };
 
-int autofs4_wait(struct autofs_sb_info *,struct qstr *, enum autofs_notify);
+int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
 int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
 void autofs4_catatonic_mode(struct autofs_sb_info *);
+
+static inline int simple_positive(struct dentry *dentry)
+{
+       return dentry->d_inode && !d_unhashed(dentry);
+}
+
+static inline int simple_empty_nolock(struct dentry *dentry)
+{
+       struct dentry *child;
+       int ret = 0;
+
+       list_for_each_entry(child, &dentry->d_subdirs, d_child)
+               if (simple_positive(child))
+                       goto out;
+       ret = 1;
+out:
+       return ret;
+}