Merge branch 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 May 2019 03:03:32 +0000 (20:03 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 May 2019 03:03:32 +0000 (20:03 -0700)
Pull misc dcache updates from Al Viro:
 "Most of this pile is putting name length into struct name_snapshot and
  making use of it.

  The beginning of this series ("ovl_lookup_real_one(): don't bother
  with strlen()") ought to have been split in two (separate switch of
  name_snapshot to struct qstr from overlayfs reaping the trivial
  benefits of that), but I wanted to avoid a rebase - by the time I'd
  spotted that it was (a) in -next and (b) close to 5.1-final ;-/"

* 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  audit_compare_dname_path(): switch to const struct qstr *
  audit_update_watch(): switch to const struct qstr *
  inotify_handle_event(): don't bother with strlen()
  fsnotify: switch send_to_group() and ->handle_event to const struct qstr *
  fsnotify(): switch to passing const struct qstr * for file_name
  switch fsnotify_move() to passing const struct qstr * for old_name
  ovl_lookup_real_one(): don't bother with strlen()
  sysv: bury the broken "quietly truncate the long filenames" logics
  nsfs: unobfuscate
  unexport d_alloc_pseudo()

25 files changed:
Documentation/filesystems/porting
fs/dcache.c
fs/debugfs/inode.c
fs/internal.h
fs/kernfs/file.c
fs/namei.c
fs/notify/dnotify/dnotify.c
fs/notify/fanotify/fanotify.c
fs/notify/fsnotify.c
fs/notify/inotify/inotify.h
fs/notify/inotify/inotify_fsnotify.c
fs/nsfs.c
fs/overlayfs/export.c
fs/sysv/namei.c
fs/sysv/super.c
fs/sysv/sysv.h
include/linux/dcache.h
include/linux/fsnotify.h
include/linux/fsnotify_backend.h
kernel/audit.h
kernel/audit_fsnotify.c
kernel/audit_tree.c
kernel/audit_watch.c
kernel/auditfilter.c
kernel/auditsc.c

index d392d4b..3bd1148 100644 (file)
@@ -668,3 +668,8 @@ in your dentry operations instead.
        DCACHE_RCUACCESS is gone; having an RCU delay on dentry freeing is the
        default.  DCACHE_NORCU opts out, and only d_alloc_pseudo() has any
        business doing so.
+--
+[mandatory]
+       d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are
+       very suspect (and won't work in modules).  Such uses are very likely to
+       be misspelled d_alloc_anon().
index c663c60..982d97b 100644 (file)
@@ -284,25 +284,23 @@ static inline int dname_external(const struct dentry *dentry)
 void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry)
 {
        spin_lock(&dentry->d_lock);
+       name->name = dentry->d_name;
        if (unlikely(dname_external(dentry))) {
-               struct external_name *p = external_name(dentry);
-               atomic_inc(&p->u.count);
-               spin_unlock(&dentry->d_lock);
-               name->name = p->name;
+               atomic_inc(&external_name(dentry)->u.count);
        } else {
                memcpy(name->inline_name, dentry->d_iname,
                       dentry->d_name.len + 1);
-               spin_unlock(&dentry->d_lock);
-               name->name = name->inline_name;
+               name->name.name = name->inline_name;
        }
+       spin_unlock(&dentry->d_lock);
 }
 EXPORT_SYMBOL(take_dentry_name_snapshot);
 
 void release_dentry_name_snapshot(struct name_snapshot *name)
 {
-       if (unlikely(name->name != name->inline_name)) {
+       if (unlikely(name->name.name != name->inline_name)) {
                struct external_name *p;
-               p = container_of(name->name, struct external_name, name[0]);
+               p = container_of(name->name.name, struct external_name, name[0]);
                if (unlikely(atomic_dec_and_test(&p->u.count)))
                        kfree_rcu(p, u.head);
        }
@@ -1742,6 +1740,9 @@ struct dentry *d_alloc_cursor(struct dentry * parent)
  * never be anyone's children or parents.  Unlike all other
  * dentries, these will not have RCU delay between dropping the
  * last reference and freeing them.
+ *
+ * The only user is alloc_file_pseudo() and that's what should
+ * be considered a public interface.  Don't use directly.
  */
 struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
 {
@@ -1750,7 +1751,6 @@ struct dentry *d_alloc_pseudo(struct super_block *sb, const struct qstr *name)
                dentry->d_flags |= DCACHE_NORCU;
        return dentry;
 }
-EXPORT_SYMBOL(d_alloc_pseudo);
 
 struct dentry *d_alloc_name(struct dentry *parent, const char *name)
 {
index 414fa47..acef14a 100644 (file)
@@ -818,7 +818,7 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
                goto exit;
        }
        d_move(old_dentry, dentry);
-       fsnotify_move(d_inode(old_dir), d_inode(new_dir), old_name.name,
+       fsnotify_move(d_inode(old_dir), d_inode(new_dir), &old_name.name,
                d_is_dir(old_dentry),
                NULL, old_dentry);
        release_dentry_name_snapshot(&old_name);
index 82b78ae..17a8ae9 100644 (file)
@@ -155,6 +155,7 @@ extern struct dentry *__d_alloc(struct super_block *, const struct qstr *);
 extern int d_set_mounted(struct dentry *dentry);
 extern long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc);
 extern struct dentry *d_alloc_cursor(struct dentry *);
+extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
 
 /*
  * read_write.c
index ae948aa..553ce0a 100644 (file)
@@ -885,6 +885,7 @@ repeat:
        list_for_each_entry(info, &kernfs_root(kn)->supers, node) {
                struct kernfs_node *parent;
                struct inode *inode;
+               struct qstr name;
 
                /*
                 * We want fsnotify_modify() on @kn but as the
@@ -896,6 +897,7 @@ repeat:
                if (!inode)
                        continue;
 
+               name = (struct qstr)QSTR_INIT(kn->name, strlen(kn->name));
                parent = kernfs_get_parent(kn);
                if (parent) {
                        struct inode *p_inode;
@@ -903,7 +905,7 @@ repeat:
                        p_inode = ilookup(info->sb, parent->id.ino);
                        if (p_inode) {
                                fsnotify(p_inode, FS_MODIFY | FS_EVENT_ON_CHILD,
-                                        inode, FSNOTIFY_EVENT_INODE, kn->name, 0);
+                                        inode, FSNOTIFY_EVENT_INODE, &name, 0);
                                iput(p_inode);
                        }
 
@@ -911,7 +913,7 @@ repeat:
                }
 
                fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE,
-                        kn->name, 0);
+                        &name, 0);
                iput(inode);
        }
 
index dede014..5ebd64b 100644 (file)
@@ -4498,10 +4498,10 @@ out:
                inode_unlock(target);
        dput(new_dentry);
        if (!error) {
-               fsnotify_move(old_dir, new_dir, old_name.name, is_dir,
+               fsnotify_move(old_dir, new_dir, &old_name.name, is_dir,
                              !(flags & RENAME_EXCHANGE) ? target : NULL, old_dentry);
                if (flags & RENAME_EXCHANGE) {
-                       fsnotify_move(new_dir, old_dir, old_dentry->d_name.name,
+                       fsnotify_move(new_dir, old_dir, &old_dentry->d_name,
                                      new_is_dir, NULL, new_dentry);
                }
        }
index 58d77dc..250369d 100644 (file)
@@ -81,7 +81,7 @@ static void dnotify_recalc_inode_mask(struct fsnotify_mark *fsn_mark)
 static int dnotify_handle_event(struct fsnotify_group *group,
                                struct inode *inode,
                                u32 mask, const void *data, int data_type,
-                               const unsigned char *file_name, u32 cookie,
+                               const struct qstr *file_name, u32 cookie,
                                struct fsnotify_iter_info *iter_info)
 {
        struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
index 63c6bb1..e6fde1a 100644 (file)
@@ -367,7 +367,7 @@ static __kernel_fsid_t fanotify_get_fsid(struct fsnotify_iter_info *iter_info)
 static int fanotify_handle_event(struct fsnotify_group *group,
                                 struct inode *inode,
                                 u32 mask, const void *data, int data_type,
-                                const unsigned char *file_name, u32 cookie,
+                                const struct qstr *file_name, u32 cookie,
                                 struct fsnotify_iter_info *iter_info)
 {
        int ret = 0;
index df06f3d..5433e37 100644 (file)
@@ -179,10 +179,10 @@ int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask
                take_dentry_name_snapshot(&name, dentry);
                if (path)
                        ret = fsnotify(p_inode, mask, path, FSNOTIFY_EVENT_PATH,
-                                      name.name, 0);
+                                      &name.name, 0);
                else
                        ret = fsnotify(p_inode, mask, dentry->d_inode, FSNOTIFY_EVENT_INODE,
-                                      name.name, 0);
+                                      &name.name, 0);
                release_dentry_name_snapshot(&name);
        }
 
@@ -195,7 +195,7 @@ EXPORT_SYMBOL_GPL(__fsnotify_parent);
 static int send_to_group(struct inode *to_tell,
                         __u32 mask, const void *data,
                         int data_is, u32 cookie,
-                        const unsigned char *file_name,
+                        const struct qstr *file_name,
                         struct fsnotify_iter_info *iter_info)
 {
        struct fsnotify_group *group = NULL;
@@ -325,7 +325,7 @@ static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info)
  * notification event in whatever means they feel necessary.
  */
 int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
-            const unsigned char *file_name, u32 cookie)
+            const struct qstr *file_name, u32 cookie)
 {
        struct fsnotify_iter_info iter_info = {};
        struct super_block *sb = to_tell->i_sb;
index 74ae603..3f246f7 100644 (file)
@@ -27,7 +27,7 @@ extern void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
 extern int inotify_handle_event(struct fsnotify_group *group,
                                struct inode *inode,
                                u32 mask, const void *data, int data_type,
-                               const unsigned char *file_name, u32 cookie,
+                               const struct qstr *file_name, u32 cookie,
                                struct fsnotify_iter_info *iter_info);
 
 extern const struct fsnotify_ops inotify_fsnotify_ops;
index ff30abd..7e8b131 100644 (file)
@@ -67,7 +67,7 @@ static int inotify_merge(struct list_head *list,
 int inotify_handle_event(struct fsnotify_group *group,
                         struct inode *inode,
                         u32 mask, const void *data, int data_type,
-                        const unsigned char *file_name, u32 cookie,
+                        const struct qstr *file_name, u32 cookie,
                         struct fsnotify_iter_info *iter_info)
 {
        struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
@@ -89,7 +89,7 @@ int inotify_handle_event(struct fsnotify_group *group,
                        return 0;
        }
        if (file_name) {
-               len = strlen(file_name);
+               len = file_name->len;
                alloc_len += len + 1;
        }
 
@@ -129,7 +129,7 @@ int inotify_handle_event(struct fsnotify_group *group,
        event->sync_cookie = cookie;
        event->name_len = len;
        if (len)
-               strcpy(event->name, file_name);
+               strcpy(event->name, file_name->name);
 
        ret = fsnotify_add_event(group, fsn_event, inotify_merge);
        if (ret) {
index 30d150a..e3bf08c 100644 (file)
--- a/fs/nsfs.c
+++ b/fs/nsfs.c
@@ -105,17 +105,16 @@ slow:
 void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb,
                     void *private_data)
 {
-       struct ns_common *ns;
        void *ret;
 
-again:
-       ns = ns_get_cb(private_data);
-       if (!ns)
-               return ERR_PTR(-ENOENT);
+       do {
+               struct ns_common *ns = ns_get_cb(private_data);
+               if (!ns)
+                       return ERR_PTR(-ENOENT);
+
+               ret = __ns_get_path(path, ns);
+       } while (ret == ERR_PTR(-EAGAIN));
 
-       ret = __ns_get_path(path, ns);
-       if (IS_ERR(ret) && PTR_ERR(ret) == -EAGAIN)
-               goto again;
        return ret;
 }
 
@@ -154,7 +153,7 @@ int open_related_ns(struct ns_common *ns,
        if (fd < 0)
                return fd;
 
-       while (1) {
+       do {
                struct ns_common *relative;
 
                relative = get_ns(ns);
@@ -164,10 +163,8 @@ int open_related_ns(struct ns_common *ns,
                }
 
                err = __ns_get_path(&path, relative);
-               if (IS_ERR(err) && PTR_ERR(err) == -EAGAIN)
-                       continue;
-               break;
-       }
+       } while (err == ERR_PTR(-EAGAIN));
+
        if (IS_ERR(err)) {
                put_unused_fd(fd);
                return PTR_ERR(err);
index 54e5d17..cc1c9e5 100644 (file)
@@ -398,7 +398,7 @@ static struct dentry *ovl_lookup_real_one(struct dentry *connected,
         * pointer because we hold no lock on the real dentry.
         */
        take_dentry_name_snapshot(&name, real);
-       this = lookup_one_len(name.name, connected, strlen(name.name));
+       this = lookup_one_len(name.name.name, connected, name.name.len);
        err = PTR_ERR(this);
        if (IS_ERR(this)) {
                goto fail;
index 4d5d204..ea2414b 100644 (file)
@@ -28,21 +28,6 @@ static int add_nondir(struct dentry *dentry, struct inode *inode)
        return err;
 }
 
-static int sysv_hash(const struct dentry *dentry, struct qstr *qstr)
-{
-       /* Truncate the name in place, avoids having to define a compare
-          function. */
-       if (qstr->len > SYSV_NAMELEN) {
-               qstr->len = SYSV_NAMELEN;
-               qstr->hash = full_name_hash(dentry, qstr->name, qstr->len);
-       }
-       return 0;
-}
-
-const struct dentry_operations sysv_dentry_operations = {
-       .d_hash         = sysv_hash,
-};
-
 static struct dentry *sysv_lookup(struct inode * dir, struct dentry * dentry, unsigned int flags)
 {
        struct inode * inode = NULL;
index 89765dd..d3b2f54 100644 (file)
@@ -312,7 +312,6 @@ static int complete_read_super(struct super_block *sb, int silent, int size)
 
        flavour_setup[sbi->s_type](sbi, &sb->s_max_links);
        
-       sbi->s_truncate = 1;
        sbi->s_ndatazones = sbi->s_nzones - sbi->s_firstdatazone;
        sbi->s_inodes_per_block = bsize >> 6;
        sbi->s_inodes_per_block_1 = (bsize >> 6)-1;
@@ -334,8 +333,6 @@ static int complete_read_super(struct super_block *sb, int silent, int size)
        sb->s_op = &sysv_sops;
        if (sbi->s_forced_ro)
                sb->s_flags |= SB_RDONLY;
-       if (sbi->s_truncate)
-               sb->s_d_op = &sysv_dentry_operations;
        root_inode = sysv_iget(sb, SYSV_ROOT_INO);
        if (IS_ERR(root_inode)) {
                printk("SysV FS: get root inode failed\n");
index e913698..1cff585 100644 (file)
@@ -23,8 +23,6 @@ struct sysv_sb_info {
        struct super_block *s_sb;       /* VFS superblock */
        int            s_type;          /* file system type: FSTYPE_{XENIX|SYSV|COH} */
        char           s_bytesex;       /* bytesex (le/be/pdp) */
-       char           s_truncate;      /* if 1: names > SYSV_NAMELEN chars are truncated */
-                                       /* if 0: they are disallowed (ENAMETOOLONG) */
        unsigned int   s_inodes_per_block;      /* number of inodes per block */
        unsigned int   s_inodes_per_block_1;    /* inodes_per_block - 1 */
        unsigned int   s_inodes_per_block_bits; /* log2(inodes_per_block) */
@@ -166,7 +164,6 @@ extern const struct file_operations sysv_file_operations;
 extern const struct file_operations sysv_dir_operations;
 extern const struct address_space_operations sysv_aops;
 extern const struct super_operations sysv_sops;
-extern const struct dentry_operations sysv_dentry_operations;
 
 
 enum {
index 6e1e8e6..73c3a8f 100644 (file)
@@ -235,7 +235,6 @@ extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op
 /* allocate/de-allocate */
 extern struct dentry * d_alloc(struct dentry *, const struct qstr *);
 extern struct dentry * d_alloc_anon(struct super_block *);
-extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
 extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *,
                                        wait_queue_head_t *);
 extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
@@ -594,7 +593,7 @@ static inline struct inode *d_real_inode(const struct dentry *dentry)
 }
 
 struct name_snapshot {
-       const unsigned char *name;
+       struct qstr name;
        unsigned char inline_name[DNAME_INLINE_LEN];
 };
 void take_dentry_name_snapshot(struct name_snapshot *, struct dentry *);
index 09587e2..0c0ef30 100644 (file)
@@ -27,7 +27,7 @@ static inline int fsnotify_dirent(struct inode *dir, struct dentry *dentry,
                                  __u32 mask)
 {
        return fsnotify(dir, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE,
-                       dentry->d_name.name, 0);
+                       &dentry->d_name, 0);
 }
 
 /* Notify this dentry's parent about a child's events. */
@@ -102,7 +102,7 @@ static inline void fsnotify_link_count(struct inode *inode)
  * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir
  */
 static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
-                                const unsigned char *old_name,
+                                const struct qstr *old_name,
                                 int isdir, struct inode *target,
                                 struct dentry *moved)
 {
@@ -111,7 +111,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
        __u32 old_dir_mask = FS_MOVED_FROM;
        __u32 new_dir_mask = FS_MOVED_TO;
        __u32 mask = FS_MOVE_SELF;
-       const unsigned char *new_name = moved->d_name.name;
+       const struct qstr *new_name = &moved->d_name;
 
        if (old_dir == new_dir)
                old_dir_mask |= FS_DN_RENAME;
@@ -178,7 +178,7 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir)
        take_dentry_name_snapshot(&name, dentry);
 
        fsnotify(d_inode(parent), mask, d_inode(dentry), FSNOTIFY_EVENT_INODE,
-                name.name, 0);
+                &name.name, 0);
 
        release_dentry_name_snapshot(&name);
        dput(parent);
@@ -218,7 +218,7 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct
        fsnotify_link_count(inode);
        audit_inode_child(dir, new_dentry, AUDIT_TYPE_CHILD_CREATE);
 
-       fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, new_dentry->d_name.name, 0);
+       fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, &new_dentry->d_name, 0);
 }
 
 /*
index dfc28fc..c28f6ed 100644 (file)
@@ -117,7 +117,7 @@ struct fsnotify_ops {
        int (*handle_event)(struct fsnotify_group *group,
                            struct inode *inode,
                            u32 mask, const void *data, int data_type,
-                           const unsigned char *file_name, u32 cookie,
+                           const struct qstr *file_name, u32 cookie,
                            struct fsnotify_iter_info *iter_info);
        void (*free_group_priv)(struct fsnotify_group *group);
        void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
@@ -350,7 +350,7 @@ struct fsnotify_mark {
 
 /* main fsnotify call to send events */
 extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
-                   const unsigned char *name, u32 cookie);
+                   const struct qstr *name, u32 cookie);
 extern int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask);
 extern void __fsnotify_inode_delete(struct inode *inode);
 extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
@@ -505,7 +505,7 @@ static inline void fsnotify_init_event(struct fsnotify_event *event,
 #else
 
 static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
-                          const unsigned char *name, u32 cookie)
+                          const struct qstr *name, u32 cookie)
 {
        return 0;
 }
