diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 22 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 81 | ||||
| -rw-r--r-- | fs/btrfs/send.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/super.c | 5 | ||||
| -rw-r--r-- | fs/dcache.c | 2 | ||||
| -rw-r--r-- | fs/namei.c | 7 | ||||
| -rw-r--r-- | fs/nfsd/nfscache.c | 9 | ||||
| -rw-r--r-- | fs/proc/inode.c | 14 | ||||
| -rw-r--r-- | fs/xfs/xfs_discard.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_fsops.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_ioctl.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_ioctl32.c | 3 |
13 files changed, 104 insertions, 60 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 45d98d01028f..9c01509dd8ab 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -767,20 +767,19 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, | |||
| 767 | if (!path) | 767 | if (!path) |
| 768 | return -ENOMEM; | 768 | return -ENOMEM; |
| 769 | 769 | ||
| 770 | if (metadata) { | ||
| 771 | key.objectid = bytenr; | ||
| 772 | key.type = BTRFS_METADATA_ITEM_KEY; | ||
| 773 | key.offset = offset; | ||
| 774 | } else { | ||
| 775 | key.objectid = bytenr; | ||
| 776 | key.type = BTRFS_EXTENT_ITEM_KEY; | ||
| 777 | key.offset = offset; | ||
| 778 | } | ||
| 779 | |||
| 780 | if (!trans) { | 770 | if (!trans) { |
| 781 | path->skip_locking = 1; | 771 | path->skip_locking = 1; |
| 782 | path->search_commit_root = 1; | 772 | path->search_commit_root = 1; |
| 783 | } | 773 | } |
| 774 | |||
| 775 | search_again: | ||
| 776 | key.objectid = bytenr; | ||
| 777 | key.offset = offset; | ||
| 778 | if (metadata) | ||
| 779 | key.type = BTRFS_METADATA_ITEM_KEY; | ||
| 780 | else | ||
| 781 | key.type = BTRFS_EXTENT_ITEM_KEY; | ||
| 782 | |||
| 784 | again: | 783 | again: |
| 785 | ret = btrfs_search_slot(trans, root->fs_info->extent_root, | 784 | ret = btrfs_search_slot(trans, root->fs_info->extent_root, |
| 786 | &key, path, 0, 0); | 785 | &key, path, 0, 0); |
| @@ -788,7 +787,6 @@ again: | |||
| 788 | goto out_free; | 787 | goto out_free; |
| 789 | 788 | ||
| 790 | if (ret > 0 && metadata && key.type == BTRFS_METADATA_ITEM_KEY) { | 789 | if (ret > 0 && metadata && key.type == BTRFS_METADATA_ITEM_KEY) { |
| 791 | metadata = 0; | ||
| 792 | if (path->slots[0]) { | 790 | if (path->slots[0]) { |
| 793 | path->slots[0]--; | 791 | path->slots[0]--; |
| 794 | btrfs_item_key_to_cpu(path->nodes[0], &key, | 792 | btrfs_item_key_to_cpu(path->nodes[0], &key, |
| @@ -855,7 +853,7 @@ again: | |||
| 855 | mutex_lock(&head->mutex); | 853 | mutex_lock(&head->mutex); |
| 856 | mutex_unlock(&head->mutex); | 854 | mutex_unlock(&head->mutex); |
| 857 | btrfs_put_delayed_ref(&head->node); | 855 | btrfs_put_delayed_ref(&head->node); |
| 858 | goto again; | 856 | goto search_again; |
| 859 | } | 857 | } |
| 860 | if (head->extent_op && head->extent_op->update_flags) | 858 | if (head->extent_op && head->extent_op->update_flags) |
| 861 | extent_flags |= head->extent_op->flags_to_set; | 859 | extent_flags |= head->extent_op->flags_to_set; |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index a111622598b0..21da5762b0b1 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -2121,7 +2121,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, | |||
| 2121 | 2121 | ||
| 2122 | err = mutex_lock_killable_nested(&dir->i_mutex, I_MUTEX_PARENT); | 2122 | err = mutex_lock_killable_nested(&dir->i_mutex, I_MUTEX_PARENT); |
| 2123 | if (err == -EINTR) | 2123 | if (err == -EINTR) |
| 2124 | goto out; | 2124 | goto out_drop_write; |
| 2125 | dentry = lookup_one_len(vol_args->name, parent, namelen); | 2125 | dentry = lookup_one_len(vol_args->name, parent, namelen); |
| 2126 | if (IS_ERR(dentry)) { | 2126 | if (IS_ERR(dentry)) { |
| 2127 | err = PTR_ERR(dentry); | 2127 | err = PTR_ERR(dentry); |
| @@ -2284,6 +2284,7 @@ out_dput: | |||
| 2284 | dput(dentry); | 2284 | dput(dentry); |
| 2285 | out_unlock_dir: | 2285 | out_unlock_dir: |
| 2286 | mutex_unlock(&dir->i_mutex); | 2286 | mutex_unlock(&dir->i_mutex); |
| 2287 | out_drop_write: | ||
| 2287 | mnt_drop_write_file(file); | 2288 | mnt_drop_write_file(file); |
| 2288 | out: | 2289 | out: |
| 2289 | kfree(vol_args); | 2290 | kfree(vol_args); |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index ce459a7cb16d..429c73c374b8 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -571,7 +571,9 @@ static int is_cowonly_root(u64 root_objectid) | |||
| 571 | root_objectid == BTRFS_CHUNK_TREE_OBJECTID || | 571 | root_objectid == BTRFS_CHUNK_TREE_OBJECTID || |
| 572 | root_objectid == BTRFS_DEV_TREE_OBJECTID || | 572 | root_objectid == BTRFS_DEV_TREE_OBJECTID || |
| 573 | root_objectid == BTRFS_TREE_LOG_OBJECTID || | 573 | root_objectid == BTRFS_TREE_LOG_OBJECTID || |
| 574 | root_objectid == BTRFS_CSUM_TREE_OBJECTID) | 574 | root_objectid == BTRFS_CSUM_TREE_OBJECTID || |
| 575 | root_objectid == BTRFS_UUID_TREE_OBJECTID || | ||
| 576 | root_objectid == BTRFS_QUOTA_TREE_OBJECTID) | ||
| 575 | return 1; | 577 | return 1; |
| 576 | return 0; | 578 | return 0; |
| 577 | } | 579 | } |
| @@ -1264,10 +1266,10 @@ static int __must_check __add_reloc_root(struct btrfs_root *root) | |||
| 1264 | } | 1266 | } |
| 1265 | 1267 | ||
| 1266 | /* | 1268 | /* |
| 1267 | * helper to update/delete the 'address of tree root -> reloc tree' | 1269 | * helper to delete the 'address of tree root -> reloc tree' |
| 1268 | * mapping | 1270 | * mapping |
| 1269 | */ | 1271 | */ |
| 1270 | static int __update_reloc_root(struct btrfs_root *root, int del) | 1272 | static void __del_reloc_root(struct btrfs_root *root) |
| 1271 | { | 1273 | { |
| 1272 | struct rb_node *rb_node; | 1274 | struct rb_node *rb_node; |
| 1273 | struct mapping_node *node = NULL; | 1275 | struct mapping_node *node = NULL; |
| @@ -1275,7 +1277,7 @@ static int __update_reloc_root(struct btrfs_root *root, int del) | |||
| 1275 | 1277 | ||
| 1276 | spin_lock(&rc->reloc_root_tree.lock); | 1278 | spin_lock(&rc->reloc_root_tree.lock); |
| 1277 | rb_node = tree_search(&rc->reloc_root_tree.rb_root, | 1279 | rb_node = tree_search(&rc->reloc_root_tree.rb_root, |
| 1278 | root->commit_root->start); | 1280 | root->node->start); |
| 1279 | if (rb_node) { | 1281 | if (rb_node) { |
| 1280 | node = rb_entry(rb_node, struct mapping_node, rb_node); | 1282 | node = rb_entry(rb_node, struct mapping_node, rb_node); |
| 1281 | rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); | 1283 | rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); |
| @@ -1283,23 +1285,45 @@ static int __update_reloc_root(struct btrfs_root *root, int del) | |||
| 1283 | spin_unlock(&rc->reloc_root_tree.lock); | 1285 | spin_unlock(&rc->reloc_root_tree.lock); |
| 1284 | 1286 | ||
| 1285 | if (!node) | 1287 | if (!node) |
| 1286 | return 0; | 1288 | return; |
| 1287 | BUG_ON((struct btrfs_root *)node->data != root); | 1289 | BUG_ON((struct btrfs_root *)node->data != root); |
| 1288 | 1290 | ||
| 1289 | if (!del) { | 1291 | spin_lock(&root->fs_info->trans_lock); |
| 1290 | spin_lock(&rc->reloc_root_tree.lock); | 1292 | list_del_init(&root->root_list); |
| 1291 | node->bytenr = root->node->start; | 1293 | spin_unlock(&root->fs_info->trans_lock); |
| 1292 | rb_node = tree_insert(&rc->reloc_root_tree.rb_root, | 1294 | kfree(node); |
| 1293 | node->bytenr, &node->rb_node); | 1295 | } |
| 1294 | spin_unlock(&rc->reloc_root_tree.lock); | 1296 | |
| 1295 | if (rb_node) | 1297 | /* |
| 1296 | backref_tree_panic(rb_node, -EEXIST, node->bytenr); | 1298 | * helper to update the 'address of tree root -> reloc tree' |
| 1297 | } else { | 1299 | * mapping |
| 1298 | spin_lock(&root->fs_info->trans_lock); | 1300 | */ |
| 1299 | list_del_init(&root->root_list); | 1301 | static int __update_reloc_root(struct btrfs_root *root, u64 new_bytenr) |
| 1300 | spin_unlock(&root->fs_info->trans_lock); | 1302 | { |
| 1301 | kfree(node); | 1303 | struct rb_node *rb_node; |
| 1304 | struct mapping_node *node = NULL; | ||
| 1305 | struct reloc_control *rc = root->fs_info->reloc_ctl; | ||
| 1306 | |||
| 1307 | spin_lock(&rc->reloc_root_tree.lock); | ||
| 1308 | rb_node = tree_search(&rc->reloc_root_tree.rb_root, | ||
| 1309 | root->node->start); | ||
| 1310 | if (rb_node) { | ||
| 1311 | node = rb_entry(rb_node, struct mapping_node, rb_node); | ||
| 1312 | rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); | ||
| 1302 | } | 1313 | } |
| 1314 | spin_unlock(&rc->reloc_root_tree.lock); | ||
| 1315 | |||
| 1316 | if (!node) | ||
| 1317 | return 0; | ||
| 1318 | BUG_ON((struct btrfs_root *)node->data != root); | ||
| 1319 | |||
| 1320 | spin_lock(&rc->reloc_root_tree.lock); | ||
| 1321 | node->bytenr = new_bytenr; | ||
| 1322 | rb_node = tree_insert(&rc->reloc_root_tree.rb_root, | ||
| 1323 | node->bytenr, &node->rb_node); | ||
| 1324 | spin_unlock(&rc->reloc_root_tree.lock); | ||
| 1325 | if (rb_node) | ||
| 1326 | backref_tree_panic(rb_node, -EEXIST, node->bytenr); | ||
| 1303 | return 0; | 1327 | return 0; |
| 1304 | } | 1328 | } |
| 1305 | 1329 | ||
| @@ -1420,7 +1444,6 @@ int btrfs_update_reloc_root(struct btrfs_trans_handle *trans, | |||
| 1420 | { | 1444 | { |
| 1421 | struct btrfs_root *reloc_root; | 1445 | struct btrfs_root *reloc_root; |
| 1422 | struct btrfs_root_item *root_item; | 1446 | struct btrfs_root_item *root_item; |
| 1423 | int del = 0; | ||
| 1424 | int ret; | 1447 | int ret; |
| 1425 | 1448 | ||
| 1426 | if (!root->reloc_root) | 1449 | if (!root->reloc_root) |
| @@ -1432,11 +1455,9 @@ int btrfs_update_reloc_root(struct btrfs_trans_handle *trans, | |||
| 1432 | if (root->fs_info->reloc_ctl->merge_reloc_tree && | 1455 | if (root->fs_info->reloc_ctl->merge_reloc_tree && |
| 1433 | btrfs_root_refs(root_item) == 0) { | 1456 | btrfs_root_refs(root_item) == 0) { |
| 1434 | root->reloc_root = NULL; | 1457 | root->reloc_root = NULL; |
| 1435 | del = 1; | 1458 | __del_reloc_root(reloc_root); |
| 1436 | } | 1459 | } |
| 1437 | 1460 | ||
| 1438 | __update_reloc_root(reloc_root, del); | ||
| 1439 | |||
| 1440 | if (reloc_root->commit_root != reloc_root->node) { | 1461 | if (reloc_root->commit_root != reloc_root->node) { |
| 1441 | btrfs_set_root_node(root_item, reloc_root->node); | 1462 | btrfs_set_root_node(root_item, reloc_root->node); |
| 1442 | free_extent_buffer(reloc_root->commit_root); | 1463 | free_extent_buffer(reloc_root->commit_root); |
| @@ -2287,7 +2308,7 @@ void free_reloc_roots(struct list_head *list) | |||
| 2287 | while (!list_empty(list)) { | 2308 | while (!list_empty(list)) { |
| 2288 | reloc_root = list_entry(list->next, struct btrfs_root, | 2309 | reloc_root = list_entry(list->next, struct btrfs_root, |
| 2289 | root_list); | 2310 | root_list); |
| 2290 | __update_reloc_root(reloc_root, 1); | 2311 | __del_reloc_root(reloc_root); |
| 2291 | free_extent_buffer(reloc_root->node); | 2312 | free_extent_buffer(reloc_root->node); |
| 2292 | free_extent_buffer(reloc_root->commit_root); | 2313 | free_extent_buffer(reloc_root->commit_root); |
| 2293 | kfree(reloc_root); | 2314 | kfree(reloc_root); |
| @@ -2332,7 +2353,7 @@ again: | |||
| 2332 | 2353 | ||
| 2333 | ret = merge_reloc_root(rc, root); | 2354 | ret = merge_reloc_root(rc, root); |
| 2334 | if (ret) { | 2355 | if (ret) { |
| 2335 | __update_reloc_root(reloc_root, 1); | 2356 | __del_reloc_root(reloc_root); |
| 2336 | free_extent_buffer(reloc_root->node); | 2357 | free_extent_buffer(reloc_root->node); |
| 2337 | free_extent_buffer(reloc_root->commit_root); | 2358 | free_extent_buffer(reloc_root->commit_root); |
| 2338 | kfree(reloc_root); | 2359 | kfree(reloc_root); |
| @@ -2388,6 +2409,13 @@ out: | |||
| 2388 | btrfs_std_error(root->fs_info, ret); | 2409 | btrfs_std_error(root->fs_info, ret); |
| 2389 | if (!list_empty(&reloc_roots)) | 2410 | if (!list_empty(&reloc_roots)) |
| 2390 | free_reloc_roots(&reloc_roots); | 2411 | free_reloc_roots(&reloc_roots); |
| 2412 | |||
| 2413 | /* new reloc root may be added */ | ||
| 2414 | mutex_lock(&root->fs_info->reloc_mutex); | ||
| 2415 | list_splice_init(&rc->reloc_roots, &reloc_roots); | ||
| 2416 | mutex_unlock(&root->fs_info->reloc_mutex); | ||
| 2417 | if (!list_empty(&reloc_roots)) | ||
| 2418 | free_reloc_roots(&reloc_roots); | ||
| 2391 | } | 2419 | } |
| 2392 | 2420 | ||
| 2393 | BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root)); | 2421 | BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root)); |
| @@ -4522,6 +4550,11 @@ int btrfs_reloc_cow_block(struct btrfs_trans_handle *trans, | |||
| 4522 | BUG_ON(rc->stage == UPDATE_DATA_PTRS && | 4550 | BUG_ON(rc->stage == UPDATE_DATA_PTRS && |
| 4523 | root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID); | 4551 | root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID); |
| 4524 | 4552 | ||
| 4553 | if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) { | ||
| 4554 | if (buf == root->node) | ||
| 4555 | __update_reloc_root(root, cow->start); | ||
| 4556 | } | ||
| 4557 | |||
| 4525 | level = btrfs_header_level(buf); | 4558 | level = btrfs_header_level(buf); |
| 4526 | if (btrfs_header_generation(buf) <= | 4559 | if (btrfs_header_generation(buf) <= |
| 4527 | btrfs_root_last_snapshot(&root->root_item)) | 4560 | btrfs_root_last_snapshot(&root->root_item)) |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 6837fe87f3a6..945d1db98f26 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
| @@ -4723,8 +4723,8 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_) | |||
| 4723 | } | 4723 | } |
| 4724 | 4724 | ||
| 4725 | if (!access_ok(VERIFY_READ, arg->clone_sources, | 4725 | if (!access_ok(VERIFY_READ, arg->clone_sources, |
| 4726 | sizeof(*arg->clone_sources * | 4726 | sizeof(*arg->clone_sources) * |
| 4727 | arg->clone_sources_count))) { | 4727 | arg->clone_sources_count)) { |
| 4728 | ret = -EFAULT; | 4728 | ret = -EFAULT; |
| 4729 | goto out; | 4729 | goto out; |
| 4730 | } | 4730 | } |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 2d8ac1bf0cf9..d71a11d13dfa 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -432,7 +432,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 432 | } else { | 432 | } else { |
| 433 | printk(KERN_INFO "btrfs: setting nodatacow\n"); | 433 | printk(KERN_INFO "btrfs: setting nodatacow\n"); |
| 434 | } | 434 | } |
| 435 | info->compress_type = BTRFS_COMPRESS_NONE; | ||
| 436 | btrfs_clear_opt(info->mount_opt, COMPRESS); | 435 | btrfs_clear_opt(info->mount_opt, COMPRESS); |
| 437 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); | 436 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); |
| 438 | btrfs_set_opt(info->mount_opt, NODATACOW); | 437 | btrfs_set_opt(info->mount_opt, NODATACOW); |
| @@ -461,7 +460,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 461 | btrfs_set_fs_incompat(info, COMPRESS_LZO); | 460 | btrfs_set_fs_incompat(info, COMPRESS_LZO); |
| 462 | } else if (strncmp(args[0].from, "no", 2) == 0) { | 461 | } else if (strncmp(args[0].from, "no", 2) == 0) { |
| 463 | compress_type = "no"; | 462 | compress_type = "no"; |
| 464 | info->compress_type = BTRFS_COMPRESS_NONE; | ||
| 465 | btrfs_clear_opt(info->mount_opt, COMPRESS); | 463 | btrfs_clear_opt(info->mount_opt, COMPRESS); |
| 466 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); | 464 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); |
| 467 | compress_force = false; | 465 | compress_force = false; |
| @@ -474,9 +472,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 474 | btrfs_set_opt(info->mount_opt, FORCE_COMPRESS); | 472 | btrfs_set_opt(info->mount_opt, FORCE_COMPRESS); |
| 475 | pr_info("btrfs: force %s compression\n", | 473 | pr_info("btrfs: force %s compression\n", |
| 476 | compress_type); | 474 | compress_type); |
| 477 | } else | 475 | } else if (btrfs_test_opt(root, COMPRESS)) { |
| 478 | pr_info("btrfs: use %s compression\n", | 476 | pr_info("btrfs: use %s compression\n", |
| 479 | compress_type); | 477 | compress_type); |
| 478 | } | ||
| 480 | break; | 479 | break; |
| 481 | case Opt_ssd: | 480 | case Opt_ssd: |
| 482 | printk(KERN_INFO "btrfs: use ssd allocation scheme\n"); | 481 | printk(KERN_INFO "btrfs: use ssd allocation scheme\n"); |
diff --git a/fs/dcache.c b/fs/dcache.c index 4bdb300b16e2..6055d61811d3 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -192,7 +192,7 @@ static inline int dentry_string_cmp(const unsigned char *cs, const unsigned char | |||
| 192 | if (!tcount) | 192 | if (!tcount) |
| 193 | return 0; | 193 | return 0; |
| 194 | } | 194 | } |
| 195 | mask = ~(~0ul << tcount*8); | 195 | mask = bytemask_from_count(tcount); |
| 196 | return unlikely(!!((a ^ b) & mask)); | 196 | return unlikely(!!((a ^ b) & mask)); |
| 197 | } | 197 | } |
| 198 | 198 | ||
diff --git a/fs/namei.c b/fs/namei.c index c53d3a9547f9..3531deebad30 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1598,11 +1598,6 @@ static inline int nested_symlink(struct path *path, struct nameidata *nd) | |||
| 1598 | * do a "get_unaligned()" if this helps and is sufficiently | 1598 | * do a "get_unaligned()" if this helps and is sufficiently |
| 1599 | * fast. | 1599 | * fast. |
| 1600 | * | 1600 | * |
| 1601 | * - Little-endian machines (so that we can generate the mask | ||
| 1602 | * of low bytes efficiently). Again, we *could* do a byte | ||
| 1603 | * swapping load on big-endian architectures if that is not | ||
| 1604 | * expensive enough to make the optimization worthless. | ||
| 1605 | * | ||
| 1606 | * - non-CONFIG_DEBUG_PAGEALLOC configurations (so that we | 1601 | * - non-CONFIG_DEBUG_PAGEALLOC configurations (so that we |
| 1607 | * do not trap on the (extremely unlikely) case of a page | 1602 | * do not trap on the (extremely unlikely) case of a page |
| 1608 | * crossing operation. | 1603 | * crossing operation. |
| @@ -1646,7 +1641,7 @@ unsigned int full_name_hash(const unsigned char *name, unsigned int len) | |||
| 1646 | if (!len) | 1641 | if (!len) |
| 1647 | goto done; | 1642 | goto done; |
| 1648 | } | 1643 | } |
| 1649 | mask = ~(~0ul << len*8); | 1644 | mask = bytemask_from_count(len); |
| 1650 | hash += mask & a; | 1645 | hash += mask & a; |
| 1651 | done: | 1646 | done: |
| 1652 | return fold_hash(hash); | 1647 | return fold_hash(hash); |
diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index 9186c7ce0b14..b6af150c96b8 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c | |||
| @@ -132,6 +132,13 @@ nfsd_reply_cache_alloc(void) | |||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | static void | 134 | static void |
| 135 | nfsd_reply_cache_unhash(struct svc_cacherep *rp) | ||
| 136 | { | ||
| 137 | hlist_del_init(&rp->c_hash); | ||
| 138 | list_del_init(&rp->c_lru); | ||
| 139 | } | ||
| 140 | |||
| 141 | static void | ||
| 135 | nfsd_reply_cache_free_locked(struct svc_cacherep *rp) | 142 | nfsd_reply_cache_free_locked(struct svc_cacherep *rp) |
| 136 | { | 143 | { |
| 137 | if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) { | 144 | if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) { |
| @@ -417,7 +424,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp) | |||
| 417 | rp = list_first_entry(&lru_head, struct svc_cacherep, c_lru); | 424 | rp = list_first_entry(&lru_head, struct svc_cacherep, c_lru); |
| 418 | if (nfsd_cache_entry_expired(rp) || | 425 | if (nfsd_cache_entry_expired(rp) || |
| 419 | num_drc_entries >= max_drc_entries) { | 426 | num_drc_entries >= max_drc_entries) { |
| 420 | lru_put_end(rp); | 427 | nfsd_reply_cache_unhash(rp); |
| 421 | prune_cache_entries(); | 428 | prune_cache_entries(); |
| 422 | goto search_cache; | 429 | goto search_cache; |
| 423 | } | 430 | } |
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 28955d4b7218..124fc43c7090 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
| @@ -292,16 +292,20 @@ proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr, | |||
| 292 | { | 292 | { |
| 293 | struct proc_dir_entry *pde = PDE(file_inode(file)); | 293 | struct proc_dir_entry *pde = PDE(file_inode(file)); |
| 294 | unsigned long rv = -EIO; | 294 | unsigned long rv = -EIO; |
| 295 | unsigned long (*get_area)(struct file *, unsigned long, unsigned long, | 295 | |
| 296 | unsigned long, unsigned long) = NULL; | ||
| 297 | if (use_pde(pde)) { | 296 | if (use_pde(pde)) { |
| 297 | typeof(proc_reg_get_unmapped_area) *get_area; | ||
| 298 | |||
| 299 | get_area = pde->proc_fops->get_unmapped_area; | ||
| 298 | #ifdef CONFIG_MMU | 300 | #ifdef CONFIG_MMU |
| 299 | get_area = current->mm->get_unmapped_area; | 301 | if (!get_area) |
| 302 | get_area = current->mm->get_unmapped_area; | ||
| 300 | #endif | 303 | #endif |
| 301 | if (pde->proc_fops->get_unmapped_area) | 304 | |
| 302 | get_area = pde->proc_fops->get_unmapped_area; | ||
| 303 | if (get_area) | 305 | if (get_area) |
| 304 | rv = get_area(file, orig_addr, len, pgoff, flags); | 306 | rv = get_area(file, orig_addr, len, pgoff, flags); |
| 307 | else | ||
| 308 | rv = orig_addr; | ||
| 305 | unuse_pde(pde); | 309 | unuse_pde(pde); |
| 306 | } | 310 | } |
| 307 | return rv; | 311 | return rv; |
diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 8367d6dc18c9..4f11ef011139 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c | |||
| @@ -157,7 +157,7 @@ xfs_ioc_trim( | |||
| 157 | struct xfs_mount *mp, | 157 | struct xfs_mount *mp, |
| 158 | struct fstrim_range __user *urange) | 158 | struct fstrim_range __user *urange) |
| 159 | { | 159 | { |
| 160 | struct request_queue *q = mp->m_ddev_targp->bt_bdev->bd_disk->queue; | 160 | struct request_queue *q = bdev_get_queue(mp->m_ddev_targp->bt_bdev); |
| 161 | unsigned int granularity = q->limits.discard_granularity; | 161 | unsigned int granularity = q->limits.discard_granularity; |
| 162 | struct fstrim_range range; | 162 | struct fstrim_range range; |
| 163 | xfs_daddr_t start, end, minlen; | 163 | xfs_daddr_t start, end, minlen; |
| @@ -180,7 +180,8 @@ xfs_ioc_trim( | |||
| 180 | * matter as trimming blocks is an advisory interface. | 180 | * matter as trimming blocks is an advisory interface. |
| 181 | */ | 181 | */ |
| 182 | if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || | 182 | if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || |
| 183 | range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp))) | 183 | range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp)) || |
| 184 | range.len < mp->m_sb.sb_blocksize) | ||
| 184 | return -XFS_ERROR(EINVAL); | 185 | return -XFS_ERROR(EINVAL); |
| 185 | 186 | ||
| 186 | start = BTOBB(range.start); | 187 | start = BTOBB(range.start); |
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index a6e54b3319bd..02fb943cbf22 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c | |||
| @@ -220,6 +220,8 @@ xfs_growfs_data_private( | |||
| 220 | */ | 220 | */ |
| 221 | nfree = 0; | 221 | nfree = 0; |
| 222 | for (agno = nagcount - 1; agno >= oagcount; agno--, new -= agsize) { | 222 | for (agno = nagcount - 1; agno >= oagcount; agno--, new -= agsize) { |
| 223 | __be32 *agfl_bno; | ||
| 224 | |||
| 223 | /* | 225 | /* |
| 224 | * AG freespace header block | 226 | * AG freespace header block |
| 225 | */ | 227 | */ |
| @@ -279,8 +281,10 @@ xfs_growfs_data_private( | |||
| 279 | agfl->agfl_seqno = cpu_to_be32(agno); | 281 | agfl->agfl_seqno = cpu_to_be32(agno); |
| 280 | uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); | 282 | uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); |
| 281 | } | 283 | } |
| 284 | |||
| 285 | agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp); | ||
| 282 | for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) | 286 | for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) |
| 283 | agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); | 287 | agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); |
| 284 | 288 | ||
| 285 | error = xfs_bwrite(bp); | 289 | error = xfs_bwrite(bp); |
| 286 | xfs_buf_relse(bp); | 290 | xfs_buf_relse(bp); |
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 4d613401a5e0..33ad9a77791f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c | |||
| @@ -442,7 +442,8 @@ xfs_attrlist_by_handle( | |||
| 442 | return -XFS_ERROR(EPERM); | 442 | return -XFS_ERROR(EPERM); |
| 443 | if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t))) | 443 | if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t))) |
| 444 | return -XFS_ERROR(EFAULT); | 444 | return -XFS_ERROR(EFAULT); |
| 445 | if (al_hreq.buflen > XATTR_LIST_MAX) | 445 | if (al_hreq.buflen < sizeof(struct attrlist) || |
| 446 | al_hreq.buflen > XATTR_LIST_MAX) | ||
| 446 | return -XFS_ERROR(EINVAL); | 447 | return -XFS_ERROR(EINVAL); |
| 447 | 448 | ||
| 448 | /* | 449 | /* |
diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index e8fb1231db81..a7992f8de9d3 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c | |||
| @@ -356,7 +356,8 @@ xfs_compat_attrlist_by_handle( | |||
| 356 | if (copy_from_user(&al_hreq, arg, | 356 | if (copy_from_user(&al_hreq, arg, |
| 357 | sizeof(compat_xfs_fsop_attrlist_handlereq_t))) | 357 | sizeof(compat_xfs_fsop_attrlist_handlereq_t))) |
| 358 | return -XFS_ERROR(EFAULT); | 358 | return -XFS_ERROR(EFAULT); |
| 359 | if (al_hreq.buflen > XATTR_LIST_MAX) | 359 | if (al_hreq.buflen < sizeof(struct attrlist) || |
| 360 | al_hreq.buflen > XATTR_LIST_MAX) | ||
| 360 | return -XFS_ERROR(EINVAL); | 361 | return -XFS_ERROR(EINVAL); |
| 361 | 362 | ||
| 362 | /* | 363 | /* |
