* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2014-06-03 11:02 Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 1/6] GFS2: quotas not being refreshed in gfs2_adjust_quota Steven Whitehouse ` (5 more replies) 0 siblings, 6 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, This must be about the smallest merge window patch set ever for GFS2. It is probably also the first one without a single patch from me. That is down to a combination of factors, and I have some things in the works that are not quite ready yet, that I hope to put in next time around. Returning to what is here this time... we have 3 patches which fix various warnings. Two are bug fixes (for quotas and also a rare recovery race condition). The final patch, from Ben Marzinski, is an important change in the freeze code which has been in progress for some time. This removes the need to take and drop the transaction lock for every single transaction, when the only time it was used, was at file system freeze time. Ben's patch integrates the freeze operation into the journal flush code as an alternative with lower overheads and also lands up resolving some difficult to fix races at the same time, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 1/6] GFS2: quotas not being refreshed in gfs2_adjust_quota 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 2/6] GFS2: lops.c: replace 0 by NULL for pointers Steven Whitehouse ` (4 subsequent siblings) 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Abhi Das <adas@redhat.com> Old values of user quota limits were being used and could allow users to exceed their allotted quotas. This patch refreshes the limits to the latest values so that quotas are enforced correctly. Resolves: rhbz#1077463 Signed-off-by: Abhi Das <adas@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index c4effff..6193896 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -778,6 +778,7 @@ get_a_page: i_size_write(inode, size); inode->i_mtime = inode->i_atime = CURRENT_TIME; mark_inode_dirty(inode); + set_bit(QDF_REFRESH, &qd->qd_flags); return 0; unlock_out: -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 2/6] GFS2: lops.c: replace 0 by NULL for pointers 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 1/6] GFS2: quotas not being refreshed in gfs2_adjust_quota Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 3/6] GFS2: remove transaction glock Steven Whitehouse ` (3 subsequent siblings) 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Fabian Frederick <fabf@skynet.be> Sparse warning: fs/gfs2/lops.c:78:29: "warning: Using plain integer as NULL pointer" Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Fabian Frederick <fabf@skynet.be> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index a294d8d..2c1ae86 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -75,7 +75,7 @@ static void maybe_release_space(struct gfs2_bufdata *bd) unsigned int index = bd->bd_bh->b_blocknr - gl->gl_name.ln_number; struct gfs2_bitmap *bi = rgd->rd_bits + index; - if (bi->bi_clone == 0) + if (bi->bi_clone == NULL) return; if (sdp->sd_args.ar_discard) gfs2_rgrp_send_discards(sdp, rgd->rd_data0, bd->bd_bh, bi, 1, NULL); -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 3/6] GFS2: remove transaction glock 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 1/6] GFS2: quotas not being refreshed in gfs2_adjust_quota Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 2/6] GFS2: lops.c: replace 0 by NULL for pointers Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 4/6] GFS2: fs/gfs2/bmap.c: kernel-doc warning fixes Steven Whitehouse ` (2 subsequent siblings) 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Benjamin Marzinski <bmarzins@redhat.com> GFS2 has a transaction glock, which must be grabbed for every transaction, whose purpose is to deal with freezing the filesystem. Aside from this involving a large amount of locking, it is very easy to make the current fsfreeze code hang on unfreezing. This patch rewrites how gfs2 handles freezing the filesystem. The transaction glock is removed. In it's place is a freeze glock, which is cached (but not held) in a shared state by every node in the cluster when the filesystem is mounted. This lock only needs to be grabbed on freezing, and actions which need to be safe from freezing, like recovery. When a node wants to freeze the filesystem, it grabs this glock exclusively. When the freeze glock state changes on the nodes (either from shared to unlocked, or shared to exclusive), the filesystem does a special log flush. gfs2_log_flush() does all the work for flushing out the and shutting down the incore log, and then it tries to grab the freeze glock in a shared state again. Since the filesystem is stuck in gfs2_log_flush, no new transaction can start, and nothing can be written to disk. Unfreezing the filesytem simply involes dropping the freeze glock, allowing gfs2_log_flush() to grab and then release the shared lock, so it is cached for next time. However, in order for the unfreezing ioctl to occur, gfs2 needs to get a shared lock on the filesystem root directory inode to check permissions. If that glock has already been grabbed exclusively, fsfreeze will be unable to get the shared lock and unfreeze the filesystem. In order to allow the unfreeze, this patch makes gfs2 grab a shared lock on the filesystem root directory during the freeze, and hold it until it unfreezes the filesystem. The functions which need to grab a shared lock in order to allow the unfreeze ioctl to be issued now use the lock grabbed by the freeze code instead. The freeze and unfreeze code take care to make sure that this shared lock will not be dropped while another process is using it. Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index ce62dca..5a49b03 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -431,7 +431,7 @@ static int gfs2_jdata_writepages(struct address_space *mapping, ret = gfs2_write_cache_jdata(mapping, wbc); if (ret == 0 && wbc->sync_mode == WB_SYNC_ALL) { - gfs2_log_flush(sdp, ip->i_gl); + gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH); ret = gfs2_write_cache_jdata(mapping, wbc); } return ret; diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 80d6725..6065252 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -256,7 +256,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) } if ((flags ^ new_flags) & GFS2_DIF_JDATA) { if (flags & GFS2_DIF_JDATA) - gfs2_log_flush(sdp, ip->i_gl); + gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH); error = filemap_fdatawrite(inode->i_mapping); if (error) goto out; diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 54b66809..0b52793 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -89,18 +89,23 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl) if (!tr.tr_revokes) return; - /* A shortened, inline version of gfs2_trans_begin() */ + /* A shortened, inline version of gfs2_trans_begin() + * tr->alloced is not set since the transaction structure is + * on the stack */ tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes, sizeof(u64)); tr.tr_ip = (unsigned long)__builtin_return_address(0); sb_start_intwrite(sdp->sd_vfs); - gfs2_log_reserve(sdp, tr.tr_reserved); + if (gfs2_log_reserve(sdp, tr.tr_reserved) < 0) { + sb_end_intwrite(sdp->sd_vfs); + return; + } WARN_ON_ONCE(current->journal_info); current->journal_info = &tr; __gfs2_ail_flush(gl, 0, tr.tr_revokes); gfs2_trans_end(sdp); - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); } void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) @@ -121,7 +126,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) return; __gfs2_ail_flush(gl, fsync, max_revokes); gfs2_trans_end(sdp); - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); } /** @@ -144,7 +149,7 @@ static void rgrp_go_sync(struct gfs2_glock *gl) return; GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE); - gfs2_log_flush(sdp, gl); + gfs2_log_flush(sdp, gl, NORMAL_FLUSH); filemap_fdatawrite_range(mapping, gl->gl_vm.start, gl->gl_vm.end); error = filemap_fdatawait_range(mapping, gl->gl_vm.start, gl->gl_vm.end); mapping_set_error(mapping, error); @@ -206,7 +211,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); + gfs2_log_flush(gl->gl_sbd, gl, NORMAL_FLUSH); filemap_fdatawrite(metamapping); if (ip) { struct address_space *mapping = ip->i_inode.i_mapping; @@ -253,7 +258,7 @@ 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); + gfs2_log_flush(gl->gl_sbd, NULL, NORMAL_FLUSH); gl->gl_sbd->sd_rindex_uptodate = 0; } if (ip && S_ISREG(ip->i_inode.i_mode)) @@ -455,31 +460,39 @@ static void inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl) } /** - * trans_go_sync - promote/demote the transaction glock + * freeze_go_sync - promote/demote the freeze glock * @gl: the glock * @state: the requested state * @flags: * */ -static void trans_go_sync(struct gfs2_glock *gl) +static void freeze_go_sync(struct gfs2_glock *gl) { struct gfs2_sbd *sdp = gl->gl_sbd; + DEFINE_WAIT(wait); - if (gl->gl_state != LM_ST_UNLOCKED && + if (gl->gl_state == LM_ST_SHARED && test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { - gfs2_meta_syncfs(sdp); - gfs2_log_shutdown(sdp); + atomic_set(&sdp->sd_log_freeze, 1); + wake_up(&sdp->sd_logd_waitq); + do { + prepare_to_wait(&sdp->sd_log_frozen_wait, &wait, + TASK_UNINTERRUPTIBLE); + if (atomic_read(&sdp->sd_log_freeze)) + io_schedule(); + } while(atomic_read(&sdp->sd_log_freeze)); + finish_wait(&sdp->sd_log_frozen_wait, &wait); } } /** - * trans_go_xmote_bh - After promoting/demoting the transaction glock + * freeze_go_xmote_bh - After promoting/demoting the freeze glock * @gl: the glock * */ -static int trans_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh) +static int freeze_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh) { struct gfs2_sbd *sdp = gl->gl_sbd; struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode); @@ -512,7 +525,7 @@ static int trans_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh) * Always returns 0 */ -static int trans_go_demote_ok(const struct gfs2_glock *gl) +static int freeze_go_demote_ok(const struct gfs2_glock *gl) { return 0; } @@ -563,10 +576,10 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = { .go_flags = GLOF_LVB, }; -const struct gfs2_glock_operations gfs2_trans_glops = { - .go_sync = trans_go_sync, - .go_xmote_bh = trans_go_xmote_bh, - .go_demote_ok = trans_go_demote_ok, +const struct gfs2_glock_operations gfs2_freeze_glops = { + .go_sync = freeze_go_sync, + .go_xmote_bh = freeze_go_xmote_bh, + .go_demote_ok = freeze_go_demote_ok, .go_type = LM_TYPE_NONDISK, }; diff --git a/fs/gfs2/glops.h b/fs/gfs2/glops.h index bf95a2d..7455d26 100644 --- a/fs/gfs2/glops.h +++ b/fs/gfs2/glops.h @@ -15,7 +15,7 @@ extern const struct gfs2_glock_operations gfs2_meta_glops; extern const struct gfs2_glock_operations gfs2_inode_glops; extern const struct gfs2_glock_operations gfs2_rgrp_glops; -extern const struct gfs2_glock_operations gfs2_trans_glops; +extern const struct gfs2_glock_operations gfs2_freeze_glops; extern const struct gfs2_glock_operations gfs2_iopen_glops; extern const struct gfs2_glock_operations gfs2_flock_glops; extern const struct gfs2_glock_operations gfs2_nondisk_glops; diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index bdf70c1..2434a96 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -465,9 +465,7 @@ struct gfs2_trans { unsigned int tr_reserved; unsigned int tr_touched:1; unsigned int tr_attached:1; - - struct gfs2_holder tr_t_gh; - + unsigned int tr_alloced:1; unsigned int tr_num_buf_new; unsigned int tr_num_databuf_new; @@ -682,7 +680,7 @@ struct gfs2_sbd { struct lm_lockstruct sd_lockstruct; struct gfs2_holder sd_live_gh; struct gfs2_glock *sd_rename_gl; - struct gfs2_glock *sd_trans_gl; + struct gfs2_glock *sd_freeze_gl; wait_queue_head_t sd_glock_wait; atomic_t sd_glock_disposal; struct completion sd_locking_init; @@ -794,6 +792,12 @@ struct gfs2_sbd { /* For quiescing the filesystem */ struct gfs2_holder sd_freeze_gh; + struct gfs2_holder sd_freeze_root_gh; + struct gfs2_holder sd_thaw_gh; + atomic_t sd_log_freeze; + atomic_t sd_frozen_root; + wait_queue_head_t sd_frozen_root_wait; + wait_queue_head_t sd_log_frozen_wait; char sd_fsname[GFS2_FSNAME_LEN]; char sd_table_name[GFS2_FSNAME_LEN]; diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 28cc7bf..e62e594 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1613,18 +1613,26 @@ int gfs2_permission(struct inode *inode, int mask) { struct gfs2_inode *ip; struct gfs2_holder i_gh; + struct gfs2_sbd *sdp = GFS2_SB(inode); int error; int unlock = 0; + int frozen_root = 0; ip = GFS2_I(inode); if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { - if (mask & MAY_NOT_BLOCK) - return -ECHILD; - error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); - if (error) - return error; - unlock = 1; + if (unlikely(gfs2_glock_is_held_excl(sdp->sd_freeze_gl) && + inode == sdp->sd_root_dir->d_inode && + atomic_inc_not_zero(&sdp->sd_frozen_root))) + frozen_root = 1; + else { + if (mask & MAY_NOT_BLOCK) + return -ECHILD; + error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh); + if (error) + return error; + unlock = 1; + } } if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) @@ -1633,6 +1641,8 @@ int gfs2_permission(struct inode *inode, int mask) error = generic_permission(inode, mask); if (unlock) gfs2_glock_dq_uninit(&i_gh); + else if (frozen_root && atomic_dec_and_test(&sdp->sd_frozen_root)) + wake_up(&sdp->sd_frozen_root_wait); return error; } @@ -1805,19 +1815,29 @@ static int gfs2_getattr(struct vfsmount *mnt, struct dentry *dentry, struct inode *inode = dentry->d_inode; struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_holder gh; + struct gfs2_sbd *sdp = GFS2_SB(inode); int error; int unlock = 0; + int frozen_root = 0; if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) { - error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); - if (error) - return error; - unlock = 1; + if (unlikely(gfs2_glock_is_held_excl(sdp->sd_freeze_gl) && + inode == sdp->sd_root_dir->d_inode && + atomic_inc_not_zero(&sdp->sd_frozen_root))) + frozen_root = 1; + else { + error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); + if (error) + return error; + unlock = 1; + } } generic_fillattr(inode, stat); if (unlock) gfs2_glock_dq_uninit(&gh); + else if (frozen_root && atomic_dec_and_test(&sdp->sd_frozen_root)) + wake_up(&sdp->sd_frozen_root_wait); return 0; } diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 4a14d50..3966fad 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -301,6 +301,23 @@ static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail) } /** + * gfs2_log_release - Release a given number of log blocks + * @sdp: The GFS2 superblock + * @blks: The number of blocks + * + */ + +void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) +{ + + atomic_add(blks, &sdp->sd_log_blks_free); + trace_gfs2_log_blocks(sdp, blks); + gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= + sdp->sd_jdesc->jd_blocks); + up_read(&sdp->sd_log_flush_lock); +} + +/** * gfs2_log_reserve - Make a log reservation * @sdp: The GFS2 superblock * @blks: The number of blocks to reserve @@ -358,7 +375,10 @@ retry: wake_up(&sdp->sd_log_waitq); down_read(&sdp->sd_log_flush_lock); - + if (unlikely(!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))) { + gfs2_log_release(sdp, blks); + return -EROFS; + } return 0; } @@ -671,7 +691,8 @@ static void log_write_header(struct gfs2_sbd *sdp, u32 flags) * */ -void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl) +void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, + enum gfs2_flush_type type) { struct gfs2_trans *tr; @@ -723,6 +744,42 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl) } spin_unlock(&sdp->sd_ail_lock); gfs2_log_unlock(sdp); + + if (atomic_read(&sdp->sd_log_freeze)) + type = FREEZE_FLUSH; + if (type != NORMAL_FLUSH) { + if (!sdp->sd_log_idle) { + for (;;) { + gfs2_ail1_start(sdp); + gfs2_ail1_wait(sdp); + if (gfs2_ail1_empty(sdp)) + break; + } + atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */ + trace_gfs2_log_blocks(sdp, -1); + sdp->sd_log_flush_wrapped = 0; + log_write_header(sdp, 0); + sdp->sd_log_head = sdp->sd_log_flush_head; + } + if (type == SHUTDOWN_FLUSH || type == FREEZE_FLUSH) + gfs2_log_shutdown(sdp); + if (type == FREEZE_FLUSH) { + int error; + + atomic_set(&sdp->sd_log_freeze, 0); + wake_up(&sdp->sd_log_frozen_wait); + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, + LM_ST_SHARED, 0, + &sdp->sd_thaw_gh); + if (error) { + printk(KERN_INFO "GFS2: couln't get freeze lock : %d\n", error); + gfs2_assert_withdraw(sdp, 0); + } + else + gfs2_glock_dq_uninit(&sdp->sd_thaw_gh); + } + } + trace_gfs2_log_flush(sdp, 0); up_write(&sdp->sd_log_flush_lock); @@ -761,7 +818,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) if (sdp->sd_log_tr) { gfs2_merge_trans(sdp->sd_log_tr, tr); } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) { - gfs2_assert_withdraw(sdp, tr->tr_t_gh.gh_gl); + gfs2_assert_withdraw(sdp, tr->tr_alloced); sdp->sd_log_tr = tr; tr->tr_attached = 1; } @@ -813,8 +870,6 @@ void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) void gfs2_log_shutdown(struct gfs2_sbd *sdp) { - down_write(&sdp->sd_log_flush_lock); - gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved); gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list)); @@ -824,38 +879,16 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp) log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT); - gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks); gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail); gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list)); sdp->sd_log_head = sdp->sd_log_flush_head; sdp->sd_log_tail = sdp->sd_log_head; - - up_write(&sdp->sd_log_flush_lock); -} - - -/** - * gfs2_meta_syncfs - sync all the buffers in a filesystem - * @sdp: the filesystem - * - */ - -void gfs2_meta_syncfs(struct gfs2_sbd *sdp) -{ - gfs2_log_flush(sdp, NULL); - for (;;) { - gfs2_ail1_start(sdp); - gfs2_ail1_wait(sdp); - if (gfs2_ail1_empty(sdp)) - break; - } - gfs2_log_flush(sdp, NULL); } static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp) { - return (atomic_read(&sdp->sd_log_pinned) >= atomic_read(&sdp->sd_log_thresh1)); + return (atomic_read(&sdp->sd_log_pinned) >= atomic_read(&sdp->sd_log_thresh1) || atomic_read(&sdp->sd_log_freeze)); } static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp) @@ -882,14 +915,14 @@ int gfs2_logd(void *data) if (gfs2_jrnl_flush_reqd(sdp) || t == 0) { gfs2_ail1_empty(sdp); - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); } if (gfs2_ail_flush_reqd(sdp)) { gfs2_ail1_start(sdp); gfs2_ail1_wait(sdp); gfs2_ail1_empty(sdp); - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); } if (!gfs2_ail_flush_reqd(sdp)) diff --git a/fs/gfs2/log.h b/fs/gfs2/log.h index 3721663..9499a60 100644 --- a/fs/gfs2/log.h +++ b/fs/gfs2/log.h @@ -63,14 +63,21 @@ extern void gfs2_ordered_del_inode(struct gfs2_inode *ip); extern unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct, unsigned int ssize); +extern void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks); extern int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks); -extern void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl); +enum gfs2_flush_type { + NORMAL_FLUSH = 0, + SYNC_FLUSH, + SHUTDOWN_FLUSH, + FREEZE_FLUSH +}; +extern void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, + enum gfs2_flush_type type); extern void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans); extern void gfs2_remove_from_ail(struct gfs2_bufdata *bd); extern void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc); extern void gfs2_log_shutdown(struct gfs2_sbd *sdp); -extern void gfs2_meta_syncfs(struct gfs2_sbd *sdp); extern int gfs2_logd(void *data); extern void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd); extern void gfs2_write_revokes(struct gfs2_sbd *sdp); diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 22f9540..be45c79 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -129,6 +129,10 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb) init_rwsem(&sdp->sd_log_flush_lock); atomic_set(&sdp->sd_log_in_flight, 0); init_waitqueue_head(&sdp->sd_log_flush_wait); + init_waitqueue_head(&sdp->sd_log_frozen_wait); + atomic_set(&sdp->sd_log_freeze, 0); + atomic_set(&sdp->sd_frozen_root, 0); + init_waitqueue_head(&sdp->sd_frozen_root_wait); return sdp; } @@ -419,8 +423,8 @@ static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh, goto fail_live; } - error = gfs2_glock_get(sdp, GFS2_TRANS_LOCK, &gfs2_trans_glops, - CREATE, &sdp->sd_trans_gl); + error = gfs2_glock_get(sdp, GFS2_FREEZE_LOCK, &gfs2_freeze_glops, + CREATE, &sdp->sd_freeze_gl); if (error) { fs_err(sdp, "can't create transaction glock: %d\n", error); goto fail_rename; @@ -429,7 +433,7 @@ static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh, return 0; fail_trans: - gfs2_glock_put(sdp->sd_trans_gl); + gfs2_glock_put(sdp->sd_freeze_gl); fail_rename: gfs2_glock_put(sdp->sd_rename_gl); fail_live: @@ -755,7 +759,15 @@ static int init_journal(struct gfs2_sbd *sdp, int undo) set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags); gfs2_glock_dq_uninit(&ji_gh); jindex = 0; - + if (!sdp->sd_args.ar_spectator) { + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, 0, + &sdp->sd_thaw_gh); + if (error) { + fs_err(sdp, "can't acquire freeze glock: %d\n", error); + goto fail_jinode_gh; + } + } + gfs2_glock_dq_uninit(&sdp->sd_thaw_gh); return 0; fail_jinode_gh: @@ -1380,7 +1392,7 @@ static void gfs2_kill_sb(struct super_block *sb) return; } - gfs2_meta_syncfs(sdp); + gfs2_log_flush(sdp, NULL, SYNC_FLUSH); dput(sdp->sd_root_dir); dput(sdp->sd_master_dir); sdp->sd_root_dir = NULL; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 6193896..64b29f7 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -880,7 +880,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); + gfs2_log_flush(ip->i_gl->gl_sbd, ip->i_gl, NORMAL_FLUSH); return error; } diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c index 7ad4094..a4ed78b 100644 --- a/fs/gfs2/recovery.c +++ b/fs/gfs2/recovery.c @@ -454,7 +454,7 @@ void gfs2_recover_func(struct work_struct *work) struct gfs2_inode *ip = GFS2_I(jd->jd_inode); struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); struct gfs2_log_header_host head; - struct gfs2_holder j_gh, ji_gh, t_gh; + struct gfs2_holder j_gh, ji_gh, thaw_gh; unsigned long t; int ro = 0; unsigned int pass; @@ -508,11 +508,11 @@ void gfs2_recover_func(struct work_struct *work) t = jiffies; - /* Acquire a shared hold on the transaction lock */ + /* Acquire a shared hold on the freeze lock */ - error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, - LM_FLAG_NOEXP | LM_FLAG_PRIORITY | - GL_NOCACHE, &t_gh); + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, + LM_FLAG_NOEXP | LM_FLAG_PRIORITY, + &thaw_gh); if (error) goto fail_gunlock_ji; @@ -538,7 +538,7 @@ void gfs2_recover_func(struct work_struct *work) fs_warn(sdp, "jid=%u: Can't replay: read-only block " "device\n", jd->jd_jid); error = -EROFS; - goto fail_gunlock_tr; + goto fail_gunlock_thaw; } fs_info(sdp, "jid=%u: Replaying journal...\n", jd->jd_jid); @@ -549,14 +549,14 @@ void gfs2_recover_func(struct work_struct *work) head.lh_blkno, pass); lops_after_scan(jd, error, pass); if (error) - goto fail_gunlock_tr; + goto fail_gunlock_thaw; } error = clean_journal(jd, &head); if (error) - goto fail_gunlock_tr; + goto fail_gunlock_thaw; - gfs2_glock_dq_uninit(&t_gh); + gfs2_glock_dq_uninit(&thaw_gh); t = DIV_ROUND_UP(jiffies - t, HZ); fs_info(sdp, "jid=%u: Journal replayed in %lus\n", jd->jd_jid, t); @@ -572,8 +572,8 @@ void gfs2_recover_func(struct work_struct *work) fs_info(sdp, "jid=%u: Done\n", jd->jd_jid); goto done; -fail_gunlock_tr: - gfs2_glock_dq_uninit(&t_gh); +fail_gunlock_thaw: + gfs2_glock_dq_uninit(&thaw_gh); fail_gunlock_ji: if (jlocked) { gfs2_glock_dq_uninit(&ji_gh); diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 281a771..db629d1 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -2001,7 +2001,7 @@ next_rgrp: } /* Flushing the log may release space */ if (loops == 2) - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); } return -ENOSPC; diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index de8afad..1319b5c 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -399,7 +399,7 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp) { struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode); struct gfs2_glock *j_gl = ip->i_gl; - struct gfs2_holder t_gh; + struct gfs2_holder thaw_gh; struct gfs2_log_header_host head; int error; @@ -407,7 +407,8 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp) if (error) return error; - error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &t_gh); + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, 0, + &thaw_gh); if (error) goto fail_threads; @@ -433,13 +434,13 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp) set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); - gfs2_glock_dq_uninit(&t_gh); + gfs2_glock_dq_uninit(&thaw_gh); return 0; fail: - t_gh.gh_flags |= GL_NOCACHE; - gfs2_glock_dq_uninit(&t_gh); + thaw_gh.gh_flags |= GL_NOCACHE; + gfs2_glock_dq_uninit(&thaw_gh); fail_threads: kthread_stop(sdp->sd_quotad_process); kthread_stop(sdp->sd_logd_process); @@ -635,15 +636,21 @@ struct lfcc { */ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, - struct gfs2_holder *t_gh) + struct gfs2_holder *freeze_gh) { struct gfs2_inode *ip; struct gfs2_jdesc *jd; struct lfcc *lfcc; LIST_HEAD(list); struct gfs2_log_header_host lh; + struct gfs2_inode *dip = GFS2_I(sdp->sd_root_dir->d_inode); int error; + error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, + &sdp->sd_freeze_root_gh); + if (error) + return error; + atomic_set(&sdp->sd_frozen_root, 1); list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) { lfcc = kmalloc(sizeof(struct lfcc), GFP_KERNEL); if (!lfcc) { @@ -659,8 +666,8 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, list_add(&lfcc->list, &list); } - error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_DEFERRED, - GL_NOCACHE, t_gh); + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_EXCLUSIVE, + GL_NOCACHE, freeze_gh); list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) { error = gfs2_jdesc_check(jd); @@ -676,7 +683,7 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, } if (error) - gfs2_glock_dq_uninit(t_gh); + gfs2_glock_dq_uninit(freeze_gh); out: while (!list_empty(&list)) { @@ -685,6 +692,11 @@ out: gfs2_glock_dq_uninit(&lfcc->gh); kfree(lfcc); } + if (error) { + atomic_dec(&sdp->sd_frozen_root); + wait_event(sdp->sd_frozen_root_wait, atomic_read(&sdp->sd_frozen_root) == 0); + gfs2_glock_dq_uninit(&sdp->sd_freeze_root_gh); + } return error; } @@ -742,7 +754,7 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc) int ret = 0; if (wbc->sync_mode == WB_SYNC_ALL) - gfs2_log_flush(GFS2_SB(inode), ip->i_gl); + gfs2_log_flush(GFS2_SB(inode), ip->i_gl, NORMAL_FLUSH); if (bdi->dirty_exceeded) gfs2_ail1_flush(sdp, wbc); else @@ -822,9 +834,18 @@ out: static int gfs2_make_fs_ro(struct gfs2_sbd *sdp) { - struct gfs2_holder t_gh; + struct gfs2_holder thaw_gh; int error; + error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, GL_NOCACHE, + &thaw_gh); + if (error && !test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) + return error; + + down_write(&sdp->sd_log_flush_lock); + clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); + up_write(&sdp->sd_log_flush_lock); + kthread_stop(sdp->sd_quotad_process); kthread_stop(sdp->sd_logd_process); @@ -832,18 +853,11 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp) gfs2_quota_sync(sdp->sd_vfs, 0); gfs2_statfs_sync(sdp->sd_vfs, 0); - error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, - &t_gh); - if (error && !test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) - return error; - - gfs2_meta_syncfs(sdp); - gfs2_log_shutdown(sdp); - - clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); + gfs2_log_flush(sdp, NULL, SHUTDOWN_FLUSH); + gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks); - if (t_gh.gh_gl) - gfs2_glock_dq_uninit(&t_gh); + if (thaw_gh.gh_gl) + gfs2_glock_dq_uninit(&thaw_gh); gfs2_quota_cleanup(sdp); @@ -900,7 +914,7 @@ restart: iput(sdp->sd_quota_inode); gfs2_glock_put(sdp->sd_rename_gl); - gfs2_glock_put(sdp->sd_trans_gl); + gfs2_glock_put(sdp->sd_freeze_gl); if (!sdp->sd_args.ar_spectator) { gfs2_glock_dq_uninit(&sdp->sd_journal_gh); @@ -935,8 +949,8 @@ static int gfs2_sync_fs(struct super_block *sb, int wait) struct gfs2_sbd *sdp = sb->s_fs_info; gfs2_quota_sync(sb, -1); - if (wait && sdp) - gfs2_log_flush(sdp, NULL); + if (wait && sdp && !atomic_read(&sdp->sd_log_freeze)) + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); return 0; } @@ -986,6 +1000,9 @@ static int gfs2_unfreeze(struct super_block *sb) struct gfs2_sbd *sdp = sb->s_fs_info; gfs2_glock_dq_uninit(&sdp->sd_freeze_gh); + atomic_dec(&sdp->sd_frozen_root); + wait_event(sdp->sd_frozen_root_wait, atomic_read(&sdp->sd_frozen_root) == 0); + gfs2_glock_dq_uninit(&sdp->sd_freeze_root_gh); return 0; } @@ -1525,7 +1542,7 @@ static void gfs2_evict_inode(struct inode *inode) goto out_unlock; out_truncate: - gfs2_log_flush(sdp, ip->i_gl); + gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH); if (test_bit(GLF_DIRTY, &ip->i_gl->gl_flags)) { struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl); filemap_fdatawrite(metamapping); diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index de25d55..7bc17ed 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -240,8 +240,8 @@ static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len if (gltype > LM_TYPE_JOURNAL) return -EINVAL; - if (gltype == LM_TYPE_NONDISK && glnum == GFS2_TRANS_LOCK) - glops = &gfs2_trans_glops; + if (gltype == LM_TYPE_NONDISK && glnum == GFS2_FREEZE_LOCK) + glops = &gfs2_freeze_glops; else glops = gfs2_glops_list[gltype]; if (glops == NULL) diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c index bead90d..0546ab4 100644 --- a/fs/gfs2/trans.c +++ b/fs/gfs2/trans.c @@ -48,6 +48,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, tr->tr_blocks = blocks; tr->tr_revokes = revokes; tr->tr_reserved = 1; + tr->tr_alloced = 1; if (blocks) tr->tr_reserved += 6 + blocks; if (revokes) @@ -57,48 +58,22 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, INIT_LIST_HEAD(&tr->tr_buf); sb_start_intwrite(sdp->sd_vfs); - gfs2_holder_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &tr->tr_t_gh); - - error = gfs2_glock_nq(&tr->tr_t_gh); - if (error) - goto fail_holder_uninit; error = gfs2_log_reserve(sdp, tr->tr_reserved); if (error) - goto fail_gunlock; + goto fail; current->journal_info = tr; return 0; -fail_gunlock: - gfs2_glock_dq(&tr->tr_t_gh); - -fail_holder_uninit: +fail: sb_end_intwrite(sdp->sd_vfs); - gfs2_holder_uninit(&tr->tr_t_gh); kfree(tr); return error; } -/** - * gfs2_log_release - Release a given number of log blocks - * @sdp: The GFS2 superblock - * @blks: The number of blocks - * - */ - -static void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) -{ - - atomic_add(blks, &sdp->sd_log_blks_free); - trace_gfs2_log_blocks(sdp, blks); - gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= - sdp->sd_jdesc->jd_blocks); - up_read(&sdp->sd_log_flush_lock); -} - static void gfs2_print_trans(const struct gfs2_trans *tr) { pr_warn("Transaction created at: %pSR\n", (void *)tr->tr_ip); @@ -119,11 +94,8 @@ void gfs2_trans_end(struct gfs2_sbd *sdp) if (!tr->tr_touched) { gfs2_log_release(sdp, tr->tr_reserved); - if (tr->tr_t_gh.gh_gl) { - gfs2_glock_dq(&tr->tr_t_gh); - gfs2_holder_uninit(&tr->tr_t_gh); + if (tr->tr_alloced) kfree(tr); - } sb_end_intwrite(sdp->sd_vfs); return; } @@ -137,16 +109,12 @@ void gfs2_trans_end(struct gfs2_sbd *sdp) gfs2_print_trans(tr); gfs2_log_commit(sdp, tr); - if (tr->tr_t_gh.gh_gl) { - gfs2_glock_dq(&tr->tr_t_gh); - gfs2_holder_uninit(&tr->tr_t_gh); - if (!tr->tr_attached) + if (tr->tr_alloced && !tr->tr_attached) kfree(tr); - } up_read(&sdp->sd_log_flush_lock); if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS) - gfs2_log_flush(sdp, NULL); + gfs2_log_flush(sdp, NULL, NORMAL_FLUSH); sb_end_intwrite(sdp->sd_vfs); } diff --git a/include/uapi/linux/gfs2_ondisk.h b/include/uapi/linux/gfs2_ondisk.h index db3fdd0..1a763ea 100644 --- a/include/uapi/linux/gfs2_ondisk.h +++ b/include/uapi/linux/gfs2_ondisk.h @@ -20,7 +20,7 @@ #define GFS2_MOUNT_LOCK 0 #define GFS2_LIVE_LOCK 1 -#define GFS2_TRANS_LOCK 2 +#define GFS2_FREEZE_LOCK 2 #define GFS2_RENAME_LOCK 3 #define GFS2_CONTROL_LOCK 4 #define GFS2_MOUNTED_LOCK 5 -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 4/6] GFS2: fs/gfs2/bmap.c: kernel-doc warning fixes 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse ` (2 preceding siblings ...) 2014-06-03 11:02 ` [Cluster-devel] [PATCH 3/6] GFS2: remove transaction glock Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 5/6] GFS2: fs/gfs2/file.c: " Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 6/6] GFS2: Prevent recovery before the local journal is set Steven Whitehouse 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Fabian Frederick <fabf@skynet.be> Fix 2 typos and move one definition which was between function comments and function definition (yet another kernel-doc warning) Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Fabian Frederick <fabf@skynet.be> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index c62d4b9..e6ee5b6 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -707,7 +707,7 @@ int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsi * @top: The first pointer in the buffer * @bottom: One more than the last pointer * @height: the height this buffer is at - * @data: a pointer to a struct strip_mine + * @sm: a pointer to a struct strip_mine * * Returns: errno */ @@ -992,6 +992,8 @@ unlock: return err; } +#define GFS2_JTRUNC_REVOKES 8192 + /** * gfs2_journaled_truncate - Wrapper for truncate_pagecache for jdata files * @inode: The inode being truncated @@ -1003,8 +1005,6 @@ unlock: * if the number of pages being truncated gets too large. */ -#define GFS2_JTRUNC_REVOKES 8192 - static int gfs2_journaled_truncate(struct inode *inode, u64 oldsize, u64 newsize) { struct gfs2_sbd *sdp = GFS2_SB(inode); @@ -1348,7 +1348,7 @@ void gfs2_free_journal_extents(struct gfs2_jdesc *jd) * gfs2_add_jextent - Add or merge a new extent to extent cache * @jd: The journal descriptor * @lblock: The logical block at start of new extent - * @pblock: The physical block at start of new extent + * @dblock: The physical block at start of new extent * @blocks: Size of extent in fs blocks * * Returns: 0 on success or -ENOMEM -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 5/6] GFS2: fs/gfs2/file.c: kernel-doc warning fixes 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse ` (3 preceding siblings ...) 2014-06-03 11:02 ` [Cluster-devel] [PATCH 4/6] GFS2: fs/gfs2/bmap.c: kernel-doc warning fixes Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 6/6] GFS2: Prevent recovery before the local journal is set Steven Whitehouse 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Fabian Frederick <fabf@skynet.be> Related function is not gfs2_set_flags but do_gfs2_set_flags Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Fabian Frederick <fabf@skynet.be> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 6065252..6ab0cfb 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -203,9 +203,9 @@ void gfs2_set_inode_flags(struct inode *inode) GFS2_DIF_INHERIT_JDATA) /** - * gfs2_set_flags - set flags on an inode - * @inode: The inode - * @flags: The flags to set + * do_gfs2_set_flags - set flags on an inode + * @filp: file pointer + * @reqflags: The flags to set * @mask: Indicates which flags are valid * */ @@ -318,7 +318,7 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) /** * gfs2_size_hint - Give a hint to the size of a write request - * @file: The struct file + * @filep: The struct file * @offset: The file offset of the write * @size: The length of the write * @@ -371,7 +371,7 @@ static int gfs2_allocate_page_backing(struct page *page) /** * gfs2_page_mkwrite - Make a shared, mmap()ed, page writable * @vma: The virtual memory area - * @page: The page which is about to become writable + * @vmf: The virtual memory fault containing the page to become writable * * When the page becomes writable, we need to ensure that we have * blocks allocated on disk to back that page. -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] [PATCH 6/6] GFS2: Prevent recovery before the local journal is set 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse ` (4 preceding siblings ...) 2014-06-03 11:02 ` [Cluster-devel] [PATCH 5/6] GFS2: fs/gfs2/file.c: " Steven Whitehouse @ 2014-06-03 11:02 ` Steven Whitehouse 5 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-06-03 11:02 UTC (permalink / raw) To: cluster-devel.redhat.com From: Bob Peterson <rpeterso@redhat.com> This patch uses a completion to prevent dlm's recovery process from referencing and trying to recover a journal before a journal has been opened. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 2434a96..67d310c 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -728,6 +728,8 @@ struct gfs2_sbd { struct gfs2_holder sd_sc_gh; struct gfs2_holder sd_qc_gh; + struct completion sd_journal_ready; + /* Daemon stuff */ struct task_struct *sd_logd_process; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index be45c79..bc564c0 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -94,6 +94,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb) INIT_LIST_HEAD(&sdp->sd_jindex_list); spin_lock_init(&sdp->sd_jindex_spin); mutex_init(&sdp->sd_jindex_mutex); + init_completion(&sdp->sd_journal_ready); INIT_LIST_HEAD(&sdp->sd_quota_list); mutex_init(&sdp->sd_quota_mutex); @@ -796,6 +797,7 @@ static int init_inodes(struct gfs2_sbd *sdp, int undo) goto fail_qinode; error = init_journal(sdp, undo); + complete_all(&sdp->sd_journal_ready); if (error) goto fail; @@ -1212,6 +1214,7 @@ fail_sb: fail_locking: init_locking(sdp, &mount_gh, UNDO); fail_lm: + complete_all(&sdp->sd_journal_ready); gfs2_gl_hash_clear(sdp); gfs2_lm_unmount(sdp); fail_debug: diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 7bc17ed..0e049f9 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -407,6 +407,9 @@ int gfs2_recover_set(struct gfs2_sbd *sdp, unsigned jid) struct gfs2_jdesc *jd; int rv; + /* Wait for our primary journal to be initialized */ + wait_for_completion(&sdp->sd_journal_ready); + spin_lock(&sdp->sd_jindex_spin); rv = -EBUSY; if (sdp->sd_jdesc->jd_jid == jid) -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2014-12-08 12:38 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-12-08 12:38 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, In contrast to recent merge windows, there are a number of interesting features this time. There is a set of patches to improve performance in relation to block reservations. Some correctness fixes for fallocate, and an update to the freeze/thaw code which greatly simplyfies this code path. In addition there is a set of clean ups from Al Viro too, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2014-10-08 9:53 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-10-08 9:53 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Not a huge amount this time... just four patches. This time we have a couple of bug fixes, one relating to bad i_goal values which are now ignored (i_goal is basically a hint so it is safe to so this) and another relating to the saving of the dirent location during rename. There is one performance improvement, which is an optimisation in rgblk_free so that multiple block deallocations will now be more efficient, and one clean up patch to use _RET_IP_ rather than writing it out longhand, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2014-04-01 9:15 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-04-01 9:15 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here is the current content of the GFS2 -nmw tree for the current merge window. One of the main highlights this time, is not the patches themselves but instead the widening contributor base. It is good to see that interest is increasing in GFS2, and I'd like to thank all the contributors to this patch set. In addition to the usual set of bug fixes and clean ups, there are patches to improve inode creation performance when xattrs are required and some improvements to the transaction code which is intended to help improve scalability after further changes in due course. Journal extent mapping is also updated to make it more efficient and again, this is a foundation for future work in this area. The maximum number of ACLs has been increased to 300 (for a 4k block size) which means that even with a few additional xattrs from selinux, everything should fit within a single fs block. There is also a patch to bring GFS2's own copy of the writepages code up to the same level as the core VFS. Eventually we may be able to merge some of this code, since it is fairly similar. The other major change this time, is bringing consistency to the printing of messages via fs_<level>, pr_<level> macros. Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2014-01-20 12:23 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2014-01-20 12:23 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Here are the pending patches for the merge window which are currently in the GFS2 tree. The main topics this time are allocation, in the form of Bob's improvements when searching resource groups and several updates to quotas which should increase scalability. The quota changes follow on from those in the last merge window, and there will likely be further work to come in this area in due course. There are also a few patches which help to improve efficiency of adding entries into directories, and clean up some of that code. One on-disk change is included this time, which is to write some additional information which should be useful to fsck and also potentially for debugging. Other than that, its just a few small random bug fixes and clean ups, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2013-11-04 11:09 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2013-11-04 11:09 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, I'm just back from firstly Edinburgh, and secondly holiday, and the merge window is again upon us. I've added in the three pending patches which were under test while I was away and then that should be it for this time. The main feature of interest this time is quota updates. There are some clean ups and some patches to use the new generic lru list code. There is still plenty of scope for some further changes in due course - faster lookups of quota structures is very much on the todo list. Also, a start has been made towards the more tricky issue of using the generic lru code with glocks, but that will have to be completed in a subsequent merge window. The other, more minor feature, is that there have been a number of performance patches which relate to block allocation. In particular they will improve performance when the disk is nearly full, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2 Pre-pull patch posting (merge window) @ 2013-09-05 9:02 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2013-09-05 9:02 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, This is the smallest merge window patch set for GFS2 for quite some time. Only one of the patches (moving gfs2_sync_meta) is a non-bug fix patch, although the merge ordered and writeback writepage patch is also a nice clean up. A couple of the patches are quite recently added, due to my only having recently returned from holiday, so I'll give them a couple of extra days in -next before sending the pull request. Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2013-07-01 9:33 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2013-07-01 9:33 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, There are a few bug fixes for various, mostly very minor corner cases, plus some interesting new features. The new features include atomic_open whose main benefit will be the reduction in locking overhead in case of combined lookup/create and open operations, sorting the log buffer lists by block number to improve the efficiency of AIL writeback, and agressively issuing revokes in gfs2_log_flush to reduce overhead when dropping glocks, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2013-04-26 9:18 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2013-04-26 9:18 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Since the merge window is coming up soon, I'm posting the content of the GFS2 -nmw tree as usual. There is not a whole lot of change this time - there are some further changes which are in the works, but those will be held over until next time. Here there are some clean ups to inode creation, the addition of an origin (local or remote) indicator to glock demote requests, removal of one of the remaining GFP_NOFAIL allocations during log flushes, one minor clean up, and a one liner bug fix, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2013-02-19 10:07 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2013-02-19 10:07 UTC (permalink / raw) To: cluster-devel.redhat.com This is one of the smallest collections of patches for the merge window for some time. There are some clean ups relating to the transaction code and the shrinker, which are mostly in preparation for further development, but also make the code much easier to follow in these areas. There is a patch which allows the use of ->writepages even in the default ordered write mode for all writebacks. This results in sending larger i/os to the block layer, and a subsequent increase in performance. It also reduces the number of different i/o paths by one. There is also a bug fix reinstating the withdraw ack system which somehow got lost when the lock modules were merged into GFS2. And thats all this time around, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-11-30 9:52 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-11-30 9:52 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, So yes, this is a bit early, but the tree seems to have settled down now, and I'd like to hold off any further feature patches until the subsequent merge window at this stage. The main feature this time is the new Orlov allocator and the patches leading up to it which allow us to allocate new inodes from their own allocation context, rather than borrowing that of their parent directory. It is this change which then allows us to choose a different location for subdirectories when required. This works exactly as per the ext3 implementation from the users point of view. In addition to that, we've got a speed up in gfs2_rbm_from_block() from Bob Peterson, three locking related improvements from Dave Teigland plus a selection of smaller bug fixes and clean ups. Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-09-26 8:25 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-09-26 8:25 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, We've collected up a goodly number of patches in the -nmw tree now and we can hold off any further changes until the following merge window, so here is the current tree content. The major feature this time is the "rbm" conversion in the resource group code. The new struct gfs2_rbm specifies the location of an allocatable block in (resource group, bitmap, offset) form. There are a number of added helper functions, and later patches then rewrite some of the resource group code in terms of this new structure. Not only does this give us a nice code clean up, but it also removes some of the previous restructions where extents could not cross bitmap boundaries, for example. In addition to that, there are a few bug fixes and clean ups, but the rbm work is by far the majority of this patch set in terms of number of changed lines. Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-07-23 8:00 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-07-23 8:00 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, As usual, here is the content of the GFS2 tree prior to sending a merge request. Not a huge number of patches this time, but some interesting features nonetheless. A number of the earlier patches are aimed at cleaning up the resource group code for the later patch which implements block reservations. In addition to that, there are a few patches aimed at improving the time taken to dump (the potentially rather large) glock debugfs file. Beyond that there are a couple of bug fixes and thats about it this time, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-05-17 12:23 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-05-17 12:23 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Since the merge window appears to be fast approaching, here are the current GFS2 patches. This time there are two main themes, one is updates to the log code, mostly on the writing side. The other is preparation for some block reservation work which will probably land in the subsequent merge window. There is of course the usual collection of cleanup and bug fixes as well. See the individual patches for the detailed descriptions, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-03-19 10:25 Steven Whitehouse [not found] ` <4F674696.7030602@xenotime.net> 0 siblings, 1 reply; 35+ messages in thread From: Steven Whitehouse @ 2012-03-19 10:25 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Not a huge number of patches this time. Some notable new features though: - Glock stats gathering (v. useful for performance analysis) - FITRIM ioctl support - Sorting the ordered write list (big performance increase when the workload doesn't result in the write requests being nicely ordered to start with) Plus a few clean ups, and bug fixes in addition, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
[parent not found: <4F674696.7030602@xenotime.net>]
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F674696.7030602@xenotime.net> @ 2012-03-19 14:59 ` Steven Whitehouse [not found] ` <4F674E4F.5080904@xenotime.net> 0 siblings, 1 reply; 35+ messages in thread From: Steven Whitehouse @ 2012-03-19 14:59 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Mon, 2012-03-19 at 07:45 -0700, Randy Dunlap wrote: > On 03/19/2012 03:25 AM, Steven Whitehouse wrote: > > > Hi, > > > > Not a huge number of patches this time. Some notable new features > > though: > > - Glock stats gathering (v. useful for performance analysis) > > - FITRIM ioctl support > > - Sorting the ordered write list (big performance increase when the workload > > doesn't result in the write requests being nicely ordered to start with) > > > > Plus a few clean ups, and bug fixes in addition, > > > > Hi, > > I reported a build error in linux-next 20120313, but it appears > that mainline also needs the fix (when it's ready) since mainline > gfs2 Kconfig selects DLM_SCTP, which does not exist. > > https://lkml.org/lkml/2012/3/13/456 > Does the following fix the problem? If so then I'll roll that into the tree before it gets pushed, Steve. diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig index c465ae0..f4e1c60 100644 --- a/fs/gfs2/Kconfig +++ b/fs/gfs2/Kconfig @@ -4,7 +4,7 @@ config GFS2_FS select DLM if GFS2_FS_LOCKING_DLM select CONFIGFS_FS if GFS2_FS_LOCKING_DLM select SYSFS if GFS2_FS_LOCKING_DLM - select IP_SCTP if DLM_SCTP + select IP_SCTP if GFS2_FS_LOCKING_DLM select FS_POSIX_ACL select CRC32 select QUOTACTL ^ permalink raw reply related [flat|nested] 35+ messages in thread
[parent not found: <4F674E4F.5080904@xenotime.net>]
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F674E4F.5080904@xenotime.net> @ 2012-03-19 15:34 ` Steven Whitehouse 2012-03-23 19:41 ` David Teigland 2012-03-20 9:47 ` Steven Whitehouse 1 sibling, 1 reply; 35+ messages in thread From: Steven Whitehouse @ 2012-03-19 15:34 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Mon, 2012-03-19 at 08:18 -0700, Randy Dunlap wrote: > On 03/19/2012 07:59 AM, Steven Whitehouse wrote: > > > Hi, > > > > On Mon, 2012-03-19 at 07:45 -0700, Randy Dunlap wrote: > >> On 03/19/2012 03:25 AM, Steven Whitehouse wrote: > >> > >>> Hi, > >>> > >>> Not a huge number of patches this time. Some notable new features > >>> though: > >>> - Glock stats gathering (v. useful for performance analysis) > >>> - FITRIM ioctl support > >>> - Sorting the ordered write list (big performance increase when the workload > >>> doesn't result in the write requests being nicely ordered to start with) > >>> > >>> Plus a few clean ups, and bug fixes in addition, > >> > >> > >> > >> Hi, > >> > >> I reported a build error in linux-next 20120313, but it appears > >> that mainline also needs the fix (when it's ready) since mainline > >> gfs2 Kconfig selects DLM_SCTP, which does not exist. > >> > >> https://lkml.org/lkml/2012/3/13/456 > >> > > > > Does the following fix the problem? If so then I'll roll that into the > > tree before it gets pushed, > > > > No, that's not sufficient: > > warning: (GFS2_FS) selects DLM which has unmet direct dependencies (EXPERIMENTAL && INET && SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n)) > warning: (DLM && GFS2_FS) selects IP_SCTP which has unmet direct dependencies (NET && INET && EXPERIMENTAL && (IPV6 || IPV6=n)) > > and > > ERROR: "crc32c" [net/sctp/sctp.ko] undefined! > > Hmm, ok. I'll look at this again. I'm not sure why DLM is still calling itself EXPERIMENTAL since thats long since not been the case, maybe SCTP still is, but I don't think GFS2 should be selecting EXPERIMENTAL directly, anyway. It is rather easy to tie ones' self in knots with this config language.... since GFS2_FS_LOCKING_DLM depends on NET && INET && (IPV6 || IPV6=n) && HOTPLUG then all those other deps must presumably be set anyway, so I don't understand quite why DLM doesn't have those available to it. I'll dig around a bit and see if I can figure out whats going on here, Steve. > > > > > > diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig > > index c465ae0..f4e1c60 100644 > > --- a/fs/gfs2/Kconfig > > +++ b/fs/gfs2/Kconfig > > @@ -4,7 +4,7 @@ config GFS2_FS > > select DLM if GFS2_FS_LOCKING_DLM > > select CONFIGFS_FS if GFS2_FS_LOCKING_DLM > > select SYSFS if GFS2_FS_LOCKING_DLM > > - select IP_SCTP if DLM_SCTP > > + select IP_SCTP if GFS2_FS_LOCKING_DLM > > select FS_POSIX_ACL > > select CRC32 > > select QUOTACTL > > > > > > > ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) 2012-03-19 15:34 ` Steven Whitehouse @ 2012-03-23 19:41 ` David Teigland 2012-03-23 19:46 ` David Miller [not found] ` <4F6CD7AD.9030306@xenotime.net> 0 siblings, 2 replies; 35+ messages in thread From: David Teigland @ 2012-03-23 19:41 UTC (permalink / raw) To: cluster-devel.redhat.com > on i386: > > ERROR: "sctp_do_peeloff" [fs/dlm/dlm.ko] undefined! > > > GFS2_FS selects DLM (if GFS2_FS_LOCKING_DLM, which is enabled). > GFS2_FS selects IP_SCTP if DLM_SCTP, which is not enabled and not > used anywhere else in the kernel tree AFAICT. > DLM just always selects IP_SCTP. Here's what we have now: config GFS2_FS tristate "GFS2 file system support" depends on (64BIT || LBDAF) select DLM if GFS2_FS_LOCKING_DLM select CONFIGFS_FS if GFS2_FS_LOCKING_DLM select SYSFS if GFS2_FS_LOCKING_DLM select IP_SCTP if DLM_SCTP select FS_POSIX_ACL select CRC32 select QUOTACTL menuconfig DLM tristate "Distributed Lock Manager (DLM)" depends on EXPERIMENTAL && INET depends on SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n) select IP_SCTP Why does gfs2 Kconfig bother with SCTP at all? It seems that line should just be removed. I'll also remove EXPERIMENTAL. I don't understand the vagaries of Kconfig, so a dumb question, how could sctp_do_peeloff possibly be undefined if we're selecting SCTP. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) 2012-03-23 19:41 ` David Teigland @ 2012-03-23 19:46 ` David Miller [not found] ` <4F6CD7AD.9030306@xenotime.net> 1 sibling, 0 replies; 35+ messages in thread From: David Miller @ 2012-03-23 19:46 UTC (permalink / raw) To: cluster-devel.redhat.com From: David Teigland <teigland@redhat.com> Date: Fri, 23 Mar 2012 15:41:52 -0400 > Why does gfs2 Kconfig bother with SCTP at all? It seems that line should > just be removed. I'll also remove EXPERIMENTAL. I don't understand the > vagaries of Kconfig, so a dumb question, how could sctp_do_peeloff > possibly be undefined if we're selecting SCTP. GFS2=y SCTP=m ^ permalink raw reply [flat|nested] 35+ messages in thread
[parent not found: <4F6CD7AD.9030306@xenotime.net>]
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F6CD7AD.9030306@xenotime.net> @ 2012-03-23 20:09 ` Steven Whitehouse 2012-03-23 20:18 ` David Teigland 1 sibling, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-03-23 20:09 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Fri, 2012-03-23 at 13:06 -0700, Randy Dunlap wrote: > On 03/23/2012 12:41 PM, David Teigland wrote: > > > > >> on i386: > >> > >> ERROR: "sctp_do_peeloff" [fs/dlm/dlm.ko] undefined! > >> > >> > >> GFS2_FS selects DLM (if GFS2_FS_LOCKING_DLM, which is enabled). > >> GFS2_FS selects IP_SCTP if DLM_SCTP, which is not enabled and not > >> used anywhere else in the kernel tree AFAICT. > >> DLM just always selects IP_SCTP. > > > > Here's what we have now: > > > > config GFS2_FS > > tristate "GFS2 file system support" > > depends on (64BIT || LBDAF) > > select DLM if GFS2_FS_LOCKING_DLM > > select CONFIGFS_FS if GFS2_FS_LOCKING_DLM > > select SYSFS if GFS2_FS_LOCKING_DLM > > select IP_SCTP if DLM_SCTP > > select FS_POSIX_ACL > > select CRC32 > > select QUOTACTL > > > > menuconfig DLM > > tristate "Distributed Lock Manager (DLM)" > > depends on EXPERIMENTAL && INET > > depends on SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n) > > select IP_SCTP > > > > Why does gfs2 Kconfig bother with SCTP at all? It seems that line should > > just be removed. I'll also remove EXPERIMENTAL. I don't understand the > > vagaries of Kconfig, so a dumb question, how could sctp_do_peeloff > > possibly be undefined if we're selecting SCTP. > > What is selecting SCTP? DLM? so GFS2 selects DLM, but selects > don't follow dependency chains. Also, the "select IP_SCTP if DLM_SCTP" > in GFS2 is meaningless since there is no DLM_SCTP. > > I just verified that the (posted) failing config still fails with > today's linux-next. > The DLM_SCTP is historical. There used to be such a thing, but that config option went away, and there is now run time selection of the DLM transport. So that the GFS2 Kconfig should have been updated, however that appears not to be enough on its own to resolve the issue, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F6CD7AD.9030306@xenotime.net> 2012-03-23 20:09 ` Steven Whitehouse @ 2012-03-23 20:18 ` David Teigland [not found] ` <20120323220618.GA30906@d2.synalogic.ca> 1 sibling, 1 reply; 35+ messages in thread From: David Teigland @ 2012-03-23 20:18 UTC (permalink / raw) To: cluster-devel.redhat.com On Fri, Mar 23, 2012 at 01:06:05PM -0700, Randy Dunlap wrote: > >> GFS2_FS selects DLM (if GFS2_FS_LOCKING_DLM, which is enabled). > >> GFS2_FS selects IP_SCTP if DLM_SCTP, which is not enabled and not > >> used anywhere else in the kernel tree AFAICT. > >> DLM just always selects IP_SCTP. > > > > Here's what we have now: > > > > config GFS2_FS > > tristate "GFS2 file system support" > > depends on (64BIT || LBDAF) > > select DLM if GFS2_FS_LOCKING_DLM > > select CONFIGFS_FS if GFS2_FS_LOCKING_DLM > > select SYSFS if GFS2_FS_LOCKING_DLM > > select IP_SCTP if DLM_SCTP > > select FS_POSIX_ACL > > select CRC32 > > select QUOTACTL > > > > menuconfig DLM > > tristate "Distributed Lock Manager (DLM)" > > depends on EXPERIMENTAL && INET > > depends on SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n) > > select IP_SCTP > > > > Why does gfs2 Kconfig bother with SCTP at all? It seems that line should > > just be removed. I'll also remove EXPERIMENTAL. I don't understand the > > vagaries of Kconfig, so a dumb question, how could sctp_do_peeloff > > possibly be undefined if we're selecting SCTP. > > What is selecting SCTP? DLM? so GFS2 selects DLM, but selects > don't follow dependency chains. Also, the "select IP_SCTP if DLM_SCTP" > in GFS2 is meaningless since there is no DLM_SCTP. https://lkml.org/lkml/2012/3/8/222 seems to have caused this by adding the new dependency on the sctp module without any Kconfig changes. Should that patch have added depends IP_SCTP to the dlm and gfs2? ^ permalink raw reply [flat|nested] 35+ messages in thread
[parent not found: <20120323220618.GA30906@d2.synalogic.ca>]
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <20120323220618.GA30906@d2.synalogic.ca> @ 2012-03-26 10:44 ` Steven Whitehouse [not found] ` <4F79C733.60604@xenotime.net> 0 siblings, 1 reply; 35+ messages in thread From: Steven Whitehouse @ 2012-03-26 10:44 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Fri, 2012-03-23 at 18:06 -0400, Benjamin Poirier wrote: [snip] > > Instead of trying to select everything in GFS2, how about doing it this way? > > [PATCH] gfs2: use depends instead of select in kconfig > > Avoids having to duplicate the dependencies of what is 'select'ed (and on > down...) > > Those dependencies are currently incomplete, leading to broken builds with > GFS2_FS_LOCKING_DLM=y and IP_SCTP=n. > > Signed-off-by: Benjamin Poirier <bpoirier@suse.de> > --- > fs/gfs2/Kconfig | 7 ++----- > 1 files changed, 2 insertions(+), 5 deletions(-) > > diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig > index c465ae0..eb08c9e 100644 > --- a/fs/gfs2/Kconfig > +++ b/fs/gfs2/Kconfig > @@ -1,10 +1,6 @@ > config GFS2_FS > tristate "GFS2 file system support" > depends on (64BIT || LBDAF) > - select DLM if GFS2_FS_LOCKING_DLM > - select CONFIGFS_FS if GFS2_FS_LOCKING_DLM > - select SYSFS if GFS2_FS_LOCKING_DLM > - select IP_SCTP if DLM_SCTP > select FS_POSIX_ACL > select CRC32 > select QUOTACTL > @@ -29,7 +25,8 @@ config GFS2_FS > > config GFS2_FS_LOCKING_DLM > bool "GFS2 DLM locking" > - depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && HOTPLUG > + depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && \ > + HOTPLUG && DLM && CONFIGFS_FS && SYSFS > help > Multiple node locking module for GFS2 > That looks ok to me. I've put it in the GFS2 -fixes tree, and if everybody is happy with that I'll send a pull request shortly, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
[parent not found: <4F79C733.60604@xenotime.net>]
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F79C733.60604@xenotime.net> @ 2012-04-02 15:47 ` Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-04-02 15:47 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Mon, 2012-04-02 at 08:35 -0700, Randy Dunlap wrote: > On 03/26/2012 03:44 AM, Steven Whitehouse wrote: > > > Hi, > > > > On Fri, 2012-03-23 at 18:06 -0400, Benjamin Poirier wrote: > > [snip] > >> > >> Instead of trying to select everything in GFS2, how about doing it this way? > >> > >> [PATCH] gfs2: use depends instead of select in kconfig > >> > >> Avoids having to duplicate the dependencies of what is 'select'ed (and on > >> down...) > >> > >> Those dependencies are currently incomplete, leading to broken builds with > >> GFS2_FS_LOCKING_DLM=y and IP_SCTP=n. > >> > >> Signed-off-by: Benjamin Poirier <bpoirier@suse.de> > >> --- > >> fs/gfs2/Kconfig | 7 ++----- > >> 1 files changed, 2 insertions(+), 5 deletions(-) > >> > >> diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig > >> index c465ae0..eb08c9e 100644 > >> --- a/fs/gfs2/Kconfig > >> +++ b/fs/gfs2/Kconfig > >> @@ -1,10 +1,6 @@ > >> config GFS2_FS > >> tristate "GFS2 file system support" > >> depends on (64BIT || LBDAF) > >> - select DLM if GFS2_FS_LOCKING_DLM > >> - select CONFIGFS_FS if GFS2_FS_LOCKING_DLM > >> - select SYSFS if GFS2_FS_LOCKING_DLM > >> - select IP_SCTP if DLM_SCTP > >> select FS_POSIX_ACL > >> select CRC32 > >> select QUOTACTL > >> @@ -29,7 +25,8 @@ config GFS2_FS > >> > >> config GFS2_FS_LOCKING_DLM > >> bool "GFS2 DLM locking" > >> - depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && HOTPLUG > >> + depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && \ > >> + HOTPLUG && DLM && CONFIGFS_FS && SYSFS > >> help > >> Multiple node locking module for GFS2 > >> > > > > That looks ok to me. I've put it in the GFS2 -fixes tree, and if > > everybody is happy with that I'll send a pull request shortly, > > > Can we get Benjamin's patch merged, please? > linux-next is still having build errors without it. > It is in the GFS2 -nmw tree now, so it will be in linux-next shortly. I'll merge up the -fixes tree shortly, but I'm expecting one more patch for that very shortly, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) [not found] ` <4F674E4F.5080904@xenotime.net> 2012-03-19 15:34 ` Steven Whitehouse @ 2012-03-20 9:47 ` Steven Whitehouse 1 sibling, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-03-20 9:47 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, On Mon, 2012-03-19 at 08:18 -0700, Randy Dunlap wrote: > On 03/19/2012 07:59 AM, Steven Whitehouse wrote: > > > Hi, > > > > On Mon, 2012-03-19 at 07:45 -0700, Randy Dunlap wrote: > >> On 03/19/2012 03:25 AM, Steven Whitehouse wrote: > >> > >>> Hi, > >>> > >>> Not a huge number of patches this time. Some notable new features > >>> though: > >>> - Glock stats gathering (v. useful for performance analysis) > >>> - FITRIM ioctl support > >>> - Sorting the ordered write list (big performance increase when the workload > >>> doesn't result in the write requests being nicely ordered to start with) > >>> > >>> Plus a few clean ups, and bug fixes in addition, > >> > >> > >> > >> Hi, > >> > >> I reported a build error in linux-next 20120313, but it appears > >> that mainline also needs the fix (when it's ready) since mainline > >> gfs2 Kconfig selects DLM_SCTP, which does not exist. > >> > >> https://lkml.org/lkml/2012/3/13/456 > >> > > > > Does the following fix the problem? If so then I'll roll that into the > > tree before it gets pushed, > > > > No, that's not sufficient: > > warning: (GFS2_FS) selects DLM which has unmet direct dependencies (EXPERIMENTAL && INET && SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n)) > warning: (DLM && GFS2_FS) selects IP_SCTP which has unmet direct dependencies (NET && INET && EXPERIMENTAL && (IPV6 || IPV6=n)) > > and > > ERROR: "crc32c" [net/sctp/sctp.ko] undefined! > > Since the pending patch set doesn't affect the Kconfig at all, I don't think that this issue needs to hold up merging the GFS2 tree. We'll follow up with a fix for this later on, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2012-01-05 11:51 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2012-01-05 11:51 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, The main feature this time is clean up around the allocation and resource group code. Otherwise the remainder is mostly small bug fixes. I've held back the glock stats patch and that will probably be ready for the following merge window with a bit of luck, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2011-10-24 12:48 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2011-10-24 12:48 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Since the merge window is upon us, here is the current content of the GFS2 git tree. A few things will be help back to the following merge window in order to ensure a greater test time, but those currently in the tree are ready for the current window. Recently I've reconstituted the GFS2 git tree, so it can be pulled (via http) from: http://sucs.org/~rohan/git/gfs2-3.0-nmw and viewed via gitweb at: http://sucs.org/gitweb/ This is thanks to the Swansea University Computer Society for providing a temporary (or possibly permanent) home for the GFS2 git trees. Please treat their server kindly as this will only continue while it doesn't generate too much traffic. I figure that there will not be too many people pulling the GFS2 tree at once, but we'll see. Some highlights of the current patch set: o Reduction in code of approx 400 lines o Big clean up (and speed up) in the resource group code - This is a nice base to build some forthcoming improvements on - It should improve performance with multi-threaded workloads o Some left-over fsync/writeback changes o Improvements to readahead when deallocating large directories Any questions/concerns then please let me know as usual, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2011-07-22 9:16 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2011-07-22 9:16 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, Not a lot new this time... the addition of a cache for the directory hash table improve directory read/lookup speed, automatic adjustment of the glock hold time improves performance for some contention corner cases. S_NOSEC support is another performance related change, plus a nice clean up from Eric Sandeen, Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2011-05-19 8:46 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2011-05-19 8:46 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, This time, most of the GFS2 patches are code clean up, although there are a few bug fixes (fallocate/ail writeback/end of life inodes/nlink) and some new features (new tracepoint & tracing flags, using the UUID field in the generic superblock). The changes can be broadly divided into three sets: 1. Bob's directory code clean up 2. My fsync/ail writeback fixes & clean up 3. inode.c/ops_inode.c clean up Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
* [Cluster-devel] GFS2: Pre-pull patch posting (merge window) @ 2011-03-15 9:11 Steven Whitehouse 0 siblings, 0 replies; 35+ messages in thread From: Steven Whitehouse @ 2011-03-15 9:11 UTC (permalink / raw) To: cluster-devel.redhat.com Hi, The most interesting "feature" in this patch set is the RCU glock patch which has been a long time coming, but is finally here. That patch contains most of the changes this time. The other patches ins this set are mostly smaller bug fixes and performance improvements. Steve. ^ permalink raw reply [flat|nested] 35+ messages in thread
end of thread, other threads:[~2014-12-08 12:38 UTC | newest] Thread overview: 35+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-06-03 11:02 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 1/6] GFS2: quotas not being refreshed in gfs2_adjust_quota Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 2/6] GFS2: lops.c: replace 0 by NULL for pointers Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 3/6] GFS2: remove transaction glock Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 4/6] GFS2: fs/gfs2/bmap.c: kernel-doc warning fixes Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 5/6] GFS2: fs/gfs2/file.c: " Steven Whitehouse 2014-06-03 11:02 ` [Cluster-devel] [PATCH 6/6] GFS2: Prevent recovery before the local journal is set Steven Whitehouse -- strict thread matches above, loose matches on Subject: below -- 2014-12-08 12:38 [Cluster-devel] GFS2: Pre-pull patch posting (merge window) Steven Whitehouse 2014-10-08 9:53 Steven Whitehouse 2014-04-01 9:15 Steven Whitehouse 2014-01-20 12:23 Steven Whitehouse 2013-11-04 11:09 Steven Whitehouse 2013-09-05 9:02 [Cluster-devel] GFS2 " Steven Whitehouse 2013-07-01 9:33 [Cluster-devel] GFS2: " Steven Whitehouse 2013-04-26 9:18 Steven Whitehouse 2013-02-19 10:07 Steven Whitehouse 2012-11-30 9:52 Steven Whitehouse 2012-09-26 8:25 Steven Whitehouse 2012-07-23 8:00 Steven Whitehouse 2012-05-17 12:23 Steven Whitehouse 2012-03-19 10:25 Steven Whitehouse [not found] ` <4F674696.7030602@xenotime.net> 2012-03-19 14:59 ` Steven Whitehouse [not found] ` <4F674E4F.5080904@xenotime.net> 2012-03-19 15:34 ` Steven Whitehouse 2012-03-23 19:41 ` David Teigland 2012-03-23 19:46 ` David Miller [not found] ` <4F6CD7AD.9030306@xenotime.net> 2012-03-23 20:09 ` Steven Whitehouse 2012-03-23 20:18 ` David Teigland [not found] ` <20120323220618.GA30906@d2.synalogic.ca> 2012-03-26 10:44 ` Steven Whitehouse [not found] ` <4F79C733.60604@xenotime.net> 2012-04-02 15:47 ` Steven Whitehouse 2012-03-20 9:47 ` Steven Whitehouse 2012-01-05 11:51 Steven Whitehouse 2011-10-24 12:48 Steven Whitehouse 2011-07-22 9:16 Steven Whitehouse 2011-05-19 8:46 Steven Whitehouse 2011-03-15 9:11 Steven Whitehouse
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).