dect
/
linux-2.6
Archived
13
0
Fork 0

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
  Btrfs: fix meta data raid-repair merge problem
  Btrfs: skip allocation attempt from empty cluster
  Btrfs: skip block groups without enough space for a cluster
  Btrfs: start search for new cluster at the beginning
  Btrfs: reset cluster's max_size when creating bitmap
  Btrfs: initialize new bitmaps' list
  Btrfs: fix oops when calling statfs on readonly device
  Btrfs: Don't error on resizing FS to same size
  Btrfs: fix deadlock on metadata reservation when evicting a inode
  Fix URL of btrfs-progs git repository in docs
  btrfs scrub: handle -ENOMEM from init_ipath()
This commit is contained in:
Linus Torvalds 2011-12-01 08:28:53 -08:00
commit b930c26416
9 changed files with 60 additions and 25 deletions

View File

@ -63,8 +63,8 @@ IRC network.
Userspace tools for creating and manipulating Btrfs file systems are Userspace tools for creating and manipulating Btrfs file systems are
available from the git repository at the following location: available from the git repository at the following location:
http://git.kernel.org/?p=linux/kernel/git/mason/btrfs-progs-unstable.git http://git.kernel.org/?p=linux/kernel/git/mason/btrfs-progs.git
git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs-unstable.git git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
These include the following tools: These include the following tools:

View File

@ -2369,6 +2369,9 @@ int btrfs_block_rsv_check(struct btrfs_root *root,
int btrfs_block_rsv_refill(struct btrfs_root *root, int btrfs_block_rsv_refill(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv, struct btrfs_block_rsv *block_rsv,
u64 min_reserved); u64 min_reserved);
int btrfs_block_rsv_refill_noflush(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv,
u64 min_reserved);
int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
struct btrfs_block_rsv *dst_rsv, struct btrfs_block_rsv *dst_rsv,
u64 num_bytes); u64 num_bytes);

View File

