Merge with /shiny/git/linux-2.6/.git
David Woodhouse [Wed, 13 Jul 2005 14:25:59 +0000 (15:25 +0100)]
1  2 
MAINTAINERS
fs/namei.c
include/linux/audit.h

diff --combined MAINTAINERS
@@@ -363,13 -363,6 +363,13 @@@ L:       linux-atm-general@lists.sourceforge.
  W:    http://linux-atm.sourceforge.net
  S:    Maintained
  
 +AUDIT SUBSYSTEM
 +P:    David Woodhouse
 +M:    dwmw2@infradead.org
 +L:    linux-audit@redhat.com
 +W:    http://people.redhat.com/sgrubb/audit/
 +S:    Maintained
 +
  ATMEL WIRELESS DRIVER
  P:    Simon Kelley
  M:    simon@thekelleys.org.uk
@@@ -377,6 -370,10 +377,10 @@@ W:       http://www.thekelleys.org.uk/atme
  W:    http://atmelwlandriver.sourceforge.net/
  S:    Maintained
  
+ AUDIT SUBSYSTEM
+ L:    linux-audit@redhat.com (subscribers-only)
+ S:    Maintained
  AX.25 NETWORK LAYER
  P:    Ralf Baechle
  M:    ralf@linux-mips.org
@@@ -1243,7 -1240,7 +1247,7 @@@ S:      Maintaine
  
  IRDA SUBSYSTEM
  P:    Jean Tourrilhes
- L:    irda-users@lists.sourceforge.net
+ L:    irda-users@lists.sourceforge.net (subscribers-only)
  W:    http://irda.sourceforge.net/
  S:    Maintained
  
@@@ -1810,8 -1807,9 +1814,9 @@@ M:      greg@kroah.co
  S:    Maintained
  
  PCMCIA SUBSYSTEM
+ P:    Linux PCMCIA Team
  L:    http://lists.infradead.org/mailman/listinfo/linux-pcmcia
- S:    Unmaintained
+ S:    Maintained
  
  PCNET32 NETWORK DRIVER
  P:    Thomas Bogendörfer
@@@ -2168,7 -2166,7 +2173,7 @@@ UltraSPARC (sparc64)
  P:    David S. Miller
  M:    davem@davemloft.net
  P:    Eddie C. Dost
- M:    ecd@skynet.be
+ M:    ecd@brainaid.de
  P:    Jakub Jelinek
  M:    jj@sunsite.ms.mff.cuni.cz
  P:    Anton Blanchard
diff --combined fs/namei.c
@@@ -21,7 -21,7 +21,7 @@@
  #include <linux/namei.h>
  #include <linux/quotaops.h>
  #include <linux/pagemap.h>
- #include <linux/dnotify.h>
+ #include <linux/fsnotify.h>
  #include <linux/smp_lock.h>
  #include <linux/personality.h>
  #include <linux/security.h>
@@@ -314,7 -314,7 +314,7 @@@ void path_release(struct nameidata *nd
  void path_release_on_umount(struct nameidata *nd)
  {
        dput(nd->dentry);
-       _mntput(nd->mnt);
+       mntput_no_expire(nd->mnt);
  }
  
  /*
@@@ -1043,7 -1043,7 +1043,7 @@@ int fastcall path_lookup(const char *na
  out:
        if (unlikely(current->audit_context
                     && nd && nd->dentry && nd->dentry->d_inode))
 -              audit_inode(name, nd->dentry->d_inode);
 +              audit_inode(name, nd->dentry->d_inode, flags);
        return retval;
  }
  
@@@ -1312,7 -1312,7 +1312,7 @@@ int vfs_create(struct inode *dir, struc
        DQUOT_INIT(dir);
        error = dir->i_op->create(dir, dentry, mode, nd);
        if (!error) {
-               inode_dir_notify(dir, DN_CREATE);
+               fsnotify_create(dir, dentry->d_name.name);
                security_inode_post_create(dir, dentry, mode);
        }
        return error;
@@@ -1637,7 -1637,7 +1637,7 @@@ int vfs_mknod(struct inode *dir, struc
        DQUOT_INIT(dir);
        error = dir->i_op->mknod(dir, dentry, mode, dev);
        if (!error) {
-               inode_dir_notify(dir, DN_CREATE);
+               fsnotify_create(dir, dentry->d_name.name);
                security_inode_post_mknod(dir, dentry, mode, dev);
        }
        return error;
@@@ -1710,7 -1710,7 +1710,7 @@@ int vfs_mkdir(struct inode *dir, struc
        DQUOT_INIT(dir);
        error = dir->i_op->mkdir(dir, dentry, mode);
        if (!error) {
-               inode_dir_notify(dir, DN_CREATE);
+               fsnotify_mkdir(dir, dentry->d_name.name);
                security_inode_post_mkdir(dir,dentry, mode);
        }
        return error;
@@@ -1801,7 -1801,7 +1801,7 @@@ int vfs_rmdir(struct inode *dir, struc
        }
        up(&dentry->d_inode->i_sem);
        if (!error) {
-               inode_dir_notify(dir, DN_DELETE);
+               fsnotify_rmdir(dentry, dentry->d_inode, dir);
                d_delete(dentry);
        }
        dput(dentry);
@@@ -1874,9 -1874,10 +1874,10 @@@ int vfs_unlink(struct inode *dir, struc
  
        /* We don't d_delete() NFS sillyrenamed files--they still exist. */
        if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
+               fsnotify_unlink(dentry, dir);
                d_delete(dentry);
-               inode_dir_notify(dir, DN_DELETE);
        }
        return error;
  }
  
