* [Cluster-devel] GFS2: Pre-pull patch posting @ 2010-03-01 15:08 Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 1/5] GFS2: Metadata address space clean up Steven Whitehouse 0 siblings, 1 reply; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Not so many patches for GFS2 this merge window. The bulk of the changes are aimed at reducing overheads when caching large numbers of inodes and the consequent simplification of the umount code, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] [PATCH 1/5] GFS2: Metadata address space clean up 2010-03-01 15:08 [Cluster-devel] GFS2: Pre-pull patch posting Steven Whitehouse @ 2010-03-01 15:08 ` Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 2/5] GFS2: Remove loopy umount code Steven Whitehouse 0 siblings, 1 reply; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com Since the start of GFS2, an "extra" inode has been used to store the metadata belonging to each inode. The only reason for using this inode was to have an extra address space, the other fields were unused. This means that the memory usage was rather inefficient. The reason for keeping each inode's metadata in a separate address space is that when glocks are requested on remote nodes, we need to be able to efficiently locate the data and metadata which relating to that glock (inode) in order to sync or sync and invalidate it (depending on the remotely requested lock mode). This patch adds a new type of glock, which has in addition to its normal fields, has an address space. This applies to all inode and rgrp glocks (but to no other glock types which remain as before). As a result, we no longer need to have the second inode. This results in three major improvements: 1. A saving of approx 25% of memory used in caching inodes 2. A removal of the circular dependency between inodes and glocks 3. No confusion between "normal" and "metadata" inodes in super.c Although the first of these is the more immediately apparent, the second is just as important as it now enables a number of clean ups at umount time. Those will be the subject of future patches. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --- fs/gfs2/aops.c | 4 ++-- fs/gfs2/glock.c | 40 +++++++++++++++++++++------------------- fs/gfs2/glock.h | 7 +++++++ fs/gfs2/glops.c | 16 +++++++++------- fs/gfs2/incore.h | 4 ++-- fs/gfs2/inode.c | 6 ++---- fs/gfs2/lock_dlm.c | 5 ++++- fs/gfs2/main.c | 28 ++++++++++++++++++++++++++++ fs/gfs2/meta_io.c | 46 ++++++---------------------------------------- fs/gfs2/meta_io.h | 12 ++++++++++-- fs/gfs2/super.c | 26 ++++++++------------------ fs/gfs2/util.c | 1 + fs/gfs2/util.h | 1 + 13 files changed, 101 insertions(+), 95 deletions(-) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 7b8da94..0c1d0b8 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -1061,8 +1061,8 @@ out: int gfs2_releasepage(struct page *page, gfp_t gfp_mask) { - struct inode *aspace = page->mapping->host; - struct gfs2_sbd *sdp = aspace->i_sb->s_fs_info; + struct address_space *mapping = page->mapping; + struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping); struct buffer_head *bh, *head; struct gfs2_bufdata *bd; diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index f426633..dfb10a4 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -154,12 +154,14 @@ static unsigned int gl_hash(const struct gfs2_sbd *sdp, static void glock_free(struct gfs2_glock *gl) { struct gfs2_sbd *sdp = gl->gl_sbd; - struct inode *aspace = gl->gl_aspace; + struct address_space *mapping = gfs2_glock2aspace(gl); + struct kmem_cache *cachep = gfs2_glock_cachep; - if (aspace) - gfs2_aspace_put(aspace); + GLOCK_BUG_ON(gl, mapping && mapping->nrpages); trace_gfs2_glock_put(gl); - sdp->sd_lockstruct.ls_ops->lm_put_lock(gfs2_glock_cachep, gl); + if (mapping) + cachep = gfs2_glock_aspace_cachep; + sdp->sd_lockstruct.ls_ops->lm_put_lock(cachep, gl); } /** @@ -750,10 +752,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, const struct gfs2_glock_operations *glops, int create, struct gfs2_glock **glp) { + struct super_block *s = sdp->sd_vfs; struct lm_lockname name = { .ln_number = number, .ln_type = glops->go_type }; struct gfs2_glock *gl, *tmp; unsigned int hash = gl_hash(sdp, &name); - int error; + struct address_space *mapping; read_lock(gl_lock_addr(hash)); gl = search_bucket(hash, sdp, &name); @@ -765,7 +768,10 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, if (!create) return -ENOENT; - gl = kmem_cache_alloc(gfs2_glock_cachep, GFP_KERNEL); + if (glops->go_flags & GLOF_ASPACE) + gl = kmem_cache_alloc(gfs2_glock_aspace_cachep, GFP_KERNEL); + else + gl = kmem_cache_alloc(gfs2_glock_cachep, GFP_KERNEL); if (!gl) return -ENOMEM; @@ -784,18 +790,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, gl->gl_tchange = jiffies; gl->gl_object = NULL; gl->gl_sbd = sdp; - gl->gl_aspace = NULL; INIT_DELAYED_WORK(&gl->gl_work, glock_work_func); INIT_WORK(&gl->gl_delete, delete_work_func); - /* If this glock protects actual on-disk data or metadata blocks, - create a VFS inode to manage the pages/buffers holding them. */ - if (glops == &gfs2_inode_glops || glops == &gfs2_rgrp_glops) { - gl->gl_aspace = gfs2_aspace_get(sdp); - if (!gl->gl_aspace) { - error = -ENOMEM; - goto fail; - } + mapping = gfs2_glock2aspace(gl); + if (mapping) { + mapping->a_ops = &gfs2_meta_aops; + mapping->host = s->s_bdev->bd_inode; + mapping->flags = 0; + mapping_set_gfp_mask(mapping, GFP_NOFS); + mapping->assoc_mapping = NULL; + mapping->backing_dev_info = s->s_bdi; + mapping->writeback_index = 0; } write_lock(gl_lock_addr(hash)); @@ -812,10 +818,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, *glp = gl; return 0; - -fail: - kmem_cache_free(gfs2_glock_cachep, gl); - return error; } /** diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h index c0262fa..2bda191 100644 --- a/fs/gfs2/glock.h +++ b/fs/gfs2/glock.h @@ -180,6 +180,13 @@ static inline int gfs2_glock_is_held_shrd(struct gfs2_glock *gl) return gl->gl_state == LM_ST_SHARED; } +static inline struct address_space *gfs2_glock2aspace(struct gfs2_glock *gl) +{ + if (gl->gl_ops->go_flags & GLOF_ASPACE) + return (struct address_space *)(gl + 1); + return NULL; +} + int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, const struct gfs2_glock_operations *glops, int create, struct gfs2_glock **glp); diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 78554ac..38e3749 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -87,7 +87,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) static void rgrp_go_sync(struct gfs2_glock *gl) { - struct address_space *metamapping = gl->gl_aspace->i_mapping; + struct address_space *metamapping = gfs2_glock2aspace(gl); int error; if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) @@ -113,7 +113,7 @@ static void rgrp_go_sync(struct gfs2_glock *gl) static void rgrp_go_inval(struct gfs2_glock *gl, int flags) { - struct address_space *mapping = gl->gl_aspace->i_mapping; + struct address_space *mapping = gfs2_glock2aspace(gl); BUG_ON(!(flags & DIO_METADATA)); gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count)); @@ -134,7 +134,7 @@ static void rgrp_go_inval(struct gfs2_glock *gl, int flags) static void inode_go_sync(struct gfs2_glock *gl) { struct gfs2_inode *ip = gl->gl_object; - struct address_space *metamapping = gl->gl_aspace->i_mapping; + struct address_space *metamapping = gfs2_glock2aspace(gl); int error; if (ip && !S_ISREG(ip->i_inode.i_mode)) @@ -183,7 +183,7 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags) gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count)); if (flags & DIO_METADATA) { - struct address_space *mapping = gl->gl_aspace->i_mapping; + struct address_space *mapping = gfs2_glock2aspace(gl); truncate_inode_pages(mapping, 0); if (ip) { set_bit(GIF_INVALID, &ip->i_flags); @@ -282,7 +282,8 @@ static int inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl) static int rgrp_go_demote_ok(const struct gfs2_glock *gl) { - return !gl->gl_aspace->i_mapping->nrpages; + const struct address_space *mapping = (const struct address_space *)(gl + 1); + return !mapping->nrpages; } /** @@ -387,8 +388,7 @@ static void iopen_go_callback(struct gfs2_glock *gl) struct gfs2_inode *ip = (struct gfs2_inode *)gl->gl_object; if (gl->gl_demote_state == LM_ST_UNLOCKED && - gl->gl_state == LM_ST_SHARED && - ip && test_bit(GIF_USER, &ip->i_flags)) { + gl->gl_state == LM_ST_SHARED && ip) { gfs2_glock_hold(gl); if (queue_work(gfs2_delete_workqueue, &gl->gl_delete) == 0) gfs2_glock_put_nolock(gl); @@ -407,6 +407,7 @@ const struct gfs2_glock_operations gfs2_inode_glops = { .go_dump = inode_go_dump, .go_type = LM_TYPE_INODE, .go_min_hold_time = HZ / 5, + .go_flags = GLOF_ASPACE, }; const struct gfs2_glock_operations gfs2_rgrp_glops = { @@ -418,6 +419,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = { .go_dump = gfs2_rgrp_dump, .go_type = LM_TYPE_RGRP, .go_min_hold_time = HZ / 5, + .go_flags = GLOF_ASPACE, }; const struct gfs2_glock_operations gfs2_trans_glops = { diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index bc0ad15..1de7e1b 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -162,6 +162,8 @@ struct gfs2_glock_operations { void (*go_callback) (struct gfs2_glock *gl); const int go_type; const unsigned long go_min_hold_time; + const unsigned long go_flags; +#define GLOF_ASPACE 1 }; enum { @@ -225,7 +227,6 @@ struct gfs2_glock { struct gfs2_sbd *gl_sbd; - struct inode *gl_aspace; struct list_head gl_ail_list; atomic_t gl_ail_count; struct delayed_work gl_work; @@ -258,7 +259,6 @@ enum { GIF_INVALID = 0, GIF_QD_LOCKED = 1, GIF_SW_PAGED = 3, - GIF_USER = 4, /* user inode, not metadata addr space */ }; diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 6e220f4..b1bf269 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -45,7 +45,7 @@ static int iget_test(struct inode *inode, void *opaque) struct gfs2_inode *ip = GFS2_I(inode); u64 *no_addr = opaque; - if (ip->i_no_addr == *no_addr && test_bit(GIF_USER, &ip->i_flags)) + if (ip->i_no_addr == *no_addr) return 1; return 0; @@ -58,7 +58,6 @@ static int iget_set(struct inode *inode, void *opaque) inode->i_ino = (unsigned long)*no_addr; ip->i_no_addr = *no_addr; - set_bit(GIF_USER, &ip->i_flags); return 0; } @@ -84,7 +83,7 @@ static int iget_skip_test(struct inode *inode, void *opaque) struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_skip_data *data = opaque; - if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){ + if (ip->i_no_addr == data->no_addr) { if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)){ data->skipped = 1; return 0; @@ -103,7 +102,6 @@ static int iget_skip_set(struct inode *inode, void *opaque) return 1; inode->i_ino = (unsigned long)(data->no_addr); ip->i_no_addr = data->no_addr; - set_bit(GIF_USER, &ip->i_flags); return 0; } diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 0e5e0e7..569b462 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -30,7 +30,10 @@ static void gdlm_ast(void *arg) switch (gl->gl_lksb.sb_status) { case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */ - kmem_cache_free(gfs2_glock_cachep, gl); + if (gl->gl_ops->go_flags & GLOF_ASPACE) + kmem_cache_free(gfs2_glock_aspace_cachep, gl); + else + kmem_cache_free(gfs2_glock_cachep, gl); if (atomic_dec_and_test(&sdp->sd_glock_disposal)) wake_up(&sdp->sd_glock_wait); return; diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index 5b31f77..a88fadc 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c @@ -52,6 +52,22 @@ static void gfs2_init_glock_once(void *foo) atomic_set(&gl->gl_ail_count, 0); } +static void gfs2_init_gl_aspace_once(void *foo) +{ + struct gfs2_glock *gl = foo; + struct address_space *mapping = (struct address_space *)(gl + 1); + + gfs2_init_glock_once(gl); + memset(mapping, 0, sizeof(*mapping)); + INIT_RADIX_TREE(&mapping->page_tree, GFP_ATOMIC); + spin_lock_init(&mapping->tree_lock); + spin_lock_init(&mapping->i_mmap_lock); + INIT_LIST_HEAD(&mapping->private_list); + spin_lock_init(&mapping->private_lock); + INIT_RAW_PRIO_TREE_ROOT(&mapping->i_mmap); + INIT_LIST_HEAD(&mapping->i_mmap_nonlinear); +} + /** * init_gfs2_fs - Register GFS2 as a filesystem * @@ -78,6 +94,14 @@ static int __init init_gfs2_fs(void) if (!gfs2_glock_cachep) goto fail; + gfs2_glock_aspace_cachep = kmem_cache_create("gfs2_glock (aspace)", + sizeof(struct gfs2_glock) + + sizeof(struct address_space), + 0, 0, gfs2_init_gl_aspace_once); + + if (!gfs2_glock_aspace_cachep) + goto fail; + gfs2_inode_cachep = kmem_cache_create("gfs2_inode", sizeof(struct gfs2_inode), 0, SLAB_RECLAIM_ACCOUNT| @@ -144,6 +168,9 @@ fail: if (gfs2_inode_cachep) kmem_cache_destroy(gfs2_inode_cachep); + if (gfs2_glock_aspace_cachep) + kmem_cache_destroy(gfs2_glock_aspace_cachep); + if (gfs2_glock_cachep) kmem_cache_destroy(gfs2_glock_cachep); @@ -169,6 +196,7 @@ static void __exit exit_gfs2_fs(void) kmem_cache_destroy(gfs2_rgrpd_cachep); kmem_cache_destroy(gfs2_bufdata_cachep); kmem_cache_destroy(gfs2_inode_cachep); + kmem_cache_destroy(gfs2_glock_aspace_cachep); kmem_cache_destroy(gfs2_glock_cachep); gfs2_sys_uninit(); diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c index 6f68a5f..0bb12c8 100644 --- a/fs/gfs2/meta_io.c +++ b/fs/gfs2/meta_io.c @@ -93,49 +93,13 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb return err; } -static const struct address_space_operations aspace_aops = { +const struct address_space_operations gfs2_meta_aops = { .writepage = gfs2_aspace_writepage, .releasepage = gfs2_releasepage, .sync_page = block_sync_page, }; /** - * gfs2_aspace_get - Create and initialize a struct inode structure - * @sdp: the filesystem the aspace is in - * - * Right now a struct inode is just a struct inode. Maybe Linux - * will supply a more lightweight address space construct (that works) - * in the future. - * - * Make sure pages/buffers in this aspace aren't in high memory. - * - * Returns: the aspace - */ - -struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp) -{ - struct inode *aspace; - struct gfs2_inode *ip; - - aspace = new_inode(sdp->sd_vfs); - if (aspace) { - mapping_set_gfp_mask(aspace->i_mapping, GFP_NOFS); - aspace->i_mapping->a_ops = &aspace_aops; - aspace->i_size = MAX_LFS_FILESIZE; - ip = GFS2_I(aspace); - clear_bit(GIF_USER, &ip->i_flags); - insert_inode_hash(aspace); - } - return aspace; -} - -void gfs2_aspace_put(struct inode *aspace) -{ - remove_inode_hash(aspace); - iput(aspace); -} - -/** * gfs2_meta_sync - Sync all buffers associated with a glock * @gl: The glock * @@ -143,7 +107,7 @@ void gfs2_aspace_put(struct inode *aspace) void gfs2_meta_sync(struct gfs2_glock *gl) { - struct address_space *mapping = gl->gl_aspace->i_mapping; + struct address_space *mapping = gfs2_glock2aspace(gl); int error; filemap_fdatawrite(mapping); @@ -164,7 +128,7 @@ void gfs2_meta_sync(struct gfs2_glock *gl) struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create) { - struct address_space *mapping = gl->gl_aspace->i_mapping; + struct address_space *mapping = gfs2_glock2aspace(gl); struct gfs2_sbd *sdp = gl->gl_sbd; struct page *page; struct buffer_head *bh; @@ -344,8 +308,10 @@ void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh, void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int meta) { - struct gfs2_sbd *sdp = GFS2_SB(bh->b_page->mapping->host); + struct address_space *mapping = bh->b_page->mapping; + struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping); struct gfs2_bufdata *bd = bh->b_private; + if (test_clear_buffer_pinned(bh)) { list_del_init(&bd->bd_le.le_list); if (meta) { diff --git a/fs/gfs2/meta_io.h b/fs/gfs2/meta_io.h index de270c2..6a1d9ba 100644 --- a/fs/gfs2/meta_io.h +++ b/fs/gfs2/meta_io.h @@ -37,8 +37,16 @@ static inline void gfs2_buffer_copy_tail(struct buffer_head *to_bh, 0, from_head - to_head); } -struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp); -void gfs2_aspace_put(struct inode *aspace); +extern const struct address_space_operations gfs2_meta_aops; + +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; + else + return inode->i_sb->s_fs_info; +} void gfs2_meta_sync(struct gfs2_glock *gl); diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index b9dd3da..ad7bc2d 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -722,8 +722,7 @@ static int gfs2_write_inode(struct inode *inode, int sync) int ret = 0; /* Check this is a "normal" inode, etc */ - if (!test_bit(GIF_USER, &ip->i_flags) || - (current->flags & PF_MEMALLOC)) + if (current->flags & PF_MEMALLOC) return 0; ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); if (ret) @@ -1194,7 +1193,7 @@ static void gfs2_drop_inode(struct inode *inode) { struct gfs2_inode *ip = GFS2_I(inode); - if (test_bit(GIF_USER, &ip->i_flags) && inode->i_nlink) { + if (inode->i_nlink) { struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl; if (gl && test_bit(GLF_DEMOTE, &gl->gl_flags)) clear_nlink(inode); @@ -1212,18 +1211,12 @@ static void gfs2_clear_inode(struct inode *inode) { struct gfs2_inode *ip = GFS2_I(inode); - /* This tells us its a "real" inode and not one which only - * serves to contain an address space (see rgrp.c, meta_io.c) - * which therefore doesn't have its own glocks. - */ - if (test_bit(GIF_USER, &ip->i_flags)) { - ip->i_gl->gl_object = NULL; - gfs2_glock_put(ip->i_gl); - ip->i_gl = NULL; - if (ip->i_iopen_gh.gh_gl) { - ip->i_iopen_gh.gh_gl->gl_object = NULL; - gfs2_glock_dq_uninit(&ip->i_iopen_gh); - } + ip->i_gl->gl_object = NULL; + gfs2_glock_put(ip->i_gl); + ip->i_gl = NULL; + if (ip->i_iopen_gh.gh_gl) { + ip->i_iopen_gh.gh_gl->gl_object = NULL; + gfs2_glock_dq_uninit(&ip->i_iopen_gh); } } @@ -1358,9 +1351,6 @@ static void gfs2_delete_inode(struct inode *inode) struct gfs2_holder gh; int error; - if (!test_bit(GIF_USER, &ip->i_flags)) - goto out; - error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); if (unlikely(error)) { gfs2_glock_dq_uninit(&ip->i_iopen_gh); diff --git a/fs/gfs2/util.c b/fs/gfs2/util.c index f6a7efa..226f2bf 100644 --- a/fs/gfs2/util.c +++ b/fs/gfs2/util.c @@ -21,6 +21,7 @@ #include "util.h" struct kmem_cache *gfs2_glock_cachep __read_mostly; +struct kmem_cache *gfs2_glock_aspace_cachep __read_mostly; struct kmem_cache *gfs2_inode_cachep __read_mostly; struct kmem_cache *gfs2_bufdata_cachep __read_mostly; struct kmem_cache *gfs2_rgrpd_cachep __read_mostly; diff --git a/fs/gfs2/util.h b/fs/gfs2/util.h index 33e96b0..b432e04 100644 --- a/fs/gfs2/util.h +++ b/fs/gfs2/util.h @@ -145,6 +145,7 @@ gfs2_io_error_bh_i((sdp), (bh), __func__, __FILE__, __LINE__); extern struct kmem_cache *gfs2_glock_cachep; +extern struct kmem_cache *gfs2_glock_aspace_cachep; extern struct kmem_cache *gfs2_inode_cachep; extern struct kmem_cache *gfs2_bufdata_cachep; extern struct kmem_cache *gfs2_rgrpd_cachep; -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Cluster-devel] [PATCH 2/5] GFS2: Remove loopy umount code 2010-03-01 15:08 ` [Cluster-devel] [PATCH 1/5] GFS2: Metadata address space clean up Steven Whitehouse @ 2010-03-01 15:08 ` Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 3/5] GFS2: Remove old, unused linked list code from quota Steven Whitehouse 0 siblings, 1 reply; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com As a consequence of the previous patch, we can now remove the loop which used to be required due to the circular dependency between the inodes and glocks. Instead we can just invalidate the inodes, and then clear up any glocks which are left. Also we no longer need the rwsem since there is no longer any danger of the inode invalidation calling back into the glock code (and from there back into the inode code). Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --- fs/gfs2/glock.c | 33 ++------------------------------- fs/gfs2/incore.h | 1 - fs/gfs2/ops_fstype.c | 4 +--- fs/gfs2/super.c | 1 + fs/gfs2/sys.c | 2 -- 5 files changed, 4 insertions(+), 37 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index dfb10a4..4773f90 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -19,7 +19,6 @@ #include <linux/list.h> #include <linux/wait.h> #include <linux/module.h> -#include <linux/rwsem.h> #include <asm/uaccess.h> #include <linux/seq_file.h> #include <linux/debugfs.h> @@ -60,7 +59,6 @@ static int __dump_glock(struct seq_file *seq, const struct gfs2_glock *gl); #define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { __dump_glock(NULL, gl); BUG(); } } while(0) static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh, unsigned int target); -static DECLARE_RWSEM(gfs2_umount_flush_sem); static struct dentry *gfs2_root; static struct workqueue_struct *glock_workqueue; struct workqueue_struct *gfs2_delete_workqueue; @@ -714,7 +712,6 @@ static void glock_work_func(struct work_struct *work) finish_xmote(gl, gl->gl_reply); drop_ref = 1; } - down_read(&gfs2_umount_flush_sem); spin_lock(&gl->gl_spin); if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && gl->gl_state != LM_ST_UNLOCKED && @@ -727,7 +724,6 @@ static void glock_work_func(struct work_struct *work) } run_queue(gl, 0); spin_unlock(&gl->gl_spin); - up_read(&gfs2_umount_flush_sem); if (!delay || queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0) gfs2_glock_put(gl); @@ -1512,35 +1508,10 @@ void gfs2_glock_thaw(struct gfs2_sbd *sdp) void gfs2_gl_hash_clear(struct gfs2_sbd *sdp) { - unsigned long t; unsigned int x; - int cont; - t = jiffies; - - for (;;) { - cont = 0; - for (x = 0; x < GFS2_GL_HASH_SIZE; x++) { - if (examine_bucket(clear_glock, sdp, x)) - cont = 1; - } - - if (!cont) - break; - - if (time_after_eq(jiffies, - t + gfs2_tune_get(sdp, gt_stall_secs) * HZ)) { - fs_warn(sdp, "Unmount seems to be stalled. " - "Dumping lock state...\n"); - gfs2_dump_lockstate(sdp); - t = jiffies; - } - - down_write(&gfs2_umount_flush_sem); - invalidate_inodes(sdp->sd_vfs); - up_write(&gfs2_umount_flush_sem); - msleep(10); - } + for (x = 0; x < GFS2_GL_HASH_SIZE; x++) + examine_bucket(clear_glock, sdp, x); flush_workqueue(glock_workqueue); wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0); gfs2_dump_lockstate(sdp); diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 1de7e1b..b8025e5 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -451,7 +451,6 @@ struct gfs2_tune { unsigned int gt_quota_quantum; /* Secs between syncs to quota file */ unsigned int gt_new_files_jdata; unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */ - unsigned int gt_stall_secs; /* Detects trouble! */ unsigned int gt_complain_secs; unsigned int gt_statfs_quantum; unsigned int gt_statfs_slow; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index a86ed63..a054b52 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -65,7 +65,6 @@ static void gfs2_tune_init(struct gfs2_tune *gt) gt->gt_quota_scale_den = 1; gt->gt_new_files_jdata = 0; gt->gt_max_readahead = 1 << 18; - gt->gt_stall_secs = 600; gt->gt_complain_secs = 10; } @@ -1241,10 +1240,9 @@ fail_sb: fail_locking: init_locking(sdp, &mount_gh, UNDO); fail_lm: + invalidate_inodes(sb); gfs2_gl_hash_clear(sdp); gfs2_lm_unmount(sdp); - while (invalidate_inodes(sb)) - yield(); fail_sys: gfs2_sys_fs_del(sdp); fail: diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index ad7bc2d..e5e2262 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -859,6 +859,7 @@ restart: gfs2_clear_rgrpd(sdp); gfs2_jindex_free(sdp); /* Take apart glock structures and buffer lists */ + invalidate_inodes(sdp->sd_vfs); gfs2_gl_hash_clear(sdp); /* Unmount the locking protocol */ gfs2_lm_unmount(sdp); diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 0dc3462..a0db1c9 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -478,7 +478,6 @@ TUNE_ATTR(complain_secs, 0); TUNE_ATTR(statfs_slow, 0); TUNE_ATTR(new_files_jdata, 0); TUNE_ATTR(quota_simul_sync, 1); -TUNE_ATTR(stall_secs, 1); TUNE_ATTR(statfs_quantum, 1); TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store); @@ -491,7 +490,6 @@ static struct attribute *tune_attrs[] = { &tune_attr_complain_secs.attr, &tune_attr_statfs_slow.attr, &tune_attr_quota_simul_sync.attr, - &tune_attr_stall_secs.attr, &tune_attr_statfs_quantum.attr, &tune_attr_quota_scale.attr, &tune_attr_new_files_jdata.attr, -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Cluster-devel] [PATCH 3/5] GFS2: Remove old, unused linked list code from quota 2010-03-01 15:08 ` [Cluster-devel] [PATCH 2/5] GFS2: Remove loopy umount code Steven Whitehouse @ 2010-03-01 15:08 ` Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 4/5] GFS2: ordered writes are backwards Steven Whitehouse 0 siblings, 1 reply; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com From: Abhijith Das <adas@redhat.com> This is the kernel portion of the patch-set for upstream gfs2, to remove the quota-linked-list stuff and replace it with fiemap-based traversal of the quota file. The corresponding userland fixes have been pushed to STABLE3 and master branches of cluster.git and gfs2-utils.git respectively (Refer Red Hat bug #536902). Signed-off-by: Abhi Das <adas@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --- include/linux/gfs2_ondisk.h | 30 +----------------------------- 1 files changed, 1 insertions(+), 29 deletions(-) diff --git a/include/linux/gfs2_ondisk.h b/include/linux/gfs2_ondisk.h index 81f90a5..4f44629 100644 --- a/include/linux/gfs2_ondisk.h +++ b/include/linux/gfs2_ondisk.h @@ -180,33 +180,6 @@ struct gfs2_rgrp { }; /* - * quota linked list: user quotas and group quotas form two separate - * singly linked lists. ll_next stores uids or gids of next quotas in the - * linked list. - -Given the uid/gid, how to calculate the quota file offsets for the corresponding -gfs2_quota structures on disk: - -for user quotas, given uid, -offset = uid * sizeof(struct gfs2_quota); - -for group quotas, given gid, -offset = (gid * sizeof(struct gfs2_quota)) + sizeof(struct gfs2_quota); - - - uid:0 gid:0 uid:12 gid:12 uid:17 gid:17 uid:5142 gid:5142 -+-------+-------+ +-------+-------+ +-------+- - - -+ +- - - -+-------+ -| valid | valid | :: | valid | valid | :: | valid | inval | :: | inval | valid | -+-------+-------+ +-------+-------+ +-------+- - - -+ +- - - -+-------+ -next:12 next:12 next:17 next:5142 next:NULL next:NULL - | | | | |<-- user quota list | - \______|___________/ \______|___________/ group quota list -->| - | | | - \__________________/ \_______________________________________/ - -*/ - -/* * quota structure */ @@ -214,8 +187,7 @@ struct gfs2_quota { __be64 qu_limit; __be64 qu_warn; __be64 qu_value; - __be32 qu_ll_next; /* location of next quota in list */ - __u8 qu_reserved[60]; + __u8 qu_reserved[64]; }; /* -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Cluster-devel] [PATCH 4/5] GFS2: ordered writes are backwards 2010-03-01 15:08 ` [Cluster-devel] [PATCH 3/5] GFS2: Remove old, unused linked list code from quota Steven Whitehouse @ 2010-03-01 15:08 ` Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 5/5] GFS2: print glock numbers in hex Steven Whitehouse 0 siblings, 1 reply; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com From: Dave Chinner <dchinner@redhat.com> When we queue data buffers for ordered write, the buffers are added to the head of the ordered write list. When the log needs to push these buffers to disk, it also walks the list from the head. The result is that the the ordered buffers are submitted to disk in reverse order. For large writes, this means that whenever the log flushes large streams of reverse sequential order buffers are pushed down into the block layers. The elevators don't handle this particularly well, so IO rates tend to be significantly lower than if the IO was issued in ascending block order. Queue new ordered buffers to the tail of the ordered buffer list to ensure that IO is dispatched in the order it was submitted. This should significantly improve large sequential write speeds. On a disk capable of 85MB/s, speeds increase from 50MB/s to 65MB/s for noop and from 38MB/s to 50MB/s for cfq. Signed-off-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --- fs/gfs2/lops.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index de97632..adc260f 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -528,9 +528,9 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) gfs2_pin(sdp, bd->bd_bh); tr->tr_num_databuf_new++; sdp->sd_log_num_databuf++; - list_add(&le->le_list, &sdp->sd_log_le_databuf); + list_add_tail(&le->le_list, &sdp->sd_log_le_databuf); } else { - list_add(&le->le_list, &sdp->sd_log_le_ordered); + list_add_tail(&le->le_list, &sdp->sd_log_le_ordered); } out: gfs2_log_unlock(sdp); -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Cluster-devel] [PATCH 5/5] GFS2: print glock numbers in hex 2010-03-01 15:08 ` [Cluster-devel] [PATCH 4/5] GFS2: ordered writes are backwards Steven Whitehouse @ 2010-03-01 15:08 ` Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2010-03-01 15:08 UTC (permalink / raw) To: cluster-devel.redhat.com From: Bob Peterson <rpeterso@redhat.com> This patch changes glock numbers from printing in decimal to hex. Since DLM prints corresponding resource IDs in hex, it makes debugging easier. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --- fs/gfs2/glock.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 4773f90..454d4b4 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1658,7 +1658,7 @@ static int __dump_glock(struct seq_file *seq, const struct gfs2_glock *gl) dtime *= 1000000/HZ; /* demote time in uSec */ if (!test_bit(GLF_DEMOTE, &gl->gl_flags)) dtime = 0; - gfs2_print_dbg(seq, "G: s:%s n:%u/%llu f:%s t:%s d:%s/%llu a:%d r:%d\n", + gfs2_print_dbg(seq, "G: s:%s n:%u/%llx f:%s t:%s d:%s/%llu a:%d r:%d\n", state2str(gl->gl_state), gl->gl_name.ln_type, (unsigned long long)gl->gl_name.ln_number, -- 1.6.2.5 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2015-02-10 10:36 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2015-02-10 10:36 UTC (permalink / raw) To: cluster-devel.redhat.com This time we have mostly clean ups. There is a bug fix for a NULL dereference relating to ACLs, and another which improves (but does not fix entirely) an allocation fall-back code path. The other three patches are small clean ups. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2013-04-05 9:57 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2013-04-05 9:57 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here are a few GFS2 fixes which are pending. There are two patches which fix up a couple of minor issues in the DLM interface code, a missing error path in gfs2_rs_alloc(), two patches which fix problems during "withdraw" and a fix for discards/FITRIM when using 4k sector sized devices, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2013-01-03 11:50 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2013-01-03 11:50 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here are four small bug fixes for GFS2. There is no common theme here really, just a few items that were fixed recently. The first fixes lock name generation when the glock number is 0. The second fixes a race allocating reservation structures and the final two fix a performance issue by making small changes in the allocation code, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2010-10-18 14:15 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2010-10-18 14:15 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, I know the merge window isn't open yet, but at this stage I'm going to hold off on any larger patches until the following merge window so this patch set isn't likely to change much, hence kicking it out a bit early for review. There are a few interesting points to note in this patch set: o GFS2 is updated to use the new truncate sequence o Support for fallocate is added o Clean up of some unused/obsolete mount options I'm currently working on a patch to allow the glock hash table to use RCU. That is currently a work-in-progress and that will hopefully be ready for the succeeding merge window. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2010-08-02 9:27 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2010-08-02 9:27 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here is the current content of the GFS2 -nmw git tree. Mostly its just clean up and bug fixes this time. There is one exception which is the "wait for journal id" patch which is a new feature aimed at (eventually) allowing us to simplify the userland support which GFS2 requires, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2010-05-17 12:40 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2010-05-17 12:40 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Nothing very exciting this time.... mostly minor bug fixes and a docs update. The gfs2_logd patch has been hanging around for a long time and is now finally integrated. It is the first step towards a longer term goal of improving performance in that area, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2010-03-11 17:21 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2010-03-11 17:21 UTC (permalink / raw) To: cluster-devel.redhat.com Here are three small (but important!) fixes to GFS2. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2009-09-10 11:27 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2009-09-10 11:27 UTC (permalink / raw) To: cluster-devel.redhat.com As merge time is approaching, here is the current content of the GFS2 -nmw git tree. I'm not expecting to take any more patches now for the current merge window unless any last minute bugs are discovered. There is not a huge amount new this time. Some extra context for uevent messages, better error handling during block allocation, and a clean up of extended attribute support. There is still more to do on the extended attribute side of things, but this is a good start I think. There are a few bug fixes as well. Once these patches are merged I'm intending to start off the next -nmw tree with a patch to remove some of the (now unused) sysfs files as per the message on cluster-devel a few weeks back. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2009-06-10 8:30 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2009-06-10 8:30 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, As the merge window is more or less upon us, here is the content of the GFS2 -nmw tree. There is nothing too startling this time as the focus has very much been bug fixes and clean up. We have a new mount option, commit= which does exactly the same thing as the ext3 equivalent option. We have a long term plan to make all the tunable parameters available as mount options and thus to be able to eventually drop the sysfs interface to these parameters. Another long term plan is to get rid of the files named ops_somethingorother and to either merge them into other files, or rename them to not have the ops_ prefix. This patch series makes a start on that, and does all the easy ones. As a result some functions with only one caller are moved to the same file as their caller and made static. The docs are also updated to reflect the fact that the lock_dlm interface module no longer exists and that interface is now built into GFS2. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] [GFS2] Pre-pull patch posting @ 2009-03-18 12:23 swhiteho 0 siblings, 0 replies; 21+ messages in thread From: swhiteho @ 2009-03-18 12:23 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, So as the merge window draws closer, here is the current content of the GFS2 git tree. The major item this time is patch 5 in the series. This contians by far the majority of the changes, and the majority of those changes are actually removal of code. The patch merges the lock_dlm module (not the dlm itself, but GFS2's interface to the dlm) into GFS2 itself. This means that a number of optimisations are then possible in terms of merging strucutures resulting in a considerable saving in memory. Since that patch is so large (I'm afraid that it really doesn't make any sense to split it up) its been in the -nmw git tree for the whole period since the last merge window and has also been posted for review on cluster-devel on a number of occasions before that. We've run a number of tests on it as well in that period, so I believe that its pretty stable now. It certainly makes the code a lot cleaner and easier to follow in that area. The remainder of the patches are mostly bug fixes, but there are one or two other interesting features, those being: o GFS2 now supports the discard I/O requests for thin provisioning, etc o A new "demote a glock" interface is added to sysfs to help in testing GFS2 o With a new mkfs.gfs2 which writes UUIDs, the UUID is now included in uevent messages (with older filesystems which don't have UUIDs, we just don't send that information) The GFS2 tracing patches which I posted a little while back are not included in this patch set. I think I can see what I need to do in order to avoid patching blktrace now, so my plan is to look at those patches again after this merge window, and when all the queued patches for the tracing subsystem have been merged. As always, please let us know if you spot any issues in the patches, Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2008-12-17 11:29 swhiteho 0 siblings, 0 replies; 21+ messages in thread From: swhiteho @ 2008-12-17 11:29 UTC (permalink / raw) To: cluster-devel.redhat.com In preparation for the next merge window, here is the current content of the GFS2 git tree. Firstly, we have one new feature, which is support for the FIEMAP ioctl. That patch does touch some code outside of GFS2 itself, but its the only patch in this series which does so. The remaining patches are mostly clean up and bug fixes, as usual. They are working towards a point where I can submit a patch to finally merge the lock_dlm module (not dlm itself I should emphasise) into GFS2. That is a large patch and a preliminary version has already been posted to cluster-devel. My plan is to put that patch into my -nmw git tree as the first patch for the following merge window to give it maximum exposure. The other highlight of this patch series, is a patch which removes the two daemons (gfs2_scand and gfs2_glockd) and replaces them with a "shrinker" routine registered with the VM. As expected, this also reduces the code size. We are also expecting do do a similar thing with the GFS2 quota data strucutures at some point in the future. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting @ 2008-09-26 12:00 Steven Whitehouse 0 siblings, 0 replies; 21+ messages in thread From: Steven Whitehouse @ 2008-09-26 12:00 UTC (permalink / raw) To: cluster-devel.redhat.com I'm guessing that the merge window opening might not be too far away now, and in any case, I won't have quite my normal internet access next week. So I'm pushing out the current GFS2 tree so that (I hope) there will be time to fix any issues. Again, there are fewer patches here. A lot of them are fairly small too. The most noteable item deals with the meta filesystem which was in response to Al Viro's suggestions concerning a better way to structure that code. It certainly results in a much cleaner implementation, so thanks go to Al for pointing that out. A couple of new features: I/O barrier support (needs no user configuration, see the patch for details) and UUID support (no code changes, its all userland but we reserve space in the super block, again details in the patch itself). I know that I hardly need say, but please let me know if you have any comments :-) Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] [GFS2] Pre-pull patch posting @ 2008-07-11 10:11 swhiteho 0 siblings, 0 replies; 21+ messages in thread From: swhiteho @ 2008-07-11 10:11 UTC (permalink / raw) To: cluster-devel.redhat.com So, although the merge window isn't yet open, I'm guessing that its probably not too far away, hence this posting of the contents of the current GFS2 -nmw git tree. This time the big news is locking changes, although having said that, there are far fewer queued patches in total than I've had for previous merge windows and I believe that this is an indication of the growing maturity of GFS2. The first patch in the series is really the main change and is a big clean up of the core of the glocks, which are really the core of GFS2 in a lot of ways. Further through the series is a documentation patch, which explains the fine detail of how glocks work and the assumptions made by the glock core when calling the functions relating to individual glock types. Other notable changes include merging the lock_nolock module into the core of GFS2 since there is little point in retaining it separately. There is a plan to do the same to lock_dlm as well in the future (not the DLM itself obviously, just the interface module thats part of GFS2). Most of the remaing changes are bug fixes or futher optimisations over the initial glock changes, plus one or two minor clean ups along the way. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] [GFS2] Pre-pull patch posting @ 2008-04-17 8:37 swhiteho 0 siblings, 0 replies; 21+ messages in thread From: swhiteho @ 2008-04-17 8:37 UTC (permalink / raw) To: cluster-devel.redhat.com This is the current content of the GFS2 -nmw git tree. Mostly bug fixes, there are some changes relating to block mapping which are working towards cleaning up this code and allowing more efficient block mapping. There is a second part to that work which is not included in this patch set - the plan is that it will be in the next patch set and its currently undergoing testing. There are a number of clean up patches in the series too. We have been continuing the work of gradually reducing the fields in the various ..._host structures with a view to eventually eliminating them completely. They were introduced as a stop-gap measure to fix the endianess annotation and the fields are now gradually being moved to other structures (or eliminated). Bob Peterson's new improved "bitfit" algorithm provides a nice speed up when we are allocating blocks as well as cleaning up that area of the code. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [Cluster-devel] [GFS2] Pre-pull patch posting @ 2008-01-21 9:21 swhiteho 0 siblings, 0 replies; 21+ messages in thread From: swhiteho @ 2008-01-21 9:21 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here is the current GFS2 patch queue. You'll notice that this time there are no DLM patches in this list. That is because the DLM team are setting up their own git tree and this future DLM patches will be sent directly by them rather than via the GFS2 tree. Most of this set of patches is clean up and bug fixes, there is really not a lot new this time. I guess the most significant thing is the patch to use ->page_mkwrite which will greatly increase efficiency when files opened r/w are mostly only accessed for reading across a cluster. There are a number of cleanups related to journalling which is really where the largest number of changes in terms of code lines is. The indirect blocks for the journal are now scanned once only at mount time and the bmap information is retained in the form of an extent list. Since we expect journals to consist of only a single extent in the normal case, this should generally be quite a short list :-) In addition some of the tunables relating to the journal have been removed in favour of autotuning those variables. Steve. ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2015-02-10 10:36 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-03-01 15:08 [Cluster-devel] GFS2: Pre-pull patch posting Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 1/5] GFS2: Metadata address space clean up Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 2/5] GFS2: Remove loopy umount code Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 3/5] GFS2: Remove old, unused linked list code from quota Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 4/5] GFS2: ordered writes are backwards Steven Whitehouse 2010-03-01 15:08 ` [Cluster-devel] [PATCH 5/5] GFS2: print glock numbers in hex Steven Whitehouse -- strict thread matches above, loose matches on Subject: below -- 2015-02-10 10:36 [Cluster-devel] GFS2: Pre-pull patch posting Steven Whitehouse 2013-04-05 9:57 Steven Whitehouse 2013-01-03 11:50 Steven Whitehouse 2010-10-18 14:15 Steven Whitehouse 2010-08-02 9:27 Steven Whitehouse 2010-05-17 12:40 Steven Whitehouse 2010-03-11 17:21 Steven Whitehouse 2009-09-10 11:27 Steven Whitehouse 2009-06-10 8:30 Steven Whitehouse 2009-03-18 12:23 [Cluster-devel] [GFS2] " swhiteho 2008-12-17 11:29 [Cluster-devel] GFS2: " swhiteho 2008-09-26 12:00 Steven Whitehouse 2008-07-11 10:11 [Cluster-devel] [GFS2] " swhiteho 2008-04-17 8:37 swhiteho 2008-01-21 9:21 swhiteho
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).