int err = -EBADF;
 
        if (f.file) {
-               audit_inode(NULL, f.file->f_path.dentry, 0);
+               audit_file(f.file);
                err = chmod_common(&f.file->f_path, mode);
                fdput(f);
        }
        error = mnt_want_write_file(f.file);
        if (error)
                goto out_fput;
-       audit_inode(NULL, f.file->f_path.dentry, 0);
+       audit_file(f.file);
        error = chown_common(&f.file->f_path, user, group);
        mnt_drop_write_file(f.file);
 out_fput:
 
                const void __user *,value, size_t, size, int, flags)
 {
        struct fd f = fdget(fd);
-       struct dentry *dentry;
        int error = -EBADF;
 
        if (!f.file)
                return error;
-       dentry = f.file->f_path.dentry;
-       audit_inode(NULL, dentry, 0);
+       audit_file(f.file);
        error = mnt_want_write_file(f.file);
        if (!error) {
-               error = setxattr(dentry, name, value, size, flags);
+               error = setxattr(f.file->f_path.dentry, name, value, size, flags);
                mnt_drop_write_file(f.file);
        }
        fdput(f);
 
        if (!f.file)
                return error;
-       audit_inode(NULL, f.file->f_path.dentry, 0);
+       audit_file(f.file);
        error = getxattr(f.file->f_path.dentry, name, value, size);
        fdput(f);
        return error;
 
        if (!f.file)
                return error;
-       audit_inode(NULL, f.file->f_path.dentry, 0);
+       audit_file(f.file);
        error = listxattr(f.file->f_path.dentry, list, size);
        fdput(f);
        return error;
 SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
 {
        struct fd f = fdget(fd);
-       struct dentry *dentry;
        int error = -EBADF;
 
        if (!f.file)
                return error;
-       dentry = f.file->f_path.dentry;
-       audit_inode(NULL, dentry, 0);
+       audit_file(f.file);
        error = mnt_want_write_file(f.file);
        if (!error) {
-               error = removexattr(dentry, name);
+               error = removexattr(f.file->f_path.dentry, name);
                mnt_drop_write_file(f.file);
        }
        fdput(f);
 
 #define AUDIT_INODE_HIDDEN     2       /* audit record should be hidden */
 extern void __audit_inode(struct filename *name, const struct dentry *dentry,
                                unsigned int flags);
+extern void __audit_file(const struct file *);
 extern void __audit_inode_child(const struct inode *parent,
                                const struct dentry *dentry,
                                const unsigned char type);
                __audit_inode(name, dentry, flags);
        }
 }
+static inline void audit_file(struct file *file)
+{
+       if (unlikely(!audit_dummy_context()))
+               __audit_file(file);
+}
 static inline void audit_inode_parent_hidden(struct filename *name,
                                                const struct dentry *dentry)
 {
                                const struct dentry *dentry,
                                unsigned int parent)
 { }
+static inline void audit_file(struct file *file)
+{
+}
 static inline void audit_inode_parent_hidden(struct filename *name,
                                const struct dentry *dentry)
 { }
 
                goto out_fput;
        }
        info = MQUEUE_I(inode);
-       audit_inode(NULL, f.file->f_path.dentry, 0);
+       audit_file(f.file);
 
        if (unlikely(!(f.file->f_mode & FMODE_WRITE))) {
                ret = -EBADF;
                goto out_fput;
        }
        info = MQUEUE_I(inode);
-       audit_inode(NULL, f.file->f_path.dentry, 0);
+       audit_file(f.file);
 
        if (unlikely(!(f.file->f_mode & FMODE_READ))) {
                ret = -EBADF;
 
        audit_copy_inode(n, dentry, inode);
 }
 
+void __audit_file(const struct file *file)
+{
+       __audit_inode(NULL, file->f_path.dentry, 0);
+}
+
 /**
  * __audit_inode_child - collect inode info for created/removed objects
  * @parent: inode of dentry parent