@@@ -1950,7 -1951,7 +1951,7 @@@ int vfs_symlink(struct inode *dir, stru
        DQUOT_INIT(dir);
        error = dir->i_op->symlink(dir, dentry, oldname);
        if (!error) {
-               inode_dir_notify(dir, DN_CREATE);
+               fsnotify_create(dir, dentry->d_name.name);
                security_inode_post_symlink(dir, dentry, oldname);
        }
        return error;
@@@ -2023,7 -2024,7 +2024,7 @@@ int vfs_link(struct dentry *old_dentry
        error = dir->i_op->link(old_dentry, dir, new_dentry);
        up(&old_dentry->d_inode->i_sem);
        if (!error) {
-               inode_dir_notify(dir, DN_CREATE);
+               fsnotify_create(dir, new_dentry->d_name.name);
                security_inode_post_link(old_dentry, dir, new_dentry);
        }
        return error;
@@@ -2187,6 -2188,7 +2188,7 @@@ int vfs_rename(struct inode *old_dir, s
  {
        int error;
        int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
+       const char *old_name;
  
        if (old_dentry->d_inode == new_dentry->d_inode)
                return 0;
        DQUOT_INIT(old_dir);
        DQUOT_INIT(new_dir);
  
+       old_name = fsnotify_oldname_init(old_dentry->d_name.name);
        if (is_dir)
                error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
        else
                error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
        if (!error) {
-               if (old_dir == new_dir)
-                       inode_dir_notify(old_dir, DN_RENAME);
-               else {
-                       inode_dir_notify(old_dir, DN_DELETE);
-                       inode_dir_notify(new_dir, DN_CREATE);
-               }
+               const char *new_name = old_dentry->d_name.name;
+               fsnotify_move(old_dir, new_dir, old_name, new_name, is_dir);
        }
+       fsnotify_oldname_free(old_name);
        return error;
  }
  
diff --combined include/linux/audit.h
@@@ -51,8 -51,7 +51,8 @@@
  #define AUDIT_WATCH_LIST      1009    /* List all file/dir watches */
  #define AUDIT_SIGNAL_INFO     1010    /* Get info about sender of signal to auditd */
  
 -#define AUDIT_FIRST_USER_MSG  1100    /* Userspace messages uninteresting to kernel */
 +#define AUDIT_FIRST_USER_MSG  1100    /* Userspace messages mostly uninteresting to kernel */
 +#define AUDIT_USER_AVC                1107    /* We filter this differently */
  #define AUDIT_LAST_USER_MSG   1199
   
  #define AUDIT_DAEMON_START      1200    /* Daemon startup record */
  #define AUDIT_KERNEL          2000    /* Asynchronous audit record. NOT A REQUEST. */
  
  /* Rule flags */
 -#define AUDIT_PER_TASK 0x01   /* Apply rule at task creation (not syscall) */
 -#define AUDIT_AT_ENTRY 0x02   /* Apply rule at syscall entry */
 -#define AUDIT_AT_EXIT  0x04   /* Apply rule at syscall exit */
 -#define AUDIT_PREPEND  0x10   /* Prepend to front of list */
 +#define AUDIT_FILTER_USER     0x00    /* Apply rule to user-generated messages */
 +#define AUDIT_FILTER_TASK     0x01    /* Apply rule at task creation (not syscall) */
 +#define AUDIT_FILTER_ENTRY    0x02    /* Apply rule at syscall entry */
 +#define AUDIT_FILTER_WATCH    0x03    /* Apply rule to file system watches */
 +#define AUDIT_FILTER_EXIT     0x04    /* Apply rule at syscall exit */
 +
 +#define AUDIT_NR_FILTERS      5
 +
 +#define AUDIT_FILTER_PREPEND  0x10    /* Prepend to front of list */
  
  /* Rule actions */
  #define AUDIT_NEVER    0      /* Do not build context if rule matches */
  #define AUDIT_ARCH_SH64               (EM_SH|__AUDIT_ARCH_64BIT)
  #define AUDIT_ARCH_SHEL64     (EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
  #define AUDIT_ARCH_SPARC      (EM_SPARC)
- #define AUDIT_ARCH_SPARC64    (EM_SPARC64|__AUDIT_ARCH_64BIT)
+ #define AUDIT_ARCH_SPARC64    (EM_SPARCV9|__AUDIT_ARCH_64BIT)
  #define AUDIT_ARCH_V850               (EM_V850|__AUDIT_ARCH_LE)
  #define AUDIT_ARCH_X86_64     (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
  
@@@ -205,7 -199,6 +205,7 @@@ struct audit_sig_info 
  struct audit_buffer;
  struct audit_context;
  struct inode;
 +struct netlink_skb_parms;
  
  #define AUDITSC_INVALID 0
  #define AUDITSC_SUCCESS 1
@@@ -222,7 -215,7 +222,7 @@@ extern void audit_syscall_entry(struct 
  extern void audit_syscall_exit(struct task_struct *task, int failed, long return_code);
  extern void audit_getname(const char *name);
  extern void audit_putname(const char *name);
 -extern void audit_inode(const char *name, const struct inode *inode);
 +extern void audit_inode(const char *name, const struct inode *inode, unsigned flags);
  
                                /* Private API (for audit.c only) */
  extern int  audit_receive_filter(int type, int pid, int uid, int seq,
@@@ -237,7 -230,6 +237,7 @@@ extern int audit_socketcall(int nargs, 
  extern int audit_sockaddr(int len, void *addr);
  extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt);
  extern void audit_signal_info(int sig, struct task_struct *t);
 +extern int audit_filter_user(struct netlink_skb_parms *cb, int type);
  #else
  #define audit_alloc(t) ({ 0; })
  #define audit_free(t) do { ; } while (0)
  #define audit_syscall_exit(t,f,r) do { ; } while (0)
  #define audit_getname(n) do { ; } while (0)
  #define audit_putname(n) do { ; } while (0)
 -#define audit_inode(n,i) do { ; } while (0)
 +#define audit_inode(n,i,f) do { ; } while (0)
  #define audit_receive_filter(t,p,u,s,d,l) ({ -EOPNOTSUPP; })
  #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0)
  #define audit_get_loginuid(c) ({ -1; })
  #define audit_sockaddr(len, addr) ({ 0; })
  #define audit_avc_path(dentry, mnt) ({ 0; })
  #define audit_signal_info(s,t) do { ; } while (0)
 +#define audit_filter_user(cb,t) ({ 1; })
  #endif
  
  #ifdef CONFIG_AUDIT
  /* These are defined in audit.c */
                                /* Public API */
 -extern void               audit_log(struct audit_context *ctx, int type,
 -                                    const char *fmt, ...)
 -                          __attribute__((format(printf,3,4)));
 +extern void               audit_log(struct audit_context *ctx, int gfp_mask,
 +                                    int type, const char *fmt, ...)
 +                                    __attribute__((format(printf,4,5)));
  
 -extern struct audit_buffer *audit_log_start(struct audit_context *ctx,int type);
 +extern struct audit_buffer *audit_log_start(struct audit_context *ctx, int gfp_mask, int type);
  extern void               audit_log_format(struct audit_buffer *ab,
                                             const char *fmt, ...)
                            __attribute__((format(printf,2,3)));
@@@ -283,10 -274,9 +283,10 @@@ extern void                  audit_send_reply(int p
                                             int done, int multi,
                                             void *payload, int size);
  extern void               audit_log_lost(const char *message);
 +extern struct semaphore audit_netlink_sem;
  #else
 -#define audit_log(c,t,f,...) do { ; } while (0)
 -#define audit_log_start(c,t) ({ NULL; })
 +#define audit_log(c,g,t,f,...) do { ; } while (0)
 +#define audit_log_start(c,g,t) ({ NULL; })
  #define audit_log_vformat(b,f,a) do { ; } while (0)
  #define audit_log_format(b,f,...) do { ; } while (0)
  #define audit_log_end(b) do { ; } while (0)