ceph: fix use-after-free on symlink traversal
[platform/kernel/linux-rpi.git] / fs / gfs2 / glock.c
index b92740e..d32964c 100644 (file)
@@ -107,7 +107,7 @@ static int glock_wake_function(wait_queue_entry_t *wait, unsigned int mode,
 
 static wait_queue_head_t *glock_waitqueue(struct lm_lockname *name)
 {
-       u32 hash = jhash2((u32 *)name, sizeof(*name) / 4, 0);
+       u32 hash = jhash2((u32 *)name, ht_parms.key_len / 4, 0);
 
        return glock_wait_table + hash_32(hash, GLOCK_WAIT_TABLE_BITS);
 }
@@ -2131,71 +2131,29 @@ static const struct file_operations gfs2_sbstats_fops = {
        .release = seq_release,
 };
 
-int gfs2_create_debugfs_file(struct gfs2_sbd *sdp)
-{
-       struct dentry *dent;
-
-       dent = debugfs_create_dir(sdp->sd_table_name, gfs2_root);
-       if (IS_ERR_OR_NULL(dent))
-               goto fail;
-       sdp->debugfs_dir = dent;
-
-       dent = debugfs_create_file("glocks",
-                                  S_IFREG | S_IRUGO,
-                                  sdp->debugfs_dir, sdp,
-                                  &gfs2_glocks_fops);
-       if (IS_ERR_OR_NULL(dent))
-               goto fail;
-       sdp->debugfs_dentry_glocks = dent;
-
-       dent = debugfs_create_file("glstats",
-                                  S_IFREG | S_IRUGO,
-                                  sdp->debugfs_dir, sdp,
-                                  &gfs2_glstats_fops);
-       if (IS_ERR_OR_NULL(dent))
-               goto fail;
-       sdp->debugfs_dentry_glstats = dent;
-
-       dent = debugfs_create_file("sbstats",
-                                  S_IFREG | S_IRUGO,
-                                  sdp->debugfs_dir, sdp,
-                                  &gfs2_sbstats_fops);
-       if (IS_ERR_OR_NULL(dent))
-               goto fail;
-       sdp->debugfs_dentry_sbstats = dent;
+void gfs2_create_debugfs_file(struct gfs2_sbd *sdp)
+{
+       sdp->debugfs_dir = debugfs_create_dir(sdp->sd_table_name, gfs2_root);
 
-       return 0;
-fail:
-       gfs2_delete_debugfs_file(sdp);
-       return dent ? PTR_ERR(dent) : -ENOMEM;
+       debugfs_create_file("glocks", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
+                           &gfs2_glocks_fops);
+
+       debugfs_create_file("glstats", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
+                           &gfs2_glstats_fops);
+
+       debugfs_create_file("sbstats", S_IFREG | S_IRUGO, sdp->debugfs_dir, sdp,
+                           &gfs2_sbstats_fops);
 }
 
 void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp)
 {
-       if (sdp->debugfs_dir) {
-               if (sdp->debugfs_dentry_glocks) {
-                       debugfs_remove(sdp->debugfs_dentry_glocks);
-                       sdp->debugfs_dentry_glocks = NULL;
-               }
-               if (sdp->debugfs_dentry_glstats) {
-                       debugfs_remove(sdp->debugfs_dentry_glstats);
-                       sdp->debugfs_dentry_glstats = NULL;
-               }
-               if (sdp->debugfs_dentry_sbstats) {
-                       debugfs_remove(sdp->debugfs_dentry_sbstats);
-                       sdp->debugfs_dentry_sbstats = NULL;
-               }
-               debugfs_remove(sdp->debugfs_dir);
-               sdp->debugfs_dir = NULL;
-       }
+       debugfs_remove_recursive(sdp->debugfs_dir);
+       sdp->debugfs_dir = NULL;
 }
 
-int gfs2_register_debugfs(void)
+void gfs2_register_debugfs(void)
 {
        gfs2_root = debugfs_create_dir("gfs2", NULL);
-       if (IS_ERR(gfs2_root))
-               return PTR_ERR(gfs2_root);
-       return gfs2_root ? 0 : -ENOMEM;
 }
 
 void gfs2_unregister_debugfs(void)