]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
GFS2: Fix bug in gfs2_lock_fs_check_clean()
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 26 Nov 2008 12:49:26 +0000 (12:49 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 5 Jan 2009 07:39:11 +0000 (07:39 +0000)
gfs2_lock_fs_check_clean() should not be calling gfs2_jindex_hold()
since it doesn't work like rindex hold, despite the comment. That
allows gfs2_jindex_hold() to be moved into ops_fstype.c where it
can be made static.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/dir.h
fs/gfs2/ops_fstype.c
fs/gfs2/super.c
fs/gfs2/super.h

index 8a468cac9328abaa4a3b0444bf553caddcdac1ed..4f919440c3be3e20ed49c2acb742db6758096bea 100644 (file)
@@ -11,6 +11,7 @@
 #define __DIR_DOT_H__
 
 #include <linux/dcache.h>
+#include <linux/crc32.h>
 
 struct inode;
 struct gfs2_inode;
index fc300eafda841fe3a37a76772ffc64f3ade53935..4cae60f4a1758d1fde59186ec37227ca97bd8b9f 100644 (file)
@@ -33,6 +33,7 @@
 #include "util.h"
 #include "log.h"
 #include "quota.h"
+#include "dir.h"
 
 #define DO 0
 #define UNDO 1
@@ -638,6 +639,72 @@ static void gfs2_lm_others_may_mount(struct gfs2_sbd *sdp)
                                        sdp->sd_lockstruct.ls_lockspace);
 }
 
+/**
+ * gfs2_jindex_hold - Grab a lock on the jindex
+ * @sdp: The GFS2 superblock
+ * @ji_gh: the holder for the jindex glock
+ *
+ * Returns: errno
+ */
+
+static int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
+{
+       struct gfs2_inode *dip = GFS2_I(sdp->sd_jindex);
+       struct qstr name;
+       char buf[20];
+       struct gfs2_jdesc *jd;
+       int error;
+
+       name.name = buf;
+
+       mutex_lock(&sdp->sd_jindex_mutex);
+
+       for (;;) {
+               error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, ji_gh);
+               if (error)
+                       break;
+
+               name.len = sprintf(buf, "journal%u", sdp->sd_journals);
+               name.hash = gfs2_disk_hash(name.name, name.len);
+
+               error = gfs2_dir_check(sdp->sd_jindex, &name, NULL);
+               if (error == -ENOENT) {
+                       error = 0;
+                       break;
+               }
+
+               gfs2_glock_dq_uninit(ji_gh);
+
+               if (error)
+                       break;
+
+               error = -ENOMEM;
+               jd = kzalloc(sizeof(struct gfs2_jdesc), GFP_KERNEL);
+               if (!jd)
+                       break;
+
+               INIT_LIST_HEAD(&jd->extent_list);
+               jd->jd_inode = gfs2_lookupi(sdp->sd_jindex, &name, 1);
+               if (!jd->jd_inode || IS_ERR(jd->jd_inode)) {
+                       if (!jd->jd_inode)
+                               error = -ENOENT;
+                       else
+                               error = PTR_ERR(jd->jd_inode);
+                       kfree(jd);
+                       break;
+               }
+
+               spin_lock(&sdp->sd_jindex_spin);
+               jd->jd_jid = sdp->sd_journals++;
+               list_add_tail(&jd->jd_list, &sdp->sd_jindex_list);
+               spin_unlock(&sdp->sd_jindex_spin);
+       }
+
+       mutex_unlock(&sdp->sd_jindex_mutex);
+
+       return error;
+}
+
 static int init_journal(struct gfs2_sbd *sdp, int undo)
 {
        struct inode *master = sdp->sd_master_dir->d_inode;
index b85877062a48b87867624a10bb99c7e4f503487b..3dd9f5788cb04510fd8ed9d87c2a37602cd3d02a 100644 (file)
 #include "trans.h"
 #include "util.h"
 
-/**
- * gfs2_jindex_hold - Grab a lock on the jindex
- * @sdp: The GFS2 superblock
- * @ji_gh: the holder for the jindex glock
- *
- * This is very similar to the gfs2_rindex_hold() function, except that
- * in general we hold the jindex lock for longer periods of time and
- * we grab it far less frequently (in general) then the rgrp lock.
- *
- * Returns: errno
- */
-
-int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
-{
-       struct gfs2_inode *dip = GFS2_I(sdp->sd_jindex);
-       struct qstr name;
-       char buf[20];
-       struct gfs2_jdesc *jd;
-       int error;
-
-       name.name = buf;
-
-       mutex_lock(&sdp->sd_jindex_mutex);
-
-       for (;;) {
-               error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, ji_gh);
-               if (error)
-                       break;
-
-               name.len = sprintf(buf, "journal%u", sdp->sd_journals);
-               name.hash = gfs2_disk_hash(name.name, name.len);
-
-               error = gfs2_dir_check(sdp->sd_jindex, &name, NULL);
-               if (error == -ENOENT) {
-                       error = 0;
-                       break;
-               }
-
-               gfs2_glock_dq_uninit(ji_gh);
-
-               if (error)
-                       break;
-
-               error = -ENOMEM;
-               jd = kzalloc(sizeof(struct gfs2_jdesc), GFP_KERNEL);
-               if (!jd)
-                       break;
-
-               INIT_LIST_HEAD(&jd->extent_list);
-               jd->jd_inode = gfs2_lookupi(sdp->sd_jindex, &name, 1);
-               if (!jd->jd_inode || IS_ERR(jd->jd_inode)) {
-                       if (!jd->jd_inode)
-                               error = -ENOENT;
-                       else
-                               error = PTR_ERR(jd->jd_inode);
-                       kfree(jd);
-                       break;
-               }
-
-               spin_lock(&sdp->sd_jindex_spin);
-               jd->jd_jid = sdp->sd_journals++;
-               list_add_tail(&jd->jd_list, &sdp->sd_jindex_list);
-               spin_unlock(&sdp->sd_jindex_spin);
-       }
-
-       mutex_unlock(&sdp->sd_jindex_mutex);
-
-       return error;
-}
-
 /**
  * gfs2_jindex_free - Clear all the journal index information
  * @sdp: The GFS2 superblock
@@ -580,10 +510,6 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
        struct gfs2_log_header_host lh;
        int error;
 
-       error = gfs2_jindex_hold(sdp, &ji_gh);
-       if (error)
-               return error;
-
        list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
                lfcc = kmalloc(sizeof(struct lfcc), GFP_KERNEL);
                if (!lfcc) {
index 1848dad3ecbaa7e37f4a30b03ad6ec8ad50c7b29..c6254596713a7a9e0c260f81a4891e440834050d 100644 (file)
@@ -25,7 +25,6 @@ static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp)
        return x;
 }
 
-int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh);
 void gfs2_jindex_free(struct gfs2_sbd *sdp);
 
 struct gfs2_jdesc *gfs2_jdesc_find(struct gfs2_sbd *sdp, unsigned int jid);