Commit 931ed944 authored by Linus Torvalds's avatar Linus Torvalds

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.
parents 648f4e3e 7aee47b0
...@@ -20,15 +20,16 @@ Lots of code taken from ext3 and other projects. ...@@ -20,15 +20,16 @@ Lots of code taken from ext3 and other projects.
Authors in alphabetical order: Authors in alphabetical order:
Joel Becker <joel.becker@oracle.com> Joel Becker <joel.becker@oracle.com>
Zach Brown <zach.brown@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> Kurt Hackel <kurt.hackel@oracle.com>
Tao Ma <tao.ma@oracle.com>
Sunil Mushran <sunil.mushran@oracle.com> Sunil Mushran <sunil.mushran@oracle.com>
Manish Singh <manish.singh@oracle.com> Manish Singh <manish.singh@oracle.com>
Tiger Yang <tiger.yang@oracle.com>
Caveats Caveats
======= =======
Features which OCFS2 does not support yet: Features which OCFS2 does not support yet:
- quotas
- Directory change notification (F_NOTIFY) - Directory change notification (F_NOTIFY)
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) - 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 ...@@ -70,7 +71,6 @@ commit=nrsec (*) Ocfs2 can be told to sync all its data and metadata
performance. performance.
localalloc=8(*) Allows custom localalloc size in MB. If the value is too localalloc=8(*) Allows custom localalloc size in MB. If the value is too
large, the fs will silently revert it to the default. large, the fs will silently revert it to the default.
Localalloc is not enabled for local mounts.
localflocks This disables cluster aware flock. localflocks This disables cluster aware flock.
inode64 Indicates that Ocfs2 is allowed to create inodes at inode64 Indicates that Ocfs2 is allowed to create inodes at
any location in the filesystem, including those which any location in the filesystem, including those which
......
...@@ -1712,7 +1712,8 @@ int ocfs2_check_range_for_refcount(struct inode *inode, loff_t pos, ...@@ -1712,7 +1712,8 @@ int ocfs2_check_range_for_refcount(struct inode *inode, loff_t pos,
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
if (!ocfs2_refcount_tree(OCFS2_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; return 0;
cpos = pos >> OCFS2_SB(sb)->s_clustersize_bits; cpos = pos >> OCFS2_SB(sb)->s_clustersize_bits;
......
...@@ -35,12 +35,7 @@ ...@@ -35,12 +35,7 @@
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/lockdep.h> #include <linux/lockdep.h>
#ifndef CONFIG_OCFS2_COMPAT_JBD #include <linux/jbd2.h>
# include <linux/jbd2.h>
#else
# include <linux/jbd.h>
# include "ocfs2_jbd_compat.h"
#endif
/* For union ocfs2_dlm_lksb */ /* For union ocfs2_dlm_lksb */
#include "stackglue.h" #include "stackglue.h"
......
...@@ -3743,6 +3743,9 @@ static int ocfs2_attach_refcount_tree(struct inode *inode, ...@@ -3743,6 +3743,9 @@ static int ocfs2_attach_refcount_tree(struct inode *inode,
goto out; 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); ocfs2_init_dinode_extent_tree(&di_et, INODE_CACHE(inode), di_bh);
size = i_size_read(inode); size = i_size_read(inode);
...@@ -3769,6 +3772,7 @@ static int ocfs2_attach_refcount_tree(struct inode *inode, ...@@ -3769,6 +3772,7 @@ static int ocfs2_attach_refcount_tree(struct inode *inode,
cpos += num_clusters; cpos += num_clusters;
} }
attach_xattr:
if (oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) { if (oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) {
ret = ocfs2_xattr_attach_refcount_tree(inode, di_bh, ret = ocfs2_xattr_attach_refcount_tree(inode, di_bh,
&ref_tree->rf_ci, &ref_tree->rf_ci,
...@@ -3858,6 +3862,49 @@ out: ...@@ -3858,6 +3862,49 @@ out:
return ret; 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, static int ocfs2_duplicate_extent_list(struct inode *s_inode,
struct inode *t_inode, struct inode *t_inode,
struct buffer_head *t_bh, struct buffer_head *t_bh,
...@@ -3997,6 +4044,14 @@ static int ocfs2_create_reflink_node(struct inode *s_inode, ...@@ -3997,6 +4044,14 @@ static int ocfs2_create_reflink_node(struct inode *s_inode,
goto out; 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), ret = ocfs2_lock_refcount_tree(osb, le64_to_cpu(di->i_refcount_loc),
1, &ref_tree, &ref_root_bh); 1, &ref_tree, &ref_root_bh);
if (ret) { if (ret) {
...@@ -4013,10 +4068,6 @@ static int ocfs2_create_reflink_node(struct inode *s_inode, ...@@ -4013,10 +4068,6 @@ static int ocfs2_create_reflink_node(struct inode *s_inode,
goto out_unlock_refcount; 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: out_unlock_refcount:
ocfs2_unlock_refcount_tree(osb, ref_tree, 1); ocfs2_unlock_refcount_tree(osb, ref_tree, 1);
brelse(ref_root_bh); brelse(ref_root_bh);
...@@ -4068,9 +4119,17 @@ static int __ocfs2_reflink(struct dentry *old_dentry, ...@@ -4068,9 +4119,17 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
ret = ocfs2_reflink_xattrs(inode, old_bh, ret = ocfs2_reflink_xattrs(inode, old_bh,
new_inode, new_bh, new_inode, new_bh,
preserve); preserve);
if (ret) if (ret) {
mlog_errno(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: inode_unlock:
ocfs2_inode_unlock(new_inode, 1); ocfs2_inode_unlock(new_inode, 1);
brelse(new_bh); brelse(new_bh);
......
...@@ -773,19 +773,21 @@ static int ocfs2_sb_probe(struct super_block *sb, ...@@ -773,19 +773,21 @@ static int ocfs2_sb_probe(struct super_block *sb,
if (tmpstat < 0) { if (tmpstat < 0) {
status = tmpstat; status = tmpstat;
mlog_errno(status); mlog_errno(status);
goto bail; break;
} }
di = (struct ocfs2_dinode *) (*bh)->b_data; di = (struct ocfs2_dinode *) (*bh)->b_data;
memset(stats, 0, sizeof(struct ocfs2_blockcheck_stats)); memset(stats, 0, sizeof(struct ocfs2_blockcheck_stats));
spin_lock_init(&stats->b_lock); spin_lock_init(&stats->b_lock);
status = ocfs2_verify_volume(di, *bh, blksize, stats); tmpstat = ocfs2_verify_volume(di, *bh, blksize, stats);
if (status >= 0) if (tmpstat < 0) {
goto bail;
brelse(*bh); brelse(*bh);
*bh = NULL; *bh = NULL;
if (status != -EAGAIN) }
if (tmpstat != -EAGAIN) {
status = tmpstat;
break; break;
} }
}
bail: bail:
return status; return status;
...@@ -1645,6 +1647,10 @@ static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -1645,6 +1647,10 @@ static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_bavail = buf->f_bfree; buf->f_bavail = buf->f_bfree;
buf->f_files = numbits; buf->f_files = numbits;
buf->f_ffree = freebits; 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); brelse(bh);
......
...@@ -53,11 +53,6 @@ ...@@ -53,11 +53,6 @@
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/rbtree.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 #define MLOG_MASK_PREFIX ML_UPTODATE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment