diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/check-integrity.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/compression.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 22 | ||||
| -rw-r--r-- | fs/btrfs/send.c | 22 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 13 | ||||
| -rw-r--r-- | fs/btrfs/sysfs.c | 10 | 
9 files changed, 45 insertions, 38 deletions
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 49a62b4dda3b..0e8388e72d8d 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -92,11 +92,11 @@  #include <linux/slab.h>  #include <linux/buffer_head.h>  #include <linux/mutex.h> -#include <linux/crc32c.h>  #include <linux/genhd.h>  #include <linux/blkdev.h>  #include "ctree.h"  #include "disk-io.h" +#include "hash.h"  #include "transaction.h"  #include "extent_io.h"  #include "volumes.h" @@ -1823,7 +1823,7 @@ static int btrfsic_test_for_metadata(struct btrfsic_state *state,  		size_t sublen = i ? PAGE_CACHE_SIZE :  				    (PAGE_CACHE_SIZE - BTRFS_CSUM_SIZE); -		crc = crc32c(crc, data, sublen); +		crc = btrfs_crc32c(crc, data, sublen);  	}  	btrfs_csum_final(crc, csum);  	if (memcmp(csum, h->csum, state->csum_size)) diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index e2600cdb6c25..b01fb6c527e3 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -1010,6 +1010,8 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,  		bytes = min(bytes, working_bytes);  		kaddr = kmap_atomic(page_out);  		memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); +		if (*pg_index == (vcnt - 1) && *pg_offset == 0) +			memset(kaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);  		kunmap_atomic(kaddr);  		flush_dcache_page(page_out); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 0e69295d0031..81ea55314b1f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -26,7 +26,6 @@  #include <linux/workqueue.h>  #include <linux/kthread.h>  #include <linux/freezer.h> -#include <linux/crc32c.h>  #include <linux/slab.h>  #include <linux/migrate.h>  #include <linux/ratelimit.h> @@ -35,6 +34,7 @@  #include <asm/unaligned.h>  #include "ctree.h"  #include "disk-io.h" +#include "hash.h"  #include "transaction.h"  #include "btrfs_inode.h"  #include "volumes.h" @@ -244,7 +244,7 @@ out:  u32 btrfs_csum_data(char *data, u32 seed, size_t len)  { -	return crc32c(seed, data, len); +	return btrfs_crc32c(seed, data, len);  }  void btrfs_csum_final(u32 crc, char *result) @@ -3839,7 +3839,6 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans,  			rb_erase(&ref->rb_node, &head->ref_root);  			atomic_dec(&delayed_refs->num_entries);  			btrfs_put_delayed_ref(ref); -			cond_resched_lock(&head->lock);  		}  		if (head->must_insert_reserved)  			pin_bytes = true; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 9c9ecc93ae2c..32312e09f0f5 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2385,6 +2385,7 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,  			spin_unlock(&delayed_refs->lock);  			locked_ref = NULL;  			cond_resched(); +			count++;  			continue;  		} diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5c4ab9c18940..d3d44486290b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2629,7 +2629,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)  			EXTENT_DEFRAG, 1, cached_state);  	if (ret) {  		u64 last_snapshot = btrfs_root_last_snapshot(&root->root_item); -		if (last_snapshot >= BTRFS_I(inode)->generation) +		if (0 && last_snapshot >= BTRFS_I(inode)->generation)  			/* the inode is shared */  			new = record_old_file_extents(inode, ordered_extent); @@ -5154,7 +5154,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,  			return ERR_CAST(inode);  	} -	return d_splice_alias(inode, dentry); +	return d_materialise_unique(dentry, inode);  }  unsigned char btrfs_filetype_table[] = { diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index b0134892dc70..a6d8efa46bfe 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3537,20 +3537,6 @@ out:  	return ret;  } -static long btrfs_ioctl_global_rsv(struct btrfs_root *root, void __user *arg) -{ -	struct btrfs_block_rsv *block_rsv = &root->fs_info->global_block_rsv; -	u64 reserved; - -	spin_lock(&block_rsv->lock); -	reserved = block_rsv->reserved; -	spin_unlock(&block_rsv->lock); - -	if (arg && copy_to_user(arg, &reserved, sizeof(reserved))) -		return -EFAULT; -	return 0; -} -  /*   * there are many ways the trans_start and trans_end ioctls can lead   * to deadlocks.  They should only be used by applications that @@ -4525,7 +4511,7 @@ static int btrfs_ioctl_set_fslabel(struct file *file, void __user *arg)  	spin_lock(&root->fs_info->super_lock);  	strcpy(super_block->label, label);  	spin_unlock(&root->fs_info->super_lock); -	ret = btrfs_end_transaction(trans, root); +	ret = btrfs_commit_transaction(trans, root);  out_unlock:  	mnt_drop_write_file(file); @@ -4668,7 +4654,7 @@ static int btrfs_ioctl_set_features(struct file *file, void __user *arg)  	if (ret)  		return ret; -	trans = btrfs_start_transaction(root, 1); +	trans = btrfs_start_transaction(root, 0);  	if (IS_ERR(trans))  		return PTR_ERR(trans); @@ -4689,7 +4675,7 @@ static int btrfs_ioctl_set_features(struct file *file, void __user *arg)  	btrfs_set_super_incompat_flags(super_block, newflags);  	spin_unlock(&root->fs_info->super_lock); -	return btrfs_end_transaction(trans, root); +	return btrfs_commit_transaction(trans, root);  }  long btrfs_ioctl(struct file *file, unsigned int @@ -4757,8 +4743,6 @@ long btrfs_ioctl(struct file *file, unsigned int  		return btrfs_ioctl_logical_to_ino(root, argp);  	case BTRFS_IOC_SPACE_INFO:  		return btrfs_ioctl_space_info(root, argp); -	case BTRFS_IOC_GLOBAL_RSV: -		return btrfs_ioctl_global_rsv(root, argp);  	case BTRFS_IOC_SYNC: {  		int ret; diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 730dce395858..9dde9717c1b9 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -24,12 +24,12 @@  #include <linux/xattr.h>  #include <linux/posix_acl_xattr.h>  #include <linux/radix-tree.h> -#include <linux/crc32c.h>  #include <linux/vmalloc.h>  #include <linux/string.h>  #include "send.h"  #include "backref.h" +#include "hash.h"  #include "locking.h"  #include "disk-io.h"  #include "btrfs_inode.h" @@ -620,7 +620,7 @@ static int send_cmd(struct send_ctx *sctx)  	hdr->len = cpu_to_le32(sctx->send_size - sizeof(*hdr));  	hdr->crc = 0; -	crc = crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size); +	crc = btrfs_crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size);  	hdr->crc = cpu_to_le32(crc);  	ret = write_buf(sctx->send_filp, sctx->send_buf, sctx->send_size, @@ -1332,6 +1332,16 @@ verbose_printk(KERN_DEBUG "btrfs: find_extent_clone: data_offset=%llu, "  	}  	if (cur_clone_root) { +		if (compressed != BTRFS_COMPRESS_NONE) { +			/* +			 * Offsets given by iterate_extent_inodes() are relative +			 * to the start of the extent, we need to add logical +			 * offset from the file extent item. +			 * (See why at backref.c:check_extent_in_eb()) +			 */ +			cur_clone_root->offset += btrfs_file_extent_offset(eb, +									   fi); +		}  		*found = cur_clone_root;  		ret = 0;  	} else { @@ -2774,8 +2784,6 @@ static int add_waiting_dir_move(struct send_ctx *sctx, u64 ino)  	return 0;  } -#ifdef CONFIG_BTRFS_ASSERT -  static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino)  {  	struct rb_node *n = sctx->waiting_dir_moves.rb_node; @@ -2796,8 +2804,6 @@ static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino)  	return -ENOENT;  } -#endif -  static int add_pending_dir_move(struct send_ctx *sctx, u64 parent_ino)  {  	struct rb_node **p = &sctx->pending_dir_moves.rb_node; @@ -2902,7 +2908,9 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm)  	}  	sctx->send_progress = sctx->cur_ino + 1; -	ASSERT(del_waiting_dir_move(sctx, pm->ino) == 0); +	ret = del_waiting_dir_move(sctx, pm->ino); +	ASSERT(ret == 0); +  	ret = get_cur_path(sctx, pm->ino, pm->gen, to_path);  	if (ret < 0)  		goto out; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index c02f63356895..d04db817be5c 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -566,7 +566,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  				kfree(num);  				if (info->max_inline) { -					info->max_inline = max_t(u64, +					info->max_inline = min_t(u64,  						info->max_inline,  						root->sectorsize);  				} @@ -855,6 +855,7 @@ static struct dentry *get_default_root(struct super_block *sb,  	struct btrfs_path *path;  	struct btrfs_key location;  	struct inode *inode; +	struct dentry *dentry;  	u64 dir_id;  	int new = 0; @@ -925,7 +926,13 @@ setup_root:  		return dget(sb->s_root);  	} -	return d_obtain_alias(inode); +	dentry = d_obtain_alias(inode); +	if (!IS_ERR(dentry)) { +		spin_lock(&dentry->d_lock); +		dentry->d_flags &= ~DCACHE_DISCONNECTED; +		spin_unlock(&dentry->d_lock); +	} +	return dentry;  }  static int btrfs_fill_super(struct super_block *sb, @@ -1996,7 +2003,7 @@ static void __exit exit_btrfs_fs(void)  	btrfs_hash_exit();  } -module_init(init_btrfs_fs) +late_initcall(init_btrfs_fs);  module_exit(exit_btrfs_fs)  MODULE_LICENSE("GPL"); diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 782374d8fd19..865f4cf9a769 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -578,8 +578,14 @@ static int add_device_membership(struct btrfs_fs_info *fs_info)  		return -ENOMEM;  	list_for_each_entry(dev, &fs_devices->devices, dev_list) { -		struct hd_struct *disk = dev->bdev->bd_part; -		struct kobject *disk_kobj = &part_to_dev(disk)->kobj; +		struct hd_struct *disk; +		struct kobject *disk_kobj; + +		if (!dev->bdev) +			continue; + +		disk = dev->bdev->bd_part; +		disk_kobj = &part_to_dev(disk)->kobj;  		error = sysfs_create_link(fs_info->device_dir_kobj,  					  disk_kobj, disk_kobj->name);  | 
