Merge tag 'gfs2-5.1.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Mar 2019 19:52:11 +0000 (11:52 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Mar 2019 19:52:11 +0000 (11:52 -0800)
Pull gfs2 updates from Bob Peterson:
 "We've only got three patches ready for this merge window:

   - Fix a hang related to missed wakeups for glocks from Andreas
     Gruenbacher

   - Rework of how gfs2 manages its debugfs files from Greg K-H

   - An incorrect assert when truncating or deleting files from Tim
     Smith"

* tag 'gfs2-5.1.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
  gfs2: Fix missed wakeups in find_insert_glock
  gfs2: Fix an incorrect gfs2_assert()
  gfs: no need to check return value of debugfs_create functions

fs/gfs2/glock.c
fs/gfs2/glock.h
fs/gfs2/incore.h
fs/gfs2/inode.h
fs/gfs2/main.c

index b92740edc4169998772d8251010deac232f8405e..d32964cd11176d3c49c5c06b6ffe15e900dba5d4 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)
index 8949bf28b249f94ed9f2c8ee4c70bdd4dbb12857..936b3295839c4439082b4e0762cebb2303d0636c 100644 (file)
@@ -243,9 +243,9 @@ extern void gfs2_glock_free(struct gfs2_glock *gl);
 extern int __init gfs2_glock_init(void);
 extern void gfs2_glock_exit(void);
 
-extern int gfs2_create_debugfs_file(struct gfs2_sbd *sdp);
+extern void gfs2_create_debugfs_file(struct gfs2_sbd *sdp);
 extern void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp);
-extern int gfs2_register_debugfs(void);
+extern void gfs2_register_debugfs(void);
 extern void gfs2_unregister_debugfs(void);
 
 extern const struct lm_lockops gfs2_dlm_ops;
index e10e0b0a7cd58e513e4798b2ee3ef8184d9d8bad..cdf07b408f54c6c0546af3e5867c1e893de628cf 100644 (file)
@@ -853,9 +853,6 @@ struct gfs2_sbd {
 
        unsigned long sd_last_warning;
        struct dentry *debugfs_dir;    /* debugfs directory */
-       struct dentry *debugfs_dentry_glocks;
-       struct dentry *debugfs_dentry_glstats;
-       struct dentry *debugfs_dentry_sbstats;
 };
 
 static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which)
index 793808263c6d7b7b5c801578628d303b0121bd2c..18d4af7417fa34df7e548dc72ea0d0849794de1f 100644 (file)
@@ -59,8 +59,8 @@ static inline u64 gfs2_get_inode_blocks(const struct inode *inode)
 
 static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change)
 {
-       gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks > -change));
-       change *= (GFS2_SB(inode)->sd_sb.sb_bsize/GFS2_BASIC_BLOCK);
+       change <<= inode->i_blkbits - GFS2_BASIC_BLOCK_SHIFT;
+       gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks >= -change));
        inode->i_blocks += change;
 }
 
index c7603063f86148fbae4967a68a2f264f9548382a..136484ef35d37de7e4878c54ce98cd35a1326eb7 100644 (file)
@@ -178,16 +178,12 @@ static int __init init_gfs2_fs(void)
        if (!gfs2_page_pool)
                goto fail_mempool;
 
-       error = gfs2_register_debugfs();
-       if (error)
-               goto fail_debugfs;
+       gfs2_register_debugfs();
 
        pr_info("GFS2 installed\n");
 
        return 0;
 
-fail_debugfs:
-       mempool_destroy(gfs2_page_pool);
 fail_mempool:
        destroy_workqueue(gfs2_freeze_wq);
 fail_wq3: