lkml.org 
[lkml]   [2008]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 19/24] GFS2: Fix bug in gfs2_lock_fs_check_clean()
    Date
    From: Steven Whitehouse <swhiteho@redhat.com>

    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>

    diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h
    index 8a468ca..4f91944 100644
    --- a/fs/gfs2/dir.h
    +++ b/fs/gfs2/dir.h
    @@ -11,6 +11,7 @@
    #define __DIR_DOT_H__

    #include <linux/dcache.h>
    +#include <linux/crc32.h>

    struct inode;
    struct gfs2_inode;
    diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
    index fc300ea..4cae60f 100644
    --- a/fs/gfs2/ops_fstype.c
    +++ b/fs/gfs2/ops_fstype.c
    @@ -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;
    diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
    index b858770..3dd9f57 100644
    --- a/fs/gfs2/super.c
    +++ b/fs/gfs2/super.c
    @@ -34,76 +34,6 @@
    #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) {
    diff --git a/fs/gfs2/super.h b/fs/gfs2/super.h
    index 1848dad..c625459 100644
    --- a/fs/gfs2/super.h
    +++ b/fs/gfs2/super.h
    @@ -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);
    --
    1.6.0.3


    \
     
     \ /
      Last update: 2008-12-17 13:39    [W:0.032 / U:0.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site