forked from Minki/linux
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: ocfs2: Trivial cleanup of jbd compatibility layer removal ocfs2: Refresh documentation ocfs2: return f_fsid info in ocfs2_statfs() ocfs2: duplicate inline data properly during reflink. ocfs2: Move ocfs2_complete_reflink to the right place. ocfs2: Return -EINVAL when a device is not ocfs2.
This commit is contained in:
commit
931ed94430
@ -20,15 +20,16 @@ Lots of code taken from ext3 and other projects.
|
||||
Authors in alphabetical order:
|
||||
Joel Becker <joel.becker@oracle.com>
|
||||
Zach Brown <zach.brown@oracle.com>
|
||||
Mark Fasheh <mark.fasheh@oracle.com>
|
||||
Mark Fasheh <mfasheh@suse.com>
|
||||
Kurt Hackel <kurt.hackel@oracle.com>
|
||||
Tao Ma <tao.ma@oracle.com>
|
||||
Sunil Mushran <sunil.mushran@oracle.com>
|
||||
Manish Singh <manish.singh@oracle.com>
|
||||
Tiger Yang <tiger.yang@oracle.com>
|
||||
|
||||
Caveats
|
||||
=======
|
||||
Features which OCFS2 does not support yet:
|
||||
- quotas
|
||||
- Directory change notification (F_NOTIFY)
|
||||
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
|
||||
|
||||
@ -70,7 +71,6 @@ commit=nrsec (*) Ocfs2 can be told to sync all its data and metadata
|
||||
performance.
|
||||
localalloc=8(*) Allows custom localalloc size in MB. If the value is too
|
||||
large, the fs will silently revert it to the default.
|
||||
Localalloc is not enabled for local mounts.
|
||||
localflocks This disables cluster aware flock.
|
||||
inode64 Indicates that Ocfs2 is allowed to create inodes at
|
||||
any location in the filesystem, including those which
|
||||
|
@ -1712,7 +1712,8 @@ int ocfs2_check_range_for_refcount(struct inode *inode, loff_t pos,
|
||||
struct super_block *sb = inode->i_sb;
|
||||
|
||||
if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb)) ||
|
||||
!(OCFS2_I(inode)->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL))
|
||||
!(OCFS2_I(inode)->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL) ||
|
||||
OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
|
||||
return 0;
|
||||
|
||||
cpos = pos >> OCFS2_SB(sb)->s_clustersize_bits;
|
||||
|
@ -35,12 +35,7 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/lockdep.h>
|
||||
#ifndef CONFIG_OCFS2_COMPAT_JBD
|
||||
# include <linux/jbd2.h>
|
||||
#else
|
||||
# include <linux/jbd.h>
|
||||
# include "ocfs2_jbd_compat.h"
|
||||
#endif
|
||||
#include <linux/jbd2.h>
|
||||
|
||||
/* For union ocfs2_dlm_lksb */
|
||||
#include "stackglue.h"
|
||||
|
@ -3743,6 +3743,9 @@ static int ocfs2_attach_refcount_tree(struct inode *inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL)
|
||||
goto attach_xattr;
|
||||
|
||||
ocfs2_init_dinode_extent_tree(&di_et, INODE_CACHE(inode), di_bh);
|
||||
|
||||
size = i_size_read(inode);
|
||||
@ -3769,6 +3772,7 @@ static int ocfs2_attach_refcount_tree(struct inode *inode,
|
||||
cpos += num_clusters;
|
||||
}
|
||||
|
||||
attach_xattr:
|
||||
if (oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) {
|
||||
ret = ocfs2_xattr_attach_refcount_tree(inode, di_bh,
|
||||
&ref_tree->rf_ci,
|
||||
@ -3858,6 +3862,49 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ocfs2_duplicate_inline_data(struct inode *s_inode,
|
||||
struct buffer_head *s_bh,
|
||||
struct inode *t_inode,
|
||||
struct buffer_head *t_bh)
|
||||
{
|
||||
int ret;
|
||||
handle_t *handle;
|
||||
struct ocfs2_super *osb = OCFS2_SB(s_inode->i_sb);
|
||||
struct ocfs2_dinode *s_di = (struct ocfs2_dinode *)s_bh->b_data;
|
||||
struct ocfs2_dinode *t_di = (struct ocfs2_dinode *)t_bh->b_data;
|
||||
|
||||
BUG_ON(!(OCFS2_I(s_inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL));
|
||||
|
||||
handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
|
||||
if (IS_ERR(handle)) {
|
||||
ret = PTR_ERR(handle);
|
||||
mlog_errno(ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = ocfs2_journal_access_di(handle, INODE_CACHE(t_inode), t_bh,
|
||||
OCFS2_JOURNAL_ACCESS_WRITE);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto out_commit;
|
||||
}
|
||||
|
||||
t_di->id2.i_data.id_count = s_di->id2.i_data.id_count;
|
||||
memcpy(t_di->id2.i_data.id_data, s_di->id2.i_data.id_data,
|
||||
le16_to_cpu(s_di->id2.i_data.id_count));
|
||||
spin_lock(&OCFS2_I(t_inode)->ip_lock);
|
||||
OCFS2_I(t_inode)->ip_dyn_features |= OCFS2_INLINE_DATA_FL;
|
||||
t_di->i_dyn_features = cpu_to_le16(OCFS2_I(t_inode)->ip_dyn_features);
|
||||
spin_unlock(&OCFS2_I(t_inode)->ip_lock);
|
||||
|
||||
ocfs2_journal_dirty(handle, t_bh);
|
||||
|
||||
out_commit:
|
||||
ocfs2_commit_trans(osb, handle);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ocfs2_duplicate_extent_list(struct inode *s_inode,
|
||||
struct inode *t_inode,
|
||||
struct buffer_head *t_bh,
|
||||
@ -3997,6 +4044,14 @@ static int ocfs2_create_reflink_node(struct inode *s_inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (OCFS2_I(s_inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
|
||||
ret = ocfs2_duplicate_inline_data(s_inode, s_bh,
|
||||
t_inode, t_bh);
|
||||
if (ret)
|
||||
mlog_errno(ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = ocfs2_lock_refcount_tree(osb, le64_to_cpu(di->i_refcount_loc),
|
||||
1, &ref_tree, &ref_root_bh);
|
||||
if (ret) {
|
||||
@ -4013,10 +4068,6 @@ static int ocfs2_create_reflink_node(struct inode *s_inode,
|
||||
goto out_unlock_refcount;
|
||||
}
|
||||
|
||||
ret = ocfs2_complete_reflink(s_inode, s_bh, t_inode, t_bh, preserve);
|
||||
if (ret)
|
||||
mlog_errno(ret);
|
||||
|
||||
out_unlock_refcount:
|
||||
ocfs2_unlock_refcount_tree(osb, ref_tree, 1);
|
||||
brelse(ref_root_bh);
|
||||
@ -4068,9 +4119,17 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
|
||||
ret = ocfs2_reflink_xattrs(inode, old_bh,
|
||||
new_inode, new_bh,
|
||||
preserve);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
goto inode_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ocfs2_complete_reflink(inode, old_bh,
|
||||
new_inode, new_bh, preserve);
|
||||
if (ret)
|
||||
mlog_errno(ret);
|
||||
|
||||
inode_unlock:
|
||||
ocfs2_inode_unlock(new_inode, 1);
|
||||
brelse(new_bh);
|
||||
|
@ -773,18 +773,20 @@ static int ocfs2_sb_probe(struct super_block *sb,
|
||||
if (tmpstat < 0) {
|
||||
status = tmpstat;
|
||||
mlog_errno(status);
|
||||
goto bail;
|
||||
break;
|
||||
}
|
||||
di = (struct ocfs2_dinode *) (*bh)->b_data;
|
||||
memset(stats, 0, sizeof(struct ocfs2_blockcheck_stats));
|
||||
spin_lock_init(&stats->b_lock);
|
||||
status = ocfs2_verify_volume(di, *bh, blksize, stats);
|
||||
if (status >= 0)
|
||||
goto bail;
|
||||
brelse(*bh);
|
||||
*bh = NULL;
|
||||
if (status != -EAGAIN)
|
||||
tmpstat = ocfs2_verify_volume(di, *bh, blksize, stats);
|
||||
if (tmpstat < 0) {
|
||||
brelse(*bh);
|
||||
*bh = NULL;
|
||||
}
|
||||
if (tmpstat != -EAGAIN) {
|
||||
status = tmpstat;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bail:
|
||||
@ -1645,6 +1647,10 @@ static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
buf->f_bavail = buf->f_bfree;
|
||||
buf->f_files = numbits;
|
||||
buf->f_ffree = freebits;
|
||||
buf->f_fsid.val[0] = crc32_le(0, osb->uuid_str, OCFS2_VOL_UUID_LEN)
|
||||
& 0xFFFFFFFFUL;
|
||||
buf->f_fsid.val[1] = crc32_le(0, osb->uuid_str + OCFS2_VOL_UUID_LEN,
|
||||
OCFS2_VOL_UUID_LEN) & 0xFFFFFFFFUL;
|
||||
|
||||
brelse(bh);
|
||||
|
||||
|
@ -53,11 +53,6 @@
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/rbtree.h>
|
||||
#ifndef CONFIG_OCFS2_COMPAT_JBD
|
||||
# include <linux/jbd2.h>
|
||||
#else
|
||||
# include <linux/jbd.h>
|
||||
#endif
|
||||
|
||||
#define MLOG_MASK_PREFIX ML_UPTODATE
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user