The patch titled ext2-reservations-add-truncate_mutex has been removed from the -mm tree. Its filename was ext2-reservations-add-truncate_mutex.patch This patch was dropped because it was folded into ext2-reservations.patch ------------------------------------------------------ Subject: ext2-reservations-add-truncate_mutex From: Andrew Morton <akpm@xxxxxxxx> OK, well this really sucks. ext2 needs ext3's truncate_mutex just to protect the reservation internals in the single case where i_mutex doesn't do it for us: pageout over a MAP_SHARED file hole. And we take that mutex for every block allocation. Perhaps it would be better to just trylock i_mutex in that rare case. trylock it, if writeback_control.for_reclaim == 1. Gets messy. Cc: "Martin J. Bligh" <mbligh@xxxxxxxxxx> Cc: Valerie Henson <val_henson@xxxxxxxxxxxxxxx> Cc: Mingming Cao <cmm@xxxxxxxxxx> Cc: Mel Gorman <mel@xxxxxxxxx> Cc: Hugh Dickins <hugh@xxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- fs/ext2/ext2.h | 8 ++++++++ fs/ext2/file.c | 7 +++++-- fs/ext2/inode.c | 22 ++++++++++++++++++---- fs/ext2/ioctl.c | 2 ++ fs/ext2/super.c | 1 + 5 files changed, 34 insertions(+), 6 deletions(-) diff -puN fs/ext2/ext2.h~ext2-reservations-add-truncate_mutex fs/ext2/ext2.h --- a/fs/ext2/ext2.h~ext2-reservations-add-truncate_mutex +++ a/fs/ext2/ext2.h @@ -52,6 +52,14 @@ struct ext2_inode_info { struct posix_acl *i_default_acl; #endif rwlock_t i_meta_lock; + + /* + * truncate_mutex is for serialising ext2_truncate() against + * ext2_getblock(). It also protects the internals of the inode's + * reservation data structures: ext2_reserve_window and + * ext2_reserve_window_node. + */ + struct mutex truncate_mutex; struct inode vfs_inode; struct list_head i_orphan; /* unlinked but open inodes */ }; diff -puN fs/ext2/file.c~ext2-reservations-add-truncate_mutex fs/ext2/file.c --- a/fs/ext2/file.c~ext2-reservations-add-truncate_mutex +++ a/fs/ext2/file.c @@ -30,8 +30,11 @@ */ static int ext2_release_file (struct inode * inode, struct file * filp) { - if (filp->f_mode & FMODE_WRITE) - ext2_discard_reservation (inode); + if (filp->f_mode & FMODE_WRITE) { + mutex_lock(&EXT2_I(inode)->truncate_mutex); + ext2_discard_reservation(inode); + mutex_unlock(&EXT2_I(inode)->truncate_mutex); + } return 0; } diff -puN fs/ext2/inode.c~ext2-reservations-add-truncate_mutex fs/ext2/inode.c --- a/fs/ext2/inode.c~ext2-reservations-add-truncate_mutex +++ a/fs/ext2/inode.c @@ -630,6 +630,8 @@ reread: if (!create || err == -EIO) goto cleanup; + mutex_lock(&ei->truncate_mutex); + /* * Okay, we need to do block allocation. Lazily initialize the block * allocation info here if necessary @@ -653,8 +655,10 @@ reread: err = ext2_alloc_branch(inode, indirect_blks, &count, goal, offsets + (partial - chain), partial); - if (err) + if (err) { + mutex_unlock(&ei->truncate_mutex); goto cleanup; + } if (ext2_use_xip(inode->i_sb)) { /* @@ -662,12 +666,14 @@ reread: */ err = ext2_clear_xip_target (inode, le32_to_cpu(chain[depth-1].key)); - if (err) + if (err) { + mutex_unlock(&ei->truncate_mutex); goto cleanup; + } } ext2_splice_branch(inode, iblock, partial, indirect_blks, count); - + mutex_unlock(&ei->truncate_mutex); set_buffer_new(bh_result); got_it: map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); @@ -974,9 +980,10 @@ static void ext2_free_branches(struct in ext2_free_data(inode, p, q); } -void ext2_truncate (struct inode * inode) +void ext2_truncate(struct inode *inode) { __le32 *i_data = EXT2_I(inode)->i_data; + struct ext2_inode_info *ei = EXT2_I(inode); int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); int offsets[4]; Indirect chain[4]; @@ -1010,6 +1017,12 @@ void ext2_truncate (struct inode * inode if (n == 0) return; + /* + * From here we block out all ext2_get_block() callers who want to + * modify the block allocation tree. + */ + mutex_lock(&ei->truncate_mutex); + if (n == 1) { ext2_free_data(inode, i_data+offsets[0], i_data + EXT2_NDIR_BLOCKS); @@ -1065,6 +1078,7 @@ do_indirects: ext2_discard_reservation(inode); + mutex_unlock(&ei->truncate_mutex); inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; if (inode_needs_sync(inode)) { sync_mapping_buffers(inode->i_mapping); diff -puN fs/ext2/ioctl.c~ext2-reservations-add-truncate_mutex fs/ext2/ioctl.c --- a/fs/ext2/ioctl.c~ext2-reservations-add-truncate_mutex +++ a/fs/ext2/ioctl.c @@ -116,6 +116,7 @@ int ext2_ioctl (struct inode * inode, st * XXX What lock should protect the rsv_goal_size? * Accessed in ext2_get_block only. ext3 uses i_truncate. */ + mutex_lock(&ei->truncate_mutex); if (!ei->i_block_alloc_info) ext2_init_block_alloc_info(inode); @@ -123,6 +124,7 @@ int ext2_ioctl (struct inode * inode, st struct ext2_reserve_window_node *rsv = &ei->i_block_alloc_info->rsv_window_node; rsv->rsv_goal_size = rsv_window_size; } + mutex_unlock(&ei->truncate_mutex); return 0; } default: diff -puN fs/ext2/super.c~ext2-reservations-add-truncate_mutex fs/ext2/super.c --- a/fs/ext2/super.c~ext2-reservations-add-truncate_mutex +++ a/fs/ext2/super.c @@ -166,6 +166,7 @@ static void init_once(void * foo, kmem_c #ifdef CONFIG_EXT2_FS_XATTR init_rwsem(&ei->xattr_sem); #endif + mutex_init(&ei->truncate_mutex); inode_init_once(&ei->vfs_inode); } } _ Patches currently in -mm which might be from akpm@xxxxxxxx are origin.patch git-acpi.patch video-sysfs-support-take-2-add-dev-argument-for-backlight_device_register.patch acpi-asus-s3-resume-fix.patch sony_apci-resume.patch video-sysfs-support-take-2-add-dev-argument-for-backlight_device_register-sony_acpi-fix.patch git-alsa-fixup.patch git-cpufreq-prep.patch git-cpufreq.patch git-powerpc.patch fix-gregkh-driver-sound-device.patch git-dvb.patch git-dvb-fixup.patch git-gfs2-nmw.patch git-ia64.patch git-input.patch git-input-fixup.patch git-libata-all.patch via-pata-controller-xfer-fixes-fix.patch git-mtd.patch git-netdev-all.patch git-netdev-all-fixup.patch libphy-dont-do-that.patch update-smc91x-driver-with-arm-versatile-board-info.patch drivers-net-ns83820c-add-paramter-to-disable-auto.patch git-net.patch net-uninline-skb_put.patch ioat-warning-fix.patch tidy-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch fix-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch fix-2-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch pci-fix-multiple-problems-with-via-hardware-warning-fix.patch git-scsi-misc.patch drivers-scsi-mca_53c9xc-save_flags-cli-removal.patch git-sas-fixup.patch nokia-e70-is-an-unusual-device.patch git-watchdog.patch pre-x86_64-mm-i386-reloc-abssym.patch post-x86_64-mm-i386-reloc-abssym.patch touchkit-ps-2-touchscreen-driver.patch get-rid-of-zone_table.patch new-scheme-to-preempt-swap-token-tidy.patch balance_pdgat-cleanup.patch add-numa-node-information-to-struct-device-tidy.patch node-aware-skb-allocation-fix-for-device-tree-changes.patch radix-tree-rcu-lockless-readside.patch acx1xx-wireless-driver.patch security-introduce-file-caps-tweaks.patch security-introduce-file-caps-warning-fix.patch swsusp-add-resume_offset-command-line-parameter-rev-2.patch add-include-linux-freezerh-and-move-definitions-from-ueagle-fix.patch add-include-linux-freezerh-and-move-definitions-from-ucb1400_ts-fix.patch cciss-set-sector_size-to-2048-for-performance-tidy.patch deprecate-smbfs-in-favour-of-cifs.patch edac-new-opteron-athlon64-memory-controller-driver.patch kbuild-dont-put-temp-files-in-the-source-tree.patch lockdep-annotate-nfs-nfsd-in-kernel-sockets-tidy.patch drivers-add-lcd-support-3-Kconfig-fix.patch probe_kernel_address-needs-to-do-set_fs.patch slab-use-probe_kernel_address.patch lockdep-spin_lock_irqsave_nested-fix.patch lockdep-spin_lock_irqsave_nested-fix-2.patch aio-use-prepare_to_wait.patch exar-quad-port-serial-fix.patch vfs_getattr-remove-dead-code.patch ext3-uninline-large-functions.patch ext4-uninline-large-functions.patch uninline-module_put.patch sleep-profiling-fixes.patch sleep-profiling-fix.patch debug-workqueue-locking-sanity-fix.patch pcengines-wrap-led-support-fix.patch driver-base-memoryc-remove-warnings-of.patch remove-kernel-syscalls-x86_64-fix.patch protect-ext2-ioctl-modifying-append_only-immutable-etc-with-i_mutex.patch remove-hash_highmem.patch elf-fix-kcore-note-size-calculation-fix.patch reiserfs-add-missing-d-cache-flushing-tweak.patch io-accounting-remove-current-io-accounting.patch io-accounting-core-statistics.patch io-accounting-core-statistics-fix.patch clean-up-__set_page_dirty_nobuffers.patch io-accounting-write-accounting.patch io-accounting-write-cancel-accounting.patch io-accounting-read-accounting.patch io-accounting-read-accounting-nfs-fix.patch io-accounting-read-accounting-cifs-fix.patch io-accounting-metadata-read-accounting.patch io-accounting-direct-io.patch io-accounting-report-in-procfs.patch cleanup-taskstatsh.patch io-accounting-via-taskstats.patch getdelays-various-fixes.patch io-accounting-add-to-getdelays.patch ext2-reservations.patch ext2-reservations-add-truncate_mutex.patch pktcdvd-bio-write-congestion-using-blk_congestion_wait-fix.patch bug-test-1.patch fsstack-introduce-fsstack_copy_attrinode_-tidy.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-fix.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-vs-git-cryptodev.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-ppc-fix.patch add-process_session-helper-routine-deprecate-old-field-tidy.patch add-process_session-helper-routine-deprecate-old-field-fix-warnings.patch add-process_session-helper-routine-deprecate-old-field-fix-warnings-2.patch mxser-session-warning-fix.patch tty-switch-to-ktermios-and-new-framework-warning-fix.patch tty-switch-to-ktermios-bluetooth-fix.patch tty_ioctl-use-termios-for-the-old-structure-and-termios2-fix.patch char-istallion-correct-fail-paths-fix.patch drivers-isdn-handcrafted-min-max-macro-removal-fix.patch fault-injection-capabilities-infrastructure-tidy.patch fault-injection-capabilities-infrastructure-tweaks.patch fault-injection-Kconfig-cleanup.patch fault-injection-stacktrace-filtering-kconfig-fix.patch kernel-schedc-whitespace-cleanups-more.patch swap_prefetch-vs-zoned-counters.patch add-include-linux-freezerh-and-move-definitions-from-prefetch.patch readahead-minmax_ra_pages.patch readahead-sysctl-parameters.patch make-copy_from_user_inatomic-not-zero-the-tail-on-i386-vs-reiser4.patch resier4-add-include-linux-freezerh-and-move-definitions-from.patch make-kmem_cache_destroy-return-void-reiser4.patch reiser4-hardirq-include-fix.patch reiser4-run-truncate_inode_pages-in-reiser4_delete_inode.patch reiser4-get_sb_dev-fix.patch reiser4-vs-zoned-allocator.patch reiser4-temp-fix.patch hpt3xx-rework-rate-filtering-tidy.patch video-get-the-default-mode-from-the-right-database.patch various-fbdev-files-mark-structs-fix.patch md-allow-reads-that-have-bypassed-the-cache-to-be-retried-on-failure-fix.patch statistics-infrastructure-fix-buffer-overflow-in-histogram-with-linear-tidy.patch extend-notifier_call_chain-to-count-nr_calls-made.patch define-and-use-new-eventscpu_lock_acquire-and-cpu_lock_release-fix.patch gtod-persistent-clock-support-i386.patch updated-hrtimers-state-tracking.patch updated-i386-convert-to-clock-event-devices.patch updated-i386-convert-to-clock-event-devices-fix.patch updated-gtod-mark-tsc-unusable-for-highres-timers.patch round_jiffies-infrastructure-fix.patch clocksource-small-cleanup-2-fix.patch kevent_user_wait-retval-fix.patch kevent-v23-socket-notifications-fix-again.patch kevent-timer-notifications-fix.patch nr_blockdev_pages-in_interrupt-warning.patch device-suspend-debug.patch mutex-subsystem-synchro-test-module-fix.patch slab-leaks3-default-y.patch x86-kmap_atomic-debugging.patch restore-rogue-readahead-printk.patch put_bh-debug.patch e1000-printk-warning-fixes.patch acpi_format_exception-debug.patch jmicron-warning-fix.patch squash-ipc-warnings.patch squash-udf-warnings.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html