diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2009-04-16 11:16:34 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-04-16 11:16:34 -0400 |
commit | 32dc496b47eb31f7a1d115a2708e8ef1d054e1fb (patch) | |
tree | b0ae57b9b55a0277395934ea75de00f8f54d227a /fs | |
parent | 8cd50e8e2b416c7f07b267ab3457c6c25a540ba9 (diff) | |
parent | c5ab660db9a98187667d017bb9425f0c1dc76ac1 (diff) |
Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bio.c | 18 | ||||
-rw-r--r-- | fs/buffer.c | 11 | ||||
-rw-r--r-- | fs/direct-io.c | 2 | ||||
-rw-r--r-- | fs/ext4/extents.c | 2 | ||||
-rw-r--r-- | fs/gfs2/glock.c | 10 | ||||
-rw-r--r-- | fs/gfs2/inode.c | 8 | ||||
-rw-r--r-- | fs/gfs2/inode.h | 14 | ||||
-rw-r--r-- | fs/gfs2/ops_file.c | 8 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 5 | ||||
-rw-r--r-- | fs/gfs2/ops_inode.c | 1 | ||||
-rw-r--r-- | fs/gfs2/quota.c | 4 | ||||
-rw-r--r-- | fs/inode.c | 36 | ||||
-rw-r--r-- | fs/ocfs2/file.c | 94 | ||||
-rw-r--r-- | fs/pipe.c | 42 | ||||
-rw-r--r-- | fs/splice.c | 371 |
15 files changed, 349 insertions, 277 deletions
@@ -348,6 +348,24 @@ err: | |||
348 | return NULL; | 348 | return NULL; |
349 | } | 349 | } |
350 | 350 | ||
351 | /** | ||
352 | * bio_alloc - allocate a bio for I/O | ||
353 | * @gfp_mask: the GFP_ mask given to the slab allocator | ||
354 | * @nr_iovecs: number of iovecs to pre-allocate | ||
355 | * | ||
356 | * Description: | ||
357 | * bio_alloc will allocate a bio and associated bio_vec array that can hold | ||
358 | * at least @nr_iovecs entries. Allocations will be done from the | ||
359 | * fs_bio_set. Also see @bio_alloc_bioset. | ||
360 | * | ||
361 | * If %__GFP_WAIT is set, then bio_alloc will always be able to allocate | ||
362 | * a bio. This is due to the mempool guarantees. To make this work, callers | ||
363 | * must never allocate more than 1 bio at the time from this pool. Callers | ||
364 | * that need to allocate more than 1 bio must always submit the previously | ||
365 | * allocate bio for IO before attempting to allocate a new one. Failure to | ||
366 | * do so can cause livelocks under memory pressure. | ||
367 | * | ||
368 | **/ | ||
351 | struct bio *bio_alloc(gfp_t gfp_mask, int nr_iovecs) | 369 | struct bio *bio_alloc(gfp_t gfp_mask, int nr_iovecs) |
352 | { | 370 | { |
353 | struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set); | 371 | struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set); |
diff --git a/fs/buffer.c b/fs/buffer.c index 13edf7ad3ff1..ff8bb1f2333a 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -547,7 +547,7 @@ repeat: | |||
547 | return err; | 547 | return err; |
548 | } | 548 | } |
549 | 549 | ||
550 | void do_thaw_all(unsigned long unused) | 550 | void do_thaw_all(struct work_struct *work) |
551 | { | 551 | { |
552 | struct super_block *sb; | 552 | struct super_block *sb; |
553 | char b[BDEVNAME_SIZE]; | 553 | char b[BDEVNAME_SIZE]; |
@@ -567,6 +567,7 @@ restart: | |||
567 | goto restart; | 567 | goto restart; |
568 | } | 568 | } |
569 | spin_unlock(&sb_lock); | 569 | spin_unlock(&sb_lock); |
570 | kfree(work); | ||
570 | printk(KERN_WARNING "Emergency Thaw complete\n"); | 571 | printk(KERN_WARNING "Emergency Thaw complete\n"); |
571 | } | 572 | } |
572 | 573 | ||
@@ -577,7 +578,13 @@ restart: | |||
577 | */ | 578 | */ |
578 | void emergency_thaw_all(void) | 579 | void emergency_thaw_all(void) |
579 | { | 580 | { |
580 | pdflush_operation(do_thaw_all, 0); | 581 | struct work_struct *work; |
582 | |||
583 | work = kmalloc(sizeof(*work), GFP_ATOMIC); | ||
584 | if (work) { | ||
585 | INIT_WORK(work, do_thaw_all); | ||
586 | schedule_work(work); | ||
587 | } | ||
581 | } | 588 | } |
582 | 589 | ||
583 | /** | 590 | /** |
diff --git a/fs/direct-io.c b/fs/direct-io.c index da258e7249cc..05763bbc2050 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -307,8 +307,6 @@ dio_bio_alloc(struct dio *dio, struct block_device *bdev, | |||
307 | struct bio *bio; | 307 | struct bio *bio; |
308 | 308 | ||
309 | bio = bio_alloc(GFP_KERNEL, nr_vecs); | 309 | bio = bio_alloc(GFP_KERNEL, nr_vecs); |
310 | if (bio == NULL) | ||
311 | return -ENOMEM; | ||
312 | 310 | ||
313 | bio->bi_bdev = bdev; | 311 | bio->bi_bdev = bdev; |
314 | bio->bi_sector = first_sector; | 312 | bio->bi_sector = first_sector; |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 6132353dcf62..2a1cb0979768 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2416,8 +2416,6 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) | |||
2416 | len = ee_len; | 2416 | len = ee_len; |
2417 | 2417 | ||
2418 | bio = bio_alloc(GFP_NOIO, len); | 2418 | bio = bio_alloc(GFP_NOIO, len); |
2419 | if (!bio) | ||
2420 | return -ENOMEM; | ||
2421 | bio->bi_sector = ee_pblock; | 2419 | bio->bi_sector = ee_pblock; |
2422 | bio->bi_bdev = inode->i_sb->s_bdev; | 2420 | bio->bi_bdev = inode->i_sb->s_bdev; |
2423 | 2421 | ||
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 3984e47d1d33..1afd9f26bcb1 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
@@ -597,7 +597,6 @@ __acquires(&gl->gl_spin) | |||
597 | 597 | ||
598 | GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)); | 598 | GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)); |
599 | 599 | ||
600 | down_read(&gfs2_umount_flush_sem); | ||
601 | if (test_bit(GLF_DEMOTE, &gl->gl_flags) && | 600 | if (test_bit(GLF_DEMOTE, &gl->gl_flags) && |
602 | gl->gl_demote_state != gl->gl_state) { | 601 | gl->gl_demote_state != gl->gl_state) { |
603 | if (find_first_holder(gl)) | 602 | if (find_first_holder(gl)) |
@@ -614,15 +613,14 @@ __acquires(&gl->gl_spin) | |||
614 | if (ret == 0) | 613 | if (ret == 0) |
615 | goto out_unlock; | 614 | goto out_unlock; |
616 | if (ret == 2) | 615 | if (ret == 2) |
617 | goto out_sem; | 616 | goto out; |
618 | gh = find_first_waiter(gl); | 617 | gh = find_first_waiter(gl); |
619 | gl->gl_target = gh->gh_state; | 618 | gl->gl_target = gh->gh_state; |
620 | if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))) | 619 | if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB))) |
621 | do_error(gl, 0); /* Fail queued try locks */ | 620 | do_error(gl, 0); /* Fail queued try locks */ |
622 | } | 621 | } |
623 | do_xmote(gl, gh, gl->gl_target); | 622 | do_xmote(gl, gh, gl->gl_target); |
624 | out_sem: | 623 | out: |
625 | up_read(&gfs2_umount_flush_sem); | ||
626 | return; | 624 | return; |
627 | 625 | ||
628 | out_sched: | 626 | out_sched: |
@@ -631,7 +629,7 @@ out_sched: | |||
631 | gfs2_glock_put(gl); | 629 | gfs2_glock_put(gl); |
632 | out_unlock: | 630 | out_unlock: |
633 | clear_bit(GLF_LOCK, &gl->gl_flags); | 631 | clear_bit(GLF_LOCK, &gl->gl_flags); |
634 | goto out_sem; | 632 | goto out; |
635 | } | 633 | } |
636 | 634 | ||
637 | static void glock_work_func(struct work_struct *work) | 635 | static void glock_work_func(struct work_struct *work) |
@@ -641,6 +639,7 @@ static void glock_work_func(struct work_struct *work) | |||
641 | 639 | ||
642 | if (test_and_clear_bit(GLF_REPLY_PENDING, &gl->gl_flags)) | 640 | if (test_and_clear_bit(GLF_REPLY_PENDING, &gl->gl_flags)) |
643 | finish_xmote(gl, gl->gl_reply); | 641 | finish_xmote(gl, gl->gl_reply); |
642 | down_read(&gfs2_umount_flush_sem); | ||
644 | spin_lock(&gl->gl_spin); | 643 | spin_lock(&gl->gl_spin); |
645 | if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && | 644 | if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && |
646 | gl->gl_state != LM_ST_UNLOCKED && | 645 | gl->gl_state != LM_ST_UNLOCKED && |
@@ -653,6 +652,7 @@ static void glock_work_func(struct work_struct *work) | |||
653 | } | 652 | } |
654 | run_queue(gl, 0); | 653 | run_queue(gl, 0); |
655 | spin_unlock(&gl->gl_spin); | 654 | spin_unlock(&gl->gl_spin); |
655 | up_read(&gfs2_umount_flush_sem); | ||
656 | if (!delay || | 656 | if (!delay || |
657 | queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0) | 657 | queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0) |
658 | gfs2_glock_put(gl); | 658 | gfs2_glock_put(gl); |
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 7b277d449155..5a31d426116f 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -137,15 +137,15 @@ void gfs2_set_iop(struct inode *inode) | |||
137 | if (S_ISREG(mode)) { | 137 | if (S_ISREG(mode)) { |
138 | inode->i_op = &gfs2_file_iops; | 138 | inode->i_op = &gfs2_file_iops; |
139 | if (gfs2_localflocks(sdp)) | 139 | if (gfs2_localflocks(sdp)) |
140 | inode->i_fop = gfs2_file_fops_nolock; | 140 | inode->i_fop = &gfs2_file_fops_nolock; |
141 | else | 141 | else |
142 | inode->i_fop = gfs2_file_fops; | 142 | inode->i_fop = &gfs2_file_fops; |
143 | } else if (S_ISDIR(mode)) { | 143 | } else if (S_ISDIR(mode)) { |
144 | inode->i_op = &gfs2_dir_iops; | 144 | inode->i_op = &gfs2_dir_iops; |
145 | if (gfs2_localflocks(sdp)) | 145 | if (gfs2_localflocks(sdp)) |
146 | inode->i_fop = gfs2_dir_fops_nolock; | 146 | inode->i_fop = &gfs2_dir_fops_nolock; |
147 | else | 147 | else |
148 | inode->i_fop = gfs2_dir_fops; | 148 | inode->i_fop = &gfs2_dir_fops; |
149 | } else if (S_ISLNK(mode)) { | 149 | } else if (S_ISLNK(mode)) { |
150 | inode->i_op = &gfs2_symlink_iops; | 150 | inode->i_op = &gfs2_symlink_iops; |
151 | } else { | 151 | } else { |
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index dca4fee3078b..c30be2b66580 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h | |||
@@ -101,21 +101,23 @@ void gfs2_dinode_print(const struct gfs2_inode *ip); | |||
101 | extern const struct inode_operations gfs2_file_iops; | 101 | extern const struct inode_operations gfs2_file_iops; |
102 | extern const struct inode_operations gfs2_dir_iops; | 102 | extern const struct inode_operations gfs2_dir_iops; |
103 | extern const struct inode_operations gfs2_symlink_iops; | 103 | extern const struct inode_operations gfs2_symlink_iops; |
104 | extern const struct file_operations *gfs2_file_fops_nolock; | 104 | extern const struct file_operations gfs2_file_fops_nolock; |
105 | extern const struct file_operations *gfs2_dir_fops_nolock; | 105 | extern const struct file_operations gfs2_dir_fops_nolock; |
106 | 106 | ||
107 | extern void gfs2_set_inode_flags(struct inode *inode); | 107 | extern void gfs2_set_inode_flags(struct inode *inode); |
108 | 108 | ||
109 | #ifdef CONFIG_GFS2_FS_LOCKING_DLM | 109 | #ifdef CONFIG_GFS2_FS_LOCKING_DLM |
110 | extern const struct file_operations *gfs2_file_fops; | 110 | extern const struct file_operations gfs2_file_fops; |
111 | extern const struct file_operations *gfs2_dir_fops; | 111 | extern const struct file_operations gfs2_dir_fops; |
112 | |||
112 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) | 113 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) |
113 | { | 114 | { |
114 | return sdp->sd_args.ar_localflocks; | 115 | return sdp->sd_args.ar_localflocks; |
115 | } | 116 | } |
116 | #else /* Single node only */ | 117 | #else /* Single node only */ |
117 | #define gfs2_file_fops NULL | 118 | #define gfs2_file_fops gfs2_file_fops_nolock |
118 | #define gfs2_dir_fops NULL | 119 | #define gfs2_dir_fops gfs2_dir_fops_nolock |
120 | |||
119 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) | 121 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) |
120 | { | 122 | { |
121 | return 1; | 123 | return 1; |
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c index 70b9b8548945..101caf3ee861 100644 --- a/fs/gfs2/ops_file.c +++ b/fs/gfs2/ops_file.c | |||
@@ -705,7 +705,7 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl) | |||
705 | } | 705 | } |
706 | } | 706 | } |
707 | 707 | ||
708 | const struct file_operations *gfs2_file_fops = &(const struct file_operations){ | 708 | const struct file_operations gfs2_file_fops = { |
709 | .llseek = gfs2_llseek, | 709 | .llseek = gfs2_llseek, |
710 | .read = do_sync_read, | 710 | .read = do_sync_read, |
711 | .aio_read = generic_file_aio_read, | 711 | .aio_read = generic_file_aio_read, |
@@ -723,7 +723,7 @@ const struct file_operations *gfs2_file_fops = &(const struct file_operations){ | |||
723 | .setlease = gfs2_setlease, | 723 | .setlease = gfs2_setlease, |
724 | }; | 724 | }; |
725 | 725 | ||
726 | const struct file_operations *gfs2_dir_fops = &(const struct file_operations){ | 726 | const struct file_operations gfs2_dir_fops = { |
727 | .readdir = gfs2_readdir, | 727 | .readdir = gfs2_readdir, |
728 | .unlocked_ioctl = gfs2_ioctl, | 728 | .unlocked_ioctl = gfs2_ioctl, |
729 | .open = gfs2_open, | 729 | .open = gfs2_open, |
@@ -735,7 +735,7 @@ const struct file_operations *gfs2_dir_fops = &(const struct file_operations){ | |||
735 | 735 | ||
736 | #endif /* CONFIG_GFS2_FS_LOCKING_DLM */ | 736 | #endif /* CONFIG_GFS2_FS_LOCKING_DLM */ |
737 | 737 | ||
738 | const struct file_operations *gfs2_file_fops_nolock = &(const struct file_operations){ | 738 | const struct file_operations gfs2_file_fops_nolock = { |
739 | .llseek = gfs2_llseek, | 739 | .llseek = gfs2_llseek, |
740 | .read = do_sync_read, | 740 | .read = do_sync_read, |
741 | .aio_read = generic_file_aio_read, | 741 | .aio_read = generic_file_aio_read, |
@@ -751,7 +751,7 @@ const struct file_operations *gfs2_file_fops_nolock = &(const struct file_operat | |||
751 | .setlease = generic_setlease, | 751 | .setlease = generic_setlease, |
752 | }; | 752 | }; |
753 | 753 | ||
754 | const struct file_operations *gfs2_dir_fops_nolock = &(const struct file_operations){ | 754 | const struct file_operations gfs2_dir_fops_nolock = { |
755 | .readdir = gfs2_readdir, | 755 | .readdir = gfs2_readdir, |
756 | .unlocked_ioctl = gfs2_ioctl, | 756 | .unlocked_ioctl = gfs2_ioctl, |
757 | .open = gfs2_open, | 757 | .open = gfs2_open, |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 51883b3ad89c..650a730707b7 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -272,11 +272,6 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector) | |||
272 | lock_page(page); | 272 | lock_page(page); |
273 | 273 | ||
274 | bio = bio_alloc(GFP_NOFS, 1); | 274 | bio = bio_alloc(GFP_NOFS, 1); |
275 | if (unlikely(!bio)) { | ||
276 | __free_page(page); | ||
277 | return -ENOBUFS; | ||
278 | } | ||
279 | |||
280 | bio->bi_sector = sector * (sb->s_blocksize >> 9); | 275 | bio->bi_sector = sector * (sb->s_blocksize >> 9); |
281 | bio->bi_bdev = sb->s_bdev; | 276 | bio->bi_bdev = sb->s_bdev; |
282 | bio_add_page(bio, page, PAGE_SIZE, 0); | 277 | bio_add_page(bio, page, PAGE_SIZE, 0); |
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index abd5429ae285..1c70fa5168d6 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -371,6 +371,7 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry, | |||
371 | ip = ghs[1].gh_gl->gl_object; | 371 | ip = ghs[1].gh_gl->gl_object; |
372 | 372 | ||
373 | ip->i_disksize = size; | 373 | ip->i_disksize = size; |
374 | i_size_write(inode, size); | ||
374 | 375 | ||
375 | error = gfs2_meta_inode_buffer(ip, &dibh); | 376 | error = gfs2_meta_inode_buffer(ip, &dibh); |
376 | 377 | ||
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 8d53f66b5bcc..152e6c4a0dca 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -81,7 +81,7 @@ struct gfs2_quota_change_host { | |||
81 | 81 | ||
82 | static LIST_HEAD(qd_lru_list); | 82 | static LIST_HEAD(qd_lru_list); |
83 | static atomic_t qd_lru_count = ATOMIC_INIT(0); | 83 | static atomic_t qd_lru_count = ATOMIC_INIT(0); |
84 | static spinlock_t qd_lru_lock = SPIN_LOCK_UNLOCKED; | 84 | static DEFINE_SPINLOCK(qd_lru_lock); |
85 | 85 | ||
86 | int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask) | 86 | int gfs2_shrink_qd_memory(int nr, gfp_t gfp_mask) |
87 | { | 87 | { |
@@ -1364,7 +1364,7 @@ int gfs2_quotad(void *data) | |||
1364 | refrigerator(); | 1364 | refrigerator(); |
1365 | t = min(quotad_timeo, statfs_timeo); | 1365 | t = min(quotad_timeo, statfs_timeo); |
1366 | 1366 | ||
1367 | prepare_to_wait(&sdp->sd_quota_wait, &wait, TASK_UNINTERRUPTIBLE); | 1367 | prepare_to_wait(&sdp->sd_quota_wait, &wait, TASK_INTERRUPTIBLE); |
1368 | spin_lock(&sdp->sd_trunc_lock); | 1368 | spin_lock(&sdp->sd_trunc_lock); |
1369 | empty = list_empty(&sdp->sd_trunc_list); | 1369 | empty = list_empty(&sdp->sd_trunc_list); |
1370 | spin_unlock(&sdp->sd_trunc_lock); | 1370 | spin_unlock(&sdp->sd_trunc_lock); |
diff --git a/fs/inode.c b/fs/inode.c index d06d6d268de9..6ad14a1cd8c9 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1470,42 +1470,6 @@ static void __wait_on_freeing_inode(struct inode *inode) | |||
1470 | spin_lock(&inode_lock); | 1470 | spin_lock(&inode_lock); |
1471 | } | 1471 | } |
1472 | 1472 | ||
1473 | /* | ||
1474 | * We rarely want to lock two inodes that do not have a parent/child | ||
1475 | * relationship (such as directory, child inode) simultaneously. The | ||
1476 | * vast majority of file systems should be able to get along fine | ||
1477 | * without this. Do not use these functions except as a last resort. | ||
1478 | */ | ||
1479 | void inode_double_lock(struct inode *inode1, struct inode *inode2) | ||
1480 | { | ||
1481 | if (inode1 == NULL || inode2 == NULL || inode1 == inode2) { | ||
1482 | if (inode1) | ||
1483 | mutex_lock(&inode1->i_mutex); | ||
1484 | else if (inode2) | ||
1485 | mutex_lock(&inode2->i_mutex); | ||
1486 | return; | ||
1487 | } | ||
1488 | |||
1489 | if (inode1 < inode2) { | ||
1490 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT); | ||
1491 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD); | ||
1492 | } else { | ||
1493 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT); | ||
1494 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD); | ||
1495 | } | ||
1496 | } | ||
1497 | EXPORT_SYMBOL(inode_double_lock); | ||
1498 | |||
1499 | void inode_double_unlock(struct inode *inode1, struct inode *inode2) | ||
1500 | { | ||
1501 | if (inode1) | ||
1502 | mutex_unlock(&inode1->i_mutex); | ||
1503 | |||
1504 | if (inode2 && inode2 != inode1) | ||
1505 | mutex_unlock(&inode2->i_mutex); | ||
1506 | } | ||
1507 | EXPORT_SYMBOL(inode_double_unlock); | ||
1508 | |||
1509 | static __initdata unsigned long ihash_entries; | 1473 | static __initdata unsigned long ihash_entries; |
1510 | static int __init set_ihash_entries(char *str) | 1474 | static int __init set_ihash_entries(char *str) |
1511 | { | 1475 | { |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 8672b9536039..c2a87c885b73 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -1912,6 +1912,22 @@ out_sems: | |||
1912 | return written ? written : ret; | 1912 | return written ? written : ret; |
1913 | } | 1913 | } |
1914 | 1914 | ||
1915 | static int ocfs2_splice_to_file(struct pipe_inode_info *pipe, | ||
1916 | struct file *out, | ||
1917 | struct splice_desc *sd) | ||
1918 | { | ||
1919 | int ret; | ||
1920 | |||
1921 | ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos, | ||
1922 | sd->total_len, 0, NULL); | ||
1923 | if (ret < 0) { | ||
1924 | mlog_errno(ret); | ||
1925 | return ret; | ||
1926 | } | ||
1927 | |||
1928 | return splice_from_pipe_feed(pipe, sd, pipe_to_file); | ||
1929 | } | ||
1930 | |||
1915 | static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, | 1931 | static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, |
1916 | struct file *out, | 1932 | struct file *out, |
1917 | loff_t *ppos, | 1933 | loff_t *ppos, |
@@ -1919,38 +1935,76 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, | |||
1919 | unsigned int flags) | 1935 | unsigned int flags) |
1920 | { | 1936 | { |
1921 | int ret; | 1937 | int ret; |
1922 | struct inode *inode = out->f_path.dentry->d_inode; | 1938 | struct address_space *mapping = out->f_mapping; |
1939 | struct inode *inode = mapping->host; | ||
1940 | struct splice_desc sd = { | ||
1941 | .total_len = len, | ||
1942 | .flags = flags, | ||
1943 | .pos = *ppos, | ||
1944 | .u.file = out, | ||
1945 | }; | ||
1923 | 1946 | ||
1924 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe, | 1947 | mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe, |
1925 | (unsigned int)len, | 1948 | (unsigned int)len, |
1926 | out->f_path.dentry->d_name.len, | 1949 | out->f_path.dentry->d_name.len, |
1927 | out->f_path.dentry->d_name.name); | 1950 | out->f_path.dentry->d_name.name); |
1928 | 1951 | ||
1929 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); | 1952 | if (pipe->inode) |
1953 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT); | ||
1930 | 1954 | ||
1931 | ret = ocfs2_rw_lock(inode, 1); | 1955 | splice_from_pipe_begin(&sd); |
1932 | if (ret < 0) { | 1956 | do { |
1933 | mlog_errno(ret); | 1957 | ret = splice_from_pipe_next(pipe, &sd); |
1934 | goto out; | 1958 | if (ret <= 0) |
1935 | } | 1959 | break; |
1936 | 1960 | ||
1937 | ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, ppos, len, 0, | 1961 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD); |
1938 | NULL); | 1962 | ret = ocfs2_rw_lock(inode, 1); |
1939 | if (ret < 0) { | 1963 | if (ret < 0) |
1940 | mlog_errno(ret); | 1964 | mlog_errno(ret); |
1941 | goto out_unlock; | 1965 | else { |
1942 | } | 1966 | ret = ocfs2_splice_to_file(pipe, out, &sd); |
1967 | ocfs2_rw_unlock(inode, 1); | ||
1968 | } | ||
1969 | mutex_unlock(&inode->i_mutex); | ||
1970 | } while (ret > 0); | ||
1971 | splice_from_pipe_end(pipe, &sd); | ||
1943 | 1972 | ||
1944 | if (pipe->inode) | 1973 | if (pipe->inode) |
1945 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); | ||
1946 | ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags); | ||
1947 | if (pipe->inode) | ||
1948 | mutex_unlock(&pipe->inode->i_mutex); | 1974 | mutex_unlock(&pipe->inode->i_mutex); |
1949 | 1975 | ||
1950 | out_unlock: | 1976 | if (sd.num_spliced) |
1951 | ocfs2_rw_unlock(inode, 1); | 1977 | ret = sd.num_spliced; |
1952 | out: | 1978 | |
1953 | mutex_unlock(&inode->i_mutex); | 1979 | if (ret > 0) { |
1980 | unsigned long nr_pages; | ||
1981 | |||
1982 | *ppos += ret; | ||
1983 | nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | ||
1984 | |||
1985 | /* | ||
1986 | * If file or inode is SYNC and we actually wrote some data, | ||
1987 | * sync it. | ||
1988 | */ | ||
1989 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { | ||
1990 | int err; | ||
1991 | |||
1992 | mutex_lock(&inode->i_mutex); | ||
1993 | err = ocfs2_rw_lock(inode, 1); | ||
1994 | if (err < 0) { | ||
1995 | mlog_errno(err); | ||
1996 | } else { | ||
1997 | err = generic_osync_inode(inode, mapping, | ||
1998 | OSYNC_METADATA|OSYNC_DATA); | ||
1999 | ocfs2_rw_unlock(inode, 1); | ||
2000 | } | ||
2001 | mutex_unlock(&inode->i_mutex); | ||
2002 | |||
2003 | if (err) | ||
2004 | ret = err; | ||
2005 | } | ||
2006 | balance_dirty_pages_ratelimited_nr(mapping, nr_pages); | ||
2007 | } | ||
1954 | 2008 | ||
1955 | mlog_exit(ret); | 2009 | mlog_exit(ret); |
1956 | return ret; | 2010 | return ret; |
@@ -37,6 +37,42 @@ | |||
37 | * -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09 | 37 | * -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09 |
38 | */ | 38 | */ |
39 | 39 | ||
40 | static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) | ||
41 | { | ||
42 | if (pipe->inode) | ||
43 | mutex_lock_nested(&pipe->inode->i_mutex, subclass); | ||
44 | } | ||
45 | |||
46 | void pipe_lock(struct pipe_inode_info *pipe) | ||
47 | { | ||
48 | /* | ||
49 | * pipe_lock() nests non-pipe inode locks (for writing to a file) | ||
50 | */ | ||
51 | pipe_lock_nested(pipe, I_MUTEX_PARENT); | ||
52 | } | ||
53 | EXPORT_SYMBOL(pipe_lock); | ||
54 | |||
55 | void pipe_unlock(struct pipe_inode_info *pipe) | ||
56 | { | ||
57 | if (pipe->inode) | ||
58 | mutex_unlock(&pipe->inode->i_mutex); | ||
59 | } | ||
60 | EXPORT_SYMBOL(pipe_unlock); | ||
61 | |||
62 | void pipe_double_lock(struct pipe_inode_info *pipe1, | ||
63 | struct pipe_inode_info *pipe2) | ||
64 | { | ||
65 | BUG_ON(pipe1 == pipe2); | ||
66 | |||
67 | if (pipe1 < pipe2) { | ||
68 | pipe_lock_nested(pipe1, I_MUTEX_PARENT); | ||
69 | pipe_lock_nested(pipe2, I_MUTEX_CHILD); | ||
70 | } else { | ||
71 | pipe_lock_nested(pipe2, I_MUTEX_CHILD); | ||
72 | pipe_lock_nested(pipe1, I_MUTEX_PARENT); | ||
73 | } | ||
74 | } | ||
75 | |||
40 | /* Drop the inode semaphore and wait for a pipe event, atomically */ | 76 | /* Drop the inode semaphore and wait for a pipe event, atomically */ |
41 | void pipe_wait(struct pipe_inode_info *pipe) | 77 | void pipe_wait(struct pipe_inode_info *pipe) |
42 | { | 78 | { |
@@ -47,12 +83,10 @@ void pipe_wait(struct pipe_inode_info *pipe) | |||
47 | * is considered a noninteractive wait: | 83 | * is considered a noninteractive wait: |
48 | */ | 84 | */ |
49 | prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); | 85 | prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); |
50 | if (pipe->inode) | 86 | pipe_unlock(pipe); |
51 | mutex_unlock(&pipe->inode->i_mutex); | ||
52 | schedule(); | 87 | schedule(); |
53 | finish_wait(&pipe->wait, &wait); | 88 | finish_wait(&pipe->wait, &wait); |
54 | if (pipe->inode) | 89 | pipe_lock(pipe); |
55 | mutex_lock(&pipe->inode->i_mutex); | ||
56 | } | 90 | } |
57 | 91 | ||
58 | static int | 92 | static int |
diff --git a/fs/splice.c b/fs/splice.c index c18aa7e03e2b..5384a90665d0 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -182,8 +182,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
182 | do_wakeup = 0; | 182 | do_wakeup = 0; |
183 | page_nr = 0; | 183 | page_nr = 0; |
184 | 184 | ||
185 | if (pipe->inode) | 185 | pipe_lock(pipe); |
186 | mutex_lock(&pipe->inode->i_mutex); | ||
187 | 186 | ||
188 | for (;;) { | 187 | for (;;) { |
189 | if (!pipe->readers) { | 188 | if (!pipe->readers) { |
@@ -245,15 +244,13 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
245 | pipe->waiting_writers--; | 244 | pipe->waiting_writers--; |
246 | } | 245 | } |
247 | 246 | ||
248 | if (pipe->inode) { | 247 | pipe_unlock(pipe); |
249 | mutex_unlock(&pipe->inode->i_mutex); | ||
250 | 248 | ||
251 | if (do_wakeup) { | 249 | if (do_wakeup) { |
252 | smp_mb(); | 250 | smp_mb(); |
253 | if (waitqueue_active(&pipe->wait)) | 251 | if (waitqueue_active(&pipe->wait)) |
254 | wake_up_interruptible(&pipe->wait); | 252 | wake_up_interruptible(&pipe->wait); |
255 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 253 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
256 | } | ||
257 | } | 254 | } |
258 | 255 | ||
259 | while (page_nr < spd_pages) | 256 | while (page_nr < spd_pages) |
@@ -555,8 +552,8 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
555 | * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create | 552 | * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create |
556 | * a new page in the output file page cache and fill/dirty that. | 553 | * a new page in the output file page cache and fill/dirty that. |
557 | */ | 554 | */ |
558 | static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | 555 | int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, |
559 | struct splice_desc *sd) | 556 | struct splice_desc *sd) |
560 | { | 557 | { |
561 | struct file *file = sd->u.file; | 558 | struct file *file = sd->u.file; |
562 | struct address_space *mapping = file->f_mapping; | 559 | struct address_space *mapping = file->f_mapping; |
@@ -600,108 +597,178 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
600 | out: | 597 | out: |
601 | return ret; | 598 | return ret; |
602 | } | 599 | } |
600 | EXPORT_SYMBOL(pipe_to_file); | ||
601 | |||
602 | static void wakeup_pipe_writers(struct pipe_inode_info *pipe) | ||
603 | { | ||
604 | smp_mb(); | ||
605 | if (waitqueue_active(&pipe->wait)) | ||
606 | wake_up_interruptible(&pipe->wait); | ||
607 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | ||
608 | } | ||
603 | 609 | ||
604 | /** | 610 | /** |
605 | * __splice_from_pipe - splice data from a pipe to given actor | 611 | * splice_from_pipe_feed - feed available data from a pipe to a file |
606 | * @pipe: pipe to splice from | 612 | * @pipe: pipe to splice from |
607 | * @sd: information to @actor | 613 | * @sd: information to @actor |
608 | * @actor: handler that splices the data | 614 | * @actor: handler that splices the data |
609 | * | 615 | * |
610 | * Description: | 616 | * Description: |
611 | * This function does little more than loop over the pipe and call | 617 | |
612 | * @actor to do the actual moving of a single struct pipe_buffer to | 618 | * This function loops over the pipe and calls @actor to do the |
613 | * the desired destination. See pipe_to_file, pipe_to_sendpage, or | 619 | * actual moving of a single struct pipe_buffer to the desired |
614 | * pipe_to_user. | 620 | * destination. It returns when there's no more buffers left in |
621 | * the pipe or if the requested number of bytes (@sd->total_len) | ||
622 | * have been copied. It returns a positive number (one) if the | ||
623 | * pipe needs to be filled with more data, zero if the required | ||
624 | * number of bytes have been copied and -errno on error. | ||
615 | * | 625 | * |
626 | * This, together with splice_from_pipe_{begin,end,next}, may be | ||
627 | * used to implement the functionality of __splice_from_pipe() when | ||
628 | * locking is required around copying the pipe buffers to the | ||
629 | * destination. | ||
616 | */ | 630 | */ |
617 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | 631 | int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd, |
618 | splice_actor *actor) | 632 | splice_actor *actor) |
619 | { | 633 | { |
620 | int ret, do_wakeup, err; | 634 | int ret; |
621 | |||
622 | ret = 0; | ||
623 | do_wakeup = 0; | ||
624 | |||
625 | for (;;) { | ||
626 | if (pipe->nrbufs) { | ||
627 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; | ||
628 | const struct pipe_buf_operations *ops = buf->ops; | ||
629 | 635 | ||
630 | sd->len = buf->len; | 636 | while (pipe->nrbufs) { |
631 | if (sd->len > sd->total_len) | 637 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; |
632 | sd->len = sd->total_len; | 638 | const struct pipe_buf_operations *ops = buf->ops; |
633 | 639 | ||
634 | err = actor(pipe, buf, sd); | 640 | sd->len = buf->len; |
635 | if (err <= 0) { | 641 | if (sd->len > sd->total_len) |
636 | if (!ret && err != -ENODATA) | 642 | sd->len = sd->total_len; |
637 | ret = err; | ||
638 | 643 | ||
639 | break; | 644 | ret = actor(pipe, buf, sd); |
640 | } | 645 | if (ret <= 0) { |
646 | if (ret == -ENODATA) | ||
647 | ret = 0; | ||
648 | return ret; | ||
649 | } | ||
650 | buf->offset += ret; | ||
651 | buf->len -= ret; | ||
641 | 652 | ||
642 | ret += err; | 653 | sd->num_spliced += ret; |
643 | buf->offset += err; | 654 | sd->len -= ret; |
644 | buf->len -= err; | 655 | sd->pos += ret; |
656 | sd->total_len -= ret; | ||
645 | 657 | ||
646 | sd->len -= err; | 658 | if (!buf->len) { |
647 | sd->pos += err; | 659 | buf->ops = NULL; |
648 | sd->total_len -= err; | 660 | ops->release(pipe, buf); |
649 | if (sd->len) | 661 | pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1); |
650 | continue; | 662 | pipe->nrbufs--; |
663 | if (pipe->inode) | ||
664 | sd->need_wakeup = true; | ||
665 | } | ||
651 | 666 | ||
652 | if (!buf->len) { | 667 | if (!sd->total_len) |
653 | buf->ops = NULL; | 668 | return 0; |
654 | ops->release(pipe, buf); | 669 | } |
655 | pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1); | ||
656 | pipe->nrbufs--; | ||
657 | if (pipe->inode) | ||
658 | do_wakeup = 1; | ||
659 | } | ||
660 | 670 | ||
661 | if (!sd->total_len) | 671 | return 1; |
662 | break; | 672 | } |
663 | } | 673 | EXPORT_SYMBOL(splice_from_pipe_feed); |
664 | 674 | ||
665 | if (pipe->nrbufs) | 675 | /** |
666 | continue; | 676 | * splice_from_pipe_next - wait for some data to splice from |
677 | * @pipe: pipe to splice from | ||
678 | * @sd: information about the splice operation | ||
679 | * | ||
680 | * Description: | ||
681 | * This function will wait for some data and return a positive | ||
682 | * value (one) if pipe buffers are available. It will return zero | ||
683 | * or -errno if no more data needs to be spliced. | ||
684 | */ | ||
685 | int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd) | ||
686 | { | ||
687 | while (!pipe->nrbufs) { | ||
667 | if (!pipe->writers) | 688 | if (!pipe->writers) |
668 | break; | 689 | return 0; |
669 | if (!pipe->waiting_writers) { | ||
670 | if (ret) | ||
671 | break; | ||
672 | } | ||
673 | 690 | ||
674 | if (sd->flags & SPLICE_F_NONBLOCK) { | 691 | if (!pipe->waiting_writers && sd->num_spliced) |
675 | if (!ret) | 692 | return 0; |
676 | ret = -EAGAIN; | ||
677 | break; | ||
678 | } | ||
679 | 693 | ||
680 | if (signal_pending(current)) { | 694 | if (sd->flags & SPLICE_F_NONBLOCK) |
681 | if (!ret) | 695 | return -EAGAIN; |
682 | ret = -ERESTARTSYS; | ||
683 | break; | ||
684 | } | ||
685 | 696 | ||
686 | if (do_wakeup) { | 697 | if (signal_pending(current)) |
687 | smp_mb(); | 698 | return -ERESTARTSYS; |
688 | if (waitqueue_active(&pipe->wait)) | 699 | |
689 | wake_up_interruptible_sync(&pipe->wait); | 700 | if (sd->need_wakeup) { |
690 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 701 | wakeup_pipe_writers(pipe); |
691 | do_wakeup = 0; | 702 | sd->need_wakeup = false; |
692 | } | 703 | } |
693 | 704 | ||
694 | pipe_wait(pipe); | 705 | pipe_wait(pipe); |
695 | } | 706 | } |
696 | 707 | ||
697 | if (do_wakeup) { | 708 | return 1; |
698 | smp_mb(); | 709 | } |
699 | if (waitqueue_active(&pipe->wait)) | 710 | EXPORT_SYMBOL(splice_from_pipe_next); |
700 | wake_up_interruptible(&pipe->wait); | ||
701 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | ||
702 | } | ||
703 | 711 | ||
704 | return ret; | 712 | /** |
713 | * splice_from_pipe_begin - start splicing from pipe | ||
714 | * @pipe: pipe to splice from | ||
715 | * | ||
716 | * Description: | ||
717 | * This function should be called before a loop containing | ||
718 | * splice_from_pipe_next() and splice_from_pipe_feed() to | ||
719 | * initialize the necessary fields of @sd. | ||
720 | */ | ||
721 | void splice_from_pipe_begin(struct splice_desc *sd) | ||
722 | { | ||
723 | sd->num_spliced = 0; | ||
724 | sd->need_wakeup = false; | ||
725 | } | ||
726 | EXPORT_SYMBOL(splice_from_pipe_begin); | ||
727 | |||
728 | /** | ||
729 | * splice_from_pipe_end - finish splicing from pipe | ||
730 | * @pipe: pipe to splice from | ||
731 | * @sd: information about the splice operation | ||
732 | * | ||
733 | * Description: | ||
734 | * This function will wake up pipe writers if necessary. It should | ||
735 | * be called after a loop containing splice_from_pipe_next() and | ||
736 | * splice_from_pipe_feed(). | ||
737 | */ | ||
738 | void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd) | ||
739 | { | ||
740 | if (sd->need_wakeup) | ||
741 | wakeup_pipe_writers(pipe); | ||
742 | } | ||
743 | EXPORT_SYMBOL(splice_from_pipe_end); | ||
744 | |||
745 | /** | ||
746 | * __splice_from_pipe - splice data from a pipe to given actor | ||
747 | * @pipe: pipe to splice from | ||
748 | * @sd: information to @actor | ||
749 | * @actor: handler that splices the data | ||
750 | * | ||
751 | * Description: | ||
752 | * This function does little more than loop over the pipe and call | ||
753 | * @actor to do the actual moving of a single struct pipe_buffer to | ||
754 | * the desired destination. See pipe_to_file, pipe_to_sendpage, or | ||
755 | * pipe_to_user. | ||
756 | * | ||
757 | */ | ||
758 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | ||
759 | splice_actor *actor) | ||
760 | { | ||
761 | int ret; | ||
762 | |||
763 | splice_from_pipe_begin(sd); | ||
764 | do { | ||
765 | ret = splice_from_pipe_next(pipe, sd); | ||
766 | if (ret > 0) | ||
767 | ret = splice_from_pipe_feed(pipe, sd, actor); | ||
768 | } while (ret > 0); | ||
769 | splice_from_pipe_end(pipe, sd); | ||
770 | |||
771 | return sd->num_spliced ? sd->num_spliced : ret; | ||
705 | } | 772 | } |
706 | EXPORT_SYMBOL(__splice_from_pipe); | 773 | EXPORT_SYMBOL(__splice_from_pipe); |
707 | 774 | ||
@@ -715,7 +782,7 @@ EXPORT_SYMBOL(__splice_from_pipe); | |||
715 | * @actor: handler that splices the data | 782 | * @actor: handler that splices the data |
716 | * | 783 | * |
717 | * Description: | 784 | * Description: |
718 | * See __splice_from_pipe. This function locks the input and output inodes, | 785 | * See __splice_from_pipe. This function locks the pipe inode, |
719 | * otherwise it's identical to __splice_from_pipe(). | 786 | * otherwise it's identical to __splice_from_pipe(). |
720 | * | 787 | * |
721 | */ | 788 | */ |
@@ -724,7 +791,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
724 | splice_actor *actor) | 791 | splice_actor *actor) |
725 | { | 792 | { |
726 | ssize_t ret; | 793 | ssize_t ret; |
727 | struct inode *inode = out->f_mapping->host; | ||
728 | struct splice_desc sd = { | 794 | struct splice_desc sd = { |
729 | .total_len = len, | 795 | .total_len = len, |
730 | .flags = flags, | 796 | .flags = flags, |
@@ -732,30 +798,15 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
732 | .u.file = out, | 798 | .u.file = out, |
733 | }; | 799 | }; |
734 | 800 | ||
735 | /* | 801 | pipe_lock(pipe); |
736 | * The actor worker might be calling ->write_begin and | ||
737 | * ->write_end. Most of the time, these expect i_mutex to | ||
738 | * be held. Since this may result in an ABBA deadlock with | ||
739 | * pipe->inode, we have to order lock acquiry here. | ||
740 | * | ||
741 | * Outer lock must be inode->i_mutex, as pipe_wait() will | ||
742 | * release and reacquire pipe->inode->i_mutex, AND inode must | ||
743 | * never be a pipe. | ||
744 | */ | ||
745 | WARN_ON(S_ISFIFO(inode->i_mode)); | ||
746 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); | ||
747 | if (pipe->inode) | ||
748 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); | ||
749 | ret = __splice_from_pipe(pipe, &sd, actor); | 802 | ret = __splice_from_pipe(pipe, &sd, actor); |
750 | if (pipe->inode) | 803 | pipe_unlock(pipe); |
751 | mutex_unlock(&pipe->inode->i_mutex); | ||
752 | mutex_unlock(&inode->i_mutex); | ||
753 | 804 | ||
754 | return ret; | 805 | return ret; |
755 | } | 806 | } |
756 | 807 | ||
757 | /** | 808 | /** |
758 | * generic_file_splice_write_nolock - generic_file_splice_write without mutexes | 809 | * generic_file_splice_write - splice data from a pipe to a file |
759 | * @pipe: pipe info | 810 | * @pipe: pipe info |
760 | * @out: file to write to | 811 | * @out: file to write to |
761 | * @ppos: position in @out | 812 | * @ppos: position in @out |
@@ -764,13 +815,12 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
764 | * | 815 | * |
765 | * Description: | 816 | * Description: |
766 | * Will either move or copy pages (determined by @flags options) from | 817 | * Will either move or copy pages (determined by @flags options) from |
767 | * the given pipe inode to the given file. The caller is responsible | 818 | * the given pipe inode to the given file. |
768 | * for acquiring i_mutex on both inodes. | ||
769 | * | 819 | * |
770 | */ | 820 | */ |
771 | ssize_t | 821 | ssize_t |
772 | generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, | 822 | generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, |
773 | loff_t *ppos, size_t len, unsigned int flags) | 823 | loff_t *ppos, size_t len, unsigned int flags) |
774 | { | 824 | { |
775 | struct address_space *mapping = out->f_mapping; | 825 | struct address_space *mapping = out->f_mapping; |
776 | struct inode *inode = mapping->host; | 826 | struct inode *inode = mapping->host; |
@@ -781,76 +831,28 @@ generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, | |||
781 | .u.file = out, | 831 | .u.file = out, |
782 | }; | 832 | }; |
783 | ssize_t ret; | 833 | ssize_t ret; |
784 | int err; | ||
785 | |||
786 | err = file_remove_suid(out); | ||
787 | if (unlikely(err)) | ||
788 | return err; | ||
789 | |||
790 | ret = __splice_from_pipe(pipe, &sd, pipe_to_file); | ||
791 | if (ret > 0) { | ||
792 | unsigned long nr_pages; | ||
793 | 834 | ||
794 | *ppos += ret; | 835 | pipe_lock(pipe); |
795 | nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | ||
796 | 836 | ||
797 | /* | 837 | splice_from_pipe_begin(&sd); |
798 | * If file or inode is SYNC and we actually wrote some data, | 838 | do { |
799 | * sync it. | 839 | ret = splice_from_pipe_next(pipe, &sd); |
800 | */ | 840 | if (ret <= 0) |
801 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { | 841 | break; |
802 | err = generic_osync_inode(inode, mapping, | ||
803 | OSYNC_METADATA|OSYNC_DATA); | ||
804 | |||
805 | if (err) | ||
806 | ret = err; | ||
807 | } | ||
808 | balance_dirty_pages_ratelimited_nr(mapping, nr_pages); | ||
809 | } | ||
810 | 842 | ||
811 | return ret; | 843 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD); |
812 | } | 844 | ret = file_remove_suid(out); |
845 | if (!ret) | ||
846 | ret = splice_from_pipe_feed(pipe, &sd, pipe_to_file); | ||
847 | mutex_unlock(&inode->i_mutex); | ||
848 | } while (ret > 0); | ||
849 | splice_from_pipe_end(pipe, &sd); | ||
813 | 850 | ||
814 | EXPORT_SYMBOL(generic_file_splice_write_nolock); | 851 | pipe_unlock(pipe); |
815 | 852 | ||
816 | /** | 853 | if (sd.num_spliced) |
817 | * generic_file_splice_write - splice data from a pipe to a file | 854 | ret = sd.num_spliced; |
818 | * @pipe: pipe info | ||
819 | * @out: file to write to | ||
820 | * @ppos: position in @out | ||
821 | * @len: number of bytes to splice | ||
822 | * @flags: splice modifier flags | ||
823 | * | ||
824 | * Description: | ||
825 | * Will either move or copy pages (determined by @flags options) from | ||
826 | * the given pipe inode to the given file. | ||
827 | * | ||
828 | */ | ||
829 | ssize_t | ||
830 | generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, | ||
831 | loff_t *ppos, size_t len, unsigned int flags) | ||
832 | { | ||
833 | struct address_space *mapping = out->f_mapping; | ||
834 | struct inode *inode = mapping->host; | ||
835 | struct splice_desc sd = { | ||
836 | .total_len = len, | ||
837 | .flags = flags, | ||
838 | .pos = *ppos, | ||
839 | .u.file = out, | ||
840 | }; | ||
841 | ssize_t ret; | ||
842 | 855 | ||
843 | WARN_ON(S_ISFIFO(inode->i_mode)); | ||
844 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); | ||
845 | ret = file_remove_suid(out); | ||
846 | if (likely(!ret)) { | ||
847 | if (pipe->inode) | ||
848 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); | ||
849 | ret = __splice_from_pipe(pipe, &sd, pipe_to_file); | ||
850 | if (pipe->inode) | ||
851 | mutex_unlock(&pipe->inode->i_mutex); | ||
852 | } | ||
853 | mutex_unlock(&inode->i_mutex); | ||
854 | if (ret > 0) { | 856 | if (ret > 0) { |
855 | unsigned long nr_pages; | 857 | unsigned long nr_pages; |
856 | 858 | ||
@@ -1339,8 +1341,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov, | |||
1339 | if (!pipe) | 1341 | if (!pipe) |
1340 | return -EBADF; | 1342 | return -EBADF; |
1341 | 1343 | ||
1342 | if (pipe->inode) | 1344 | pipe_lock(pipe); |
1343 | mutex_lock(&pipe->inode->i_mutex); | ||
1344 | 1345 | ||
1345 | error = ret = 0; | 1346 | error = ret = 0; |
1346 | while (nr_segs) { | 1347 | while (nr_segs) { |
@@ -1395,8 +1396,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov, | |||
1395 | iov++; | 1396 | iov++; |
1396 | } | 1397 | } |
1397 | 1398 | ||
1398 | if (pipe->inode) | 1399 | pipe_unlock(pipe); |
1399 | mutex_unlock(&pipe->inode->i_mutex); | ||
1400 | 1400 | ||
1401 | if (!ret) | 1401 | if (!ret) |
1402 | ret = error; | 1402 | ret = error; |
@@ -1524,7 +1524,7 @@ static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1524 | return 0; | 1524 | return 0; |
1525 | 1525 | ||
1526 | ret = 0; | 1526 | ret = 0; |
1527 | mutex_lock(&pipe->inode->i_mutex); | 1527 | pipe_lock(pipe); |
1528 | 1528 | ||
1529 | while (!pipe->nrbufs) { | 1529 | while (!pipe->nrbufs) { |
1530 | if (signal_pending(current)) { | 1530 | if (signal_pending(current)) { |
@@ -1542,7 +1542,7 @@ static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1542 | pipe_wait(pipe); | 1542 | pipe_wait(pipe); |
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | mutex_unlock(&pipe->inode->i_mutex); | 1545 | pipe_unlock(pipe); |
1546 | return ret; | 1546 | return ret; |
1547 | } | 1547 | } |
1548 | 1548 | ||
@@ -1562,7 +1562,7 @@ static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1562 | return 0; | 1562 | return 0; |
1563 | 1563 | ||
1564 | ret = 0; | 1564 | ret = 0; |
1565 | mutex_lock(&pipe->inode->i_mutex); | 1565 | pipe_lock(pipe); |
1566 | 1566 | ||
1567 | while (pipe->nrbufs >= PIPE_BUFFERS) { | 1567 | while (pipe->nrbufs >= PIPE_BUFFERS) { |
1568 | if (!pipe->readers) { | 1568 | if (!pipe->readers) { |
@@ -1583,7 +1583,7 @@ static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1583 | pipe->waiting_writers--; | 1583 | pipe->waiting_writers--; |
1584 | } | 1584 | } |
1585 | 1585 | ||
1586 | mutex_unlock(&pipe->inode->i_mutex); | 1586 | pipe_unlock(pipe); |
1587 | return ret; | 1587 | return ret; |
1588 | } | 1588 | } |
1589 | 1589 | ||
@@ -1599,10 +1599,10 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1599 | 1599 | ||
1600 | /* | 1600 | /* |
1601 | * Potential ABBA deadlock, work around it by ordering lock | 1601 | * Potential ABBA deadlock, work around it by ordering lock |
1602 | * grabbing by inode address. Otherwise two different processes | 1602 | * grabbing by pipe info address. Otherwise two different processes |
1603 | * could deadlock (one doing tee from A -> B, the other from B -> A). | 1603 | * could deadlock (one doing tee from A -> B, the other from B -> A). |
1604 | */ | 1604 | */ |
1605 | inode_double_lock(ipipe->inode, opipe->inode); | 1605 | pipe_double_lock(ipipe, opipe); |
1606 | 1606 | ||
1607 | do { | 1607 | do { |
1608 | if (!opipe->readers) { | 1608 | if (!opipe->readers) { |
@@ -1653,7 +1653,8 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1653 | if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) | 1653 | if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) |
1654 | ret = -EAGAIN; | 1654 | ret = -EAGAIN; |
1655 | 1655 | ||
1656 | inode_double_unlock(ipipe->inode, opipe->inode); | 1656 | pipe_unlock(ipipe); |
1657 | pipe_unlock(opipe); | ||
1657 | 1658 | ||
1658 | /* | 1659 | /* |
1659 | * If we put data in the output pipe, wakeup any potential readers. | 1660 | * If we put data in the output pipe, wakeup any potential readers. |