@ -3888,9 +3888,9 @@ int btrfs_block_rsv_check(struct btrfs_root *root,
return ret; return ret;
} }
int btrfs_block_rsv_refill(struct btrfs_root *root, static inline int __btrfs_block_rsv_refill(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv, struct btrfs_block_rsv *block_rsv,
u64 min_reserved) u64 min_reserved, int flush)
{ {
u64 num_bytes = 0; u64 num_bytes = 0;
int ret = -ENOSPC; int ret = -ENOSPC;
@ -3909,7 +3909,7 @@ int btrfs_block_rsv_refill(struct btrfs_root *root,
if (!ret) if (!ret)
return 0; return 0;
ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1); ret = reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
if (!ret) { if (!ret) {
block_rsv_add_bytes(block_rsv, num_bytes, 0); block_rsv_add_bytes(block_rsv, num_bytes, 0);
return 0; return 0;
@ -3918,6 +3918,20 @@ int btrfs_block_rsv_refill(struct btrfs_root *root,
return ret; return ret;
} }
int btrfs_block_rsv_refill(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv,
u64 min_reserved)
{
return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 1);
}
int btrfs_block_rsv_refill_noflush(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv,
u64 min_reserved)
{
return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 0);
}
int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
struct btrfs_block_rsv *dst_rsv, struct btrfs_block_rsv *dst_rsv,
u64 num_bytes) u64 num_bytes)
@ -5265,7 +5279,7 @@ alloc:
spin_lock(&block_group->free_space_ctl->tree_lock); spin_lock(&block_group->free_space_ctl->tree_lock);
if (cached && if (cached &&
block_group->free_space_ctl->free_space < block_group->free_space_ctl->free_space <
num_bytes + empty_size) { num_bytes + empty_cluster + empty_size) {
spin_unlock(&block_group->free_space_ctl->tree_lock); spin_unlock(&block_group->free_space_ctl->tree_lock);
goto loop; goto loop;
} }
@ -5286,12 +5300,10 @@ alloc:
* people trying to start a new cluster * people trying to start a new cluster
*/ */
spin_lock(&last_ptr->refill_lock); spin_lock(&last_ptr->refill_lock);
if (last_ptr->block_group && if (!last_ptr->block_group ||
(last_ptr->block_group->ro || last_ptr->block_group->ro ||
!block_group_bits(last_ptr->block_group, data))) { !block_group_bits(last_ptr->block_group, data))
offset = 0;
goto refill_cluster; goto refill_cluster;
}
offset = btrfs_alloc_from_cluster(block_group, last_ptr, offset = btrfs_alloc_from_cluster(block_group, last_ptr,
num_bytes, search_start); num_bytes, search_start);
@ -5342,7 +5354,7 @@ refill_cluster:
/* allocate a cluster in this block group */ /* allocate a cluster in this block group */
ret = btrfs_find_space_cluster(trans, root, ret = btrfs_find_space_cluster(trans, root,
block_group, last_ptr, block_group, last_ptr,
offset, num_bytes, search_start, num_bytes,
empty_cluster + empty_size); empty_cluster + empty_size);
if (ret == 0) { if (ret == 0) {
/* /*

View File

@ -2287,14 +2287,20 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
if (!uptodate) { if (!uptodate) {
int failed_mirror; int failed_mirror;
failed_mirror = (int)(unsigned long)bio->bi_bdev; failed_mirror = (int)(unsigned long)bio->bi_bdev;
if (tree->ops && tree->ops->readpage_io_failed_hook) /*
ret = tree->ops->readpage_io_failed_hook( * The generic bio_readpage_error handles errors the
bio, page, start, end, * following way: If possible, new read requests are
failed_mirror, state); * created and submitted and will end up in
else * end_bio_extent_readpage as well (if we're lucky, not
ret = bio_readpage_error(bio, page, start, end, * in the !uptodate case). In that case it returns 0 and
failed_mirror, NULL); * we just go on with the next page in our bio. If it
* can't handle the error it will return -EIO and we
* remain responsible for that page.
*/
ret = bio_readpage_error(bio, page, start, end,
failed_mirror, NULL);
if (ret == 0) { if (ret == 0) {
error_handled:
uptodate = uptodate =
test_bit(BIO_UPTODATE, &bio->bi_flags); test_bit(BIO_UPTODATE, &bio->bi_flags);
if (err) if (err)
@ -2302,6 +2308,13 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
uncache_state(&cached); uncache_state(&cached);
continue; continue;
} }
if (tree->ops && tree->ops->readpage_io_failed_hook) {
ret = tree->ops->readpage_io_failed_hook(
bio, page, start, end,
failed_mirror, state);
if (ret == 0)
goto error_handled;
}
} }
if (uptodate) { if (uptodate) {

View File

@ -1470,6 +1470,7 @@ static void add_new_bitmap(struct btrfs_free_space_ctl *ctl,
{ {
info->offset = offset_to_bitmap(ctl, offset); info->offset = offset_to_bitmap(ctl, offset);
info->bytes = 0; info->bytes = 0;
INIT_LIST_HEAD(&info->list);
link_free_space(ctl, info); link_free_space(ctl, info);
ctl->total_bitmaps++; ctl->total_bitmaps++;
@ -2319,6 +2320,7 @@ again:
if (!found) { if (!found) {
start = i; start = i;
cluster->max_size = 0;
found = true; found = true;
} }

View File

@ -3490,7 +3490,7 @@ void btrfs_evict_inode(struct inode *inode)
* doing the truncate. * doing the truncate.
*/ */
while (1) { while (1) {
ret = btrfs_block_rsv_refill(root, rsv, min_size); ret = btrfs_block_rsv_refill_noflush(root, rsv, min_size);
/* /*
* Try and steal from the global reserve since we will * Try and steal from the global reserve since we will

View File

@ -1278,7 +1278,7 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root,
} }
ret = btrfs_grow_device(trans, device, new_size); ret = btrfs_grow_device(trans, device, new_size);
btrfs_commit_transaction(trans, root); btrfs_commit_transaction(trans, root);
} else { } else if (new_size < old_size) {
ret = btrfs_shrink_device(device, new_size); ret = btrfs_shrink_device(device, new_size);
} }

View File

@ -256,6 +256,11 @@ static int scrub_print_warning_inode(u64 inum, u64 offset, u64 root, void *ctx)
btrfs_release_path(swarn->path); btrfs_release_path(swarn->path);
ipath = init_ipath(4096, local_root, swarn->path); ipath = init_ipath(4096, local_root, swarn->path);
if (IS_ERR(ipath)) {
ret = PTR_ERR(ipath);
ipath = NULL;
goto err;
}
ret = paths_from_inode(inum, ipath); ret = paths_from_inode(inum, ipath);
if (ret < 0) if (ret < 0)

View File

@ -1057,7 +1057,7 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
int i = 0, nr_devices; int i = 0, nr_devices;
int ret; int ret;
nr_devices = fs_info->fs_devices->rw_devices; nr_devices = fs_info->fs_devices->open_devices;
BUG_ON(!nr_devices); BUG_ON(!nr_devices);
devices_info = kmalloc(sizeof(*devices_info) * nr_devices, devices_info = kmalloc(sizeof(*devices_info) * nr_devices,
@ -1079,8 +1079,8 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes)
else else
min_stripe_size = BTRFS_STRIPE_LEN; min_stripe_size = BTRFS_STRIPE_LEN;
list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) { list_for_each_entry(device, &fs_devices->devices, dev_list) {
if (!device->in_fs_metadata) if (!device->in_fs_metadata || !device->bdev)
continue; continue;
avail_space = device->total_bytes - device->bytes_used; avail_space = device->total_bytes - device->bytes_used;