diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/binfmt_elf.c | 1 | ||||
| -rw-r--r-- | fs/bio.c | 2 | ||||
| -rw-r--r-- | fs/block_dev.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 48 | ||||
| -rw-r--r-- | fs/cifs/connect.c | 16 | ||||
| -rw-r--r-- | fs/ecryptfs/miscdev.c | 14 | ||||
| -rw-r--r-- | fs/exec.c | 4 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 11 | ||||
| -rw-r--r-- | fs/ext4/indirect.c | 4 | ||||
| -rw-r--r-- | fs/gfs2/file.c | 5 | ||||
| -rw-r--r-- | fs/gfs2/incore.h | 1 | ||||
| -rw-r--r-- | fs/gfs2/lock_dlm.c | 39 | ||||
| -rw-r--r-- | fs/gfs2/rgrp.c | 32 | ||||
| -rw-r--r-- | fs/hfsplus/extents.c | 2 | ||||
| -rw-r--r-- | fs/hugetlbfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/inode.c | 2 | ||||
| -rw-r--r-- | fs/namespace.c | 2 | ||||
| -rw-r--r-- | fs/nfs/nfs4client.c | 45 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 1 | ||||
| -rw-r--r-- | fs/nfs/nfs4state.c | 8 | ||||
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 2 | ||||
| -rw-r--r-- | fs/proc/array.c | 1 | ||||
| -rw-r--r-- | fs/proc/generic.c | 119 | ||||
| -rw-r--r-- | fs/reiserfs/xattr.c | 4 | ||||
| -rw-r--r-- | fs/ubifs/super.c | 12 |
25 files changed, 249 insertions, 129 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 3939829f6c5c..86af964c2425 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -1137,6 +1137,7 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma, | |||
| 1137 | goto whole; | 1137 | goto whole; |
| 1138 | if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE)) | 1138 | if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE)) |
| 1139 | goto whole; | 1139 | goto whole; |
| 1140 | return 0; | ||
| 1140 | } | 1141 | } |
| 1141 | 1142 | ||
| 1142 | /* Do not dump I/O mapped devices or special mappings */ | 1143 | /* Do not dump I/O mapped devices or special mappings */ |
| @@ -1428,8 +1428,6 @@ void bio_endio(struct bio *bio, int error) | |||
| 1428 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | 1428 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) |
| 1429 | error = -EIO; | 1429 | error = -EIO; |
| 1430 | 1430 | ||
| 1431 | trace_block_bio_complete(bio, error); | ||
| 1432 | |||
| 1433 | if (bio->bi_end_io) | 1431 | if (bio->bi_end_io) |
| 1434 | bio->bi_end_io(bio, error); | 1432 | bio->bi_end_io(bio, error); |
| 1435 | } | 1433 | } |
diff --git a/fs/block_dev.c b/fs/block_dev.c index aea605c98ba6..aae187a7f94a 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -551,6 +551,7 @@ struct block_device *bdgrab(struct block_device *bdev) | |||
| 551 | ihold(bdev->bd_inode); | 551 | ihold(bdev->bd_inode); |
| 552 | return bdev; | 552 | return bdev; |
| 553 | } | 553 | } |
| 554 | EXPORT_SYMBOL(bdgrab); | ||
| 554 | 555 | ||
| 555 | long nr_blockdev_pages(void) | 556 | long nr_blockdev_pages(void) |
| 556 | { | 557 | { |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 451fad96ecd1..ef96381569a4 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -317,6 +317,7 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | |||
| 317 | unsigned long src_ptr; | 317 | unsigned long src_ptr; |
| 318 | unsigned long dst_ptr; | 318 | unsigned long dst_ptr; |
| 319 | int overwrite_root = 0; | 319 | int overwrite_root = 0; |
| 320 | bool inode_item = key->type == BTRFS_INODE_ITEM_KEY; | ||
| 320 | 321 | ||
| 321 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | 322 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) |
| 322 | overwrite_root = 1; | 323 | overwrite_root = 1; |
| @@ -326,6 +327,9 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | |||
| 326 | 327 | ||
| 327 | /* look for the key in the destination tree */ | 328 | /* look for the key in the destination tree */ |
| 328 | ret = btrfs_search_slot(NULL, root, key, path, 0, 0); | 329 | ret = btrfs_search_slot(NULL, root, key, path, 0, 0); |
| 330 | if (ret < 0) | ||
| 331 | return ret; | ||
| 332 | |||
| 329 | if (ret == 0) { | 333 | if (ret == 0) { |
| 330 | char *src_copy; | 334 | char *src_copy; |
| 331 | char *dst_copy; | 335 | char *dst_copy; |
| @@ -367,6 +371,30 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | |||
| 367 | return 0; | 371 | return 0; |
| 368 | } | 372 | } |
| 369 | 373 | ||
| 374 | /* | ||
| 375 | * We need to load the old nbytes into the inode so when we | ||
| 376 | * replay the extents we've logged we get the right nbytes. | ||
| 377 | */ | ||
| 378 | if (inode_item) { | ||
| 379 | struct btrfs_inode_item *item; | ||
| 380 | u64 nbytes; | ||
| 381 | |||
| 382 | item = btrfs_item_ptr(path->nodes[0], path->slots[0], | ||
| 383 | struct btrfs_inode_item); | ||
| 384 | nbytes = btrfs_inode_nbytes(path->nodes[0], item); | ||
| 385 | item = btrfs_item_ptr(eb, slot, | ||
| 386 | struct btrfs_inode_item); | ||
| 387 | btrfs_set_inode_nbytes(eb, item, nbytes); | ||
| 388 | } | ||
| 389 | } else if (inode_item) { | ||
| 390 | struct btrfs_inode_item *item; | ||
| 391 | |||
| 392 | /* | ||
| 393 | * New inode, set nbytes to 0 so that the nbytes comes out | ||
| 394 | * properly when we replay the extents. | ||
| 395 | */ | ||
| 396 | item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item); | ||
| 397 | btrfs_set_inode_nbytes(eb, item, 0); | ||
| 370 | } | 398 | } |
| 371 | insert: | 399 | insert: |
| 372 | btrfs_release_path(path); | 400 | btrfs_release_path(path); |
| @@ -486,7 +514,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | |||
| 486 | int found_type; | 514 | int found_type; |
| 487 | u64 extent_end; | 515 | u64 extent_end; |
| 488 | u64 start = key->offset; | 516 | u64 start = key->offset; |
| 489 | u64 saved_nbytes; | 517 | u64 nbytes = 0; |
| 490 | struct btrfs_file_extent_item *item; | 518 | struct btrfs_file_extent_item *item; |
| 491 | struct inode *inode = NULL; | 519 | struct inode *inode = NULL; |
| 492 | unsigned long size; | 520 | unsigned long size; |
| @@ -496,10 +524,19 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | |||
| 496 | found_type = btrfs_file_extent_type(eb, item); | 524 | found_type = btrfs_file_extent_type(eb, item); |
| 497 | 525 | ||
| 498 | if (found_type == BTRFS_FILE_EXTENT_REG || | 526 | if (found_type == BTRFS_FILE_EXTENT_REG || |
| 499 | found_type == BTRFS_FILE_EXTENT_PREALLOC) | 527 | found_type == BTRFS_FILE_EXTENT_PREALLOC) { |
| 500 | extent_end = start + btrfs_file_extent_num_bytes(eb, item); | 528 | nbytes = btrfs_file_extent_num_bytes(eb, item); |
| 501 | else if (found_type == BTRFS_FILE_EXTENT_INLINE) { | 529 | extent_end = start + nbytes; |
| 530 | |||
| 531 | /* | ||
| 532 | * We don't add to the inodes nbytes if we are prealloc or a | ||
| 533 | * hole. | ||
| 534 | */ | ||
| 535 | if (btrfs_file_extent_disk_bytenr(eb, item) == 0) | ||
| 536 | nbytes = 0; | ||
| 537 | } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { | ||
| 502 | size = btrfs_file_extent_inline_len(eb, item); | 538 | size = btrfs_file_extent_inline_len(eb, item); |
| 539 | nbytes = btrfs_file_extent_ram_bytes(eb, item); | ||
| 503 | extent_end = ALIGN(start + size, root->sectorsize); | 540 | extent_end = ALIGN(start + size, root->sectorsize); |
| 504 | } else { | 541 | } else { |
| 505 | ret = 0; | 542 | ret = 0; |
| @@ -548,7 +585,6 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | |||
| 548 | } | 585 | } |
| 549 | btrfs_release_path(path); | 586 | btrfs_release_path(path); |
| 550 | 587 | ||
| 551 | saved_nbytes = inode_get_bytes(inode); | ||
| 552 | /* drop any overlapping extents */ | 588 | /* drop any overlapping extents */ |
| 553 | ret = btrfs_drop_extents(trans, root, inode, start, extent_end, 1); | 589 | ret = btrfs_drop_extents(trans, root, inode, start, extent_end, 1); |
| 554 | BUG_ON(ret); | 590 | BUG_ON(ret); |
| @@ -635,7 +671,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | |||
| 635 | BUG_ON(ret); | 671 | BUG_ON(ret); |
| 636 | } | 672 | } |
| 637 | 673 | ||
| 638 | inode_set_bytes(inode, saved_nbytes); | 674 | inode_add_bytes(inode, nbytes); |
| 639 | ret = btrfs_update_inode(trans, root, inode); | 675 | ret = btrfs_update_inode(trans, root, inode); |
| 640 | out: | 676 | out: |
| 641 | if (inode) | 677 | if (inode) |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 991c63c6bdd0..21b3a291c327 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -1575,14 +1575,24 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1575 | } | 1575 | } |
| 1576 | break; | 1576 | break; |
| 1577 | case Opt_blank_pass: | 1577 | case Opt_blank_pass: |
| 1578 | vol->password = NULL; | ||
| 1579 | break; | ||
| 1580 | case Opt_pass: | ||
| 1581 | /* passwords have to be handled differently | 1578 | /* passwords have to be handled differently |
| 1582 | * to allow the character used for deliminator | 1579 | * to allow the character used for deliminator |
| 1583 | * to be passed within them | 1580 | * to be passed within them |
| 1584 | */ | 1581 | */ |
| 1585 | 1582 | ||
| 1583 | /* | ||
| 1584 | * Check if this is a case where the password | ||
| 1585 | * starts with a delimiter | ||
| 1586 | */ | ||
| 1587 | tmp_end = strchr(data, '='); | ||
| 1588 | tmp_end++; | ||
| 1589 | if (!(tmp_end < end && tmp_end[1] == delim)) { | ||
| 1590 | /* No it is not. Set the password to NULL */ | ||
| 1591 | vol->password = NULL; | ||
| 1592 | break; | ||
| 1593 | } | ||
| 1594 | /* Yes it is. Drop down to Opt_pass below.*/ | ||
| 1595 | case Opt_pass: | ||
| 1586 | /* Obtain the value string */ | 1596 | /* Obtain the value string */ |
| 1587 | value = strchr(data, '='); | 1597 | value = strchr(data, '='); |
| 1588 | value++; | 1598 | value++; |
diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c index 412e6eda25f8..e4141f257495 100644 --- a/fs/ecryptfs/miscdev.c +++ b/fs/ecryptfs/miscdev.c | |||
| @@ -80,13 +80,6 @@ ecryptfs_miscdev_open(struct inode *inode, struct file *file) | |||
| 80 | int rc; | 80 | int rc; |
| 81 | 81 | ||
| 82 | mutex_lock(&ecryptfs_daemon_hash_mux); | 82 | mutex_lock(&ecryptfs_daemon_hash_mux); |
| 83 | rc = try_module_get(THIS_MODULE); | ||
| 84 | if (rc == 0) { | ||
| 85 | rc = -EIO; | ||
| 86 | printk(KERN_ERR "%s: Error attempting to increment module use " | ||
| 87 | "count; rc = [%d]\n", __func__, rc); | ||
| 88 | goto out_unlock_daemon_list; | ||
| 89 | } | ||
| 90 | rc = ecryptfs_find_daemon_by_euid(&daemon); | 83 | rc = ecryptfs_find_daemon_by_euid(&daemon); |
| 91 | if (!rc) { | 84 | if (!rc) { |
| 92 | rc = -EINVAL; | 85 | rc = -EINVAL; |
| @@ -96,7 +89,7 @@ ecryptfs_miscdev_open(struct inode *inode, struct file *file) | |||
| 96 | if (rc) { | 89 | if (rc) { |
| 97 | printk(KERN_ERR "%s: Error attempting to spawn daemon; " | 90 | printk(KERN_ERR "%s: Error attempting to spawn daemon; " |
| 98 | "rc = [%d]\n", __func__, rc); | 91 | "rc = [%d]\n", __func__, rc); |
| 99 | goto out_module_put_unlock_daemon_list; | 92 | goto out_unlock_daemon_list; |
| 100 | } | 93 | } |
| 101 | mutex_lock(&daemon->mux); | 94 | mutex_lock(&daemon->mux); |
| 102 | if (daemon->flags & ECRYPTFS_DAEMON_MISCDEV_OPEN) { | 95 | if (daemon->flags & ECRYPTFS_DAEMON_MISCDEV_OPEN) { |
| @@ -108,9 +101,6 @@ ecryptfs_miscdev_open(struct inode *inode, struct file *file) | |||
| 108 | atomic_inc(&ecryptfs_num_miscdev_opens); | 101 | atomic_inc(&ecryptfs_num_miscdev_opens); |
| 109 | out_unlock_daemon: | 102 | out_unlock_daemon: |
| 110 | mutex_unlock(&daemon->mux); | 103 | mutex_unlock(&daemon->mux); |
| 111 | out_module_put_unlock_daemon_list: | ||
| 112 | if (rc) | ||
| 113 | module_put(THIS_MODULE); | ||
| 114 | out_unlock_daemon_list: | 104 | out_unlock_daemon_list: |
| 115 | mutex_unlock(&ecryptfs_daemon_hash_mux); | 105 | mutex_unlock(&ecryptfs_daemon_hash_mux); |
| 116 | return rc; | 106 | return rc; |
| @@ -147,7 +137,6 @@ ecryptfs_miscdev_release(struct inode *inode, struct file *file) | |||
| 147 | "bug.\n", __func__, rc); | 137 | "bug.\n", __func__, rc); |
| 148 | BUG(); | 138 | BUG(); |
| 149 | } | 139 | } |
| 150 | module_put(THIS_MODULE); | ||
| 151 | return rc; | 140 | return rc; |
| 152 | } | 141 | } |
| 153 | 142 | ||
| @@ -471,6 +460,7 @@ out_free: | |||
| 471 | 460 | ||
| 472 | 461 | ||
| 473 | static const struct file_operations ecryptfs_miscdev_fops = { | 462 | static const struct file_operations ecryptfs_miscdev_fops = { |
| 463 | .owner = THIS_MODULE, | ||
| 474 | .open = ecryptfs_miscdev_open, | 464 | .open = ecryptfs_miscdev_open, |
| 475 | .poll = ecryptfs_miscdev_poll, | 465 | .poll = ecryptfs_miscdev_poll, |
| 476 | .read = ecryptfs_miscdev_read, | 466 | .read = ecryptfs_miscdev_read, |
| @@ -613,7 +613,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | |||
| 613 | * when the old and new regions overlap clear from new_end. | 613 | * when the old and new regions overlap clear from new_end. |
| 614 | */ | 614 | */ |
| 615 | free_pgd_range(&tlb, new_end, old_end, new_end, | 615 | free_pgd_range(&tlb, new_end, old_end, new_end, |
| 616 | vma->vm_next ? vma->vm_next->vm_start : 0); | 616 | vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); |
| 617 | } else { | 617 | } else { |
| 618 | /* | 618 | /* |
| 619 | * otherwise, clean from old_start; this is done to not touch | 619 | * otherwise, clean from old_start; this is done to not touch |
| @@ -622,7 +622,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | |||
| 622 | * for the others its just a little faster. | 622 | * for the others its just a little faster. |
| 623 | */ | 623 | */ |
| 624 | free_pgd_range(&tlb, old_start, old_end, new_end, | 624 | free_pgd_range(&tlb, old_start, old_end, new_end, |
| 625 | vma->vm_next ? vma->vm_next->vm_start : 0); | 625 | vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); |
| 626 | } | 626 | } |
| 627 | tlb_finish_mmu(&tlb, new_end, old_end); | 627 | tlb_finish_mmu(&tlb, new_end, old_end); |
| 628 | 628 | ||
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 56efcaadf848..9c6d06dcef8b 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -2999,20 +2999,23 @@ static int ext4_split_extent_at(handle_t *handle, | |||
| 2999 | if (split_flag & EXT4_EXT_DATA_VALID1) { | 2999 | if (split_flag & EXT4_EXT_DATA_VALID1) { |
| 3000 | err = ext4_ext_zeroout(inode, ex2); | 3000 | err = ext4_ext_zeroout(inode, ex2); |
| 3001 | zero_ex.ee_block = ex2->ee_block; | 3001 | zero_ex.ee_block = ex2->ee_block; |
| 3002 | zero_ex.ee_len = ext4_ext_get_actual_len(ex2); | 3002 | zero_ex.ee_len = cpu_to_le16( |
| 3003 | ext4_ext_get_actual_len(ex2)); | ||
| 3003 | ext4_ext_store_pblock(&zero_ex, | 3004 | ext4_ext_store_pblock(&zero_ex, |
| 3004 | ext4_ext_pblock(ex2)); | 3005 | ext4_ext_pblock(ex2)); |
| 3005 | } else { | 3006 | } else { |
| 3006 | err = ext4_ext_zeroout(inode, ex); | 3007 | err = ext4_ext_zeroout(inode, ex); |
| 3007 | zero_ex.ee_block = ex->ee_block; | 3008 | zero_ex.ee_block = ex->ee_block; |
| 3008 | zero_ex.ee_len = ext4_ext_get_actual_len(ex); | 3009 | zero_ex.ee_len = cpu_to_le16( |
| 3010 | ext4_ext_get_actual_len(ex)); | ||
| 3009 | ext4_ext_store_pblock(&zero_ex, | 3011 | ext4_ext_store_pblock(&zero_ex, |
| 3010 | ext4_ext_pblock(ex)); | 3012 | ext4_ext_pblock(ex)); |
| 3011 | } | 3013 | } |
| 3012 | } else { | 3014 | } else { |
| 3013 | err = ext4_ext_zeroout(inode, &orig_ex); | 3015 | err = ext4_ext_zeroout(inode, &orig_ex); |
| 3014 | zero_ex.ee_block = orig_ex.ee_block; | 3016 | zero_ex.ee_block = orig_ex.ee_block; |
| 3015 | zero_ex.ee_len = ext4_ext_get_actual_len(&orig_ex); | 3017 | zero_ex.ee_len = cpu_to_le16( |
| 3018 | ext4_ext_get_actual_len(&orig_ex)); | ||
| 3016 | ext4_ext_store_pblock(&zero_ex, | 3019 | ext4_ext_store_pblock(&zero_ex, |
| 3017 | ext4_ext_pblock(&orig_ex)); | 3020 | ext4_ext_pblock(&orig_ex)); |
| 3018 | } | 3021 | } |
| @@ -3272,7 +3275,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 3272 | if (err) | 3275 | if (err) |
| 3273 | goto out; | 3276 | goto out; |
| 3274 | zero_ex.ee_block = ex->ee_block; | 3277 | zero_ex.ee_block = ex->ee_block; |
| 3275 | zero_ex.ee_len = ext4_ext_get_actual_len(ex); | 3278 | zero_ex.ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex)); |
| 3276 | ext4_ext_store_pblock(&zero_ex, ext4_ext_pblock(ex)); | 3279 | ext4_ext_store_pblock(&zero_ex, ext4_ext_pblock(ex)); |
| 3277 | 3280 | ||
| 3278 | err = ext4_ext_get_access(handle, inode, path + depth); | 3281 | err = ext4_ext_get_access(handle, inode, path + depth); |
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index b505a145a593..a04183127ef0 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c | |||
| @@ -1539,9 +1539,9 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode, | |||
| 1539 | blk = *i_data; | 1539 | blk = *i_data; |
| 1540 | if (level > 0) { | 1540 | if (level > 0) { |
| 1541 | ext4_lblk_t first2; | 1541 | ext4_lblk_t first2; |
| 1542 | bh = sb_bread(inode->i_sb, blk); | 1542 | bh = sb_bread(inode->i_sb, le32_to_cpu(blk)); |
| 1543 | if (!bh) { | 1543 | if (!bh) { |
| 1544 | EXT4_ERROR_INODE_BLOCK(inode, blk, | 1544 | EXT4_ERROR_INODE_BLOCK(inode, le32_to_cpu(blk), |
| 1545 | "Read failure"); | 1545 | "Read failure"); |
| 1546 | return -EIO; | 1546 | return -EIO; |
| 1547 | } | 1547 | } |
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 019f45e45097..d79c2dadc536 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
| @@ -923,8 +923,11 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) | |||
| 923 | cmd = F_SETLK; | 923 | cmd = F_SETLK; |
| 924 | fl->fl_type = F_UNLCK; | 924 | fl->fl_type = F_UNLCK; |
| 925 | } | 925 | } |
| 926 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) | 926 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) { |
| 927 | if (fl->fl_type == F_UNLCK) | ||
| 928 | posix_lock_file_wait(file, fl); | ||
| 927 | return -EIO; | 929 | return -EIO; |
| 930 | } | ||
| 928 | if (IS_GETLK(cmd)) | 931 | if (IS_GETLK(cmd)) |
| 929 | return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl); | 932 | return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl); |
| 930 | else if (fl->fl_type == F_UNLCK) | 933 | else if (fl->fl_type == F_UNLCK) |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 156e42ec84ea..5c29216e9cc1 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
| @@ -588,6 +588,7 @@ struct lm_lockstruct { | |||
| 588 | struct dlm_lksb ls_control_lksb; /* control_lock */ | 588 | struct dlm_lksb ls_control_lksb; /* control_lock */ |
| 589 | char ls_control_lvb[GDLM_LVB_SIZE]; /* control_lock lvb */ | 589 | char ls_control_lvb[GDLM_LVB_SIZE]; /* control_lock lvb */ |
| 590 | struct completion ls_sync_wait; /* {control,mounted}_{lock,unlock} */ | 590 | struct completion ls_sync_wait; /* {control,mounted}_{lock,unlock} */ |
| 591 | char *ls_lvb_bits; | ||
| 591 | 592 | ||
| 592 | spinlock_t ls_recover_spin; /* protects following fields */ | 593 | spinlock_t ls_recover_spin; /* protects following fields */ |
| 593 | unsigned long ls_recover_flags; /* DFL_ */ | 594 | unsigned long ls_recover_flags; /* DFL_ */ |
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 9802de0f85e6..c8423d6de6c3 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c | |||
| @@ -483,12 +483,8 @@ static void control_lvb_write(struct lm_lockstruct *ls, uint32_t lvb_gen, | |||
| 483 | 483 | ||
| 484 | static int all_jid_bits_clear(char *lvb) | 484 | static int all_jid_bits_clear(char *lvb) |
| 485 | { | 485 | { |
| 486 | int i; | 486 | return !memchr_inv(lvb + JID_BITMAP_OFFSET, 0, |
| 487 | for (i = JID_BITMAP_OFFSET; i < GDLM_LVB_SIZE; i++) { | 487 | GDLM_LVB_SIZE - JID_BITMAP_OFFSET); |
| 488 | if (lvb[i]) | ||
| 489 | return 0; | ||
| 490 | } | ||
| 491 | return 1; | ||
| 492 | } | 488 | } |
| 493 | 489 | ||
| 494 | static void sync_wait_cb(void *arg) | 490 | static void sync_wait_cb(void *arg) |
| @@ -580,7 +576,6 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 580 | { | 576 | { |
| 581 | struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work); | 577 | struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_control_work.work); |
| 582 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; | 578 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
| 583 | char lvb_bits[GDLM_LVB_SIZE]; | ||
| 584 | uint32_t block_gen, start_gen, lvb_gen, flags; | 579 | uint32_t block_gen, start_gen, lvb_gen, flags; |
| 585 | int recover_set = 0; | 580 | int recover_set = 0; |
| 586 | int write_lvb = 0; | 581 | int write_lvb = 0; |
| @@ -634,7 +629,7 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 634 | return; | 629 | return; |
| 635 | } | 630 | } |
| 636 | 631 | ||
| 637 | control_lvb_read(ls, &lvb_gen, lvb_bits); | 632 | control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits); |
| 638 | 633 | ||
| 639 | spin_lock(&ls->ls_recover_spin); | 634 | spin_lock(&ls->ls_recover_spin); |
| 640 | if (block_gen != ls->ls_recover_block || | 635 | if (block_gen != ls->ls_recover_block || |
| @@ -664,10 +659,10 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 664 | 659 | ||
| 665 | ls->ls_recover_result[i] = 0; | 660 | ls->ls_recover_result[i] = 0; |
| 666 | 661 | ||
| 667 | if (!test_bit_le(i, lvb_bits + JID_BITMAP_OFFSET)) | 662 | if (!test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET)) |
| 668 | continue; | 663 | continue; |
| 669 | 664 | ||
| 670 | __clear_bit_le(i, lvb_bits + JID_BITMAP_OFFSET); | 665 | __clear_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET); |
| 671 | write_lvb = 1; | 666 | write_lvb = 1; |
| 672 | } | 667 | } |
| 673 | } | 668 | } |
| @@ -691,7 +686,7 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 691 | continue; | 686 | continue; |
| 692 | if (ls->ls_recover_submit[i] < start_gen) { | 687 | if (ls->ls_recover_submit[i] < start_gen) { |
| 693 | ls->ls_recover_submit[i] = 0; | 688 | ls->ls_recover_submit[i] = 0; |
| 694 | __set_bit_le(i, lvb_bits + JID_BITMAP_OFFSET); | 689 | __set_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET); |
| 695 | } | 690 | } |
| 696 | } | 691 | } |
| 697 | /* even if there are no bits to set, we need to write the | 692 | /* even if there are no bits to set, we need to write the |
| @@ -705,7 +700,7 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 705 | spin_unlock(&ls->ls_recover_spin); | 700 | spin_unlock(&ls->ls_recover_spin); |
| 706 | 701 | ||
| 707 | if (write_lvb) { | 702 | if (write_lvb) { |
| 708 | control_lvb_write(ls, start_gen, lvb_bits); | 703 | control_lvb_write(ls, start_gen, ls->ls_lvb_bits); |
| 709 | flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK; | 704 | flags = DLM_LKF_CONVERT | DLM_LKF_VALBLK; |
| 710 | } else { | 705 | } else { |
| 711 | flags = DLM_LKF_CONVERT; | 706 | flags = DLM_LKF_CONVERT; |
| @@ -725,7 +720,7 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 725 | */ | 720 | */ |
| 726 | 721 | ||
| 727 | for (i = 0; i < recover_size; i++) { | 722 | for (i = 0; i < recover_size; i++) { |
| 728 | if (test_bit_le(i, lvb_bits + JID_BITMAP_OFFSET)) { | 723 | if (test_bit_le(i, ls->ls_lvb_bits + JID_BITMAP_OFFSET)) { |
| 729 | fs_info(sdp, "recover generation %u jid %d\n", | 724 | fs_info(sdp, "recover generation %u jid %d\n", |
| 730 | start_gen, i); | 725 | start_gen, i); |
| 731 | gfs2_recover_set(sdp, i); | 726 | gfs2_recover_set(sdp, i); |
| @@ -758,7 +753,6 @@ static void gfs2_control_func(struct work_struct *work) | |||
| 758 | static int control_mount(struct gfs2_sbd *sdp) | 753 | static int control_mount(struct gfs2_sbd *sdp) |
| 759 | { | 754 | { |
| 760 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; | 755 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
| 761 | char lvb_bits[GDLM_LVB_SIZE]; | ||
| 762 | uint32_t start_gen, block_gen, mount_gen, lvb_gen; | 756 | uint32_t start_gen, block_gen, mount_gen, lvb_gen; |
| 763 | int mounted_mode; | 757 | int mounted_mode; |
| 764 | int retries = 0; | 758 | int retries = 0; |
| @@ -857,7 +851,7 @@ locks_done: | |||
| 857 | * lvb_gen will be non-zero. | 851 | * lvb_gen will be non-zero. |
| 858 | */ | 852 | */ |
| 859 | 853 | ||
| 860 | control_lvb_read(ls, &lvb_gen, lvb_bits); | 854 | control_lvb_read(ls, &lvb_gen, ls->ls_lvb_bits); |
| 861 | 855 | ||
| 862 | if (lvb_gen == 0xFFFFFFFF) { | 856 | if (lvb_gen == 0xFFFFFFFF) { |
| 863 | /* special value to force mount attempts to fail */ | 857 | /* special value to force mount attempts to fail */ |
| @@ -887,7 +881,7 @@ locks_done: | |||
| 887 | * and all lvb bits to be clear (no pending journal recoveries.) | 881 | * and all lvb bits to be clear (no pending journal recoveries.) |
| 888 | */ | 882 | */ |
| 889 | 883 | ||
| 890 | if (!all_jid_bits_clear(lvb_bits)) { | 884 | if (!all_jid_bits_clear(ls->ls_lvb_bits)) { |
| 891 | /* journals need recovery, wait until all are clear */ | 885 | /* journals need recovery, wait until all are clear */ |
| 892 | fs_info(sdp, "control_mount wait for journal recovery\n"); | 886 | fs_info(sdp, "control_mount wait for journal recovery\n"); |
| 893 | goto restart; | 887 | goto restart; |
| @@ -949,7 +943,6 @@ static int dlm_recovery_wait(void *word) | |||
| 949 | static int control_first_done(struct gfs2_sbd *sdp) | 943 | static int control_first_done(struct gfs2_sbd *sdp) |
| 950 | { | 944 | { |
| 951 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; | 945 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
| 952 | char lvb_bits[GDLM_LVB_SIZE]; | ||
| 953 | uint32_t start_gen, block_gen; | 946 | uint32_t start_gen, block_gen; |
| 954 | int error; | 947 | int error; |
| 955 | 948 | ||
| @@ -991,8 +984,8 @@ restart: | |||
| 991 | memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t)); | 984 | memset(ls->ls_recover_result, 0, ls->ls_recover_size*sizeof(uint32_t)); |
| 992 | spin_unlock(&ls->ls_recover_spin); | 985 | spin_unlock(&ls->ls_recover_spin); |
| 993 | 986 | ||
| 994 | memset(lvb_bits, 0, sizeof(lvb_bits)); | 987 | memset(ls->ls_lvb_bits, 0, GDLM_LVB_SIZE); |
| 995 | control_lvb_write(ls, start_gen, lvb_bits); | 988 | control_lvb_write(ls, start_gen, ls->ls_lvb_bits); |
| 996 | 989 | ||
| 997 | error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT); | 990 | error = mounted_lock(sdp, DLM_LOCK_PR, DLM_LKF_CONVERT); |
| 998 | if (error) | 991 | if (error) |
| @@ -1022,6 +1015,12 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots, | |||
| 1022 | uint32_t old_size, new_size; | 1015 | uint32_t old_size, new_size; |
| 1023 | int i, max_jid; | 1016 | int i, max_jid; |
| 1024 | 1017 | ||
| 1018 | if (!ls->ls_lvb_bits) { | ||
| 1019 | ls->ls_lvb_bits = kzalloc(GDLM_LVB_SIZE, GFP_NOFS); | ||
| 1020 | if (!ls->ls_lvb_bits) | ||
| 1021 | return -ENOMEM; | ||
| 1022 | } | ||
| 1023 | |||
| 1025 | max_jid = 0; | 1024 | max_jid = 0; |
| 1026 | for (i = 0; i < num_slots; i++) { | 1025 | for (i = 0; i < num_slots; i++) { |
| 1027 | if (max_jid < slots[i].slot - 1) | 1026 | if (max_jid < slots[i].slot - 1) |
| @@ -1057,6 +1056,7 @@ static int set_recover_size(struct gfs2_sbd *sdp, struct dlm_slot *slots, | |||
| 1057 | 1056 | ||
| 1058 | static void free_recover_size(struct lm_lockstruct *ls) | 1057 | static void free_recover_size(struct lm_lockstruct *ls) |
| 1059 | { | 1058 | { |
| 1059 | kfree(ls->ls_lvb_bits); | ||
| 1060 | kfree(ls->ls_recover_submit); | 1060 | kfree(ls->ls_recover_submit); |
| 1061 | kfree(ls->ls_recover_result); | 1061 | kfree(ls->ls_recover_result); |
| 1062 | ls->ls_recover_submit = NULL; | 1062 | ls->ls_recover_submit = NULL; |
| @@ -1205,6 +1205,7 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table) | |||
| 1205 | ls->ls_recover_size = 0; | 1205 | ls->ls_recover_size = 0; |
| 1206 | ls->ls_recover_submit = NULL; | 1206 | ls->ls_recover_submit = NULL; |
| 1207 | ls->ls_recover_result = NULL; | 1207 | ls->ls_recover_result = NULL; |
| 1208 | ls->ls_lvb_bits = NULL; | ||
| 1208 | 1209 | ||
| 1209 | error = set_recover_size(sdp, NULL, 0); | 1210 | error = set_recover_size(sdp, NULL, 0); |
| 1210 | if (error) | 1211 | if (error) |
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index d1f51fd73f86..5a51265a4341 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
| @@ -576,7 +576,7 @@ int gfs2_rs_alloc(struct gfs2_inode *ip) | |||
| 576 | RB_CLEAR_NODE(&ip->i_res->rs_node); | 576 | RB_CLEAR_NODE(&ip->i_res->rs_node); |
| 577 | out: | 577 | out: |
| 578 | up_write(&ip->i_rw_mutex); | 578 | up_write(&ip->i_rw_mutex); |
| 579 | return 0; | 579 | return error; |
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) | 582 | static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) |
| @@ -1181,12 +1181,9 @@ int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset, | |||
| 1181 | const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed) | 1181 | const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed) |
| 1182 | { | 1182 | { |
| 1183 | struct super_block *sb = sdp->sd_vfs; | 1183 | struct super_block *sb = sdp->sd_vfs; |
| 1184 | struct block_device *bdev = sb->s_bdev; | ||
| 1185 | const unsigned int sects_per_blk = sdp->sd_sb.sb_bsize / | ||
| 1186 | bdev_logical_block_size(sb->s_bdev); | ||
| 1187 | u64 blk; | 1184 | u64 blk; |
| 1188 | sector_t start = 0; | 1185 | sector_t start = 0; |
| 1189 | sector_t nr_sects = 0; | 1186 | sector_t nr_blks = 0; |
| 1190 | int rv; | 1187 | int rv; |
| 1191 | unsigned int x; | 1188 | unsigned int x; |
| 1192 | u32 trimmed = 0; | 1189 | u32 trimmed = 0; |
| @@ -1206,35 +1203,34 @@ int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset, | |||
| 1206 | if (diff == 0) | 1203 | if (diff == 0) |
| 1207 | continue; | 1204 | continue; |
| 1208 | blk = offset + ((bi->bi_start + x) * GFS2_NBBY); | 1205 | blk = offset + ((bi->bi_start + x) * GFS2_NBBY); |
| 1209 | blk *= sects_per_blk; /* convert to sectors */ | ||
| 1210 | while(diff) { | 1206 | while(diff) { |
| 1211 | if (diff & 1) { | 1207 | if (diff & 1) { |
| 1212 | if (nr_sects == 0) | 1208 | if (nr_blks == 0) |
| 1213 | goto start_new_extent; | 1209 | goto start_new_extent; |
| 1214 | if ((start + nr_sects) != blk) { | 1210 | if ((start + nr_blks) != blk) { |
| 1215 | if (nr_sects >= minlen) { | 1211 | if (nr_blks >= minlen) { |
| 1216 | rv = blkdev_issue_discard(bdev, | 1212 | rv = sb_issue_discard(sb, |
| 1217 | start, nr_sects, | 1213 | start, nr_blks, |
| 1218 | GFP_NOFS, 0); | 1214 | GFP_NOFS, 0); |
| 1219 | if (rv) | 1215 | if (rv) |
| 1220 | goto fail; | 1216 | goto fail; |
| 1221 | trimmed += nr_sects; | 1217 | trimmed += nr_blks; |
| 1222 | } | 1218 | } |
| 1223 | nr_sects = 0; | 1219 | nr_blks = 0; |
| 1224 | start_new_extent: | 1220 | start_new_extent: |
| 1225 | start = blk; | 1221 | start = blk; |
| 1226 | } | 1222 | } |
| 1227 | nr_sects += sects_per_blk; | 1223 | nr_blks++; |
| 1228 | } | 1224 | } |
| 1229 | diff >>= 2; | 1225 | diff >>= 2; |
| 1230 | blk += sects_per_blk; | 1226 | blk++; |
| 1231 | } | 1227 | } |
| 1232 | } | 1228 | } |
| 1233 | if (nr_sects >= minlen) { | 1229 | if (nr_blks >= minlen) { |
| 1234 | rv = blkdev_issue_discard(bdev, start, nr_sects, GFP_NOFS, 0); | 1230 | rv = sb_issue_discard(sb, start, nr_blks, GFP_NOFS, 0); |
| 1235 | if (rv) | 1231 | if (rv) |
| 1236 | goto fail; | 1232 | goto fail; |
| 1237 | trimmed += nr_sects; | 1233 | trimmed += nr_blks; |
| 1238 | } | 1234 | } |
| 1239 | if (ptrimmed) | 1235 | if (ptrimmed) |
| 1240 | *ptrimmed = trimmed; | 1236 | *ptrimmed = trimmed; |
diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index a94f0f779d5e..fe0a76213d9e 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c | |||
| @@ -533,7 +533,7 @@ void hfsplus_file_truncate(struct inode *inode) | |||
| 533 | struct address_space *mapping = inode->i_mapping; | 533 | struct address_space *mapping = inode->i_mapping; |
| 534 | struct page *page; | 534 | struct page *page; |
| 535 | void *fsdata; | 535 | void *fsdata; |
| 536 | u32 size = inode->i_size; | 536 | loff_t size = inode->i_size; |
| 537 | 537 | ||
| 538 | res = pagecache_write_begin(NULL, mapping, size, 0, | 538 | res = pagecache_write_begin(NULL, mapping, size, 0, |
| 539 | AOP_FLAG_UNINTERRUPTIBLE, | 539 | AOP_FLAG_UNINTERRUPTIBLE, |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 84e3d856e91d..523464e62849 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -110,7 +110,7 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 110 | * way when do_mmap_pgoff unwinds (may be important on powerpc | 110 | * way when do_mmap_pgoff unwinds (may be important on powerpc |
| 111 | * and ia64). | 111 | * and ia64). |
| 112 | */ | 112 | */ |
| 113 | vma->vm_flags |= VM_HUGETLB | VM_DONTEXPAND | VM_DONTDUMP; | 113 | vma->vm_flags |= VM_HUGETLB | VM_DONTEXPAND; |
| 114 | vma->vm_ops = &hugetlb_vm_ops; | 114 | vma->vm_ops = &hugetlb_vm_ops; |
| 115 | 115 | ||
| 116 | if (vma->vm_pgoff & (~huge_page_mask(h) >> PAGE_SHIFT)) | 116 | if (vma->vm_pgoff & (~huge_page_mask(h) >> PAGE_SHIFT)) |
diff --git a/fs/inode.c b/fs/inode.c index f5f7c06c36fb..a898b3d43ccf 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -725,7 +725,7 @@ void prune_icache_sb(struct super_block *sb, int nr_to_scan) | |||
| 725 | * inode to the back of the list so we don't spin on it. | 725 | * inode to the back of the list so we don't spin on it. |
| 726 | */ | 726 | */ |
| 727 | if (!spin_trylock(&inode->i_lock)) { | 727 | if (!spin_trylock(&inode->i_lock)) { |
| 728 | list_move_tail(&inode->i_lru, &sb->s_inode_lru); | 728 | list_move(&inode->i_lru, &sb->s_inode_lru); |
| 729 | continue; | 729 | continue; |
| 730 | } | 730 | } |
| 731 | 731 | ||
diff --git a/fs/namespace.c b/fs/namespace.c index d581e45c0a9f..341d3f564082 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -1690,7 +1690,7 @@ static int do_loopback(struct path *path, const char *old_name, | |||
| 1690 | 1690 | ||
| 1691 | if (IS_ERR(mnt)) { | 1691 | if (IS_ERR(mnt)) { |
| 1692 | err = PTR_ERR(mnt); | 1692 | err = PTR_ERR(mnt); |
| 1693 | goto out; | 1693 | goto out2; |
| 1694 | } | 1694 | } |
| 1695 | 1695 | ||
| 1696 | err = graft_tree(mnt, path); | 1696 | err = graft_tree(mnt, path); |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index ac4fc9a8fdbc..66b6664dcd4c 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
| @@ -300,7 +300,7 @@ int nfs40_walk_client_list(struct nfs_client *new, | |||
| 300 | struct rpc_cred *cred) | 300 | struct rpc_cred *cred) |
| 301 | { | 301 | { |
| 302 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); | 302 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); |
| 303 | struct nfs_client *pos, *n, *prev = NULL; | 303 | struct nfs_client *pos, *prev = NULL; |
| 304 | struct nfs4_setclientid_res clid = { | 304 | struct nfs4_setclientid_res clid = { |
| 305 | .clientid = new->cl_clientid, | 305 | .clientid = new->cl_clientid, |
| 306 | .confirm = new->cl_confirm, | 306 | .confirm = new->cl_confirm, |
| @@ -308,10 +308,23 @@ int nfs40_walk_client_list(struct nfs_client *new, | |||
| 308 | int status = -NFS4ERR_STALE_CLIENTID; | 308 | int status = -NFS4ERR_STALE_CLIENTID; |
| 309 | 309 | ||
| 310 | spin_lock(&nn->nfs_client_lock); | 310 | spin_lock(&nn->nfs_client_lock); |
| 311 | list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { | 311 | list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
| 312 | /* If "pos" isn't marked ready, we can't trust the | 312 | /* If "pos" isn't marked ready, we can't trust the |
| 313 | * remaining fields in "pos" */ | 313 | * remaining fields in "pos" */ |
| 314 | if (pos->cl_cons_state < NFS_CS_READY) | 314 | if (pos->cl_cons_state > NFS_CS_READY) { |
| 315 | atomic_inc(&pos->cl_count); | ||
| 316 | spin_unlock(&nn->nfs_client_lock); | ||
| 317 | |||
| 318 | if (prev) | ||
| 319 | nfs_put_client(prev); | ||
| 320 | prev = pos; | ||
| 321 | |||
| 322 | status = nfs_wait_client_init_complete(pos); | ||
| 323 | spin_lock(&nn->nfs_client_lock); | ||
| 324 | if (status < 0) | ||
| 325 | continue; | ||
| 326 | } | ||
| 327 | if (pos->cl_cons_state != NFS_CS_READY) | ||
| 315 | continue; | 328 | continue; |
| 316 | 329 | ||
| 317 | if (pos->rpc_ops != new->rpc_ops) | 330 | if (pos->rpc_ops != new->rpc_ops) |
| @@ -423,16 +436,16 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
| 423 | struct rpc_cred *cred) | 436 | struct rpc_cred *cred) |
| 424 | { | 437 | { |
| 425 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); | 438 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); |
| 426 | struct nfs_client *pos, *n, *prev = NULL; | 439 | struct nfs_client *pos, *prev = NULL; |
| 427 | int status = -NFS4ERR_STALE_CLIENTID; | 440 | int status = -NFS4ERR_STALE_CLIENTID; |
| 428 | 441 | ||
| 429 | spin_lock(&nn->nfs_client_lock); | 442 | spin_lock(&nn->nfs_client_lock); |
| 430 | list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { | 443 | list_for_each_entry(pos, &nn->nfs_client_list, cl_share_link) { |
| 431 | /* If "pos" isn't marked ready, we can't trust the | 444 | /* If "pos" isn't marked ready, we can't trust the |
| 432 | * remaining fields in "pos", especially the client | 445 | * remaining fields in "pos", especially the client |
| 433 | * ID and serverowner fields. Wait for CREATE_SESSION | 446 | * ID and serverowner fields. Wait for CREATE_SESSION |
| 434 | * to finish. */ | 447 | * to finish. */ |
| 435 | if (pos->cl_cons_state < NFS_CS_READY) { | 448 | if (pos->cl_cons_state > NFS_CS_READY) { |
| 436 | atomic_inc(&pos->cl_count); | 449 | atomic_inc(&pos->cl_count); |
| 437 | spin_unlock(&nn->nfs_client_lock); | 450 | spin_unlock(&nn->nfs_client_lock); |
| 438 | 451 | ||
| @@ -440,18 +453,17 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
| 440 | nfs_put_client(prev); | 453 | nfs_put_client(prev); |
| 441 | prev = pos; | 454 | prev = pos; |
| 442 | 455 | ||
| 443 | nfs4_schedule_lease_recovery(pos); | ||
| 444 | status = nfs_wait_client_init_complete(pos); | 456 | status = nfs_wait_client_init_complete(pos); |
| 445 | if (status < 0) { | 457 | if (status == 0) { |
| 446 | nfs_put_client(pos); | 458 | nfs4_schedule_lease_recovery(pos); |
| 447 | spin_lock(&nn->nfs_client_lock); | 459 | status = nfs4_wait_clnt_recover(pos); |
| 448 | continue; | ||
| 449 | } | 460 | } |
| 450 | status = pos->cl_cons_state; | ||
| 451 | spin_lock(&nn->nfs_client_lock); | 461 | spin_lock(&nn->nfs_client_lock); |
| 452 | if (status < 0) | 462 | if (status < 0) |
| 453 | continue; | 463 | continue; |
| 454 | } | 464 | } |
| 465 | if (pos->cl_cons_state != NFS_CS_READY) | ||
| 466 | continue; | ||
| 455 | 467 | ||
| 456 | if (pos->rpc_ops != new->rpc_ops) | 468 | if (pos->rpc_ops != new->rpc_ops) |
| 457 | continue; | 469 | continue; |
| @@ -469,17 +481,18 @@ int nfs41_walk_client_list(struct nfs_client *new, | |||
| 469 | continue; | 481 | continue; |
| 470 | 482 | ||
| 471 | atomic_inc(&pos->cl_count); | 483 | atomic_inc(&pos->cl_count); |
| 472 | spin_unlock(&nn->nfs_client_lock); | 484 | *result = pos; |
| 485 | status = 0; | ||
| 473 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", | 486 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", |
| 474 | __func__, pos, atomic_read(&pos->cl_count)); | 487 | __func__, pos, atomic_read(&pos->cl_count)); |
| 475 | 488 | break; | |
| 476 | *result = pos; | ||
| 477 | return 0; | ||
| 478 | } | 489 | } |
| 479 | 490 | ||
| 480 | /* No matching nfs_client found. */ | 491 | /* No matching nfs_client found. */ |
| 481 | spin_unlock(&nn->nfs_client_lock); | 492 | spin_unlock(&nn->nfs_client_lock); |
| 482 | dprintk("NFS: <-- %s status = %d\n", __func__, status); | 493 | dprintk("NFS: <-- %s status = %d\n", __func__, status); |
| 494 | if (prev) | ||
| 495 | nfs_put_client(prev); | ||
| 483 | return status; | 496 | return status; |
| 484 | } | 497 | } |
| 485 | #endif /* CONFIG_NFS_V4_1 */ | 498 | #endif /* CONFIG_NFS_V4_1 */ |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 26431cf62ddb..0ad025eb523b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -1046,6 +1046,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) | |||
| 1046 | /* Save the delegation */ | 1046 | /* Save the delegation */ |
| 1047 | nfs4_stateid_copy(&stateid, &delegation->stateid); | 1047 | nfs4_stateid_copy(&stateid, &delegation->stateid); |
| 1048 | rcu_read_unlock(); | 1048 | rcu_read_unlock(); |
| 1049 | nfs_release_seqid(opendata->o_arg.seqid); | ||
| 1049 | ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); | 1050 | ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode); |
| 1050 | if (ret != 0) | 1051 | if (ret != 0) |
| 1051 | goto out; | 1052 | goto out; |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 6ace365c6334..d41a3518509f 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -1886,7 +1886,13 @@ again: | |||
| 1886 | status = PTR_ERR(clnt); | 1886 | status = PTR_ERR(clnt); |
| 1887 | break; | 1887 | break; |
| 1888 | } | 1888 | } |
| 1889 | clp->cl_rpcclient = clnt; | 1889 | /* Note: this is safe because we haven't yet marked the |
| 1890 | * client as ready, so we are the only user of | ||
| 1891 | * clp->cl_rpcclient | ||
| 1892 | */ | ||
| 1893 | clnt = xchg(&clp->cl_rpcclient, clnt); | ||
| 1894 | rpc_shutdown_client(clnt); | ||
| 1895 | clnt = clp->cl_rpcclient; | ||
| 1890 | goto again; | 1896 | goto again; |
| 1891 | 1897 | ||
| 1892 | case -NFS4ERR_MINOR_VERS_MISMATCH: | 1898 | case -NFS4ERR_MINOR_VERS_MISMATCH: |
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 01168865dd37..a2720071f282 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
| @@ -264,7 +264,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | |||
| 264 | iattr->ia_valid |= ATTR_SIZE; | 264 | iattr->ia_valid |= ATTR_SIZE; |
| 265 | } | 265 | } |
| 266 | if (bmval[0] & FATTR4_WORD0_ACL) { | 266 | if (bmval[0] & FATTR4_WORD0_ACL) { |
| 267 | int nace; | 267 | u32 nace; |
| 268 | struct nfs4_ace *ace; | 268 | struct nfs4_ace *ace; |
| 269 | 269 | ||
| 270 | READ_BUF(4); len += 4; | 270 | READ_BUF(4); len += 4; |
diff --git a/fs/proc/array.c b/fs/proc/array.c index f7ed9ee46eb9..cbd0f1b324b9 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -143,6 +143,7 @@ static const char * const task_state_array[] = { | |||
| 143 | "x (dead)", /* 64 */ | 143 | "x (dead)", /* 64 */ |
| 144 | "K (wakekill)", /* 128 */ | 144 | "K (wakekill)", /* 128 */ |
| 145 | "W (waking)", /* 256 */ | 145 | "W (waking)", /* 256 */ |
| 146 | "P (parked)", /* 512 */ | ||
| 146 | }; | 147 | }; |
| 147 | 148 | ||
| 148 | static inline const char *get_task_state(struct task_struct *tsk) | 149 | static inline const char *get_task_state(struct task_struct *tsk) |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 4b3b3ffb52f1..21e1a8f1659d 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
| @@ -755,37 +755,8 @@ void pde_put(struct proc_dir_entry *pde) | |||
| 755 | free_proc_entry(pde); | 755 | free_proc_entry(pde); |
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | /* | 758 | static void entry_rundown(struct proc_dir_entry *de) |
| 759 | * Remove a /proc entry and free it if it's not currently in use. | ||
| 760 | */ | ||
| 761 | void remove_proc_entry(const char *name, struct proc_dir_entry *parent) | ||
| 762 | { | 759 | { |
| 763 | struct proc_dir_entry **p; | ||
| 764 | struct proc_dir_entry *de = NULL; | ||
| 765 | const char *fn = name; | ||
| 766 | unsigned int len; | ||
| 767 | |||
| 768 | spin_lock(&proc_subdir_lock); | ||
| 769 | if (__xlate_proc_name(name, &parent, &fn) != 0) { | ||
| 770 | spin_unlock(&proc_subdir_lock); | ||
| 771 | return; | ||
| 772 | } | ||
| 773 | len = strlen(fn); | ||
| 774 | |||
| 775 | for (p = &parent->subdir; *p; p=&(*p)->next ) { | ||
| 776 | if (proc_match(len, fn, *p)) { | ||
| 777 | de = *p; | ||
| 778 | *p = de->next; | ||
| 779 | de->next = NULL; | ||
| 780 | break; | ||
| 781 | } | ||
| 782 | } | ||
| 783 | spin_unlock(&proc_subdir_lock); | ||
| 784 | if (!de) { | ||
| 785 | WARN(1, "name '%s'\n", name); | ||
| 786 | return; | ||
| 787 | } | ||
| 788 | |||
| 789 | spin_lock(&de->pde_unload_lock); | 760 | spin_lock(&de->pde_unload_lock); |
| 790 | /* | 761 | /* |
| 791 | * Stop accepting new callers into module. If you're | 762 | * Stop accepting new callers into module. If you're |
| @@ -817,6 +788,40 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent) | |||
| 817 | spin_lock(&de->pde_unload_lock); | 788 | spin_lock(&de->pde_unload_lock); |
| 818 | } | 789 | } |
| 819 | spin_unlock(&de->pde_unload_lock); | 790 | spin_unlock(&de->pde_unload_lock); |
| 791 | } | ||
| 792 | |||
| 793 | /* | ||
| 794 | * Remove a /proc entry and free it if it's not currently in use. | ||
| 795 | */ | ||
| 796 | void remove_proc_entry(const char *name, struct proc_dir_entry *parent) | ||
| 797 | { | ||
| 798 | struct proc_dir_entry **p; | ||
| 799 | struct proc_dir_entry *de = NULL; | ||
| 800 | const char *fn = name; | ||
| 801 | unsigned int len; | ||
| 802 | |||
| 803 | spin_lock(&proc_subdir_lock); | ||
| 804 | if (__xlate_proc_name(name, &parent, &fn) != 0) { | ||
| 805 | spin_unlock(&proc_subdir_lock); | ||
| 806 | return; | ||
| 807 | } | ||
| 808 | len = strlen(fn); | ||
| 809 | |||
| 810 | for (p = &parent->subdir; *p; p=&(*p)->next ) { | ||
| 811 | if (proc_match(len, fn, *p)) { | ||
| 812 | de = *p; | ||
| 813 | *p = de->next; | ||
| 814 | de->next = NULL; | ||
| 815 | break; | ||
| 816 | } | ||
| 817 | } | ||
| 818 | spin_unlock(&proc_subdir_lock); | ||
| 819 | if (!de) { | ||
| 820 | WARN(1, "name '%s'\n", name); | ||
| 821 | return; | ||
| 822 | } | ||
| 823 | |||
| 824 | entry_rundown(de); | ||
| 820 | 825 | ||
| 821 | if (S_ISDIR(de->mode)) | 826 | if (S_ISDIR(de->mode)) |
| 822 | parent->nlink--; | 827 | parent->nlink--; |
| @@ -827,3 +832,57 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent) | |||
| 827 | pde_put(de); | 832 | pde_put(de); |
| 828 | } | 833 | } |
| 829 | EXPORT_SYMBOL(remove_proc_entry); | 834 | EXPORT_SYMBOL(remove_proc_entry); |
| 835 | |||
| 836 | int remove_proc_subtree(const char *name, struct proc_dir_entry *parent) | ||
| 837 | { | ||
| 838 | struct proc_dir_entry **p; | ||
| 839 | struct proc_dir_entry *root = NULL, *de, *next; | ||
| 840 | const char *fn = name; | ||
| 841 | unsigned int len; | ||
| 842 | |||
| 843 | spin_lock(&proc_subdir_lock); | ||
| 844 | if (__xlate_proc_name(name, &parent, &fn) != 0) { | ||
| 845 | spin_unlock(&proc_subdir_lock); | ||
| 846 | return -ENOENT; | ||
| 847 | } | ||
| 848 | len = strlen(fn); | ||
| 849 | |||
| 850 | for (p = &parent->subdir; *p; p=&(*p)->next ) { | ||
| 851 | if (proc_match(len, fn, *p)) { | ||
| 852 | root = *p; | ||
| 853 | *p = root->next; | ||
| 854 | root->next = NULL; | ||
| 855 | break; | ||
| 856 | } | ||
| 857 | } | ||
| 858 | if (!root) { | ||
| 859 | spin_unlock(&proc_subdir_lock); | ||
| 860 | return -ENOENT; | ||
| 861 | } | ||
| 862 | de = root; | ||
| 863 | while (1) { | ||
| 864 | next = de->subdir; | ||
| 865 | if (next) { | ||
| 866 | de->subdir = next->next; | ||
| 867 | next->next = NULL; | ||
| 868 | de = next; | ||
| 869 | continue; | ||
| 870 | } | ||
| 871 | spin_unlock(&proc_subdir_lock); | ||
| 872 | |||
| 873 | entry_rundown(de); | ||
| 874 | next = de->parent; | ||
| 875 | if (S_ISDIR(de->mode)) | ||
| 876 | next->nlink--; | ||
| 877 | de->nlink = 0; | ||
| 878 | if (de == root) | ||
| 879 | break; | ||
| 880 | pde_put(de); | ||
| 881 | |||
| 882 | spin_lock(&proc_subdir_lock); | ||
| 883 | de = next; | ||
| 884 | } | ||
| 885 | pde_put(root); | ||
| 886 | return 0; | ||
| 887 | } | ||
| 888 | EXPORT_SYMBOL(remove_proc_subtree); | ||
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index c196369fe408..4cce1d9552fb 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c | |||
| @@ -187,8 +187,8 @@ fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset, | |||
| 187 | if (dbuf->count == ARRAY_SIZE(dbuf->dentries)) | 187 | if (dbuf->count == ARRAY_SIZE(dbuf->dentries)) |
| 188 | return -ENOSPC; | 188 | return -ENOSPC; |
| 189 | 189 | ||
| 190 | if (name[0] == '.' && (name[1] == '\0' || | 190 | if (name[0] == '.' && (namelen < 2 || |
| 191 | (name[1] == '.' && name[2] == '\0'))) | 191 | (namelen == 2 && name[1] == '.'))) |
| 192 | return 0; | 192 | return 0; |
| 193 | 193 | ||
| 194 | dentry = lookup_one_len(name, dbuf->xadir, namelen); | 194 | dentry = lookup_one_len(name, dbuf->xadir, namelen); |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index ac838b844936..f21acf0ef01f 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -1568,6 +1568,12 @@ static int ubifs_remount_rw(struct ubifs_info *c) | |||
| 1568 | c->remounting_rw = 1; | 1568 | c->remounting_rw = 1; |
| 1569 | c->ro_mount = 0; | 1569 | c->ro_mount = 0; |
| 1570 | 1570 | ||
| 1571 | if (c->space_fixup) { | ||
| 1572 | err = ubifs_fixup_free_space(c); | ||
| 1573 | if (err) | ||
| 1574 | return err; | ||
| 1575 | } | ||
| 1576 | |||
| 1571 | err = check_free_space(c); | 1577 | err = check_free_space(c); |
| 1572 | if (err) | 1578 | if (err) |
| 1573 | goto out; | 1579 | goto out; |
| @@ -1684,12 +1690,6 @@ static int ubifs_remount_rw(struct ubifs_info *c) | |||
| 1684 | err = dbg_check_space_info(c); | 1690 | err = dbg_check_space_info(c); |
| 1685 | } | 1691 | } |
| 1686 | 1692 | ||
| 1687 | if (c->space_fixup) { | ||
| 1688 | err = ubifs_fixup_free_space(c); | ||
| 1689 | if (err) | ||
| 1690 | goto out; | ||
| 1691 | } | ||
| 1692 | |||
| 1693 | mutex_unlock(&c->umount_mutex); | 1693 | mutex_unlock(&c->umount_mutex); |
| 1694 | return err; | 1694 | return err; |
| 1695 | 1695 | ||
