|
@@ -96,39 +96,6 @@ struct gfs2_jdesc *gfs2_jdesc_find(struct gfs2_sbd *sdp, unsigned int jid)
|
|
return jd;
|
|
return jd;
|
|
}
|
|
}
|
|
|
|
|
|
-void gfs2_jdesc_make_dirty(struct gfs2_sbd *sdp, unsigned int jid)
|
|
|
|
-{
|
|
|
|
- struct gfs2_jdesc *jd;
|
|
|
|
-
|
|
|
|
- spin_lock(&sdp->sd_jindex_spin);
|
|
|
|
- jd = jdesc_find_i(&sdp->sd_jindex_list, jid);
|
|
|
|
- if (jd)
|
|
|
|
- jd->jd_dirty = 1;
|
|
|
|
- spin_unlock(&sdp->sd_jindex_spin);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-struct gfs2_jdesc *gfs2_jdesc_find_dirty(struct gfs2_sbd *sdp)
|
|
|
|
-{
|
|
|
|
- struct gfs2_jdesc *jd;
|
|
|
|
- int found = 0;
|
|
|
|
-
|
|
|
|
- spin_lock(&sdp->sd_jindex_spin);
|
|
|
|
-
|
|
|
|
- list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
|
|
|
|
- if (jd->jd_dirty) {
|
|
|
|
- jd->jd_dirty = 0;
|
|
|
|
- found = 1;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- spin_unlock(&sdp->sd_jindex_spin);
|
|
|
|
-
|
|
|
|
- if (!found)
|
|
|
|
- jd = NULL;
|
|
|
|
-
|
|
|
|
- return jd;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int gfs2_jdesc_check(struct gfs2_jdesc *jd)
|
|
int gfs2_jdesc_check(struct gfs2_jdesc *jd)
|
|
{
|
|
{
|
|
struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
|
|
struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
|
|
@@ -353,137 +320,6 @@ out:
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * gfs2_statfs_i - Do a statfs
|
|
|
|
- * @sdp: the filesystem
|
|
|
|
- * @sg: the sg structure
|
|
|
|
- *
|
|
|
|
- * Returns: errno
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-int gfs2_statfs_i(struct gfs2_sbd *sdp, struct gfs2_statfs_change_host *sc)
|
|
|
|
-{
|
|
|
|
- struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
|
|
|
|
- struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
|
|
|
|
-
|
|
|
|
- spin_lock(&sdp->sd_statfs_spin);
|
|
|
|
-
|
|
|
|
- *sc = *m_sc;
|
|
|
|
- sc->sc_total += l_sc->sc_total;
|
|
|
|
- sc->sc_free += l_sc->sc_free;
|
|
|
|
- sc->sc_dinodes += l_sc->sc_dinodes;
|
|
|
|
-
|
|
|
|
- spin_unlock(&sdp->sd_statfs_spin);
|
|
|
|
-
|
|
|
|
- if (sc->sc_free < 0)
|
|
|
|
- sc->sc_free = 0;
|
|
|
|
- if (sc->sc_free > sc->sc_total)
|
|
|
|
- sc->sc_free = sc->sc_total;
|
|
|
|
- if (sc->sc_dinodes < 0)
|
|
|
|
- sc->sc_dinodes = 0;
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * statfs_fill - fill in the sg for a given RG
|
|
|
|
- * @rgd: the RG
|
|
|
|
- * @sc: the sc structure
|
|
|
|
- *
|
|
|
|
- * Returns: 0 on success, -ESTALE if the LVB is invalid
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static int statfs_slow_fill(struct gfs2_rgrpd *rgd,
|
|
|
|
- struct gfs2_statfs_change_host *sc)
|
|
|
|
-{
|
|
|
|
- gfs2_rgrp_verify(rgd);
|
|
|
|
- sc->sc_total += rgd->rd_data;
|
|
|
|
- sc->sc_free += rgd->rd_free;
|
|
|
|
- sc->sc_dinodes += rgd->rd_dinodes;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * gfs2_statfs_slow - Stat a filesystem using asynchronous locking
|
|
|
|
- * @sdp: the filesystem
|
|
|
|
- * @sc: the sc info that will be returned
|
|
|
|
- *
|
|
|
|
- * Any error (other than a signal) will cause this routine to fall back
|
|
|
|
- * to the synchronous version.
|
|
|
|
- *
|
|
|
|
- * FIXME: This really shouldn't busy wait like this.
|
|
|
|
- *
|
|
|
|
- * Returns: errno
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-int gfs2_statfs_slow(struct gfs2_sbd *sdp, struct gfs2_statfs_change_host *sc)
|
|
|
|
-{
|
|
|
|
- struct gfs2_holder ri_gh;
|
|
|
|
- struct gfs2_rgrpd *rgd_next;
|
|
|
|
- struct gfs2_holder *gha, *gh;
|
|
|
|
- unsigned int slots = 64;
|
|
|
|
- unsigned int x;
|
|
|
|
- int done;
|
|
|
|
- int error = 0, err;
|
|
|
|
-
|
|
|
|
- memset(sc, 0, sizeof(struct gfs2_statfs_change_host));
|
|
|
|
- gha = kcalloc(slots, sizeof(struct gfs2_holder), GFP_KERNEL);
|
|
|
|
- if (!gha)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
- error = gfs2_rindex_hold(sdp, &ri_gh);
|
|
|
|
- if (error)
|
|
|
|
- goto out;
|
|
|
|
-
|
|
|
|
- rgd_next = gfs2_rgrpd_get_first(sdp);
|
|
|
|
-
|
|
|
|
- for (;;) {
|
|
|
|
- done = 1;
|
|
|
|
-
|
|
|
|
- for (x = 0; x < slots; x++) {
|
|
|
|
- gh = gha + x;
|
|
|
|
-
|
|
|
|
- if (gh->gh_gl && gfs2_glock_poll(gh)) {
|
|
|
|
- err = gfs2_glock_wait(gh);
|
|
|
|
- if (err) {
|
|
|
|
- gfs2_holder_uninit(gh);
|
|
|
|
- error = err;
|
|
|
|
- } else {
|
|
|
|
- if (!error)
|
|
|
|
- error = statfs_slow_fill(
|
|
|
|
- gh->gh_gl->gl_object, sc);
|
|
|
|
- gfs2_glock_dq_uninit(gh);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (gh->gh_gl)
|
|
|
|
- done = 0;
|
|
|
|
- else if (rgd_next && !error) {
|
|
|
|
- error = gfs2_glock_nq_init(rgd_next->rd_gl,
|
|
|
|
- LM_ST_SHARED,
|
|
|
|
- GL_ASYNC,
|
|
|
|
- gh);
|
|
|
|
- rgd_next = gfs2_rgrpd_get_next(rgd_next);
|
|
|
|
- done = 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (signal_pending(current))
|
|
|
|
- error = -ERESTARTSYS;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (done)
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- yield();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- gfs2_glock_dq_uninit(&ri_gh);
|
|
|
|
-
|
|
|
|
-out:
|
|
|
|
- kfree(gha);
|
|
|
|
- return error;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
struct lfcc {
|
|
struct lfcc {
|
|
struct list_head list;
|
|
struct list_head list;
|
|
struct gfs2_holder gh;
|
|
struct gfs2_holder gh;
|