From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Mon, 13 Jul 2015 20:19:35 +0100 Subject: [Cluster-devel] [GFS2 PATCH 1/2][TRY #2] GFS2: Move glock superblock pointer to field gl_name In-Reply-To: <910441860.37476260.1436794765629.JavaMail.zimbra@redhat.com> References: <1436466345-11383-1-git-send-email-rpeterso@redhat.com> <1436466345-11383-2-git-send-email-rpeterso@redhat.com> <55A39EA6.3050302@redhat.com> <910441860.37476260.1436794765629.JavaMail.zimbra@redhat.com> Message-ID: <55A40F47.1080002@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, On 13/07/15 14:39, Bob Peterson wrote: > Hi, > > ----- Original Message ----- >> Hi, >> >> On 09/07/15 19:25, Bob Peterson wrote: >>> What uniquely identifies a glock in the glock hash table is not >>> gl_name, but gl_name and its superblock pointer. This patch makes >>> the gl_name field correspond to a unique glock identifier. That will >>> allow us to simplify hashing with a future patch, since the hash >>> algorithm can then take the gl_name and hash its components in one >>> operation. >>> --- >> [snip] >>> diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h >>> index a1ec7c2..4de7853 100644 >>> --- a/fs/gfs2/incore.h >>> +++ b/fs/gfs2/incore.h >>> @@ -205,11 +205,13 @@ enum { >>> struct lm_lockname { >>> u64 ln_number; >>> unsigned int ln_type; >>> + struct gfs2_sbd *ln_sbd; >>> }; >>> >> This looks like its adding a hole on 64 bit arches... can we swap the >> order of ln_type and ln_sbd, or even make the sbd the first element of >> this? That way a memcmp of two of lm_locknames doesn't have to include >> the hole in the comparison, which I assume is what you want here? >> >> Steve. > Good catch. This replacement for patch #1 is identical except for > the placement of ln_sbd in the lm_lockname structure. > > Regards, > > Bob Peterson > Red Hat File Systems > --- That looks good now. Acked-by: Steven Whitehouse Steve. > commit 0ed2b820a4f3d44e447b3e724f5355cd2f7ee4ee > Author: Bob Peterson > Date: Mon Mar 16 11:52:05 2015 -0500 > > GFS2: Move glock superblock pointer to field gl_name > > What uniquely identifies a glock in the glock hash table is not > gl_name, but gl_name and its superblock pointer. This patch makes > the gl_name field correspond to a unique glock identifier. That will > allow us to simplify hashing with a future patch, since the hash > algorithm can then take the gl_name and hash its components in one > operation. > > Signed-off-by: Bob Peterson > --- > fs/gfs2/glock.c | 32 +++++++++++++++----------------- > fs/gfs2/glops.c | 38 ++++++++++++++++++++------------------ > fs/gfs2/incore.h | 9 +++++---- > fs/gfs2/lock_dlm.c | 10 +++++----- > fs/gfs2/lops.c | 6 +++--- > fs/gfs2/meta_io.c | 6 +++--- > fs/gfs2/meta_io.h | 2 +- > fs/gfs2/quota.c | 22 +++++++++++----------- > fs/gfs2/rgrp.c | 2 +- > fs/gfs2/trace_gfs2.h | 18 +++++++++--------- > fs/gfs2/trans.c | 4 ++-- > 11 files changed, 75 insertions(+), 74 deletions(-) > > diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c > index a38e38f..25e0389 100644 > --- a/fs/gfs2/glock.c > +++ b/fs/gfs2/glock.c > @@ -119,7 +119,7 @@ static void gfs2_glock_dealloc(struct rcu_head *rcu) > > void gfs2_glock_free(struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > > call_rcu(&gl->gl_rcu, gfs2_glock_dealloc); > if (atomic_dec_and_test(&sdp->sd_glock_disposal)) > @@ -192,7 +192,7 @@ static void gfs2_glock_remove_from_lru(struct gfs2_glock *gl) > > void gfs2_glock_put(struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct address_space *mapping = gfs2_glock2aspace(gl); > > if (lockref_put_or_lock(&gl->gl_lockref)) > @@ -220,7 +220,6 @@ void gfs2_glock_put(struct gfs2_glock *gl) > */ > > static struct gfs2_glock *search_bucket(unsigned int hash, > - const struct gfs2_sbd *sdp, > const struct lm_lockname *name) > { > struct gfs2_glock *gl; > @@ -229,8 +228,6 @@ static struct gfs2_glock *search_bucket(unsigned int hash, > hlist_bl_for_each_entry_rcu(gl, h, &gl_hash_table[hash], gl_list) { > if (!lm_name_equal(&gl->gl_name, name)) > continue; > - if (gl->gl_sbd != sdp) > - continue; > if (lockref_get_not_dead(&gl->gl_lockref)) > return gl; > } > @@ -506,7 +503,7 @@ __releases(&gl->gl_spin) > __acquires(&gl->gl_spin) > { > const struct gfs2_glock_operations *glops = gl->gl_ops; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > unsigned int lck_flags = gh ? gh->gh_flags : 0; > int ret; > > @@ -628,7 +625,7 @@ out_unlock: > static void delete_work_func(struct work_struct *work) > { > struct gfs2_glock *gl = container_of(work, struct gfs2_glock, gl_delete); > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_inode *ip; > struct inode *inode; > u64 no_addr = gl->gl_name.ln_number; > @@ -704,14 +701,16 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, > struct gfs2_glock **glp) > { > struct super_block *s = sdp->sd_vfs; > - struct lm_lockname name = { .ln_number = number, .ln_type = glops->go_type }; > + struct lm_lockname name = { .ln_number = number, > + .ln_type = glops->go_type, > + .ln_sbd = sdp }; > struct gfs2_glock *gl, *tmp; > unsigned int hash = gl_hash(sdp, &name); > struct address_space *mapping; > struct kmem_cache *cachep; > > rcu_read_lock(); > - gl = search_bucket(hash, sdp, &name); > + gl = search_bucket(hash, &name); > rcu_read_unlock(); > > *glp = gl; > @@ -739,7 +738,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, > } > > atomic_inc(&sdp->sd_glock_disposal); > - gl->gl_sbd = sdp; > gl->gl_flags = 0; > gl->gl_name = name; > gl->gl_lockref.count = 1; > @@ -772,7 +770,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, > } > > spin_lock_bucket(hash); > - tmp = search_bucket(hash, sdp, &name); > + tmp = search_bucket(hash, &name); > if (tmp) { > spin_unlock_bucket(hash); > kfree(gl->gl_lksb.sb_lvbptr); > @@ -928,7 +926,7 @@ __releases(&gl->gl_spin) > __acquires(&gl->gl_spin) > { > struct gfs2_glock *gl = gh->gh_gl; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct list_head *insert_pt = NULL; > struct gfs2_holder *gh2; > int try_futile = 0; > @@ -1006,7 +1004,7 @@ trap_recursive: > int gfs2_glock_nq(struct gfs2_holder *gh) > { > struct gfs2_glock *gl = gh->gh_gl; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > int error = 0; > > if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) > @@ -1313,7 +1311,7 @@ static int gfs2_should_freeze(const struct gfs2_glock *gl) > > void gfs2_glock_complete(struct gfs2_glock *gl, int ret) > { > - struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct; > + struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct; > > spin_lock(&gl->gl_spin); > gl->gl_reply = ret; > @@ -1471,7 +1469,7 @@ static void examine_bucket(glock_examiner examiner, const struct gfs2_sbd *sdp, > > rcu_read_lock(); > hlist_bl_for_each_entry_rcu(gl, pos, head, gl_list) { > - if ((gl->gl_sbd == sdp) && lockref_get_not_dead(&gl->gl_lockref)) > + if ((gl->gl_name.ln_sbd == sdp) && lockref_get_not_dead(&gl->gl_lockref)) > examiner(gl); > } > rcu_read_unlock(); > @@ -1569,7 +1567,7 @@ void gfs2_glock_finish_truncate(struct gfs2_inode *ip) > int ret; > > ret = gfs2_truncatei_resume(ip); > - gfs2_assert_withdraw(gl->gl_sbd, ret == 0); > + gfs2_assert_withdraw(gl->gl_name.ln_sbd, ret == 0); > > spin_lock(&gl->gl_spin); > clear_bit(GLF_LOCK, &gl->gl_flags); > @@ -1872,7 +1870,7 @@ static int gfs2_glock_iter_next(struct gfs2_glock_iter *gi) > gi->nhash = 0; > } > /* Skip entries for other sb and dead entries */ > - } while (gi->sdp != gi->gl->gl_sbd || > + } while (gi->sdp != gi->gl->gl_name.ln_sbd || > __lockref_is_dead(&gi->gl->gl_lockref)); > > return 0; > diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c > index fa3fa5e..1f6c9c3 100644 > --- a/fs/gfs2/glops.c > +++ b/fs/gfs2/glops.c > @@ -32,13 +32,15 @@ struct workqueue_struct *gfs2_freeze_wq; > > static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh) > { > - fs_err(gl->gl_sbd, "AIL buffer %p: blocknr %llu state 0x%08lx mapping %p page state 0x%lx\n", > + fs_err(gl->gl_name.ln_sbd, > + "AIL buffer %p: blocknr %llu state 0x%08lx mapping %p page " > + "state 0x%lx\n", > bh, (unsigned long long)bh->b_blocknr, bh->b_state, > bh->b_page->mapping, bh->b_page->flags); > - fs_err(gl->gl_sbd, "AIL glock %u:%llu mapping %p\n", > + fs_err(gl->gl_name.ln_sbd, "AIL glock %u:%llu mapping %p\n", > gl->gl_name.ln_type, gl->gl_name.ln_number, > gfs2_glock2aspace(gl)); > - gfs2_lm_withdraw(gl->gl_sbd, "AIL error\n"); > + gfs2_lm_withdraw(gl->gl_name.ln_sbd, "AIL error\n"); > } > > /** > @@ -52,7 +54,7 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh) > static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync, > unsigned int nr_revokes) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct list_head *head = &gl->gl_ail_list; > struct gfs2_bufdata *bd, *tmp; > struct buffer_head *bh; > @@ -80,7 +82,7 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync, > > static void gfs2_ail_empty_gl(struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_trans tr; > > memset(&tr, 0, sizeof(tr)); > @@ -109,7 +111,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) > > void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > unsigned int revokes = atomic_read(&gl->gl_ail_count); > unsigned int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64); > int ret; > @@ -139,7 +141,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) > > static void rgrp_go_sync(struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct address_space *mapping = &sdp->sd_aspace; > struct gfs2_rgrpd *rgd; > int error; > @@ -179,7 +181,7 @@ static void rgrp_go_sync(struct gfs2_glock *gl) > > static void rgrp_go_inval(struct gfs2_glock *gl, int flags) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct address_space *mapping = &sdp->sd_aspace; > struct gfs2_rgrpd *rgd = gl->gl_object; > > @@ -218,7 +220,7 @@ static void inode_go_sync(struct gfs2_glock *gl) > > GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE); > > - gfs2_log_flush(gl->gl_sbd, gl, NORMAL_FLUSH); > + gfs2_log_flush(gl->gl_name.ln_sbd, gl, NORMAL_FLUSH); > filemap_fdatawrite(metamapping); > if (ip) { > struct address_space *mapping = ip->i_inode.i_mapping; > @@ -252,7 +254,7 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags) > { > struct gfs2_inode *ip = gl->gl_object; > > - gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count)); > + gfs2_assert_withdraw(gl->gl_name.ln_sbd, !atomic_read(&gl->gl_ail_count)); > > if (flags & DIO_METADATA) { > struct address_space *mapping = gfs2_glock2aspace(gl); > @@ -264,9 +266,9 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags) > } > } > > - if (ip == GFS2_I(gl->gl_sbd->sd_rindex)) { > - gfs2_log_flush(gl->gl_sbd, NULL, NORMAL_FLUSH); > - gl->gl_sbd->sd_rindex_uptodate = 0; > + if (ip == GFS2_I(gl->gl_name.ln_sbd->sd_rindex)) { > + gfs2_log_flush(gl->gl_name.ln_sbd, NULL, NORMAL_FLUSH); > + gl->gl_name.ln_sbd->sd_rindex_uptodate = 0; > } > if (ip && S_ISREG(ip->i_inode.i_mode)) > truncate_inode_pages(ip->i_inode.i_mapping, 0); > @@ -281,7 +283,7 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags) > > static int inode_go_demote_ok(const struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_holder *gh; > > if (sdp->sd_jindex == gl->gl_object || sdp->sd_rindex == gl->gl_object) > @@ -416,7 +418,7 @@ int gfs2_inode_refresh(struct gfs2_inode *ip) > static int inode_go_lock(struct gfs2_holder *gh) > { > struct gfs2_glock *gl = gh->gh_gl; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_inode *ip = gl->gl_object; > int error = 0; > > @@ -477,7 +479,7 @@ static void inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl) > static void freeze_go_sync(struct gfs2_glock *gl) > { > int error = 0; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > > if (gl->gl_state == LM_ST_SHARED && > test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { > @@ -500,7 +502,7 @@ static void freeze_go_sync(struct gfs2_glock *gl) > > static int freeze_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode); > struct gfs2_glock *j_gl = ip->i_gl; > struct gfs2_log_header_host head; > @@ -545,7 +547,7 @@ static int freeze_go_demote_ok(const struct gfs2_glock *gl) > static void iopen_go_callback(struct gfs2_glock *gl, bool remote) > { > struct gfs2_inode *ip = (struct gfs2_inode *)gl->gl_object; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > > if (!remote || (sdp->sd_vfs->s_flags & MS_RDONLY)) > return; > diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h > index a1ec7c2..35a55f3 100644 > --- a/fs/gfs2/incore.h > +++ b/fs/gfs2/incore.h > @@ -203,13 +203,15 @@ enum { > }; > > struct lm_lockname { > + struct gfs2_sbd *ln_sbd; > u64 ln_number; > unsigned int ln_type; > }; > > #define lm_name_equal(name1, name2) \ > - (((name1)->ln_number == (name2)->ln_number) && \ > - ((name1)->ln_type == (name2)->ln_type)) > + (((name1)->ln_number == (name2)->ln_number) && \ > + ((name1)->ln_type == (name2)->ln_type) && \ > + ((name1)->ln_sbd == (name2)->ln_sbd)) > > > struct gfs2_glock_operations { > @@ -327,7 +329,6 @@ enum { > > struct gfs2_glock { > struct hlist_bl_node gl_list; > - struct gfs2_sbd *gl_sbd; > unsigned long gl_flags; /* GLF_... */ > struct lm_lockname gl_name; > > @@ -835,7 +836,7 @@ static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which) > > static inline void gfs2_sbstats_inc(const struct gfs2_glock *gl, int which) > { > - const struct gfs2_sbd *sdp = gl->gl_sbd; > + const struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > preempt_disable(); > this_cpu_ptr(sdp->sd_lkstats)->lkstats[gl->gl_name.ln_type].stats[which]++; > preempt_enable(); > diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c > index 641383a..c962cfc 100644 > --- a/fs/gfs2/lock_dlm.c > +++ b/fs/gfs2/lock_dlm.c > @@ -80,7 +80,7 @@ static inline void gfs2_update_reply_times(struct gfs2_glock *gl) > > preempt_disable(); > rtt = ktime_to_ns(ktime_sub(ktime_get_real(), gl->gl_dstamp)); > - lks = this_cpu_ptr(gl->gl_sbd->sd_lkstats); > + lks = this_cpu_ptr(gl->gl_name.ln_sbd->sd_lkstats); > gfs2_update_stats(&gl->gl_stats, index, rtt); /* Local */ > gfs2_update_stats(&lks->lkstats[gltype], index, rtt); /* Global */ > preempt_enable(); > @@ -108,7 +108,7 @@ static inline void gfs2_update_request_times(struct gfs2_glock *gl) > dstamp = gl->gl_dstamp; > gl->gl_dstamp = ktime_get_real(); > irt = ktime_to_ns(ktime_sub(gl->gl_dstamp, dstamp)); > - lks = this_cpu_ptr(gl->gl_sbd->sd_lkstats); > + lks = this_cpu_ptr(gl->gl_name.ln_sbd->sd_lkstats); > gfs2_update_stats(&gl->gl_stats, GFS2_LKS_SIRT, irt); /* Local */ > gfs2_update_stats(&lks->lkstats[gltype], GFS2_LKS_SIRT, irt); /* Global */ > preempt_enable(); > @@ -253,7 +253,7 @@ static void gfs2_reverse_hex(char *c, u64 value) > static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state, > unsigned int flags) > { > - struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct; > + struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct; > int req; > u32 lkf; > char strname[GDLM_STRNAME_BYTES] = ""; > @@ -281,7 +281,7 @@ static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state, > > static void gdlm_put_lock(struct gfs2_glock *gl) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct lm_lockstruct *ls = &sdp->sd_lockstruct; > int lvb_needs_unlock = 0; > int error; > @@ -319,7 +319,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl) > > static void gdlm_cancel(struct gfs2_glock *gl) > { > - struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct; > + struct lm_lockstruct *ls = &gl->gl_name.ln_sbd->sd_lockstruct; > dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_CANCEL, NULL, gl); > } > > diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c > index 2c1ae86..7833394 100644 > --- a/fs/gfs2/lops.c > +++ b/fs/gfs2/lops.c > @@ -70,7 +70,7 @@ static bool buffer_is_rgrp(const struct gfs2_bufdata *bd) > static void maybe_release_space(struct gfs2_bufdata *bd) > { > struct gfs2_glock *gl = bd->bd_gl; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_rgrpd *rgd = gl->gl_object; > unsigned int index = bd->bd_bh->b_blocknr - gl->gl_name.ln_number; > struct gfs2_bitmap *bi = rgd->rd_bits + index; > @@ -585,7 +585,7 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, > static void gfs2_meta_sync(struct gfs2_glock *gl) > { > struct address_space *mapping = gfs2_glock2aspace(gl); > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > int error; > > if (mapping == NULL) > @@ -595,7 +595,7 @@ static void gfs2_meta_sync(struct gfs2_glock *gl) > error = filemap_fdatawait(mapping); > > if (error) > - gfs2_io_error(gl->gl_sbd); > + gfs2_io_error(gl->gl_name.ln_sbd); > } > > static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) > diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c > index b984a6e..0e1d4be 100644 > --- a/fs/gfs2/meta_io.c > +++ b/fs/gfs2/meta_io.c > @@ -114,7 +114,7 @@ const struct address_space_operations gfs2_rgrp_aops = { > struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create) > { > struct address_space *mapping = gfs2_glock2aspace(gl); > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct page *page; > struct buffer_head *bh; > unsigned int shift; > @@ -200,7 +200,7 @@ struct buffer_head *gfs2_meta_new(struct gfs2_glock *gl, u64 blkno) > int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, > struct buffer_head **bhp) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct buffer_head *bh; > > if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) { > @@ -362,7 +362,7 @@ int gfs2_meta_indirect_buffer(struct gfs2_inode *ip, int height, u64 num, > > struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) > { > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct buffer_head *first_bh, *bh; > u32 max_ra = gfs2_tune_get(sdp, gt_max_readahead) >> > sdp->sd_sb.sb_bsize_shift; > diff --git a/fs/gfs2/meta_io.h b/fs/gfs2/meta_io.h > index ac5d802..8ca1615 100644 > --- a/fs/gfs2/meta_io.h > +++ b/fs/gfs2/meta_io.h > @@ -44,7 +44,7 @@ static inline struct gfs2_sbd *gfs2_mapping2sbd(struct address_space *mapping) > { > struct inode *inode = mapping->host; > if (mapping->a_ops == &gfs2_meta_aops) > - return (((struct gfs2_glock *)mapping) - 1)->gl_sbd; > + return (((struct gfs2_glock *)mapping) - 1)->gl_name.ln_sbd; > else if (mapping->a_ops == &gfs2_rgrp_aops) > return container_of(mapping, struct gfs2_sbd, sd_aspace); > else > diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c > index 9b61f92..3a31226 100644 > --- a/fs/gfs2/quota.c > +++ b/fs/gfs2/quota.c > @@ -119,7 +119,7 @@ static void gfs2_qd_dispose(struct list_head *list) > > while (!list_empty(list)) { > qd = list_entry(list->next, struct gfs2_quota_data, qd_lru); > - sdp = qd->qd_gl->gl_sbd; > + sdp = qd->qd_gl->gl_name.ln_sbd; > > list_del(&qd->qd_lru); > > @@ -302,7 +302,7 @@ static int qd_get(struct gfs2_sbd *sdp, struct kqid qid, > > static void qd_hold(struct gfs2_quota_data *qd) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > gfs2_assert(sdp, !__lockref_is_dead(&qd->qd_lockref)); > lockref_get(&qd->qd_lockref); > } > @@ -367,7 +367,7 @@ static void slot_put(struct gfs2_quota_data *qd) > > static int bh_get(struct gfs2_quota_data *qd) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode); > unsigned int block, offset; > struct buffer_head *bh; > @@ -414,7 +414,7 @@ fail: > > static void bh_put(struct gfs2_quota_data *qd) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > > mutex_lock(&sdp->sd_quota_mutex); > gfs2_assert(sdp, qd->qd_bh_count); > @@ -486,7 +486,7 @@ static int qd_fish(struct gfs2_sbd *sdp, struct gfs2_quota_data **qdp) > > static void qd_unlock(struct gfs2_quota_data *qd) > { > - gfs2_assert_warn(qd->qd_gl->gl_sbd, > + gfs2_assert_warn(qd->qd_gl->gl_name.ln_sbd, > test_bit(QDF_LOCKED, &qd->qd_flags)); > clear_bit(QDF_LOCKED, &qd->qd_flags); > bh_put(qd); > @@ -614,7 +614,7 @@ static int sort_qd(const void *a, const void *b) > > static void do_qc(struct gfs2_quota_data *qd, s64 change) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode); > struct gfs2_quota_change *qc = qd->qd_bh_qc; > s64 x; > @@ -831,7 +831,7 @@ static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, > > static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) > { > - struct gfs2_sbd *sdp = (*qda)->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = (*qda)->qd_gl->gl_name.ln_sbd; > struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); > struct gfs2_alloc_parms ap = { .aflags = 0, }; > unsigned int data_blocks, ind_blocks; > @@ -922,7 +922,7 @@ out: > gfs2_glock_dq_uninit(&ghs[qx]); > mutex_unlock(&ip->i_inode.i_mutex); > kfree(ghs); > - gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl, NORMAL_FLUSH); > + gfs2_log_flush(ip->i_gl->gl_name.ln_sbd, ip->i_gl, NORMAL_FLUSH); > return error; > } > > @@ -954,7 +954,7 @@ static int update_qd(struct gfs2_sbd *sdp, struct gfs2_quota_data *qd) > static int do_glock(struct gfs2_quota_data *qd, int force_refresh, > struct gfs2_holder *q_gh) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); > struct gfs2_holder i_gh; > int error; > @@ -1037,7 +1037,7 @@ int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid) > > static int need_sync(struct gfs2_quota_data *qd) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > struct gfs2_tune *gt = &sdp->sd_tune; > s64 value; > unsigned int num, den; > @@ -1125,7 +1125,7 @@ out: > > static int print_message(struct gfs2_quota_data *qd, char *type) > { > - struct gfs2_sbd *sdp = qd->qd_gl->gl_sbd; > + struct gfs2_sbd *sdp = qd->qd_gl->gl_name.ln_sbd; > > fs_info(sdp, "quota %s for %s %u\n", > type, > diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c > index c6c6232..c92ae7fd 100644 > --- a/fs/gfs2/rgrp.c > +++ b/fs/gfs2/rgrp.c > @@ -1860,7 +1860,7 @@ static void try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked, u64 skip > static bool gfs2_rgrp_congested(const struct gfs2_rgrpd *rgd, int loops) > { > const struct gfs2_glock *gl = rgd->rd_gl; > - const struct gfs2_sbd *sdp = gl->gl_sbd; > + const struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_lkstats *st; > s64 r_dcount, l_dcount; > s64 l_srttb, a_srttb = 0; > diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h > index 20c007d..fff47d0 100644 > --- a/fs/gfs2/trace_gfs2.h > +++ b/fs/gfs2/trace_gfs2.h > @@ -104,7 +104,7 @@ TRACE_EVENT(gfs2_glock_state_change, > ), > > TP_fast_assign( > - __entry->dev = gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->glnum = gl->gl_name.ln_number; > __entry->gltype = gl->gl_name.ln_type; > __entry->cur_state = glock_trace_state(gl->gl_state); > @@ -140,7 +140,7 @@ TRACE_EVENT(gfs2_glock_put, > ), > > TP_fast_assign( > - __entry->dev = gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->gltype = gl->gl_name.ln_type; > __entry->glnum = gl->gl_name.ln_number; > __entry->cur_state = glock_trace_state(gl->gl_state); > @@ -174,7 +174,7 @@ TRACE_EVENT(gfs2_demote_rq, > ), > > TP_fast_assign( > - __entry->dev = gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->gltype = gl->gl_name.ln_type; > __entry->glnum = gl->gl_name.ln_number; > __entry->cur_state = glock_trace_state(gl->gl_state); > @@ -209,7 +209,7 @@ TRACE_EVENT(gfs2_promote, > ), > > TP_fast_assign( > - __entry->dev = gh->gh_gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gh->gh_gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->glnum = gh->gh_gl->gl_name.ln_number; > __entry->gltype = gh->gh_gl->gl_name.ln_type; > __entry->first = first; > @@ -239,7 +239,7 @@ TRACE_EVENT(gfs2_glock_queue, > ), > > TP_fast_assign( > - __entry->dev = gh->gh_gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gh->gh_gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->glnum = gh->gh_gl->gl_name.ln_number; > __entry->gltype = gh->gh_gl->gl_name.ln_type; > __entry->queue = queue; > @@ -278,7 +278,7 @@ TRACE_EVENT(gfs2_glock_lock_time, > ), > > TP_fast_assign( > - __entry->dev = gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->glnum = gl->gl_name.ln_number; > __entry->gltype = gl->gl_name.ln_type; > __entry->status = gl->gl_lksb.sb_status; > @@ -333,7 +333,7 @@ TRACE_EVENT(gfs2_pin, > ), > > TP_fast_assign( > - __entry->dev = bd->bd_gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = bd->bd_gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->pin = pin; > __entry->len = bd->bd_bh->b_size; > __entry->block = bd->bd_bh->b_blocknr; > @@ -449,7 +449,7 @@ TRACE_EVENT(gfs2_bmap, > ), > > TP_fast_assign( > - __entry->dev = ip->i_gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = ip->i_gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->lblock = lblock; > __entry->pblock = buffer_mapped(bh) ? bh->b_blocknr : 0; > __entry->inum = ip->i_no_addr; > @@ -489,7 +489,7 @@ TRACE_EVENT(gfs2_block_alloc, > ), > > TP_fast_assign( > - __entry->dev = rgd->rd_gl->gl_sbd->sd_vfs->s_dev; > + __entry->dev = rgd->rd_gl->gl_name.ln_sbd->sd_vfs->s_dev; > __entry->start = block; > __entry->inum = ip->i_no_addr; > __entry->len = len; > diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c > index 88bff24..b95d0d6 100644 > --- a/fs/gfs2/trans.c > +++ b/fs/gfs2/trans.c > @@ -158,7 +158,7 @@ static struct gfs2_bufdata *gfs2_alloc_bufdata(struct gfs2_glock *gl, > void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh) > { > struct gfs2_trans *tr = current->journal_info; > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct address_space *mapping = bh->b_page->mapping; > struct gfs2_inode *ip = GFS2_I(mapping->host); > struct gfs2_bufdata *bd; > @@ -224,7 +224,7 @@ static void meta_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) > void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh) > { > > - struct gfs2_sbd *sdp = gl->gl_sbd; > + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_bufdata *bd; > > lock_buffer(bh);