提交 a531a141 编写于 作者: L Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2:
  ocfs2: reverse inline-data truncate args
  ocfs2: Fix comparison in ocfs2_size_fits_inline_data()
  ocfs2: Remove bug statement in ocfs2_dentry_iput()
  [PATCH] ocfs2: Remove expensive bitmap scanning
  ocfs2: log valid inode # on bad inode
  ocfs2: Filter -ENOSPC in mlog_errno()
  [PATCH] fs/ocfs2: Add missing "space"
  ocfs2: Reset journal parameters after s_mount_opt update
...@@ -459,6 +459,15 @@ config OCFS2_DEBUG_MASKLOG ...@@ -459,6 +459,15 @@ config OCFS2_DEBUG_MASKLOG
This option will enlarge your kernel, but it allows debugging of This option will enlarge your kernel, but it allows debugging of
ocfs2 filesystem issues. ocfs2 filesystem issues.
config OCFS2_DEBUG_FS
bool "OCFS2 expensive checks"
depends on OCFS2_FS
default n
help
This option will enable expensive consistency checks. Enable
this option for debugging only as it is likely to decrease
performance of the filesystem.
config MINIX_FS config MINIX_FS
tristate "Minix fs support" tristate "Minix fs support"
help help
......
...@@ -1514,7 +1514,7 @@ int ocfs2_size_fits_inline_data(struct buffer_head *di_bh, u64 new_size) ...@@ -1514,7 +1514,7 @@ int ocfs2_size_fits_inline_data(struct buffer_head *di_bh, u64 new_size)
{ {
struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
if (new_size < le16_to_cpu(di->id2.i_data.id_count)) if (new_size <= le16_to_cpu(di->id2.i_data.id_count))
return 1; return 1;
return 0; return 0;
} }
......
...@@ -212,7 +212,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; ...@@ -212,7 +212,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits;
#define mlog_errno(st) do { \ #define mlog_errno(st) do { \
int _st = (st); \ int _st = (st); \
if (_st != -ERESTARTSYS && _st != -EINTR && \ if (_st != -ERESTARTSYS && _st != -EINTR && \
_st != AOP_TRUNCATED_PAGE) \ _st != AOP_TRUNCATED_PAGE && _st != -ENOSPC) \
mlog(ML_ERROR, "status = %lld\n", (long long)_st); \ mlog(ML_ERROR, "status = %lld\n", (long long)_st); \
} while (0) } while (0)
......
...@@ -344,12 +344,24 @@ static void ocfs2_dentry_iput(struct dentry *dentry, struct inode *inode) ...@@ -344,12 +344,24 @@ static void ocfs2_dentry_iput(struct dentry *dentry, struct inode *inode)
{ {
struct ocfs2_dentry_lock *dl = dentry->d_fsdata; struct ocfs2_dentry_lock *dl = dentry->d_fsdata;
mlog_bug_on_msg(!dl && !(dentry->d_flags & DCACHE_DISCONNECTED), if (!dl) {
"dentry: %.*s\n", dentry->d_name.len, /*
dentry->d_name.name); * No dentry lock is ok if we're disconnected or
* unhashed.
*/
if (!(dentry->d_flags & DCACHE_DISCONNECTED) &&
!d_unhashed(dentry)) {
unsigned long long ino = 0ULL;
if (inode)
ino = (unsigned long long)OCFS2_I(inode)->ip_blkno;
mlog(ML_ERROR, "Dentry is missing cluster lock. "
"inode: %llu, d_flags: 0x%x, d_name: %.*s\n",
ino, dentry->d_flags, dentry->d_name.len,
dentry->d_name.name);
}
if (!dl)
goto out; goto out;
}
mlog_bug_on_msg(dl->dl_count == 0, "dentry: %.*s, count: %u\n", mlog_bug_on_msg(dl->dl_count == 0, "dentry: %.*s, count: %u\n",
dentry->d_name.len, dentry->d_name.name, dentry->d_name.len, dentry->d_name.name,
......
...@@ -908,7 +908,7 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, ...@@ -908,7 +908,7 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm,
* but they might own this lockres. wait on them. */ * but they might own this lockres. wait on them. */
bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0);
if (bit < O2NM_MAX_NODES) { if (bit < O2NM_MAX_NODES) {
mlog(ML_NOTICE, "%s:%.*s: at least one node (%d) to" mlog(ML_NOTICE, "%s:%.*s: at least one node (%d) to "
"recover before lock mastery can begin\n", "recover before lock mastery can begin\n",
dlm->name, namelen, (char *)lockid, bit); dlm->name, namelen, (char *)lockid, bit);
wait_on_recovery = 1; wait_on_recovery = 1;
...@@ -962,7 +962,7 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, ...@@ -962,7 +962,7 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm,
spin_lock(&dlm->spinlock); spin_lock(&dlm->spinlock);
bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0); bit = find_next_bit(dlm->recovery_map, O2NM_MAX_NODES, 0);
if (bit < O2NM_MAX_NODES) { if (bit < O2NM_MAX_NODES) {
mlog(ML_NOTICE, "%s:%.*s: at least one node (%d) to" mlog(ML_NOTICE, "%s:%.*s: at least one node (%d) to "
"recover before lock mastery can begin\n", "recover before lock mastery can begin\n",
dlm->name, namelen, (char *)lockid, bit); dlm->name, namelen, (char *)lockid, bit);
wait_on_recovery = 1; wait_on_recovery = 1;
......
...@@ -399,7 +399,7 @@ static int ocfs2_truncate_file(struct inode *inode, ...@@ -399,7 +399,7 @@ static int ocfs2_truncate_file(struct inode *inode,
if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
status = ocfs2_truncate_inline(inode, di_bh, new_i_size, status = ocfs2_truncate_inline(inode, di_bh, new_i_size,
i_size_read(inode), 0); i_size_read(inode), 1);
if (status) if (status)
mlog_errno(status); mlog_errno(status);
...@@ -1521,6 +1521,7 @@ static int ocfs2_remove_inode_range(struct inode *inode, ...@@ -1521,6 +1521,7 @@ static int ocfs2_remove_inode_range(struct inode *inode,
u32 trunc_start, trunc_len, cpos, phys_cpos, alloc_size; u32 trunc_start, trunc_len, cpos, phys_cpos, alloc_size;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
struct ocfs2_cached_dealloc_ctxt dealloc; struct ocfs2_cached_dealloc_ctxt dealloc;
struct address_space *mapping = inode->i_mapping;
ocfs2_init_dealloc_ctxt(&dealloc); ocfs2_init_dealloc_ctxt(&dealloc);
...@@ -1529,10 +1530,20 @@ static int ocfs2_remove_inode_range(struct inode *inode, ...@@ -1529,10 +1530,20 @@ static int ocfs2_remove_inode_range(struct inode *inode,
if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
ret = ocfs2_truncate_inline(inode, di_bh, byte_start, ret = ocfs2_truncate_inline(inode, di_bh, byte_start,
byte_start + byte_len, 1); byte_start + byte_len, 0);
if (ret) if (ret) {
mlog_errno(ret); mlog_errno(ret);
return ret; goto out;
}
/*
* There's no need to get fancy with the page cache
* truncate of an inline-data inode. We're talking
* about less than a page here, which will be cached
* in the dinode buffer anyway.
*/
unmap_mapping_range(mapping, 0, 0, 0);
truncate_inode_pages(mapping, 0);
goto out;
} }
trunc_start = ocfs2_clusters_for_bytes(osb->sb, byte_start); trunc_start = ocfs2_clusters_for_bytes(osb->sb, byte_start);
......
...@@ -455,8 +455,8 @@ static int ocfs2_read_locked_inode(struct inode *inode, ...@@ -455,8 +455,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
status = -EINVAL; status = -EINVAL;
fe = (struct ocfs2_dinode *) bh->b_data; fe = (struct ocfs2_dinode *) bh->b_data;
if (!OCFS2_IS_VALID_DINODE(fe)) { if (!OCFS2_IS_VALID_DINODE(fe)) {
mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n", mlog(0, "Invalid dinode #%llu: signature = %.*s\n",
(unsigned long long)le64_to_cpu(fe->i_blkno), 7, (unsigned long long)args->fi_blkno, 7,
fe->i_signature); fe->i_signature);
goto bail; goto bail;
} }
...@@ -863,7 +863,7 @@ static int ocfs2_query_inode_wipe(struct inode *inode, ...@@ -863,7 +863,7 @@ static int ocfs2_query_inode_wipe(struct inode *inode,
status = ocfs2_try_open_lock(inode, 1); status = ocfs2_try_open_lock(inode, 1);
if (status == -EAGAIN) { if (status == -EAGAIN) {
status = 0; status = 0;
mlog(0, "Skipping delete of %llu because it is in use on" mlog(0, "Skipping delete of %llu because it is in use on "
"other nodes\n", (unsigned long long)oi->ip_blkno); "other nodes\n", (unsigned long long)oi->ip_blkno);
goto bail; goto bail;
} }
......
...@@ -484,6 +484,7 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb, ...@@ -484,6 +484,7 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data; alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
#ifdef OCFS2_DEBUG_FS
if (le32_to_cpu(alloc->id1.bitmap1.i_used) != if (le32_to_cpu(alloc->id1.bitmap1.i_used) !=
ocfs2_local_alloc_count_bits(alloc)) { ocfs2_local_alloc_count_bits(alloc)) {
ocfs2_error(osb->sb, "local alloc inode %llu says it has " ocfs2_error(osb->sb, "local alloc inode %llu says it has "
...@@ -494,6 +495,7 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb, ...@@ -494,6 +495,7 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
status = -EIO; status = -EIO;
goto bail; goto bail;
} }
#endif
free_bits = le32_to_cpu(alloc->id1.bitmap1.i_total) - free_bits = le32_to_cpu(alloc->id1.bitmap1.i_total) -
le32_to_cpu(alloc->id1.bitmap1.i_used); le32_to_cpu(alloc->id1.bitmap1.i_used);
...@@ -712,9 +714,8 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb, ...@@ -712,9 +714,8 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
void *bitmap; void *bitmap;
struct ocfs2_local_alloc *la = OCFS2_LOCAL_ALLOC(alloc); struct ocfs2_local_alloc *la = OCFS2_LOCAL_ALLOC(alloc);
mlog_entry("total = %u, COUNT = %u, used = %u\n", mlog_entry("total = %u, used = %u\n",
le32_to_cpu(alloc->id1.bitmap1.i_total), le32_to_cpu(alloc->id1.bitmap1.i_total),
ocfs2_local_alloc_count_bits(alloc),
le32_to_cpu(alloc->id1.bitmap1.i_used)); le32_to_cpu(alloc->id1.bitmap1.i_used));
if (!alloc->id1.bitmap1.i_total) { if (!alloc->id1.bitmap1.i_total) {
......
...@@ -438,14 +438,14 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) ...@@ -438,14 +438,14 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data)
} }
if (!ret) { if (!ret) {
if (!ocfs2_is_hard_readonly(osb))
ocfs2_set_journal_params(osb);
/* Only save off the new mount options in case of a successful /* Only save off the new mount options in case of a successful
* remount. */ * remount. */
osb->s_mount_opt = parsed_options.mount_opt; osb->s_mount_opt = parsed_options.mount_opt;
osb->s_atime_quantum = parsed_options.atime_quantum; osb->s_atime_quantum = parsed_options.atime_quantum;
osb->preferred_slot = parsed_options.slot; osb->preferred_slot = parsed_options.slot;
if (!ocfs2_is_hard_readonly(osb))
ocfs2_set_journal_params(osb);
} }
out: out:
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册