Commit 3f9e3df8 authored by David Sterba's avatar David Sterba Committed by Chris Mason

btrfs: replace error code from btrfs_drop_extents

There's a case which clone does not handle and used to BUG_ON instead,
(testcase xfstests/btrfs/035), now returns EINVAL. This error code is
confusing to the ioctl caller, as it normally signifies errorneous
arguments.

Change it to ENOPNOTSUPP which allows a fall back to copy instead of
clone. This does not affect the common reflink operation.
Signed-off-by: default avatarDavid Sterba <dsterba@suse.cz>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent c5f7d0bb
...@@ -805,7 +805,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -805,7 +805,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
if (start > key.offset && end < extent_end) { if (start > key.offset && end < extent_end) {
BUG_ON(del_nr > 0); BUG_ON(del_nr > 0);
if (extent_type == BTRFS_FILE_EXTENT_INLINE) { if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
ret = -EINVAL; ret = -EOPNOTSUPP;
break; break;
} }
...@@ -851,7 +851,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -851,7 +851,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
*/ */
if (start <= key.offset && end < extent_end) { if (start <= key.offset && end < extent_end) {
if (extent_type == BTRFS_FILE_EXTENT_INLINE) { if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
ret = -EINVAL; ret = -EOPNOTSUPP;
break; break;
} }
...@@ -877,7 +877,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -877,7 +877,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
if (start > key.offset && end >= extent_end) { if (start > key.offset && end >= extent_end) {
BUG_ON(del_nr > 0); BUG_ON(del_nr > 0);
if (extent_type == BTRFS_FILE_EXTENT_INLINE) { if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
ret = -EINVAL; ret = -EOPNOTSUPP;
break; break;
} }
......
...@@ -3088,7 +3088,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode, ...@@ -3088,7 +3088,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
new_key.offset + datal, new_key.offset + datal,
1); 1);
if (ret) { if (ret) {
if (ret != -EINVAL) if (ret != -EOPNOTSUPP)
btrfs_abort_transaction(trans, btrfs_abort_transaction(trans,
root, ret); root, ret);
btrfs_end_transaction(trans, root); btrfs_end_transaction(trans, root);
...@@ -3163,7 +3163,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode, ...@@ -3163,7 +3163,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
new_key.offset + datal, new_key.offset + datal,
1); 1);
if (ret) { if (ret) {
if (ret != -EINVAL) if (ret != -EOPNOTSUPP)
btrfs_abort_transaction(trans, btrfs_abort_transaction(trans,
root, ret); root, ret);
btrfs_end_transaction(trans, root); btrfs_end_transaction(trans, root);
......
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