index 958d5b8..2071725 100644 (file)
@@ -231,7 +231,7 @@ extern int audit_comparator(const u32 left, const u32 op, const u32 right);
 extern int audit_uid_comparator(kuid_t left, u32 op, kuid_t right);
 extern int audit_gid_comparator(kgid_t left, u32 op, kgid_t right);
 extern int parent_len(const char *path);
-extern int audit_compare_dname_path(const char *dname, const char *path, int plen);
+extern int audit_compare_dname_path(const struct qstr *dname, const char *path, int plen);
 extern struct sk_buff *audit_make_reply(int seq, int type, int done, int multi,
                                        const void *payload, int size);
 extern void                audit_panic(const char *message);
index 37ae95c..b5737b8 100644 (file)
@@ -164,7 +164,7 @@ static void audit_autoremove_mark_rule(struct audit_fsnotify_mark *audit_mark)
 static int audit_mark_handle_event(struct fsnotify_group *group,
                                    struct inode *to_tell,
                                    u32 mask, const void *data, int data_type,
-                                   const unsigned char *dname, u32 cookie,
+                                   const struct qstr *dname, u32 cookie,
                                    struct fsnotify_iter_info *iter_info)
 {
        struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
index abfb112..e49c912 100644 (file)
@@ -1040,7 +1040,7 @@ static void evict_chunk(struct audit_chunk *chunk)
 static int audit_tree_handle_event(struct fsnotify_group *group,
                                   struct inode *to_tell,
                                   u32 mask, const void *data, int data_type,
-                                  const unsigned char *file_name, u32 cookie,
+                                  const struct qstr *file_name, u32 cookie,
                                   struct fsnotify_iter_info *iter_info)
 {
        return 0;
index e8d1ade..b50c574 100644 (file)
@@ -255,7 +255,7 @@ static void audit_watch_log_rule_change(struct audit_krule *r, struct audit_watc
 
 /* Update inode info in audit rules based on filesystem event. */
 static void audit_update_watch(struct audit_parent *parent,
-                              const char *dname, dev_t dev,
+                              const struct qstr *dname, dev_t dev,
                               unsigned long ino, unsigned invalidating)
 {
        struct audit_watch *owatch, *nwatch, *nextw;
@@ -482,7 +482,7 @@ void audit_remove_watch_rule(struct audit_krule *krule)
 static int audit_watch_handle_event(struct fsnotify_group *group,
                                    struct inode *to_tell,
                                    u32 mask, const void *data, int data_type,
-                                   const unsigned char *dname, u32 cookie,
+                                   const struct qstr *dname, u32 cookie,
                                    struct fsnotify_iter_info *iter_info)
 {
        struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
index 1bc6410..303fb04 100644 (file)
@@ -1292,12 +1292,12 @@ int parent_len(const char *path)
  * @parentlen: length of the parent if known. Passing in AUDIT_NAME_FULL
  *             here indicates that we must compute this value.
  */
-int audit_compare_dname_path(const char *dname, const char *path, int parentlen)
+int audit_compare_dname_path(const struct qstr *dname, const char *path, int parentlen)
 {
        int dlen, pathlen;
        const char *p;
 
-       dlen = strlen(dname);
+       dlen = dname->len;
        pathlen = strlen(path);
        if (pathlen < dlen)
                return 1;
@@ -1308,7 +1308,7 @@ int audit_compare_dname_path(const char *dname, const char *path, int parentlen)
 
        p = path + parentlen;
 
-       return strncmp(p, dname, dlen);
+       return strncmp(p, dname->name, dlen);
 }
 
 int audit_filter(int msgtype, unsigned int listtype)
index 5371b59..95ae27e 100644 (file)
@@ -2047,7 +2047,7 @@ void __audit_inode_child(struct inode *parent,
 {
        struct audit_context *context = audit_context();
        struct inode *inode = d_backing_inode(dentry);
-       const char *dname = dentry->d_name.name;
+       const struct qstr *dname = &dentry->d_name;
        struct audit_names *n, *found_parent = NULL, *found_child = NULL;
        struct audit_entry *e;
        struct list_head *list = &audit_filter_list[AUDIT_FILTER_FS];
@@ -2099,7 +2099,7 @@ void __audit_inode_child(struct inode *parent,
                    (n->type != type && n->type != AUDIT_TYPE_UNKNOWN))
                        continue;
 
-               if (!strcmp(dname, n->name->name) ||
+               if (!strcmp(dname->name, n->name->name) ||
                    !audit_compare_dname_path(dname, n->name->name,
                                                found_parent ?
                                                found_parent->name_len :