diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/aio.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/check-integrity.c | 32 | ||||
| -rw-r--r-- | fs/btrfs/check-integrity.h | 2 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 12 | ||||
| -rw-r--r-- | fs/btrfs/scrub.c | 33 | ||||
| -rw-r--r-- | fs/eventpoll.c | 3 | ||||
| -rw-r--r-- | fs/hfsplus/wrapper.c | 17 | ||||
| -rw-r--r-- | fs/logfs/dev_bdev.c | 13 | ||||
| -rw-r--r-- | fs/nfs/blocklayout/blocklayout.h | 1 | ||||
| -rw-r--r-- | fs/nfs/blocklayout/extents.c | 2 | ||||
| -rw-r--r-- | fs/nfs/dns_resolve.c | 2 | ||||
| -rw-r--r-- | fs/nfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/nfs/internal.h | 15 | ||||
| -rw-r--r-- | fs/nfs/nfs4_fs.h | 8 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 30 | ||||
| -rw-r--r-- | fs/pipe.c | 39 | ||||
| -rw-r--r-- | fs/squashfs/file_direct.c | 5 |
17 files changed, 103 insertions, 121 deletions
| @@ -367,8 +367,10 @@ static int aio_setup_ring(struct kioctx *ctx) | |||
| 367 | if (nr_pages > AIO_RING_PAGES) { | 367 | if (nr_pages > AIO_RING_PAGES) { |
| 368 | ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *), | 368 | ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *), |
| 369 | GFP_KERNEL); | 369 | GFP_KERNEL); |
| 370 | if (!ctx->ring_pages) | 370 | if (!ctx->ring_pages) { |
| 371 | put_aio_ring_file(ctx); | ||
| 371 | return -ENOMEM; | 372 | return -ENOMEM; |
| 373 | } | ||
| 372 | } | 374 | } |
| 373 | 375 | ||
| 374 | ctx->mmap_size = nr_pages * PAGE_SIZE; | 376 | ctx->mmap_size = nr_pages * PAGE_SIZE; |
| @@ -645,7 +647,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | |||
| 645 | aio_nr + nr_events < aio_nr) { | 647 | aio_nr + nr_events < aio_nr) { |
| 646 | spin_unlock(&aio_nr_lock); | 648 | spin_unlock(&aio_nr_lock); |
| 647 | err = -EAGAIN; | 649 | err = -EAGAIN; |
| 648 | goto err; | 650 | goto err_ctx; |
| 649 | } | 651 | } |
| 650 | aio_nr += ctx->max_reqs; | 652 | aio_nr += ctx->max_reqs; |
| 651 | spin_unlock(&aio_nr_lock); | 653 | spin_unlock(&aio_nr_lock); |
| @@ -662,6 +664,8 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | |||
| 662 | 664 | ||
| 663 | err_cleanup: | 665 | err_cleanup: |
| 664 | aio_nr_sub(ctx->max_reqs); | 666 | aio_nr_sub(ctx->max_reqs); |
| 667 | err_ctx: | ||
| 668 | aio_free_ring(ctx); | ||
| 665 | err: | 669 | err: |
| 666 | free_percpu(ctx->cpu); | 670 | free_percpu(ctx->cpu); |
| 667 | free_percpu(ctx->reqs.pcpu_count); | 671 | free_percpu(ctx->reqs.pcpu_count); |
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index b50764bef141..131d82800b3a 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
| @@ -333,7 +333,6 @@ static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx); | |||
| 333 | static int btrfsic_read_block(struct btrfsic_state *state, | 333 | static int btrfsic_read_block(struct btrfsic_state *state, |
| 334 | struct btrfsic_block_data_ctx *block_ctx); | 334 | struct btrfsic_block_data_ctx *block_ctx); |
| 335 | static void btrfsic_dump_database(struct btrfsic_state *state); | 335 | static void btrfsic_dump_database(struct btrfsic_state *state); |
| 336 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err); | ||
| 337 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, | 336 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, |
| 338 | char **datav, unsigned int num_pages); | 337 | char **datav, unsigned int num_pages); |
| 339 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | 338 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, |
| @@ -1687,7 +1686,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1687 | for (i = 0; i < num_pages;) { | 1686 | for (i = 0; i < num_pages;) { |
| 1688 | struct bio *bio; | 1687 | struct bio *bio; |
| 1689 | unsigned int j; | 1688 | unsigned int j; |
| 1690 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1691 | 1689 | ||
| 1692 | bio = btrfs_io_bio_alloc(GFP_NOFS, num_pages - i); | 1690 | bio = btrfs_io_bio_alloc(GFP_NOFS, num_pages - i); |
| 1693 | if (!bio) { | 1691 | if (!bio) { |
| @@ -1698,8 +1696,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1698 | } | 1696 | } |
| 1699 | bio->bi_bdev = block_ctx->dev->bdev; | 1697 | bio->bi_bdev = block_ctx->dev->bdev; |
| 1700 | bio->bi_sector = dev_bytenr >> 9; | 1698 | bio->bi_sector = dev_bytenr >> 9; |
| 1701 | bio->bi_end_io = btrfsic_complete_bio_end_io; | ||
| 1702 | bio->bi_private = &complete; | ||
| 1703 | 1699 | ||
| 1704 | for (j = i; j < num_pages; j++) { | 1700 | for (j = i; j < num_pages; j++) { |
| 1705 | ret = bio_add_page(bio, block_ctx->pagev[j], | 1701 | ret = bio_add_page(bio, block_ctx->pagev[j], |
| @@ -1712,12 +1708,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1712 | "btrfsic: error, failed to add a single page!\n"); | 1708 | "btrfsic: error, failed to add a single page!\n"); |
| 1713 | return -1; | 1709 | return -1; |
| 1714 | } | 1710 | } |
| 1715 | submit_bio(READ, bio); | 1711 | if (submit_bio_wait(READ, bio)) { |
| 1716 | |||
| 1717 | /* this will also unplug the queue */ | ||
| 1718 | wait_for_completion(&complete); | ||
| 1719 | |||
| 1720 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | ||
| 1721 | printk(KERN_INFO | 1712 | printk(KERN_INFO |
| 1722 | "btrfsic: read error at logical %llu dev %s!\n", | 1713 | "btrfsic: read error at logical %llu dev %s!\n", |
| 1723 | block_ctx->start, block_ctx->dev->name); | 1714 | block_ctx->start, block_ctx->dev->name); |
| @@ -1740,11 +1731,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1740 | return block_ctx->len; | 1731 | return block_ctx->len; |
| 1741 | } | 1732 | } |
| 1742 | 1733 | ||
| 1743 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err) | ||
| 1744 | { | ||
| 1745 | complete((struct completion *)bio->bi_private); | ||
| 1746 | } | ||
| 1747 | |||
| 1748 | static void btrfsic_dump_database(struct btrfsic_state *state) | 1734 | static void btrfsic_dump_database(struct btrfsic_state *state) |
| 1749 | { | 1735 | { |
| 1750 | struct list_head *elem_all; | 1736 | struct list_head *elem_all; |
| @@ -3008,14 +2994,12 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) | |||
| 3008 | return submit_bh(rw, bh); | 2994 | return submit_bh(rw, bh); |
| 3009 | } | 2995 | } |
| 3010 | 2996 | ||
| 3011 | void btrfsic_submit_bio(int rw, struct bio *bio) | 2997 | static void __btrfsic_submit_bio(int rw, struct bio *bio) |
| 3012 | { | 2998 | { |
| 3013 | struct btrfsic_dev_state *dev_state; | 2999 | struct btrfsic_dev_state *dev_state; |
| 3014 | 3000 | ||
| 3015 | if (!btrfsic_is_initialized) { | 3001 | if (!btrfsic_is_initialized) |
| 3016 | submit_bio(rw, bio); | ||
| 3017 | return; | 3002 | return; |
| 3018 | } | ||
| 3019 | 3003 | ||
| 3020 | mutex_lock(&btrfsic_mutex); | 3004 | mutex_lock(&btrfsic_mutex); |
| 3021 | /* since btrfsic_submit_bio() is also called before | 3005 | /* since btrfsic_submit_bio() is also called before |
| @@ -3106,10 +3090,20 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
| 3106 | } | 3090 | } |
| 3107 | leave: | 3091 | leave: |
| 3108 | mutex_unlock(&btrfsic_mutex); | 3092 | mutex_unlock(&btrfsic_mutex); |
| 3093 | } | ||
| 3109 | 3094 | ||
| 3095 | void btrfsic_submit_bio(int rw, struct bio *bio) | ||
| 3096 | { | ||
| 3097 | __btrfsic_submit_bio(rw, bio); | ||
| 3110 | submit_bio(rw, bio); | 3098 | submit_bio(rw, bio); |
| 3111 | } | 3099 | } |
| 3112 | 3100 | ||
| 3101 | int btrfsic_submit_bio_wait(int rw, struct bio *bio) | ||
| 3102 | { | ||
| 3103 | __btrfsic_submit_bio(rw, bio); | ||
| 3104 | return submit_bio_wait(rw, bio); | ||
| 3105 | } | ||
| 3106 | |||
| 3113 | int btrfsic_mount(struct btrfs_root *root, | 3107 | int btrfsic_mount(struct btrfs_root *root, |
| 3114 | struct btrfs_fs_devices *fs_devices, | 3108 | struct btrfs_fs_devices *fs_devices, |
| 3115 | int including_extent_data, u32 print_mask) | 3109 | int including_extent_data, u32 print_mask) |
diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 8b59175cc502..13b8566c97ab 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h | |||
| @@ -22,9 +22,11 @@ | |||
| 22 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | 22 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY |
| 23 | int btrfsic_submit_bh(int rw, struct buffer_head *bh); | 23 | int btrfsic_submit_bh(int rw, struct buffer_head *bh); |
| 24 | void btrfsic_submit_bio(int rw, struct bio *bio); | 24 | void btrfsic_submit_bio(int rw, struct bio *bio); |
| 25 | int btrfsic_submit_bio_wait(int rw, struct bio *bio); | ||
| 25 | #else | 26 | #else |
| 26 | #define btrfsic_submit_bh submit_bh | 27 | #define btrfsic_submit_bh submit_bh |
| 27 | #define btrfsic_submit_bio submit_bio | 28 | #define btrfsic_submit_bio submit_bio |
| 29 | #define btrfsic_submit_bio_wait submit_bio_wait | ||
| 28 | #endif | 30 | #endif |
| 29 | 31 | ||
| 30 | int btrfsic_mount(struct btrfs_root *root, | 32 | int btrfsic_mount(struct btrfs_root *root, |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 8e457fca0a0b..ff43802a7c88 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -1952,11 +1952,6 @@ static int free_io_failure(struct inode *inode, struct io_failure_record *rec, | |||
| 1952 | return err; | 1952 | return err; |
| 1953 | } | 1953 | } |
| 1954 | 1954 | ||
| 1955 | static void repair_io_failure_callback(struct bio *bio, int err) | ||
| 1956 | { | ||
| 1957 | complete(bio->bi_private); | ||
| 1958 | } | ||
| 1959 | |||
| 1960 | /* | 1955 | /* |
| 1961 | * this bypasses the standard btrfs submit functions deliberately, as | 1956 | * this bypasses the standard btrfs submit functions deliberately, as |
| 1962 | * the standard behavior is to write all copies in a raid setup. here we only | 1957 | * the standard behavior is to write all copies in a raid setup. here we only |
| @@ -1973,7 +1968,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 1973 | { | 1968 | { |
| 1974 | struct bio *bio; | 1969 | struct bio *bio; |
| 1975 | struct btrfs_device *dev; | 1970 | struct btrfs_device *dev; |
| 1976 | DECLARE_COMPLETION_ONSTACK(compl); | ||
| 1977 | u64 map_length = 0; | 1971 | u64 map_length = 0; |
| 1978 | u64 sector; | 1972 | u64 sector; |
| 1979 | struct btrfs_bio *bbio = NULL; | 1973 | struct btrfs_bio *bbio = NULL; |
| @@ -1990,8 +1984,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 1990 | bio = btrfs_io_bio_alloc(GFP_NOFS, 1); | 1984 | bio = btrfs_io_bio_alloc(GFP_NOFS, 1); |
| 1991 | if (!bio) | 1985 | if (!bio) |
| 1992 | return -EIO; | 1986 | return -EIO; |
| 1993 | bio->bi_private = &compl; | ||
| 1994 | bio->bi_end_io = repair_io_failure_callback; | ||
| 1995 | bio->bi_size = 0; | 1987 | bio->bi_size = 0; |
| 1996 | map_length = length; | 1988 | map_length = length; |
| 1997 | 1989 | ||
| @@ -2012,10 +2004,8 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 2012 | } | 2004 | } |
| 2013 | bio->bi_bdev = dev->bdev; | 2005 | bio->bi_bdev = dev->bdev; |
| 2014 | bio_add_page(bio, page, length, start - page_offset(page)); | 2006 | bio_add_page(bio, page, length, start - page_offset(page)); |
| 2015 | btrfsic_submit_bio(WRITE_SYNC, bio); | ||
| 2016 | wait_for_completion(&compl); | ||
| 2017 | 2007 | ||
| 2018 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | 2008 | if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) { |
| 2019 | /* try to remap that extent elsewhere? */ | 2009 | /* try to remap that extent elsewhere? */ |
| 2020 | bio_put(bio); | 2010 | bio_put(bio); |
| 2021 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); | 2011 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 561e2f16ba3e..1fd3f33c330a 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -208,7 +208,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info, | |||
| 208 | int is_metadata, int have_csum, | 208 | int is_metadata, int have_csum, |
| 209 | const u8 *csum, u64 generation, | 209 | const u8 *csum, u64 generation, |
| 210 | u16 csum_size); | 210 | u16 csum_size); |
| 211 | static void scrub_complete_bio_end_io(struct bio *bio, int err); | ||
| 212 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, | 211 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, |
| 213 | struct scrub_block *sblock_good, | 212 | struct scrub_block *sblock_good, |
| 214 | int force_write); | 213 | int force_write); |
| @@ -1294,7 +1293,6 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, | |||
| 1294 | for (page_num = 0; page_num < sblock->page_count; page_num++) { | 1293 | for (page_num = 0; page_num < sblock->page_count; page_num++) { |
| 1295 | struct bio *bio; | 1294 | struct bio *bio; |
| 1296 | struct scrub_page *page = sblock->pagev[page_num]; | 1295 | struct scrub_page *page = sblock->pagev[page_num]; |
| 1297 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1298 | 1296 | ||
| 1299 | if (page->dev->bdev == NULL) { | 1297 | if (page->dev->bdev == NULL) { |
| 1300 | page->io_error = 1; | 1298 | page->io_error = 1; |
| @@ -1311,18 +1309,11 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, | |||
| 1311 | } | 1309 | } |
| 1312 | bio->bi_bdev = page->dev->bdev; | 1310 | bio->bi_bdev = page->dev->bdev; |
| 1313 | bio->bi_sector = page->physical >> 9; | 1311 | bio->bi_sector = page->physical >> 9; |
| 1314 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 1315 | bio->bi_private = &complete; | ||
| 1316 | 1312 | ||
| 1317 | bio_add_page(bio, page->page, PAGE_SIZE, 0); | 1313 | bio_add_page(bio, page->page, PAGE_SIZE, 0); |
| 1318 | btrfsic_submit_bio(READ, bio); | 1314 | if (btrfsic_submit_bio_wait(READ, bio)) |
| 1319 | |||
| 1320 | /* this will also unplug the queue */ | ||
| 1321 | wait_for_completion(&complete); | ||
| 1322 | |||
| 1323 | page->io_error = !test_bit(BIO_UPTODATE, &bio->bi_flags); | ||
| 1324 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | ||
| 1325 | sblock->no_io_error_seen = 0; | 1315 | sblock->no_io_error_seen = 0; |
| 1316 | |||
| 1326 | bio_put(bio); | 1317 | bio_put(bio); |
| 1327 | } | 1318 | } |
| 1328 | 1319 | ||
| @@ -1391,11 +1382,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info, | |||
| 1391 | sblock->checksum_error = 1; | 1382 | sblock->checksum_error = 1; |
| 1392 | } | 1383 | } |
| 1393 | 1384 | ||
| 1394 | static void scrub_complete_bio_end_io(struct bio *bio, int err) | ||
| 1395 | { | ||
| 1396 | complete((struct completion *)bio->bi_private); | ||
| 1397 | } | ||
| 1398 | |||
| 1399 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, | 1385 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, |
| 1400 | struct scrub_block *sblock_good, | 1386 | struct scrub_block *sblock_good, |
| 1401 | int force_write) | 1387 | int force_write) |
| @@ -1430,7 +1416,6 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, | |||
| 1430 | sblock_bad->checksum_error || page_bad->io_error) { | 1416 | sblock_bad->checksum_error || page_bad->io_error) { |
| 1431 | struct bio *bio; | 1417 | struct bio *bio; |
| 1432 | int ret; | 1418 | int ret; |
| 1433 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1434 | 1419 | ||
| 1435 | if (!page_bad->dev->bdev) { | 1420 | if (!page_bad->dev->bdev) { |
| 1436 | printk_ratelimited(KERN_WARNING | 1421 | printk_ratelimited(KERN_WARNING |
| @@ -1443,19 +1428,14 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, | |||
| 1443 | return -EIO; | 1428 | return -EIO; |
| 1444 | bio->bi_bdev = page_bad->dev->bdev; | 1429 | bio->bi_bdev = page_bad->dev->bdev; |
| 1445 | bio->bi_sector = page_bad->physical >> 9; | 1430 | bio->bi_sector = page_bad->physical >> 9; |
| 1446 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 1447 | bio->bi_private = &complete; | ||
| 1448 | 1431 | ||
| 1449 | ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); | 1432 | ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); |
| 1450 | if (PAGE_SIZE != ret) { | 1433 | if (PAGE_SIZE != ret) { |
| 1451 | bio_put(bio); | 1434 | bio_put(bio); |
| 1452 | return -EIO; | 1435 | return -EIO; |
| 1453 | } | 1436 | } |
| 1454 | btrfsic_submit_bio(WRITE, bio); | ||
| 1455 | 1437 | ||
| 1456 | /* this will also unplug the queue */ | 1438 | if (btrfsic_submit_bio_wait(WRITE, bio)) { |
| 1457 | wait_for_completion(&complete); | ||
| 1458 | if (!bio_flagged(bio, BIO_UPTODATE)) { | ||
| 1459 | btrfs_dev_stat_inc_and_print(page_bad->dev, | 1439 | btrfs_dev_stat_inc_and_print(page_bad->dev, |
| 1460 | BTRFS_DEV_STAT_WRITE_ERRS); | 1440 | BTRFS_DEV_STAT_WRITE_ERRS); |
| 1461 | btrfs_dev_replace_stats_inc( | 1441 | btrfs_dev_replace_stats_inc( |
| @@ -3375,7 +3355,6 @@ static int write_page_nocow(struct scrub_ctx *sctx, | |||
| 3375 | struct bio *bio; | 3355 | struct bio *bio; |
| 3376 | struct btrfs_device *dev; | 3356 | struct btrfs_device *dev; |
| 3377 | int ret; | 3357 | int ret; |
| 3378 | DECLARE_COMPLETION_ONSTACK(compl); | ||
| 3379 | 3358 | ||
| 3380 | dev = sctx->wr_ctx.tgtdev; | 3359 | dev = sctx->wr_ctx.tgtdev; |
| 3381 | if (!dev) | 3360 | if (!dev) |
| @@ -3392,8 +3371,6 @@ static int write_page_nocow(struct scrub_ctx *sctx, | |||
| 3392 | spin_unlock(&sctx->stat_lock); | 3371 | spin_unlock(&sctx->stat_lock); |
| 3393 | return -ENOMEM; | 3372 | return -ENOMEM; |
| 3394 | } | 3373 | } |
| 3395 | bio->bi_private = &compl; | ||
| 3396 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 3397 | bio->bi_size = 0; | 3374 | bio->bi_size = 0; |
| 3398 | bio->bi_sector = physical_for_dev_replace >> 9; | 3375 | bio->bi_sector = physical_for_dev_replace >> 9; |
| 3399 | bio->bi_bdev = dev->bdev; | 3376 | bio->bi_bdev = dev->bdev; |
| @@ -3404,10 +3381,8 @@ leave_with_eio: | |||
| 3404 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); | 3381 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); |
| 3405 | return -EIO; | 3382 | return -EIO; |
| 3406 | } | 3383 | } |
| 3407 | btrfsic_submit_bio(WRITE_SYNC, bio); | ||
| 3408 | wait_for_completion(&compl); | ||
| 3409 | 3384 | ||
| 3410 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | 3385 | if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) |
| 3411 | goto leave_with_eio; | 3386 | goto leave_with_eio; |
| 3412 | 3387 | ||
| 3413 | bio_put(bio); | 3388 | bio_put(bio); |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 79b65c3b9e87..8b5e2584c840 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
| @@ -1852,8 +1852,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, | |||
| 1852 | goto error_tgt_fput; | 1852 | goto error_tgt_fput; |
| 1853 | 1853 | ||
| 1854 | /* Check if EPOLLWAKEUP is allowed */ | 1854 | /* Check if EPOLLWAKEUP is allowed */ |
| 1855 | if ((epds.events & EPOLLWAKEUP) && !capable(CAP_BLOCK_SUSPEND)) | 1855 | ep_take_care_of_epollwakeup(&epds); |
| 1856 | epds.events &= ~EPOLLWAKEUP; | ||
| 1857 | 1856 | ||
| 1858 | /* | 1857 | /* |
| 1859 | * We have to check that the file structure underneath the file descriptor | 1858 | * We have to check that the file structure underneath the file descriptor |
diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index b51a6079108d..e9a97a0d4314 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c | |||
| @@ -24,13 +24,6 @@ struct hfsplus_wd { | |||
| 24 | u16 embed_count; | 24 | u16 embed_count; |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | static void hfsplus_end_io_sync(struct bio *bio, int err) | ||
| 28 | { | ||
| 29 | if (err) | ||
| 30 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | ||
| 31 | complete(bio->bi_private); | ||
| 32 | } | ||
| 33 | |||
| 34 | /* | 27 | /* |
| 35 | * hfsplus_submit_bio - Perfrom block I/O | 28 | * hfsplus_submit_bio - Perfrom block I/O |
| 36 | * @sb: super block of volume for I/O | 29 | * @sb: super block of volume for I/O |
| @@ -53,7 +46,6 @@ static void hfsplus_end_io_sync(struct bio *bio, int err) | |||
| 53 | int hfsplus_submit_bio(struct super_block *sb, sector_t sector, | 46 | int hfsplus_submit_bio(struct super_block *sb, sector_t sector, |
| 54 | void *buf, void **data, int rw) | 47 | void *buf, void **data, int rw) |
| 55 | { | 48 | { |
| 56 | DECLARE_COMPLETION_ONSTACK(wait); | ||
| 57 | struct bio *bio; | 49 | struct bio *bio; |
| 58 | int ret = 0; | 50 | int ret = 0; |
| 59 | u64 io_size; | 51 | u64 io_size; |
| @@ -73,8 +65,6 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, | |||
| 73 | bio = bio_alloc(GFP_NOIO, 1); | 65 | bio = bio_alloc(GFP_NOIO, 1); |
| 74 | bio->bi_sector = sector; | 66 | bio->bi_sector = sector; |
| 75 | bio->bi_bdev = sb->s_bdev; | 67 | bio->bi_bdev = sb->s_bdev; |
| 76 | bio->bi_end_io = hfsplus_end_io_sync; | ||
| 77 | bio->bi_private = &wait; | ||
| 78 | 68 | ||
| 79 | if (!(rw & WRITE) && data) | 69 | if (!(rw & WRITE) && data) |
| 80 | *data = (u8 *)buf + offset; | 70 | *data = (u8 *)buf + offset; |
| @@ -93,12 +83,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector, | |||
| 93 | buf = (u8 *)buf + len; | 83 | buf = (u8 *)buf + len; |
| 94 | } | 84 | } |
| 95 | 85 | ||
| 96 | submit_bio(rw, bio); | 86 | ret = submit_bio_wait(rw, bio); |
| 97 | wait_for_completion(&wait); | ||
| 98 | |||
| 99 | if (!bio_flagged(bio, BIO_UPTODATE)) | ||
| 100 | ret = -EIO; | ||
| 101 | |||
| 102 | out: | 87 | out: |
| 103 | bio_put(bio); | 88 | bio_put(bio); |
| 104 | return ret < 0 ? ret : 0; | 89 | return ret < 0 ? ret : 0; |
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 550475ca6a0e..0f95f0d0b313 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
| @@ -14,16 +14,10 @@ | |||
| 14 | 14 | ||
| 15 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) | 15 | #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) |
| 16 | 16 | ||
| 17 | static void request_complete(struct bio *bio, int err) | ||
| 18 | { | ||
| 19 | complete((struct completion *)bio->bi_private); | ||
| 20 | } | ||
| 21 | |||
| 22 | static int sync_request(struct page *page, struct block_device *bdev, int rw) | 17 | static int sync_request(struct page *page, struct block_device *bdev, int rw) |
| 23 | { | 18 | { |
| 24 | struct bio bio; | 19 | struct bio bio; |
| 25 | struct bio_vec bio_vec; | 20 | struct bio_vec bio_vec; |
| 26 | struct completion complete; | ||
| 27 | 21 | ||
| 28 | bio_init(&bio); | 22 | bio_init(&bio); |
| 29 | bio.bi_max_vecs = 1; | 23 | bio.bi_max_vecs = 1; |
| @@ -35,13 +29,8 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) | |||
| 35 | bio.bi_size = PAGE_SIZE; | 29 | bio.bi_size = PAGE_SIZE; |
| 36 | bio.bi_bdev = bdev; | 30 | bio.bi_bdev = bdev; |
| 37 | bio.bi_sector = page->index * (PAGE_SIZE >> 9); | 31 | bio.bi_sector = page->index * (PAGE_SIZE >> 9); |
| 38 | init_completion(&complete); | ||
| 39 | bio.bi_private = &complete; | ||
| 40 | bio.bi_end_io = request_complete; | ||
| 41 | 32 | ||
| 42 | submit_bio(rw, &bio); | 33 | return submit_bio_wait(rw, &bio); |
| 43 | wait_for_completion(&complete); | ||
| 44 | return test_bit(BIO_UPTODATE, &bio.bi_flags) ? 0 : -EIO; | ||
| 45 | } | 34 | } |
| 46 | 35 | ||
| 47 | static int bdev_readpage(void *_sb, struct page *page) | 36 | static int bdev_readpage(void *_sb, struct page *page) |
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h index 8485978993e8..9838fb020473 100644 --- a/fs/nfs/blocklayout/blocklayout.h +++ b/fs/nfs/blocklayout/blocklayout.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/nfs_fs.h> | 36 | #include <linux/nfs_fs.h> |
| 37 | #include <linux/sunrpc/rpc_pipe_fs.h> | 37 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| 38 | 38 | ||
| 39 | #include "../nfs4_fs.h" | ||
| 39 | #include "../pnfs.h" | 40 | #include "../pnfs.h" |
| 40 | #include "../netns.h" | 41 | #include "../netns.h" |
| 41 | 42 | ||
diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.c index 9c3e117c3ed1..4d0161442565 100644 --- a/fs/nfs/blocklayout/extents.c +++ b/fs/nfs/blocklayout/extents.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | static inline sector_t normalize(sector_t s, int base) | 44 | static inline sector_t normalize(sector_t s, int base) |
| 45 | { | 45 | { |
| 46 | sector_t tmp = s; /* Since do_div modifies its argument */ | 46 | sector_t tmp = s; /* Since do_div modifies its argument */ |
| 47 | return s - do_div(tmp, base); | 47 | return s - sector_div(tmp, base); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | static inline sector_t normalize_up(sector_t s, int base) | 50 | static inline sector_t normalize_up(sector_t s, int base) |
diff --git a/fs/nfs/dns_resolve.c b/fs/nfs/dns_resolve.c index fc0f95ec7358..d25f10fb4926 100644 --- a/fs/nfs/dns_resolve.c +++ b/fs/nfs/dns_resolve.c | |||
| @@ -46,7 +46,9 @@ ssize_t nfs_dns_resolve_name(struct net *net, char *name, size_t namelen, | |||
| 46 | #include <linux/sunrpc/cache.h> | 46 | #include <linux/sunrpc/cache.h> |
| 47 | #include <linux/sunrpc/svcauth.h> | 47 | #include <linux/sunrpc/svcauth.h> |
| 48 | #include <linux/sunrpc/rpc_pipe_fs.h> | 48 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| 49 | #include <linux/nfs_fs.h> | ||
| 49 | 50 | ||
| 51 | #include "nfs4_fs.h" | ||
| 50 | #include "dns_resolve.h" | 52 | #include "dns_resolve.h" |
| 51 | #include "cache_lib.h" | 53 | #include "cache_lib.h" |
| 52 | #include "netns.h" | 54 | #include "netns.h" |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 18ab2da4eeb6..00ad1c2b217d 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -312,7 +312,7 @@ struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) | |||
| 312 | } | 312 | } |
| 313 | EXPORT_SYMBOL_GPL(nfs4_label_alloc); | 313 | EXPORT_SYMBOL_GPL(nfs4_label_alloc); |
| 314 | #else | 314 | #else |
| 315 | void inline nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, | 315 | void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, |
| 316 | struct nfs4_label *label) | 316 | struct nfs4_label *label) |
| 317 | { | 317 | { |
| 318 | } | 318 | } |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index bca6a3e3c49c..8b5cc04a8611 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
| @@ -269,6 +269,21 @@ extern const u32 nfs41_maxgetdevinfo_overhead; | |||
| 269 | extern struct rpc_procinfo nfs4_procedures[]; | 269 | extern struct rpc_procinfo nfs4_procedures[]; |
| 270 | #endif | 270 | #endif |
| 271 | 271 | ||
| 272 | #ifdef CONFIG_NFS_V4_SECURITY_LABEL | ||
| 273 | extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags); | ||
| 274 | static inline void nfs4_label_free(struct nfs4_label *label) | ||
| 275 | { | ||
| 276 | if (label) { | ||
| 277 | kfree(label->label); | ||
| 278 | kfree(label); | ||
| 279 | } | ||
| 280 | return; | ||
| 281 | } | ||
| 282 | #else | ||
| 283 | static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; } | ||
| 284 | static inline void nfs4_label_free(void *label) {} | ||
| 285 | #endif /* CONFIG_NFS_V4_SECURITY_LABEL */ | ||
| 286 | |||
| 272 | /* proc.c */ | 287 | /* proc.c */ |
| 273 | void nfs_close_context(struct nfs_open_context *ctx, int is_sync); | 288 | void nfs_close_context(struct nfs_open_context *ctx, int is_sync); |
| 274 | extern struct nfs_client *nfs_init_client(struct nfs_client *clp, | 289 | extern struct nfs_client *nfs_init_client(struct nfs_client *clp, |
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 3ce79b04522e..5609edc742a0 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
| @@ -9,6 +9,14 @@ | |||
| 9 | #ifndef __LINUX_FS_NFS_NFS4_FS_H | 9 | #ifndef __LINUX_FS_NFS_NFS4_FS_H |
| 10 | #define __LINUX_FS_NFS_NFS4_FS_H | 10 | #define __LINUX_FS_NFS_NFS4_FS_H |
| 11 | 11 | ||
| 12 | #if defined(CONFIG_NFS_V4_2) | ||
| 13 | #define NFS4_MAX_MINOR_VERSION 2 | ||
| 14 | #elif defined(CONFIG_NFS_V4_1) | ||
| 15 | #define NFS4_MAX_MINOR_VERSION 1 | ||
| 16 | #else | ||
| 17 | #define NFS4_MAX_MINOR_VERSION 0 | ||
| 18 | #endif | ||
| 19 | |||
| 12 | #if IS_ENABLED(CONFIG_NFS_V4) | 20 | #if IS_ENABLED(CONFIG_NFS_V4) |
| 13 | 21 | ||
| 14 | #define NFS4_MAX_LOOP_ON_RECOVER (10) | 22 | #define NFS4_MAX_LOOP_ON_RECOVER (10) |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 659990c0109e..15052b81df42 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -2518,9 +2518,8 @@ static void nfs4_close_done(struct rpc_task *task, void *data) | |||
| 2518 | calldata->roc_barrier); | 2518 | calldata->roc_barrier); |
| 2519 | nfs_set_open_stateid(state, &calldata->res.stateid, 0); | 2519 | nfs_set_open_stateid(state, &calldata->res.stateid, 0); |
| 2520 | renew_lease(server, calldata->timestamp); | 2520 | renew_lease(server, calldata->timestamp); |
| 2521 | nfs4_close_clear_stateid_flags(state, | ||
| 2522 | calldata->arg.fmode); | ||
| 2523 | break; | 2521 | break; |
| 2522 | case -NFS4ERR_ADMIN_REVOKED: | ||
| 2524 | case -NFS4ERR_STALE_STATEID: | 2523 | case -NFS4ERR_STALE_STATEID: |
| 2525 | case -NFS4ERR_OLD_STATEID: | 2524 | case -NFS4ERR_OLD_STATEID: |
| 2526 | case -NFS4ERR_BAD_STATEID: | 2525 | case -NFS4ERR_BAD_STATEID: |
| @@ -2528,9 +2527,13 @@ static void nfs4_close_done(struct rpc_task *task, void *data) | |||
| 2528 | if (calldata->arg.fmode == 0) | 2527 | if (calldata->arg.fmode == 0) |
| 2529 | break; | 2528 | break; |
| 2530 | default: | 2529 | default: |
| 2531 | if (nfs4_async_handle_error(task, server, state) == -EAGAIN) | 2530 | if (nfs4_async_handle_error(task, server, state) == -EAGAIN) { |
| 2532 | rpc_restart_call_prepare(task); | 2531 | rpc_restart_call_prepare(task); |
| 2532 | goto out_release; | ||
| 2533 | } | ||
| 2533 | } | 2534 | } |
| 2535 | nfs4_close_clear_stateid_flags(state, calldata->arg.fmode); | ||
| 2536 | out_release: | ||
| 2534 | nfs_release_seqid(calldata->arg.seqid); | 2537 | nfs_release_seqid(calldata->arg.seqid); |
| 2535 | nfs_refresh_inode(calldata->inode, calldata->res.fattr); | 2538 | nfs_refresh_inode(calldata->inode, calldata->res.fattr); |
| 2536 | dprintk("%s: done, ret = %d!\n", __func__, task->tk_status); | 2539 | dprintk("%s: done, ret = %d!\n", __func__, task->tk_status); |
| @@ -4802,7 +4805,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 4802 | dprintk("%s ERROR %d, Reset session\n", __func__, | 4805 | dprintk("%s ERROR %d, Reset session\n", __func__, |
| 4803 | task->tk_status); | 4806 | task->tk_status); |
| 4804 | nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); | 4807 | nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); |
| 4805 | goto restart_call; | 4808 | goto wait_on_recovery; |
| 4806 | #endif /* CONFIG_NFS_V4_1 */ | 4809 | #endif /* CONFIG_NFS_V4_1 */ |
| 4807 | case -NFS4ERR_DELAY: | 4810 | case -NFS4ERR_DELAY: |
| 4808 | nfs_inc_server_stats(server, NFSIOS_DELAY); | 4811 | nfs_inc_server_stats(server, NFSIOS_DELAY); |
| @@ -4987,11 +4990,17 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) | |||
| 4987 | 4990 | ||
| 4988 | trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status); | 4991 | trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status); |
| 4989 | switch (task->tk_status) { | 4992 | switch (task->tk_status) { |
| 4990 | case -NFS4ERR_STALE_STATEID: | ||
| 4991 | case -NFS4ERR_EXPIRED: | ||
| 4992 | case 0: | 4993 | case 0: |
| 4993 | renew_lease(data->res.server, data->timestamp); | 4994 | renew_lease(data->res.server, data->timestamp); |
| 4994 | break; | 4995 | break; |
| 4996 | case -NFS4ERR_ADMIN_REVOKED: | ||
| 4997 | case -NFS4ERR_DELEG_REVOKED: | ||
| 4998 | case -NFS4ERR_BAD_STATEID: | ||
| 4999 | case -NFS4ERR_OLD_STATEID: | ||
| 5000 | case -NFS4ERR_STALE_STATEID: | ||
| 5001 | case -NFS4ERR_EXPIRED: | ||
| 5002 | task->tk_status = 0; | ||
| 5003 | break; | ||
| 4995 | default: | 5004 | default: |
| 4996 | if (nfs4_async_handle_error(task, data->res.server, NULL) == | 5005 | if (nfs4_async_handle_error(task, data->res.server, NULL) == |
| 4997 | -EAGAIN) { | 5006 | -EAGAIN) { |
| @@ -7589,7 +7598,14 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata) | |||
| 7589 | return; | 7598 | return; |
| 7590 | 7599 | ||
| 7591 | server = NFS_SERVER(lrp->args.inode); | 7600 | server = NFS_SERVER(lrp->args.inode); |
| 7592 | if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { | 7601 | switch (task->tk_status) { |
| 7602 | default: | ||
| 7603 | task->tk_status = 0; | ||
| 7604 | case 0: | ||
| 7605 | break; | ||
| 7606 | case -NFS4ERR_DELAY: | ||
| 7607 | if (nfs4_async_handle_error(task, server, NULL) != -EAGAIN) | ||
| 7608 | break; | ||
| 7593 | rpc_restart_call_prepare(task); | 7609 | rpc_restart_call_prepare(task); |
| 7594 | return; | 7610 | return; |
| 7595 | } | 7611 | } |
| @@ -726,11 +726,25 @@ pipe_poll(struct file *filp, poll_table *wait) | |||
| 726 | return mask; | 726 | return mask; |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) | ||
| 730 | { | ||
| 731 | int kill = 0; | ||
| 732 | |||
| 733 | spin_lock(&inode->i_lock); | ||
| 734 | if (!--pipe->files) { | ||
| 735 | inode->i_pipe = NULL; | ||
| 736 | kill = 1; | ||
| 737 | } | ||
| 738 | spin_unlock(&inode->i_lock); | ||
| 739 | |||
| 740 | if (kill) | ||
| 741 | free_pipe_info(pipe); | ||
| 742 | } | ||
| 743 | |||
| 729 | static int | 744 | static int |
| 730 | pipe_release(struct inode *inode, struct file *file) | 745 | pipe_release(struct inode *inode, struct file *file) |
| 731 | { | 746 | { |
| 732 | struct pipe_inode_info *pipe = inode->i_pipe; | 747 | struct pipe_inode_info *pipe = file->private_data; |
| 733 | int kill = 0; | ||
| 734 | 748 | ||
| 735 | __pipe_lock(pipe); | 749 | __pipe_lock(pipe); |
| 736 | if (file->f_mode & FMODE_READ) | 750 | if (file->f_mode & FMODE_READ) |
| @@ -743,17 +757,9 @@ pipe_release(struct inode *inode, struct file *file) | |||
| 743 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 757 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
| 744 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 758 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
| 745 | } | 759 | } |
| 746 | spin_lock(&inode->i_lock); | ||
| 747 | if (!--pipe->files) { | ||
| 748 | inode->i_pipe = NULL; | ||
| 749 | kill = 1; | ||
| 750 | } | ||
| 751 | spin_unlock(&inode->i_lock); | ||
| 752 | __pipe_unlock(pipe); | 760 | __pipe_unlock(pipe); |
| 753 | 761 | ||
| 754 | if (kill) | 762 | put_pipe_info(inode, pipe); |
| 755 | free_pipe_info(pipe); | ||
| 756 | |||
| 757 | return 0; | 763 | return 0; |
| 758 | } | 764 | } |
| 759 | 765 | ||
| @@ -1014,7 +1020,6 @@ static int fifo_open(struct inode *inode, struct file *filp) | |||
| 1014 | { | 1020 | { |
| 1015 | struct pipe_inode_info *pipe; | 1021 | struct pipe_inode_info *pipe; |
| 1016 | bool is_pipe = inode->i_sb->s_magic == PIPEFS_MAGIC; | 1022 | bool is_pipe = inode->i_sb->s_magic == PIPEFS_MAGIC; |
| 1017 | int kill = 0; | ||
| 1018 | int ret; | 1023 | int ret; |
| 1019 | 1024 | ||
| 1020 | filp->f_version = 0; | 1025 | filp->f_version = 0; |
| @@ -1130,15 +1135,9 @@ err_wr: | |||
| 1130 | goto err; | 1135 | goto err; |
| 1131 | 1136 | ||
| 1132 | err: | 1137 | err: |
| 1133 | spin_lock(&inode->i_lock); | ||
| 1134 | if (!--pipe->files) { | ||
| 1135 | inode->i_pipe = NULL; | ||
| 1136 | kill = 1; | ||
| 1137 | } | ||
| 1138 | spin_unlock(&inode->i_lock); | ||
| 1139 | __pipe_unlock(pipe); | 1138 | __pipe_unlock(pipe); |
| 1140 | if (kill) | 1139 | |
| 1141 | free_pipe_info(pipe); | 1140 | put_pipe_info(inode, pipe); |
| 1142 | return ret; | 1141 | return ret; |
| 1143 | } | 1142 | } |
| 1144 | 1143 | ||
diff --git a/fs/squashfs/file_direct.c b/fs/squashfs/file_direct.c index 2943b2bfae48..62a0de6632e1 100644 --- a/fs/squashfs/file_direct.c +++ b/fs/squashfs/file_direct.c | |||
| @@ -84,6 +84,9 @@ int squashfs_readpage_block(struct page *target_page, u64 block, int bsize) | |||
| 84 | */ | 84 | */ |
| 85 | res = squashfs_read_cache(target_page, block, bsize, pages, | 85 | res = squashfs_read_cache(target_page, block, bsize, pages, |
| 86 | page); | 86 | page); |
| 87 | if (res < 0) | ||
| 88 | goto mark_errored; | ||
| 89 | |||
| 87 | goto out; | 90 | goto out; |
| 88 | } | 91 | } |
| 89 | 92 | ||
| @@ -119,7 +122,7 @@ mark_errored: | |||
| 119 | * dealt with by the caller | 122 | * dealt with by the caller |
| 120 | */ | 123 | */ |
| 121 | for (i = 0; i < pages; i++) { | 124 | for (i = 0; i < pages; i++) { |
| 122 | if (page[i] == target_page) | 125 | if (page[i] == NULL || page[i] == target_page) |
| 123 | continue; | 126 | continue; |
| 124 | flush_dcache_page(page[i]); | 127 | flush_dcache_page(page[i]); |
| 125 | SetPageError(page[i]); | 128 | SetPageError(page[i]); |
