aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
Commit message (Expand)AuthorAge
* [XFS] Ensure the inode is joined in xfs_itruncate_finishDavid Chinner2008-04-17
* [XFS] xfs_iflush_fork() never returns an error.David Chinner2008-04-17
* [XFS] Ensure xfs_bawrite() errors are checked.David Chinner2008-04-17
* [XFS] Propagate errors from xfs_trans_commit().David Chinner2008-04-17
* [XFS] Use xfs_inode_clean() in more placesDavid Chinner2008-04-17
* [XFS] Remove the xfs_icluster structureDavid Chinner2008-04-17
* [XFS] Don't block pdflush when writing back inodesDavid Chinner2008-04-17
* [XFS] Factor xfs_itobp() and xfs_inotobp().David Chinner2008-04-17
* [XFS] remove shouting-indirection macros from xfs_sb.hEric Sandeen2008-04-10
* [XFS] use generic_permissionChristoph Hellwig2008-02-07
* [XFS] Remove CFORK macros and use code directly in IFORK and DFORK macros.Christoph Hellwig2008-02-07
* [XFS] Use kernel-supplied "roundup_pow_of_two" for simplicityRobert P. J. Day2008-02-07
* [XFS] optimize XFS_IS_REALTIME_INODE w/o realtime configEric Sandeen2008-02-07
* [XFS] Fix inode allocation latencyDavid Chinner2008-02-07
* [XFS] Make xfs_bulkstat() to report unlinked but referenced inodesVlad Apostolov2008-02-07
* [XFS] kill xfs_iocore_tChristoph Hellwig2008-02-07
* [XFS] Unwrap AIL_LOCKDonald Douwsma2008-02-07
* [XFS] kill unnessecary ioops indirectionLachlan McIlroy2008-02-07
* [XFS] clean up vnode/inode tracingLachlan McIlroy2008-02-07
* [XFS] Don't wait for pending I/Os when purging blocks beyond eof.Lachlan McIlroy2007-12-18
* [XFS] get_bulkall() could return incorrect inode stateVlad Apostolov2007-10-15
* [XFS] kill the vfs_flags member in struct bhv_vfsChristoph Hellwig2007-10-15
* [XFS] call common xfs vfs-level helpers directly and remove vfs operationsChristoph Hellwig2007-10-15
* [XFS] move v_trace from bhv_vnode to xfs_inodeChristoph Hellwig2007-10-15
* [XFS] move v_iocount from bhv_vnode to xfs_inodeChristoph Hellwig2007-10-15
* [XFS] kill v_vfsp member from struct bhv_vnodeChristoph Hellwig2007-10-15
* [XFS] call common xfs vnode-level helpers directly and remove vnode operationsChristoph Hellwig2007-10-15
* [XFS] Radix tree based inode cachingDavid Chinner2007-10-15
* [XFS] dinode endianess annotationsChristoph Hellwig2007-10-15
* [XFS] move linux/log2.h header to xfs_linux.hEric Sandeen2007-10-15
* [XFS] endianess annotations for xfs_bmbt_rec_tChristoph Hellwig2007-10-15
* [XFS] split ondisk vs incore versions of xfs_bmbt_rec_tChristoph Hellwig2007-10-15
* [XFS] Clean up function name handling in tracing codeEric Sandeen2007-07-14
* [XFS] Quota inode has no parent.David Chinner2007-07-14
* [XFS] Concurrent Multi-File Data StreamsDavid Chinner2007-07-14
* [XFS] Use is_power_of_2 instead of open coding checksVignesh Babu2007-07-14
* [XFS] Fix to prevent the notorious 'NULL files' problem after a crash.Lachlan McIlroy2007-05-07
* [XFS] propogate return codes from flush routinesLachlan McIlroy2007-05-07
* [XFS] The last argument "lsn" of xfs_trans_commit() is always called withEric Sandeen2007-05-07
* [XFS] Remove unused header files for MAC and CAP checking functionality.Eric Sandeen2007-02-10
* [XFS] Remove unused argument to xfs_bmap_finishEric Sandeen2007-02-10
* [XFS] Fix callers of xfs_iozero() to zero the correct range.Lachlan McIlroy2007-02-10
* [XFS] Fix inode log item use-after-free on forced shutdownDavid Chinner2007-02-10
* [XFS] Keep stack usage down for 4k stacks by using noinline.David Chinner2007-02-10
* [XFS] Stale the correct inode when freeing clusters.David Chinner2006-11-21
* [XFS] Prevent a deadlock when xfslogd unpins inodes.David Chinner2006-11-11
* [XFS] Clean up i_flags and i_flags_lock handling.David Chinner2006-11-11
* [XFS] Really fix use after free in xfs_iunpin.David Chinner2006-09-27
* [XFS] Remove last bulkstat false-positives with debug kernels.Nathan Scott2006-09-27
* [XFS] Ensure bulkstat from an invalid inode number gets caught always withNathan Scott2006-07-28
ogus wakeup\n"); continue; } spin_unlock_irq(&pdflush_lock); (*my_work->fn)(my_work->arg0); /* * Thread creation: For how long have there been zero * available threads? */ if (jiffies - last_empty_jifs > 1 * HZ) { /* unlocked list_empty() test is OK here */ if (list_empty(&pdflush_list)) { /* unlocked test is OK here */ if (nr_pdflush_threads < MAX_PDFLUSH_THREADS) start_one_pdflush_thread(); } } spin_lock_irq(&pdflush_lock); my_work->fn = NULL; /* * Thread destruction: For how long has the sleepiest * thread slept? */ if (list_empty(&pdflush_list)) continue; if (nr_pdflush_threads <= MIN_PDFLUSH_THREADS) continue; pdf = list_entry(pdflush_list.prev, struct pdflush_work, list); if (jiffies - pdf->when_i_went_to_sleep > 1 * HZ) { /* Limit exit rate */ pdf->when_i_went_to_sleep = jiffies; break; /* exeunt */ } } nr_pdflush_threads--; spin_unlock_irq(&pdflush_lock); return 0; } /* * Of course, my_work wants to be just a local in __pdflush(). It is * separated out in this manner to hopefully prevent the compiler from * performing unfortunate optimisations against the auto variables. Because * these are visible to other tasks and CPUs. (No problem has actually * been observed. This is just paranoia). */ static int pdflush(void *dummy) { struct pdflush_work my_work; cpumask_t cpus_allowed; /* * pdflush can spend a lot of time doing encryption via dm-crypt. We * don't want to do that at keventd's priority. */ set_user_nice(current, 0); /* * Some configs put our parent kthread in a limited cpuset, * which kthread() overrides, forcing cpus_allowed == CPU_MASK_ALL. * Our needs are more modest - cut back to our cpusets cpus_allowed. * This is needed as pdflush's are dynamically created and destroyed. * The boottime pdflush's are easily placed w/o these 2 lines. */ cpuset_cpus_allowed(current, &cpus_allowed); set_cpus_allowed_ptr(current, &cpus_allowed); return __pdflush(&my_work); } /* * Attempt to wake up a pdflush thread, and get it to do some work for you. * Returns zero if it indeed managed to find a worker thread, and passed your * payload to it. */ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0) { unsigned long flags; int ret = 0; BUG_ON(fn == NULL); /* Hard to diagnose if it's deferred */ spin_lock_irqsave(&pdflush_lock, flags); if (list_empty(&pdflush_list)) { ret = -1; } else { struct pdflush_work *pdf; pdf = list_entry(pdflush_list.next, struct pdflush_work, list); list_del_init(&pdf->list); if (list_empty(&pdflush_list)) last_empty_jifs = jiffies; pdf->fn = fn; pdf->arg0 = arg0; wake_up_process(pdf->who); } spin_unlock_irqrestore(&pdflush_lock, flags); return ret; } static void start_one_pdflush_thread(void) { kthread_run(pdflush, NULL, "pdflush"); } static int __init pdflush_init(void) { int i; for (i = 0; i < MIN_PDFLUSH_THREADS; i++) start_one_pdflush_thread(); return 0; } module_init(pdflush_init);