Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs

* 'for-linus' of git://oss.sgi.com/xfs/xfs:
  xfs: event tracing support
  xfs: change the xfs_iext_insert / xfs_iext_remove
  xfs: cleanup bmap extent state macros
This commit is contained in:
Linus Torvalds 2009-12-15 09:12:43 -08:00
commit d180ec5d34
70 changed files with 2368 additions and 2835 deletions

View File

@ -26,6 +26,8 @@ endif
obj-$(CONFIG_XFS_FS) += xfs.o obj-$(CONFIG_XFS_FS) += xfs.o
xfs-y += linux-2.6/xfs_trace.o
xfs-$(CONFIG_XFS_QUOTA) += $(addprefix quota/, \ xfs-$(CONFIG_XFS_QUOTA) += $(addprefix quota/, \
xfs_dquot.o \ xfs_dquot.o \
xfs_dquot_item.o \ xfs_dquot_item.o \
@ -90,8 +92,7 @@ xfs-y += xfs_alloc.o \
xfs_rw.o \ xfs_rw.o \
xfs_dmops.o xfs_dmops.o
xfs-$(CONFIG_XFS_TRACE) += xfs_btree_trace.o \ xfs-$(CONFIG_XFS_TRACE) += xfs_btree_trace.o
xfs_dir2_trace.o
# Objects in linux/ # Objects in linux/
xfs-y += $(addprefix $(XFS_LINUX)/, \ xfs-y += $(addprefix $(XFS_LINUX)/, \
@ -113,6 +114,3 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \
xfs-y += $(addprefix support/, \ xfs-y += $(addprefix support/, \
debug.o \ debug.o \
uuid.o) uuid.o)
xfs-$(CONFIG_XFS_TRACE) += support/ktrace.o

View File

@ -21,6 +21,7 @@
#include "xfs_bmap_btree.h" #include "xfs_bmap_btree.h"
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
#include <linux/xattr.h> #include <linux/xattr.h>
#include <linux/posix_acl_xattr.h> #include <linux/posix_acl_xattr.h>

View File

@ -38,6 +38,7 @@
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_iomap.h" #include "xfs_iomap.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
#include <linux/mpage.h> #include <linux/mpage.h>
#include <linux/pagevec.h> #include <linux/pagevec.h>
#include <linux/writeback.h> #include <linux/writeback.h>
@ -76,7 +77,7 @@ xfs_ioend_wake(
wake_up(to_ioend_wq(ip)); wake_up(to_ioend_wq(ip));
} }
STATIC void void
xfs_count_page_state( xfs_count_page_state(
struct page *page, struct page *page,
int *delalloc, int *delalloc,
@ -98,48 +99,6 @@ xfs_count_page_state(
} while ((bh = bh->b_this_page) != head); } while ((bh = bh->b_this_page) != head);
} }
#if defined(XFS_RW_TRACE)
void
xfs_page_trace(
int tag,
struct inode *inode,
struct page *page,
unsigned long pgoff)
{
xfs_inode_t *ip;
loff_t isize = i_size_read(inode);
loff_t offset = page_offset(page);
int delalloc = -1, unmapped = -1, unwritten = -1;
if (page_has_buffers(page))
xfs_count_page_state(page, &delalloc, &unmapped, &unwritten);
ip = XFS_I(inode);
if (!ip->i_rwtrace)
return;
ktrace_enter(ip->i_rwtrace,
(void *)((unsigned long)tag),
(void *)ip,
(void *)inode,
(void *)page,
(void *)pgoff,
(void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)),
(void *)((unsigned long)((isize >> 32) & 0xffffffff)),
(void *)((unsigned long)(isize & 0xffffffff)),
(void *)((unsigned long)((offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(offset & 0xffffffff)),
(void *)((unsigned long)delalloc),
(void *)((unsigned long)unmapped),
(void *)((unsigned long)unwritten),
(void *)((unsigned long)current_pid()),
(void *)NULL);
}
#else
#define xfs_page_trace(tag, inode, page, pgoff)
#endif
STATIC struct block_device * STATIC struct block_device *
xfs_find_bdev_for_inode( xfs_find_bdev_for_inode(
struct xfs_inode *ip) struct xfs_inode *ip)
@ -1202,7 +1161,7 @@ xfs_vm_writepage(
int delalloc, unmapped, unwritten; int delalloc, unmapped, unwritten;
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
xfs_page_trace(XFS_WRITEPAGE_ENTER, inode, page, 0); trace_xfs_writepage(inode, page, 0);
/* /*
* We need a transaction if: * We need a transaction if:
@ -1307,7 +1266,7 @@ xfs_vm_releasepage(
.nr_to_write = 1, .nr_to_write = 1,
}; };
xfs_page_trace(XFS_RELEASEPAGE_ENTER, inode, page, 0); trace_xfs_releasepage(inode, page, 0);
if (!page_has_buffers(page)) if (!page_has_buffers(page))
return 0; return 0;
@ -1587,8 +1546,7 @@ xfs_vm_invalidatepage(
struct page *page, struct page *page,
unsigned long offset) unsigned long offset)
{ {
xfs_page_trace(XFS_INVALIDPAGE_ENTER, trace_xfs_invalidatepage(page->mapping->host, page, offset);
page->mapping->host, page, offset);
block_invalidatepage(page, offset); block_invalidatepage(page, offset);
} }

View File

@ -45,4 +45,6 @@ extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int);
extern void xfs_ioend_init(void); extern void xfs_ioend_init(void);
extern void xfs_ioend_wait(struct xfs_inode *); extern void xfs_ioend_wait(struct xfs_inode *);
extern void xfs_count_page_state(struct page *, int *, int *, int *);
#endif /* __XFS_AOPS_H__ */ #endif /* __XFS_AOPS_H__ */

View File

@ -39,6 +39,7 @@
#include "xfs_ag.h" #include "xfs_ag.h"
#include "xfs_dmapi.h" #include "xfs_dmapi.h"
#include "xfs_mount.h" #include "xfs_mount.h"
#include "xfs_trace.h"
static kmem_zone_t *xfs_buf_zone; static kmem_zone_t *xfs_buf_zone;
STATIC int xfsbufd(void *); STATIC int xfsbufd(void *);
@ -53,34 +54,6 @@ static struct workqueue_struct *xfslogd_workqueue;
struct workqueue_struct *xfsdatad_workqueue; struct workqueue_struct *xfsdatad_workqueue;
struct workqueue_struct *xfsconvertd_workqueue; struct workqueue_struct *xfsconvertd_workqueue;
#ifdef XFS_BUF_TRACE
void
xfs_buf_trace(
xfs_buf_t *bp,
char *id,
void *data,
void *ra)
{
ktrace_enter(xfs_buf_trace_buf,
bp, id,
(void *)(unsigned long)bp->b_flags,
(void *)(unsigned long)bp->b_hold.counter,
(void *)(unsigned long)bp->b_sema.count,
(void *)current,
data, ra,
(void *)(unsigned long)((bp->b_file_offset>>32) & 0xffffffff),
(void *)(unsigned long)(bp->b_file_offset & 0xffffffff),
(void *)(unsigned long)bp->b_buffer_length,
NULL, NULL, NULL, NULL, NULL);
}
ktrace_t *xfs_buf_trace_buf;
#define XFS_BUF_TRACE_SIZE 4096
#define XB_TRACE(bp, id, data) \
xfs_buf_trace(bp, id, (void *)data, (void *)__builtin_return_address(0))
#else
#define XB_TRACE(bp, id, data) do { } while (0)
#endif
#ifdef XFS_BUF_LOCK_TRACKING #ifdef XFS_BUF_LOCK_TRACKING
# define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) # define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid)
# define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) # define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1)
@ -279,7 +252,8 @@ _xfs_buf_initialize(
init_waitqueue_head(&bp->b_waiters); init_waitqueue_head(&bp->b_waiters);
XFS_STATS_INC(xb_create); XFS_STATS_INC(xb_create);
XB_TRACE(bp, "initialize", target);
trace_xfs_buf_init(bp, _RET_IP_);
} }
/* /*
@ -332,7 +306,7 @@ void
xfs_buf_free( xfs_buf_free(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
XB_TRACE(bp, "free", 0); trace_xfs_buf_free(bp, _RET_IP_);
ASSERT(list_empty(&bp->b_hash_list)); ASSERT(list_empty(&bp->b_hash_list));
@ -445,7 +419,6 @@ _xfs_buf_lookup_pages(
if (page_count == bp->b_page_count) if (page_count == bp->b_page_count)
bp->b_flags |= XBF_DONE; bp->b_flags |= XBF_DONE;
XB_TRACE(bp, "lookup_pages", (long)page_count);
return error; return error;
} }
@ -548,7 +521,6 @@ _xfs_buf_find(
if (down_trylock(&bp->b_sema)) { if (down_trylock(&bp->b_sema)) {
if (!(flags & XBF_TRYLOCK)) { if (!(flags & XBF_TRYLOCK)) {
/* wait for buffer ownership */ /* wait for buffer ownership */
XB_TRACE(bp, "get_lock", 0);
xfs_buf_lock(bp); xfs_buf_lock(bp);
XFS_STATS_INC(xb_get_locked_waited); XFS_STATS_INC(xb_get_locked_waited);
} else { } else {
@ -571,7 +543,8 @@ _xfs_buf_find(
ASSERT((bp->b_flags & _XBF_DELWRI_Q) == 0); ASSERT((bp->b_flags & _XBF_DELWRI_Q) == 0);
bp->b_flags &= XBF_MAPPED; bp->b_flags &= XBF_MAPPED;
} }
XB_TRACE(bp, "got_lock", 0);
trace_xfs_buf_find(bp, flags, _RET_IP_);
XFS_STATS_INC(xb_get_locked); XFS_STATS_INC(xb_get_locked);
return bp; return bp;
} }
@ -627,7 +600,7 @@ xfs_buf_get(
bp->b_bn = ioff; bp->b_bn = ioff;
bp->b_count_desired = bp->b_buffer_length; bp->b_count_desired = bp->b_buffer_length;
XB_TRACE(bp, "get", (unsigned long)flags); trace_xfs_buf_get(bp, flags, _RET_IP_);
return bp; return bp;
no_buffer: no_buffer:
@ -644,8 +617,6 @@ _xfs_buf_read(
{ {
int status; int status;
XB_TRACE(bp, "_xfs_buf_read", (unsigned long)flags);
ASSERT(!(flags & (XBF_DELWRI|XBF_WRITE))); ASSERT(!(flags & (XBF_DELWRI|XBF_WRITE)));
ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL); ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL);
@ -673,19 +644,18 @@ xfs_buf_read(
bp = xfs_buf_get(target, ioff, isize, flags); bp = xfs_buf_get(target, ioff, isize, flags);
if (bp) { if (bp) {
trace_xfs_buf_read(bp, flags, _RET_IP_);
if (!XFS_BUF_ISDONE(bp)) { if (!XFS_BUF_ISDONE(bp)) {
XB_TRACE(bp, "read", (unsigned long)flags);
XFS_STATS_INC(xb_get_read); XFS_STATS_INC(xb_get_read);
_xfs_buf_read(bp, flags); _xfs_buf_read(bp, flags);
} else if (flags & XBF_ASYNC) { } else if (flags & XBF_ASYNC) {
XB_TRACE(bp, "read_async", (unsigned long)flags);
/* /*
* Read ahead call which is already satisfied, * Read ahead call which is already satisfied,
* drop the buffer * drop the buffer
*/ */
goto no_buffer; goto no_buffer;
} else { } else {
XB_TRACE(bp, "read_done", (unsigned long)flags);
/* We do not want read in the flags */ /* We do not want read in the flags */
bp->b_flags &= ~XBF_READ; bp->b_flags &= ~XBF_READ;
} }
@ -823,7 +793,7 @@ xfs_buf_get_noaddr(
xfs_buf_unlock(bp); xfs_buf_unlock(bp);
XB_TRACE(bp, "no_daddr", len); trace_xfs_buf_get_noaddr(bp, _RET_IP_);
return bp; return bp;
fail_free_mem: fail_free_mem:
@ -845,8 +815,8 @@ void
xfs_buf_hold( xfs_buf_hold(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
trace_xfs_buf_hold(bp, _RET_IP_);
atomic_inc(&bp->b_hold); atomic_inc(&bp->b_hold);
XB_TRACE(bp, "hold", 0);
} }
/* /*
@ -859,7 +829,7 @@ xfs_buf_rele(
{ {
xfs_bufhash_t *hash = bp->b_hash; xfs_bufhash_t *hash = bp->b_hash;
XB_TRACE(bp, "rele", bp->b_relse); trace_xfs_buf_rele(bp, _RET_IP_);
if (unlikely(!hash)) { if (unlikely(!hash)) {
ASSERT(!bp->b_relse); ASSERT(!bp->b_relse);
@ -909,21 +879,19 @@ xfs_buf_cond_lock(
int locked; int locked;
locked = down_trylock(&bp->b_sema) == 0; locked = down_trylock(&bp->b_sema) == 0;
if (locked) { if (locked)
XB_SET_OWNER(bp); XB_SET_OWNER(bp);
}
XB_TRACE(bp, "cond_lock", (long)locked); trace_xfs_buf_cond_lock(bp, _RET_IP_);
return locked ? 0 : -EBUSY; return locked ? 0 : -EBUSY;
} }
#if defined(DEBUG) || defined(XFS_BLI_TRACE)
int int
xfs_buf_lock_value( xfs_buf_lock_value(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
return bp->b_sema.count; return bp->b_sema.count;
} }
#endif
/* /*
* Locks a buffer object. * Locks a buffer object.
@ -935,12 +903,14 @@ void
xfs_buf_lock( xfs_buf_lock(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
XB_TRACE(bp, "lock", 0); trace_xfs_buf_lock(bp, _RET_IP_);
if (atomic_read(&bp->b_io_remaining)) if (atomic_read(&bp->b_io_remaining))
blk_run_address_space(bp->b_target->bt_mapping); blk_run_address_space(bp->b_target->bt_mapping);
down(&bp->b_sema); down(&bp->b_sema);
XB_SET_OWNER(bp); XB_SET_OWNER(bp);
XB_TRACE(bp, "locked", 0);
trace_xfs_buf_lock_done(bp, _RET_IP_);
} }
/* /*
@ -962,7 +932,8 @@ xfs_buf_unlock(
XB_CLEAR_OWNER(bp); XB_CLEAR_OWNER(bp);
up(&bp->b_sema); up(&bp->b_sema);
XB_TRACE(bp, "unlock", 0);
trace_xfs_buf_unlock(bp, _RET_IP_);
} }
@ -974,17 +945,18 @@ void
xfs_buf_pin( xfs_buf_pin(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
trace_xfs_buf_pin(bp, _RET_IP_);
atomic_inc(&bp->b_pin_count); atomic_inc(&bp->b_pin_count);
XB_TRACE(bp, "pin", (long)bp->b_pin_count.counter);
} }
void void
xfs_buf_unpin( xfs_buf_unpin(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
trace_xfs_buf_unpin(bp, _RET_IP_);
if (atomic_dec_and_test(&bp->b_pin_count)) if (atomic_dec_and_test(&bp->b_pin_count))
wake_up_all(&bp->b_waiters); wake_up_all(&bp->b_waiters);
XB_TRACE(bp, "unpin", (long)bp->b_pin_count.counter);
} }
int int
@ -1035,7 +1007,7 @@ xfs_buf_iodone_work(
*/ */
if ((bp->b_error == EOPNOTSUPP) && if ((bp->b_error == EOPNOTSUPP) &&
(bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) { (bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) {
XB_TRACE(bp, "ordered_retry", bp->b_iodone); trace_xfs_buf_ordered_retry(bp, _RET_IP_);
bp->b_flags &= ~XBF_ORDERED; bp->b_flags &= ~XBF_ORDERED;
bp->b_flags |= _XFS_BARRIER_FAILED; bp->b_flags |= _XFS_BARRIER_FAILED;
xfs_buf_iorequest(bp); xfs_buf_iorequest(bp);
@ -1050,12 +1022,12 @@ xfs_buf_ioend(
xfs_buf_t *bp, xfs_buf_t *bp,
int schedule) int schedule)
{ {
trace_xfs_buf_iodone(bp, _RET_IP_);
bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD);
if (bp->b_error == 0) if (bp->b_error == 0)
bp->b_flags |= XBF_DONE; bp->b_flags |= XBF_DONE;
XB_TRACE(bp, "iodone", bp->b_iodone);
if ((bp->b_iodone) || (bp->b_flags & XBF_ASYNC)) { if ((bp->b_iodone) || (bp->b_flags & XBF_ASYNC)) {
if (schedule) { if (schedule) {
INIT_WORK(&bp->b_iodone_work, xfs_buf_iodone_work); INIT_WORK(&bp->b_iodone_work, xfs_buf_iodone_work);
@ -1075,7 +1047,7 @@ xfs_buf_ioerror(
{ {
ASSERT(error >= 0 && error <= 0xffff); ASSERT(error >= 0 && error <= 0xffff);
bp->b_error = (unsigned short)error; bp->b_error = (unsigned short)error;
XB_TRACE(bp, "ioerror", (unsigned long)error); trace_xfs_buf_ioerror(bp, error, _RET_IP_);
} }
int int
@ -1083,7 +1055,7 @@ xfs_bawrite(
void *mp, void *mp,
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
XB_TRACE(bp, "bawrite", 0); trace_xfs_buf_bawrite(bp, _RET_IP_);
ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL); ASSERT(bp->b_bn != XFS_BUF_DADDR_NULL);
@ -1102,7 +1074,7 @@ xfs_bdwrite(
void *mp, void *mp,
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
XB_TRACE(bp, "bdwrite", 0); trace_xfs_buf_bdwrite(bp, _RET_IP_);
bp->b_strat = xfs_bdstrat_cb; bp->b_strat = xfs_bdstrat_cb;
bp->b_mount = mp; bp->b_mount = mp;
@ -1253,7 +1225,7 @@ int
xfs_buf_iorequest( xfs_buf_iorequest(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
XB_TRACE(bp, "iorequest", 0); trace_xfs_buf_iorequest(bp, _RET_IP_);
if (bp->b_flags & XBF_DELWRI) { if (bp->b_flags & XBF_DELWRI) {
xfs_buf_delwri_queue(bp, 1); xfs_buf_delwri_queue(bp, 1);
@ -1287,11 +1259,13 @@ int
xfs_buf_iowait( xfs_buf_iowait(
xfs_buf_t *bp) xfs_buf_t *bp)
{ {
XB_TRACE(bp, "iowait", 0); trace_xfs_buf_iowait(bp, _RET_IP_);
if (atomic_read(&bp->b_io_remaining)) if (atomic_read(&bp->b_io_remaining))
blk_run_address_space(bp->b_target->bt_mapping); blk_run_address_space(bp->b_target->bt_mapping);
wait_for_completion(&bp->b_iowait); wait_for_completion(&bp->b_iowait);
XB_TRACE(bp, "iowaited", (long)bp->b_error);
trace_xfs_buf_iowait_done(bp, _RET_IP_);
return bp->b_error; return bp->b_error;
} }
@ -1604,7 +1578,8 @@ xfs_buf_delwri_queue(
struct list_head *dwq = &bp->b_target->bt_delwrite_queue; struct list_head *dwq = &bp->b_target->bt_delwrite_queue;
spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock;
XB_TRACE(bp, "delwri_q", (long)unlock); trace_xfs_buf_delwri_queue(bp, _RET_IP_);
ASSERT((bp->b_flags&(XBF_DELWRI|XBF_ASYNC)) == (XBF_DELWRI|XBF_ASYNC)); ASSERT((bp->b_flags&(XBF_DELWRI|XBF_ASYNC)) == (XBF_DELWRI|XBF_ASYNC));
spin_lock(dwlk); spin_lock(dwlk);
@ -1644,7 +1619,7 @@ xfs_buf_delwri_dequeue(
if (dequeued) if (dequeued)
xfs_buf_rele(bp); xfs_buf_rele(bp);
XB_TRACE(bp, "delwri_dq", (long)dequeued); trace_xfs_buf_delwri_dequeue(bp, _RET_IP_);
} }
STATIC void STATIC void
@ -1692,7 +1667,7 @@ xfs_buf_delwri_split(
INIT_LIST_HEAD(list); INIT_LIST_HEAD(list);
spin_lock(dwlk); spin_lock(dwlk);
list_for_each_entry_safe(bp, n, dwq, b_list) { list_for_each_entry_safe(bp, n, dwq, b_list) {
XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp)); trace_xfs_buf_delwri_split(bp, _RET_IP_);
ASSERT(bp->b_flags & XBF_DELWRI); ASSERT(bp->b_flags & XBF_DELWRI);
if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) {
@ -1816,14 +1791,10 @@ xfs_flush_buftarg(
int __init int __init
xfs_buf_init(void) xfs_buf_init(void)
{ {
#ifdef XFS_BUF_TRACE
xfs_buf_trace_buf = ktrace_alloc(XFS_BUF_TRACE_SIZE, KM_NOFS);
#endif
xfs_buf_zone = kmem_zone_init_flags(sizeof(xfs_buf_t), "xfs_buf", xfs_buf_zone = kmem_zone_init_flags(sizeof(xfs_buf_t), "xfs_buf",
KM_ZONE_HWALIGN, NULL); KM_ZONE_HWALIGN, NULL);
if (!xfs_buf_zone) if (!xfs_buf_zone)
goto out_free_trace_buf; goto out;
xfslogd_workqueue = create_workqueue("xfslogd"); xfslogd_workqueue = create_workqueue("xfslogd");
if (!xfslogd_workqueue) if (!xfslogd_workqueue)
@ -1846,10 +1817,7 @@ xfs_buf_init(void)
destroy_workqueue(xfslogd_workqueue); destroy_workqueue(xfslogd_workqueue);
out_free_buf_zone: out_free_buf_zone:
kmem_zone_destroy(xfs_buf_zone); kmem_zone_destroy(xfs_buf_zone);
out_free_trace_buf: out:
#ifdef XFS_BUF_TRACE
ktrace_free(xfs_buf_trace_buf);
#endif
return -ENOMEM; return -ENOMEM;
} }
@ -1861,9 +1829,6 @@ xfs_buf_terminate(void)
destroy_workqueue(xfsdatad_workqueue); destroy_workqueue(xfsdatad_workqueue);
destroy_workqueue(xfslogd_workqueue); destroy_workqueue(xfslogd_workqueue);
kmem_zone_destroy(xfs_buf_zone); kmem_zone_destroy(xfs_buf_zone);
#ifdef XFS_BUF_TRACE
ktrace_free(xfs_buf_trace_buf);
#endif
} }
#ifdef CONFIG_KDB_MODULES #ifdef CONFIG_KDB_MODULES

View File

@ -95,6 +95,28 @@ typedef enum {
_XFS_BARRIER_FAILED = (1 << 23), _XFS_BARRIER_FAILED = (1 << 23),
} xfs_buf_flags_t; } xfs_buf_flags_t;
#define XFS_BUF_FLAGS \
{ XBF_READ, "READ" }, \
{ XBF_WRITE, "WRITE" }, \
{ XBF_MAPPED, "MAPPED" }, \
{ XBF_ASYNC, "ASYNC" }, \
{ XBF_DONE, "DONE" }, \
{ XBF_DELWRI, "DELWRI" }, \
{ XBF_STALE, "STALE" }, \
{ XBF_FS_MANAGED, "FS_MANAGED" }, \
{ XBF_ORDERED, "ORDERED" }, \
{ XBF_READ_AHEAD, "READ_AHEAD" }, \
{ XBF_LOCK, "LOCK" }, /* should never be set */\
{ XBF_TRYLOCK, "TRYLOCK" }, /* ditto */\
{ XBF_DONT_BLOCK, "DONT_BLOCK" }, /* ditto */\
{ _XBF_PAGE_CACHE, "PAGE_CACHE" }, \
{ _XBF_PAGES, "PAGES" }, \
{ _XBF_RUN_QUEUES, "RUN_QUEUES" }, \
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
{ _XBF_PAGE_LOCKED, "PAGE_LOCKED" }, \
{ _XFS_BARRIER_FAILED, "BARRIER_FAILED" }
typedef enum { typedef enum {
XBT_FORCE_SLEEP = 0, XBT_FORCE_SLEEP = 0,
XBT_FORCE_FLUSH = 1, XBT_FORCE_FLUSH = 1,
@ -243,13 +265,6 @@ extern void xfs_buf_delwri_dequeue(xfs_buf_t *);
extern int xfs_buf_init(void); extern int xfs_buf_init(void);
extern void xfs_buf_terminate(void); extern void xfs_buf_terminate(void);
#ifdef XFS_BUF_TRACE
extern ktrace_t *xfs_buf_trace_buf;
extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *);
#else
#define xfs_buf_trace(bp,id,ptr,ra) do { } while (0)
#endif
#define xfs_buf_target_name(target) \ #define xfs_buf_target_name(target) \
({ char __b[BDEVNAME_SIZE]; bdevname((target)->bt_bdev, __b); __b; }) ({ char __b[BDEVNAME_SIZE]; bdevname((target)->bt_bdev, __b); __b; })
@ -365,10 +380,6 @@ static inline void xfs_buf_relse(xfs_buf_t *bp)
#define xfs_bpin(bp) xfs_buf_pin(bp) #define xfs_bpin(bp) xfs_buf_pin(bp)
#define xfs_bunpin(bp) xfs_buf_unpin(bp) #define xfs_bunpin(bp) xfs_buf_unpin(bp)
#define xfs_buftrace(id, bp) \
xfs_buf_trace(bp, id, NULL, (void *)__builtin_return_address(0))
#define xfs_biodone(bp) xfs_buf_ioend(bp, 0) #define xfs_biodone(bp) xfs_buf_ioend(bp, 0)
#define xfs_biomove(bp, off, len, data, rw) \ #define xfs_biomove(bp, off, len, data, rw) \

View File

@ -19,6 +19,7 @@
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_bmap_btree.h" #include "xfs_bmap_btree.h"
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_trace.h"
int fs_noerr(void) { return 0; } int fs_noerr(void) { return 0; }
int fs_nosys(void) { return ENOSYS; } int fs_nosys(void) { return ENOSYS; }
@ -51,6 +52,8 @@ xfs_flushinval_pages(
struct address_space *mapping = VFS_I(ip)->i_mapping; struct address_space *mapping = VFS_I(ip)->i_mapping;
int ret = 0; int ret = 0;
trace_xfs_pagecache_inval(ip, first, last);
if (mapping->nrpages) { if (mapping->nrpages) {
xfs_iflags_clear(ip, XFS_ITRUNCATED); xfs_iflags_clear(ip, XFS_ITRUNCATED);
ret = filemap_write_and_wait(mapping); ret = filemap_write_and_wait(mapping);

View File

@ -51,6 +51,7 @@
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_export.h" #include "xfs_export.h"
#include "xfs_trace.h"
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/dcache.h> #include <linux/dcache.h>

View File

@ -46,6 +46,7 @@
#include "xfs_attr.h" #include "xfs_attr.h"
#include "xfs_ioctl.h" #include "xfs_ioctl.h"
#include "xfs_ioctl32.h" #include "xfs_ioctl32.h"
#include "xfs_trace.h"
#define _NATIVE_IOC(cmd, type) \ #define _NATIVE_IOC(cmd, type) \
_IOC(_IOC_DIR(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd), sizeof(type)) _IOC(_IOC_DIR(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd), sizeof(type))

View File

@ -47,6 +47,7 @@
#include "xfs_buf_item.h" #include "xfs_buf_item.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/xattr.h> #include <linux/xattr.h>

View File

@ -40,7 +40,6 @@
#include <sv.h> #include <sv.h>
#include <time.h> #include <time.h>
#include <support/ktrace.h>
#include <support/debug.h> #include <support/debug.h>
#include <support/uuid.h> #include <support/uuid.h>

View File

@ -48,73 +48,12 @@
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_iomap.h" #include "xfs_iomap.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/writeback.h> #include <linux/writeback.h>
#if defined(XFS_RW_TRACE)
void
xfs_rw_enter_trace(
int tag,
xfs_inode_t *ip,
void *data,
size_t segs,
loff_t offset,
int ioflags)
{
if (ip->i_rwtrace == NULL)
return;
ktrace_enter(ip->i_rwtrace,
(void *)(unsigned long)tag,
(void *)ip,
(void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)),
(void *)data,
(void *)((unsigned long)segs),
(void *)((unsigned long)((offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(offset & 0xffffffff)),
(void *)((unsigned long)ioflags),
(void *)((unsigned long)((ip->i_new_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_new_size & 0xffffffff)),
(void *)((unsigned long)current_pid()),
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL);
}
void
xfs_inval_cached_trace(
xfs_inode_t *ip,
xfs_off_t offset,
xfs_off_t len,
xfs_off_t first,
xfs_off_t last)
{
if (ip->i_rwtrace == NULL)
return;
ktrace_enter(ip->i_rwtrace,
(void *)(__psint_t)XFS_INVAL_CACHED,
(void *)ip,
(void *)((unsigned long)((offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(offset & 0xffffffff)),
(void *)((unsigned long)((len >> 32) & 0xffffffff)),
(void *)((unsigned long)(len & 0xffffffff)),
(void *)((unsigned long)((first >> 32) & 0xffffffff)),
(void *)((unsigned long)(first & 0xffffffff)),
(void *)((unsigned long)((last >> 32) & 0xffffffff)),
(void *)((unsigned long)(last & 0xffffffff)),
(void *)((unsigned long)current_pid()),
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL);
}
#endif
/* /*
* xfs_iozero * xfs_iozero
* *
@ -250,8 +189,7 @@ xfs_read(
} }
} }
xfs_rw_enter_trace(XFS_READ_ENTER, ip, trace_xfs_file_read(ip, size, *offset, ioflags);
(void *)iovp, segs, *offset, ioflags);
iocb->ki_pos = *offset; iocb->ki_pos = *offset;
ret = generic_file_aio_read(iocb, iovp, segs, *offset); ret = generic_file_aio_read(iocb, iovp, segs, *offset);
@ -292,8 +230,9 @@ xfs_splice_read(
return -error; return -error;
} }
} }
xfs_rw_enter_trace(XFS_SPLICE_READ_ENTER, ip,
pipe, count, *ppos, ioflags); trace_xfs_file_splice_read(ip, count, *ppos, ioflags);
ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); ret = generic_file_splice_read(infilp, ppos, pipe, count, flags);
if (ret > 0) if (ret > 0)
XFS_STATS_ADD(xs_read_bytes, ret); XFS_STATS_ADD(xs_read_bytes, ret);
@ -342,8 +281,8 @@ xfs_splice_write(
ip->i_new_size = new_size; ip->i_new_size = new_size;
xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_iunlock(ip, XFS_ILOCK_EXCL);
xfs_rw_enter_trace(XFS_SPLICE_WRITE_ENTER, ip, trace_xfs_file_splice_write(ip, count, *ppos, ioflags);
pipe, count, *ppos, ioflags);
ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags);
if (ret > 0) if (ret > 0)
XFS_STATS_ADD(xs_write_bytes, ret); XFS_STATS_ADD(xs_write_bytes, ret);
@ -710,8 +649,6 @@ xfs_write(
if ((ioflags & IO_ISDIRECT)) { if ((ioflags & IO_ISDIRECT)) {
if (mapping->nrpages) { if (mapping->nrpages) {
WARN_ON(need_i_mutex == 0); WARN_ON(need_i_mutex == 0);
xfs_inval_cached_trace(xip, pos, -1,
(pos & PAGE_CACHE_MASK), -1);
error = xfs_flushinval_pages(xip, error = xfs_flushinval_pages(xip,
(pos & PAGE_CACHE_MASK), (pos & PAGE_CACHE_MASK),
-1, FI_REMAPF_LOCKED); -1, FI_REMAPF_LOCKED);
@ -728,8 +665,7 @@ xfs_write(
need_i_mutex = 0; need_i_mutex = 0;
} }
xfs_rw_enter_trace(XFS_DIOWR_ENTER, xip, (void *)iovp, segs, trace_xfs_file_direct_write(xip, count, *offset, ioflags);
*offset, ioflags);
ret = generic_file_direct_write(iocb, iovp, ret = generic_file_direct_write(iocb, iovp,
&segs, pos, offset, count, ocount); &segs, pos, offset, count, ocount);
@ -752,8 +688,7 @@ xfs_write(
ssize_t ret2 = 0; ssize_t ret2 = 0;
write_retry: write_retry:
xfs_rw_enter_trace(XFS_WRITE_ENTER, xip, (void *)iovp, segs, trace_xfs_file_buffered_write(xip, count, *offset, ioflags);
*offset, ioflags);
ret2 = generic_file_buffered_write(iocb, iovp, segs, ret2 = generic_file_buffered_write(iocb, iovp, segs,
pos, offset, count, ret); pos, offset, count, ret);
/* /*
@ -858,7 +793,7 @@ int
xfs_bdstrat_cb(struct xfs_buf *bp) xfs_bdstrat_cb(struct xfs_buf *bp)
{ {
if (XFS_FORCED_SHUTDOWN(bp->b_mount)) { if (XFS_FORCED_SHUTDOWN(bp->b_mount)) {
xfs_buftrace("XFS__BDSTRAT IOERROR", bp); trace_xfs_bdstrat_shut(bp, _RET_IP_);
/* /*
* Metadata write that didn't get logged but * Metadata write that didn't get logged but
* written delayed anyway. These aren't associated * written delayed anyway. These aren't associated
@ -891,7 +826,7 @@ xfsbdstrat(
return; return;
} }
xfs_buftrace("XFSBDSTRAT IOERROR", bp); trace_xfs_bdstrat_shut(bp, _RET_IP_);
xfs_bioerror_relse(bp); xfs_bioerror_relse(bp);
} }

View File

@ -20,52 +20,7 @@
struct xfs_mount; struct xfs_mount;
struct xfs_inode; struct xfs_inode;
struct xfs_bmbt_irec;
struct xfs_buf; struct xfs_buf;
struct xfs_iomap;
#if defined(XFS_RW_TRACE)
/*
* Defines for the trace mechanisms in xfs_lrw.c.
*/
#define XFS_RW_KTRACE_SIZE 128
#define XFS_READ_ENTER 1
#define XFS_WRITE_ENTER 2
#define XFS_IOMAP_READ_ENTER 3
#define XFS_IOMAP_WRITE_ENTER 4
#define XFS_IOMAP_READ_MAP 5
#define XFS_IOMAP_WRITE_MAP 6
#define XFS_IOMAP_WRITE_NOSPACE 7
#define XFS_ITRUNC_START 8
#define XFS_ITRUNC_FINISH1 9
#define XFS_ITRUNC_FINISH2 10
#define XFS_CTRUNC1 11
#define XFS_CTRUNC2 12
#define XFS_CTRUNC3 13
#define XFS_CTRUNC4 14
#define XFS_CTRUNC5 15
#define XFS_CTRUNC6 16
#define XFS_BUNMAP 17
#define XFS_INVAL_CACHED 18
#define XFS_DIORD_ENTER 19
#define XFS_DIOWR_ENTER 20
#define XFS_WRITEPAGE_ENTER 22
#define XFS_RELEASEPAGE_ENTER 23
#define XFS_INVALIDPAGE_ENTER 24
#define XFS_IOMAP_ALLOC_ENTER 25
#define XFS_IOMAP_ALLOC_MAP 26
#define XFS_IOMAP_UNWRITTEN 27
#define XFS_SPLICE_READ_ENTER 28
#define XFS_SPLICE_WRITE_ENTER 29
extern void xfs_rw_enter_trace(int, struct xfs_inode *,
void *, size_t, loff_t, int);
extern void xfs_inval_cached_trace(struct xfs_inode *,
xfs_off_t, xfs_off_t, xfs_off_t, xfs_off_t);
#else
#define xfs_rw_enter_trace(tag, ip, data, size, offset, ioflags)
#define xfs_inval_cached_trace(ip, offset, len, first, last)
#endif
/* errors from xfsbdstrat() must be extracted from the buffer */ /* errors from xfsbdstrat() must be extracted from the buffer */
extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *); extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *);

View File

@ -15,6 +15,7 @@
* along with this program; if not, write the Free Software Foundation, * along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "xfs.h" #include "xfs.h"
#include "xfs_bit.h" #include "xfs_bit.h"
#include "xfs_log.h" #include "xfs_log.h"
@ -52,11 +53,11 @@
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_da_btree.h" #include "xfs_da_btree.h"
#include "xfs_dir2_trace.h"
#include "xfs_extfree_item.h" #include "xfs_extfree_item.h"
#include "xfs_mru_cache.h" #include "xfs_mru_cache.h"
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_sync.h" #include "xfs_sync.h"
#include "xfs_trace.h"
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/init.h> #include <linux/init.h>
@ -1525,8 +1526,6 @@ xfs_fs_fill_super(
goto fail_vnrele; goto fail_vnrele;
kfree(mtpt); kfree(mtpt);
xfs_itrace_exit(XFS_I(sb->s_root->d_inode));
return 0; return 0;
out_filestream_unmount: out_filestream_unmount:
@ -1601,94 +1600,6 @@ static struct file_system_type xfs_fs_type = {
.fs_flags = FS_REQUIRES_DEV, .fs_flags = FS_REQUIRES_DEV,
}; };
STATIC int __init
xfs_alloc_trace_bufs(void)
{
#ifdef XFS_ALLOC_TRACE
xfs_alloc_trace_buf = ktrace_alloc(XFS_ALLOC_TRACE_SIZE, KM_MAYFAIL);
if (!xfs_alloc_trace_buf)
goto out;
#endif
#ifdef XFS_BMAP_TRACE
xfs_bmap_trace_buf = ktrace_alloc(XFS_BMAP_TRACE_SIZE, KM_MAYFAIL);
if (!xfs_bmap_trace_buf)
goto out_free_alloc_trace;
#endif
#ifdef XFS_BTREE_TRACE
xfs_allocbt_trace_buf = ktrace_alloc(XFS_ALLOCBT_TRACE_SIZE,
KM_MAYFAIL);
if (!xfs_allocbt_trace_buf)
goto out_free_bmap_trace;
xfs_inobt_trace_buf = ktrace_alloc(XFS_INOBT_TRACE_SIZE, KM_MAYFAIL);
if (!xfs_inobt_trace_buf)
goto out_free_allocbt_trace;
xfs_bmbt_trace_buf = ktrace_alloc(XFS_BMBT_TRACE_SIZE, KM_MAYFAIL);
if (!xfs_bmbt_trace_buf)
goto out_free_inobt_trace;
#endif
#ifdef XFS_ATTR_TRACE
xfs_attr_trace_buf = ktrace_alloc(XFS_ATTR_TRACE_SIZE, KM_MAYFAIL);
if (!xfs_attr_trace_buf)
goto out_free_bmbt_trace;
#endif
#ifdef XFS_DIR2_TRACE
xfs_dir2_trace_buf = ktrace_alloc(XFS_DIR2_GTRACE_SIZE, KM_MAYFAIL);
if (!xfs_dir2_trace_buf)
goto out_free_attr_trace;
#endif
return 0;
#ifdef XFS_DIR2_TRACE
out_free_attr_trace:
#endif
#ifdef XFS_ATTR_TRACE
ktrace_free(xfs_attr_trace_buf);
out_free_bmbt_trace:
#endif
#ifdef XFS_BTREE_TRACE
ktrace_free(xfs_bmbt_trace_buf);
out_free_inobt_trace:
ktrace_free(xfs_inobt_trace_buf);
out_free_allocbt_trace:
ktrace_free(xfs_allocbt_trace_buf);
out_free_bmap_trace:
#endif
#ifdef XFS_BMAP_TRACE
ktrace_free(xfs_bmap_trace_buf);
out_free_alloc_trace:
#endif
#ifdef XFS_ALLOC_TRACE
ktrace_free(xfs_alloc_trace_buf);
out:
#endif
return -ENOMEM;
}
STATIC void
xfs_free_trace_bufs(void)
{
#ifdef XFS_DIR2_TRACE
ktrace_free(xfs_dir2_trace_buf);
#endif
#ifdef XFS_ATTR_TRACE
ktrace_free(xfs_attr_trace_buf);
#endif
#ifdef XFS_BTREE_TRACE
ktrace_free(xfs_bmbt_trace_buf);
ktrace_free(xfs_inobt_trace_buf);
ktrace_free(xfs_allocbt_trace_buf);
#endif
#ifdef XFS_BMAP_TRACE
ktrace_free(xfs_bmap_trace_buf);
#endif
#ifdef XFS_ALLOC_TRACE
ktrace_free(xfs_alloc_trace_buf);
#endif
}
STATIC int __init STATIC int __init
xfs_init_zones(void) xfs_init_zones(void)
{ {
@ -1830,7 +1741,6 @@ init_xfs_fs(void)
printk(KERN_INFO XFS_VERSION_STRING " with " printk(KERN_INFO XFS_VERSION_STRING " with "
XFS_BUILD_OPTIONS " enabled\n"); XFS_BUILD_OPTIONS " enabled\n");
ktrace_init(64);
xfs_ioend_init(); xfs_ioend_init();
xfs_dir_startup(); xfs_dir_startup();
@ -1838,13 +1748,9 @@ init_xfs_fs(void)
if (error) if (error)
goto out; goto out;
error = xfs_alloc_trace_bufs();
if (error)
goto out_destroy_zones;
error = xfs_mru_cache_init(); error = xfs_mru_cache_init();
if (error) if (error)
goto out_free_trace_buffers; goto out_destroy_zones;
error = xfs_filestream_init(); error = xfs_filestream_init();
if (error) if (error)
@ -1879,8 +1785,6 @@ init_xfs_fs(void)
xfs_filestream_uninit(); xfs_filestream_uninit();
out_mru_cache_uninit: out_mru_cache_uninit:
xfs_mru_cache_uninit(); xfs_mru_cache_uninit();
out_free_trace_buffers:
xfs_free_trace_bufs();
out_destroy_zones: out_destroy_zones:
xfs_destroy_zones(); xfs_destroy_zones();
out: out:
@ -1897,9 +1801,7 @@ exit_xfs_fs(void)
xfs_buf_terminate(); xfs_buf_terminate();
xfs_filestream_uninit(); xfs_filestream_uninit();
xfs_mru_cache_uninit(); xfs_mru_cache_uninit();
xfs_free_trace_bufs();
xfs_destroy_zones(); xfs_destroy_zones();
ktrace_uninit();
} }
module_init(init_xfs_fs); module_init(init_xfs_fs);

View File

@ -56,12 +56,6 @@ extern void xfs_qm_exit(void);
# define XFS_BIGFS_STRING # define XFS_BIGFS_STRING
#endif #endif
#ifdef CONFIG_XFS_TRACE
# define XFS_TRACE_STRING "tracing, "
#else
# define XFS_TRACE_STRING
#endif
#ifdef CONFIG_XFS_DMAPI #ifdef CONFIG_XFS_DMAPI
# define XFS_DMAPI_STRING "dmapi support, " # define XFS_DMAPI_STRING "dmapi support, "
#else #else
@ -78,7 +72,6 @@ extern void xfs_qm_exit(void);
XFS_SECURITY_STRING \ XFS_SECURITY_STRING \
XFS_REALTIME_STRING \ XFS_REALTIME_STRING \
XFS_BIGFS_STRING \ XFS_BIGFS_STRING \
XFS_TRACE_STRING \
XFS_DMAPI_STRING \ XFS_DMAPI_STRING \
XFS_DBG_STRING /* DBG must be last */ XFS_DBG_STRING /* DBG must be last */

View File

@ -44,6 +44,7 @@
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_trace.h"
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/freezer.h> #include <linux/freezer.h>

View File

@ -0,0 +1,75 @@
/*
* Copyright (c) 2009, Christoph Hellwig
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "xfs.h"
#include "xfs_fs.h"
#include "xfs_types.h"
#include "xfs_bit.h"
#include "xfs_log.h"
#include "xfs_inum.h"
#include "xfs_trans.h"
#include "xfs_sb.h"
#include "xfs_ag.h"
#include "xfs_dir2.h"
#include "xfs_da_btree.h"
#include "xfs_bmap_btree.h"
#include "xfs_alloc_btree.h"
#include "xfs_ialloc_btree.h"
#include "xfs_dir2_sf.h"
#include "xfs_attr_sf.h"
#include "xfs_dinode.h"
#include "xfs_inode.h"
#include "xfs_btree.h"
#include "xfs_dmapi.h"
#include "xfs_mount.h"
#include "xfs_ialloc.h"
#include "xfs_itable.h"
#include "xfs_alloc.h"
#include "xfs_bmap.h"
#include "xfs_attr.h"
#include "xfs_attr_sf.h"
#include "xfs_attr_leaf.h"
#include "xfs_log_priv.h"
#include "xfs_buf_item.h"
#include "xfs_quota.h"
#include "xfs_iomap.h"
#include "xfs_aops.h"
#include "quota/xfs_dquot_item.h"
#include "quota/xfs_dquot.h"
/*
* Format fsblock number into a static buffer & return it.
*/
STATIC char *xfs_fmtfsblock(xfs_fsblock_t bno)
{
static char rval[50];
if (bno == NULLFSBLOCK)
sprintf(rval, "NULLFSBLOCK");
else if (isnullstartblock(bno))
sprintf(rval, "NULLSTARTBLOCK(%lld)", startblockval(bno));
else
sprintf(rval, "%lld", (xfs_dfsbno_t)bno);
return rval;
}
/*
* We include this last to have the helpers above available for the trace
* event implementations.
*/
#define CREATE_TRACE_POINTS
#include "xfs_trace.h"

1369
fs/xfs/linux-2.6/xfs_trace.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,10 @@ struct attrlist_cursor_kern;
#define IO_ISDIRECT 0x00004 /* bypass page cache */ #define IO_ISDIRECT 0x00004 /* bypass page cache */
#define IO_INVIS 0x00020 /* don't update inode timestamps */ #define IO_INVIS 0x00020 /* don't update inode timestamps */
#define XFS_IO_FLAGS \
{ IO_ISDIRECT, "DIRECT" }, \
{ IO_INVIS, "INVIS"}
/* /*
* Flush/Invalidate options for vop_toss/flush/flushinval_pages. * Flush/Invalidate options for vop_toss/flush/flushinval_pages.
*/ */

View File

@ -47,6 +47,7 @@
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_qm.h" #include "xfs_qm.h"
#include "xfs_trace.h"
/* /*
@ -112,10 +113,7 @@ xfs_qm_dqinit(
init_completion(&dqp->q_flush); init_completion(&dqp->q_flush);
complete(&dqp->q_flush); complete(&dqp->q_flush);
#ifdef XFS_DQUOT_TRACE trace_xfs_dqinit(dqp);
dqp->q_trace = ktrace_alloc(DQUOT_TRACE_SIZE, KM_NOFS);
xfs_dqtrace_entry(dqp, "DQINIT");
#endif
} else { } else {
/* /*
* Only the q_core portion was zeroed in dqreclaim_one(). * Only the q_core portion was zeroed in dqreclaim_one().
@ -136,10 +134,7 @@ xfs_qm_dqinit(
dqp->q_hash = NULL; dqp->q_hash = NULL;
ASSERT(dqp->dq_flnext == dqp->dq_flprev); ASSERT(dqp->dq_flnext == dqp->dq_flprev);
#ifdef XFS_DQUOT_TRACE trace_xfs_dqreuse(dqp);
ASSERT(dqp->q_trace);
xfs_dqtrace_entry(dqp, "DQRECLAIMED_INIT");
#endif
} }
/* /*
@ -167,13 +162,8 @@ xfs_qm_dqdestroy(
mutex_destroy(&dqp->q_qlock); mutex_destroy(&dqp->q_qlock);
sv_destroy(&dqp->q_pinwait); sv_destroy(&dqp->q_pinwait);
#ifdef XFS_DQUOT_TRACE
if (dqp->q_trace)
ktrace_free(dqp->q_trace);
dqp->q_trace = NULL;
#endif
kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); kmem_zone_free(xfs_Gqm->qm_dqzone, dqp);
atomic_dec(&xfs_Gqm->qm_totaldquots); atomic_dec(&xfs_Gqm->qm_totaldquots);
} }
@ -195,49 +185,6 @@ xfs_qm_dqinit_core(
d->dd_diskdq.d_flags = type; d->dd_diskdq.d_flags = type;
} }
#ifdef XFS_DQUOT_TRACE
/*
* Dquot tracing for debugging.
*/
/* ARGSUSED */
void
__xfs_dqtrace_entry(
xfs_dquot_t *dqp,
char *func,
void *retaddr,
xfs_inode_t *ip)
{
xfs_dquot_t *udqp = NULL;
xfs_ino_t ino = 0;
ASSERT(dqp->q_trace);
if (ip) {
ino = ip->i_ino;
udqp = ip->i_udquot;
}
ktrace_enter(dqp->q_trace,
(void *)(__psint_t)DQUOT_KTRACE_ENTRY,
(void *)func,
(void *)(__psint_t)dqp->q_nrefs,
(void *)(__psint_t)dqp->dq_flags,
(void *)(__psint_t)dqp->q_res_bcount,
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_bcount),
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_icount),
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_blk_hardlimit),
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_blk_softlimit),
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_ino_hardlimit),
(void *)(__psint_t)be64_to_cpu(dqp->q_core.d_ino_softlimit),
(void *)(__psint_t)be32_to_cpu(dqp->q_core.d_id),
(void *)(__psint_t)current_pid(),
(void *)(__psint_t)ino,
(void *)(__psint_t)retaddr,
(void *)(__psint_t)udqp);
return;
}
#endif
/* /*
* If default limits are in force, push them into the dquot now. * If default limits are in force, push them into the dquot now.
* We overwrite the dquot limits only if they are zero and this * We overwrite the dquot limits only if they are zero and this
@ -425,7 +372,8 @@ xfs_qm_dqalloc(
xfs_trans_t *tp = *tpp; xfs_trans_t *tp = *tpp;
ASSERT(tp != NULL); ASSERT(tp != NULL);
xfs_dqtrace_entry(dqp, "DQALLOC");
trace_xfs_dqalloc(dqp);
/* /*
* Initialize the bmap freelist prior to calling bmapi code. * Initialize the bmap freelist prior to calling bmapi code.
@ -612,7 +560,8 @@ xfs_qm_dqtobp(
* (in which case we already have the buf). * (in which case we already have the buf).
*/ */
if (! newdquot) { if (! newdquot) {
xfs_dqtrace_entry(dqp, "DQTOBP READBUF"); trace_xfs_dqtobp_read(dqp);
if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,
dqp->q_blkno, dqp->q_blkno,
XFS_QI_DQCHUNKLEN(mp), XFS_QI_DQCHUNKLEN(mp),
@ -670,11 +619,12 @@ xfs_qm_dqread(
ASSERT(tpp); ASSERT(tpp);
trace_xfs_dqread(dqp);
/* /*
* get a pointer to the on-disk dquot and the buffer containing it * get a pointer to the on-disk dquot and the buffer containing it
* dqp already knows its own type (GROUP/USER). * dqp already knows its own type (GROUP/USER).
*/ */
xfs_dqtrace_entry(dqp, "DQREAD");
if ((error = xfs_qm_dqtobp(tpp, dqp, &ddqp, &bp, flags))) { if ((error = xfs_qm_dqtobp(tpp, dqp, &ddqp, &bp, flags))) {
return (error); return (error);
} }
@ -763,7 +713,7 @@ xfs_qm_idtodq(
* or if the dquot didn't exist on disk and we ask to * or if the dquot didn't exist on disk and we ask to
* allocate (ENOENT). * allocate (ENOENT).
*/ */
xfs_dqtrace_entry(dqp, "DQREAD FAIL"); trace_xfs_dqread_fail(dqp);
cancelflags |= XFS_TRANS_ABORT; cancelflags |= XFS_TRANS_ABORT;
goto error0; goto error0;
} }
@ -817,7 +767,8 @@ xfs_qm_dqlookup(
* id can't be modified without the hashlock anyway. * id can't be modified without the hashlock anyway.
*/ */
if (be32_to_cpu(dqp->q_core.d_id) == id && dqp->q_mount == mp) { if (be32_to_cpu(dqp->q_core.d_id) == id && dqp->q_mount == mp) {
xfs_dqtrace_entry(dqp, "DQFOUND BY LOOKUP"); trace_xfs_dqlookup_found(dqp);
/* /*
* All in core dquots must be on the dqlist of mp * All in core dquots must be on the dqlist of mp
*/ */
@ -827,7 +778,7 @@ xfs_qm_dqlookup(
if (dqp->q_nrefs == 0) { if (dqp->q_nrefs == 0) {
ASSERT (XFS_DQ_IS_ON_FREELIST(dqp)); ASSERT (XFS_DQ_IS_ON_FREELIST(dqp));
if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) {
xfs_dqtrace_entry(dqp, "DQLOOKUP: WANT"); trace_xfs_dqlookup_want(dqp);
/* /*
* We may have raced with dqreclaim_one() * We may have raced with dqreclaim_one()
@ -857,8 +808,7 @@ xfs_qm_dqlookup(
/* /*
* take it off the freelist * take it off the freelist
*/ */
xfs_dqtrace_entry(dqp, trace_xfs_dqlookup_freelist(dqp);
"DQLOOKUP: TAKEOFF FL");
XQM_FREELIST_REMOVE(dqp); XQM_FREELIST_REMOVE(dqp);
/* xfs_qm_freelist_print(&(xfs_Gqm-> /* xfs_qm_freelist_print(&(xfs_Gqm->
qm_dqfreelist), qm_dqfreelist),
@ -878,8 +828,7 @@ xfs_qm_dqlookup(
*/ */
ASSERT(mutex_is_locked(&qh->qh_lock)); ASSERT(mutex_is_locked(&qh->qh_lock));
if (dqp->HL_PREVP != &qh->qh_next) { if (dqp->HL_PREVP != &qh->qh_next) {
xfs_dqtrace_entry(dqp, trace_xfs_dqlookup_move(dqp);
"DQLOOKUP: HASH MOVETOFRONT");
if ((d = dqp->HL_NEXT)) if ((d = dqp->HL_NEXT))
d->HL_PREVP = dqp->HL_PREVP; d->HL_PREVP = dqp->HL_PREVP;
*(dqp->HL_PREVP) = d; *(dqp->HL_PREVP) = d;
@ -889,7 +838,7 @@ xfs_qm_dqlookup(
dqp->HL_PREVP = &qh->qh_next; dqp->HL_PREVP = &qh->qh_next;
qh->qh_next = dqp; qh->qh_next = dqp;
} }
xfs_dqtrace_entry(dqp, "LOOKUP END"); trace_xfs_dqlookup_done(dqp);
*O_dqpp = dqp; *O_dqpp = dqp;
ASSERT(mutex_is_locked(&qh->qh_lock)); ASSERT(mutex_is_locked(&qh->qh_lock));
return (0); return (0);
@ -971,7 +920,7 @@ xfs_qm_dqget(
ASSERT(*O_dqpp); ASSERT(*O_dqpp);
ASSERT(XFS_DQ_IS_LOCKED(*O_dqpp)); ASSERT(XFS_DQ_IS_LOCKED(*O_dqpp));
mutex_unlock(&h->qh_lock); mutex_unlock(&h->qh_lock);
xfs_dqtrace_entry(*O_dqpp, "DQGET DONE (FROM CACHE)"); trace_xfs_dqget_hit(*O_dqpp);
return (0); /* success */ return (0); /* success */
} }
XQM_STATS_INC(xqmstats.xs_qm_dqcachemisses); XQM_STATS_INC(xqmstats.xs_qm_dqcachemisses);
@ -1104,7 +1053,7 @@ xfs_qm_dqget(
mutex_unlock(&h->qh_lock); mutex_unlock(&h->qh_lock);
dqret: dqret:
ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL));
xfs_dqtrace_entry(dqp, "DQGET DONE"); trace_xfs_dqget_miss(dqp);
*O_dqpp = dqp; *O_dqpp = dqp;
return (0); return (0);
} }
@ -1124,7 +1073,8 @@ xfs_qm_dqput(
ASSERT(dqp->q_nrefs > 0); ASSERT(dqp->q_nrefs > 0);
ASSERT(XFS_DQ_IS_LOCKED(dqp)); ASSERT(XFS_DQ_IS_LOCKED(dqp));
xfs_dqtrace_entry(dqp, "DQPUT");
trace_xfs_dqput(dqp);
if (dqp->q_nrefs != 1) { if (dqp->q_nrefs != 1) {
dqp->q_nrefs--; dqp->q_nrefs--;
@ -1137,7 +1087,7 @@ xfs_qm_dqput(
* in the right order; but try to get it out-of-order first * in the right order; but try to get it out-of-order first
*/ */
if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) {
xfs_dqtrace_entry(dqp, "DQPUT: FLLOCK-WAIT"); trace_xfs_dqput_wait(dqp);
xfs_dqunlock(dqp); xfs_dqunlock(dqp);
xfs_qm_freelist_lock(xfs_Gqm); xfs_qm_freelist_lock(xfs_Gqm);
xfs_dqlock(dqp); xfs_dqlock(dqp);
@ -1148,7 +1098,8 @@ xfs_qm_dqput(
/* We can't depend on nrefs being == 1 here */ /* We can't depend on nrefs being == 1 here */
if (--dqp->q_nrefs == 0) { if (--dqp->q_nrefs == 0) {
xfs_dqtrace_entry(dqp, "DQPUT: ON FREELIST"); trace_xfs_dqput_free(dqp);
/* /*
* insert at end of the freelist. * insert at end of the freelist.
*/ */
@ -1196,7 +1147,7 @@ xfs_qm_dqrele(
if (!dqp) if (!dqp)
return; return;
xfs_dqtrace_entry(dqp, "DQRELE"); trace_xfs_dqrele(dqp);
xfs_dqlock(dqp); xfs_dqlock(dqp);
/* /*
@ -1229,7 +1180,7 @@ xfs_qm_dqflush(
ASSERT(XFS_DQ_IS_LOCKED(dqp)); ASSERT(XFS_DQ_IS_LOCKED(dqp));
ASSERT(!completion_done(&dqp->q_flush)); ASSERT(!completion_done(&dqp->q_flush));
xfs_dqtrace_entry(dqp, "DQFLUSH"); trace_xfs_dqflush(dqp);
/* /*
* If not dirty, or it's pinned and we are not supposed to * If not dirty, or it's pinned and we are not supposed to
@ -1259,7 +1210,6 @@ xfs_qm_dqflush(
* the ondisk-dquot has already been allocated for. * the ondisk-dquot has already been allocated for.
*/ */
if ((error = xfs_qm_dqtobp(NULL, dqp, &ddqp, &bp, XFS_QMOPT_DOWARN))) { if ((error = xfs_qm_dqtobp(NULL, dqp, &ddqp, &bp, XFS_QMOPT_DOWARN))) {
xfs_dqtrace_entry(dqp, "DQTOBP FAIL");
ASSERT(error != ENOENT); ASSERT(error != ENOENT);
/* /*
* Quotas could have gotten turned off (ESRCH) * Quotas could have gotten turned off (ESRCH)
@ -1297,7 +1247,7 @@ xfs_qm_dqflush(
* get stuck waiting in the write for too long. * get stuck waiting in the write for too long.
*/ */
if (XFS_BUF_ISPINNED(bp)) { if (XFS_BUF_ISPINNED(bp)) {
xfs_dqtrace_entry(dqp, "DQFLUSH LOG FORCE"); trace_xfs_dqflush_force(dqp);
xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
} }
@ -1308,7 +1258,9 @@ xfs_qm_dqflush(
} else { } else {
error = xfs_bwrite(mp, bp); error = xfs_bwrite(mp, bp);
} }
xfs_dqtrace_entry(dqp, "DQFLUSH END");
trace_xfs_dqflush_done(dqp);
/* /*
* dqp is still locked, but caller is free to unlock it now. * dqp is still locked, but caller is free to unlock it now.
*/ */
@ -1483,7 +1435,7 @@ xfs_qm_dqpurge(
*/ */
if (XFS_DQ_IS_DIRTY(dqp)) { if (XFS_DQ_IS_DIRTY(dqp)) {
int error; int error;
xfs_dqtrace_entry(dqp, "DQPURGE ->DQFLUSH: DQDIRTY");
/* dqflush unlocks dqflock */ /* dqflush unlocks dqflock */
/* /*
* Given that dqpurge is a very rare occurrence, it is OK * Given that dqpurge is a very rare occurrence, it is OK

View File

@ -85,9 +85,6 @@ typedef struct xfs_dquot {
struct completion q_flush; /* flush completion queue */ struct completion q_flush; /* flush completion queue */
atomic_t q_pincount; /* dquot pin count */ atomic_t q_pincount; /* dquot pin count */
wait_queue_head_t q_pinwait; /* dquot pinning wait queue */ wait_queue_head_t q_pinwait; /* dquot pinning wait queue */
#ifdef XFS_DQUOT_TRACE
struct ktrace *q_trace; /* trace header structure */
#endif
} xfs_dquot_t; } xfs_dquot_t;
@ -144,24 +141,6 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp)
(XFS_IS_UQUOTA_ON((d)->q_mount)) : \ (XFS_IS_UQUOTA_ON((d)->q_mount)) : \
(XFS_IS_OQUOTA_ON((d)->q_mount)))) (XFS_IS_OQUOTA_ON((d)->q_mount))))
#ifdef XFS_DQUOT_TRACE
/*
* Dquot Tracing stuff.
*/
#define DQUOT_TRACE_SIZE 64
#define DQUOT_KTRACE_ENTRY 1
extern void __xfs_dqtrace_entry(xfs_dquot_t *dqp, char *func,
void *, xfs_inode_t *);
#define xfs_dqtrace_entry_ino(a,b,ip) \
__xfs_dqtrace_entry((a), (b), (void*)__return_address, (ip))
#define xfs_dqtrace_entry(a,b) \
__xfs_dqtrace_entry((a), (b), (void*)__return_address, NULL)
#else
#define xfs_dqtrace_entry(a,b)
#define xfs_dqtrace_entry_ino(a,b,ip)
#endif
#ifdef QUOTADEBUG #ifdef QUOTADEBUG
extern void xfs_qm_dqprint(xfs_dquot_t *); extern void xfs_qm_dqprint(xfs_dquot_t *);
#else #else

View File

@ -47,6 +47,7 @@
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_qm.h" #include "xfs_qm.h"
#include "xfs_trace.h"
/* /*
* The global quota manager. There is only one of these for the entire * The global quota manager. There is only one of these for the entire
@ -453,7 +454,7 @@ xfs_qm_dqflush_all(
xfs_dqunlock(dqp); xfs_dqunlock(dqp);
continue; continue;
} }
xfs_dqtrace_entry(dqp, "FLUSHALL: DQDIRTY");
/* XXX a sentinel would be better */ /* XXX a sentinel would be better */
recl = XFS_QI_MPLRECLAIMS(mp); recl = XFS_QI_MPLRECLAIMS(mp);
if (!xfs_dqflock_nowait(dqp)) { if (!xfs_dqflock_nowait(dqp)) {
@ -651,7 +652,7 @@ xfs_qm_dqattach_one(
*/ */
dqp = *IO_idqpp; dqp = *IO_idqpp;
if (dqp) { if (dqp) {
xfs_dqtrace_entry(dqp, "DQATTACH: found in ip"); trace_xfs_dqattach_found(dqp);
return 0; return 0;
} }
@ -704,7 +705,7 @@ xfs_qm_dqattach_one(
if (error) if (error)
return error; return error;
xfs_dqtrace_entry(dqp, "DQATTACH: found by dqget"); trace_xfs_dqattach_get(dqp);
/* /*
* dqget may have dropped and re-acquired the ilock, but it guarantees * dqget may have dropped and re-acquired the ilock, but it guarantees
@ -890,15 +891,15 @@ xfs_qm_dqdetach(
if (!(ip->i_udquot || ip->i_gdquot)) if (!(ip->i_udquot || ip->i_gdquot))
return; return;
trace_xfs_dquot_dqdetach(ip);
ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino); ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino);
ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino); ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino);
if (ip->i_udquot) { if (ip->i_udquot) {
xfs_dqtrace_entry_ino(ip->i_udquot, "DQDETTACH", ip);
xfs_qm_dqrele(ip->i_udquot); xfs_qm_dqrele(ip->i_udquot);
ip->i_udquot = NULL; ip->i_udquot = NULL;
} }
if (ip->i_gdquot) { if (ip->i_gdquot) {
xfs_dqtrace_entry_ino(ip->i_gdquot, "DQDETTACH", ip);
xfs_qm_dqrele(ip->i_gdquot); xfs_qm_dqrele(ip->i_gdquot);
ip->i_gdquot = NULL; ip->i_gdquot = NULL;
} }
@ -977,7 +978,6 @@ xfs_qm_sync(
* across a disk write * across a disk write
*/ */
xfs_qm_mplist_unlock(mp); xfs_qm_mplist_unlock(mp);
xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH");
error = xfs_qm_dqflush(dqp, flush_flags); error = xfs_qm_dqflush(dqp, flush_flags);
xfs_dqunlock(dqp); xfs_dqunlock(dqp);
if (error && XFS_FORCED_SHUTDOWN(mp)) if (error && XFS_FORCED_SHUTDOWN(mp))
@ -1350,7 +1350,8 @@ xfs_qm_reset_dqcounts(
xfs_disk_dquot_t *ddq; xfs_disk_dquot_t *ddq;
int j; int j;
xfs_buftrace("RESET DQUOTS", bp); trace_xfs_reset_dqcounts(bp, _RET_IP_);
/* /*
* Reset all counters and timers. They'll be * Reset all counters and timers. They'll be
* started afresh by xfs_qm_quotacheck. * started afresh by xfs_qm_quotacheck.
@ -1543,7 +1544,9 @@ xfs_qm_quotacheck_dqadjust(
xfs_qcnt_t rtblks) xfs_qcnt_t rtblks)
{ {
ASSERT(XFS_DQ_IS_LOCKED(dqp)); ASSERT(XFS_DQ_IS_LOCKED(dqp));
xfs_dqtrace_entry(dqp, "QCHECK DQADJUST");
trace_xfs_dqadjust(dqp);
/* /*
* Adjust the inode count and the block count to reflect this inode's * Adjust the inode count and the block count to reflect this inode's
* resource usage. * resource usage.
@ -1994,7 +1997,9 @@ xfs_qm_shake_freelist(
*/ */
if (XFS_DQ_IS_DIRTY(dqp)) { if (XFS_DQ_IS_DIRTY(dqp)) {
int error; int error;
xfs_dqtrace_entry(dqp, "DQSHAKE: DQDIRTY");
trace_xfs_dqshake_dirty(dqp);
/* /*
* We flush it delayed write, so don't bother * We flush it delayed write, so don't bother
* releasing the mplock. * releasing the mplock.
@ -2038,7 +2043,9 @@ xfs_qm_shake_freelist(
return nreclaimed; return nreclaimed;
goto tryagain; goto tryagain;
} }
xfs_dqtrace_entry(dqp, "DQSHAKE: UNLINKING");
trace_xfs_dqshake_unlink(dqp);
#ifdef QUOTADEBUG #ifdef QUOTADEBUG
cmn_err(CE_DEBUG, "Shake 0x%p, ID 0x%x\n", cmn_err(CE_DEBUG, "Shake 0x%p, ID 0x%x\n",
dqp, be32_to_cpu(dqp->q_core.d_id)); dqp, be32_to_cpu(dqp->q_core.d_id));
@ -2125,7 +2132,9 @@ xfs_qm_dqreclaim_one(void)
*/ */
if (dqp->dq_flags & XFS_DQ_WANT) { if (dqp->dq_flags & XFS_DQ_WANT) {
ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE)); ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE));
xfs_dqtrace_entry(dqp, "DQRECLAIM: DQWANT");
trace_xfs_dqreclaim_want(dqp);
xfs_dqunlock(dqp); xfs_dqunlock(dqp);
xfs_qm_freelist_unlock(xfs_Gqm); xfs_qm_freelist_unlock(xfs_Gqm);
if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
@ -2171,7 +2180,9 @@ xfs_qm_dqreclaim_one(void)
*/ */
if (XFS_DQ_IS_DIRTY(dqp)) { if (XFS_DQ_IS_DIRTY(dqp)) {
int error; int error;
xfs_dqtrace_entry(dqp, "DQRECLAIM: DQDIRTY");
trace_xfs_dqreclaim_dirty(dqp);
/* /*
* We flush it delayed write, so don't bother * We flush it delayed write, so don't bother
* releasing the freelist lock. * releasing the freelist lock.
@ -2194,8 +2205,9 @@ xfs_qm_dqreclaim_one(void)
if (!mutex_trylock(&dqp->q_hash->qh_lock)) if (!mutex_trylock(&dqp->q_hash->qh_lock))
goto mplistunlock; goto mplistunlock;
trace_xfs_dqreclaim_unlink(dqp);
ASSERT(dqp->q_nrefs == 0); ASSERT(dqp->q_nrefs == 0);
xfs_dqtrace_entry(dqp, "DQRECLAIM: UNLINKING");
XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp); XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp);
XQM_HASHLIST_REMOVE(dqp->q_hash, dqp); XQM_HASHLIST_REMOVE(dqp->q_hash, dqp);
XQM_FREELIST_REMOVE(dqp); XQM_FREELIST_REMOVE(dqp);
@ -2430,7 +2442,7 @@ xfs_qm_vop_dqalloc(
} }
} }
if (uq) if (uq)
xfs_dqtrace_entry_ino(uq, "DQALLOC", ip); trace_xfs_dquot_dqalloc(ip);
xfs_iunlock(ip, lockflags); xfs_iunlock(ip, lockflags);
if (O_udqpp) if (O_udqpp)

View File

@ -49,6 +49,7 @@
#include "xfs_buf_item.h" #include "xfs_buf_item.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_qm.h" #include "xfs_qm.h"
#include "xfs_trace.h"
#ifdef DEBUG #ifdef DEBUG
# define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args) # define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args)
@ -496,7 +497,6 @@ xfs_qm_scall_setqlim(
ASSERT(error != ENOENT); ASSERT(error != ENOENT);
return (error); return (error);
} }
xfs_dqtrace_entry(dqp, "Q_SETQLIM: AFT DQGET");
xfs_trans_dqjoin(tp, dqp); xfs_trans_dqjoin(tp, dqp);
ddq = &dqp->q_core; ddq = &dqp->q_core;
@ -602,7 +602,6 @@ xfs_qm_scall_setqlim(
dqp->dq_flags |= XFS_DQ_DIRTY; dqp->dq_flags |= XFS_DQ_DIRTY;
xfs_trans_log_dquot(tp, dqp); xfs_trans_log_dquot(tp, dqp);
xfs_dqtrace_entry(dqp, "Q_SETQLIM: COMMIT");
error = xfs_trans_commit(tp, 0); error = xfs_trans_commit(tp, 0);
xfs_qm_dqprint(dqp); xfs_qm_dqprint(dqp);
xfs_qm_dqrele(dqp); xfs_qm_dqrele(dqp);
@ -630,7 +629,6 @@ xfs_qm_scall_getquota(
return (error); return (error);
} }
xfs_dqtrace_entry(dqp, "Q_GETQUOTA SUCCESS");
/* /*
* If everything's NULL, this dquot doesn't quite exist as far as * If everything's NULL, this dquot doesn't quite exist as far as
* our utility programs are concerned. * our utility programs are concerned.

View File

@ -1,323 +0,0 @@
/*
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <xfs.h>
static kmem_zone_t *ktrace_hdr_zone;
static kmem_zone_t *ktrace_ent_zone;
static int ktrace_zentries;
void __init
ktrace_init(int zentries)
{
ktrace_zentries = roundup_pow_of_two(zentries);
ktrace_hdr_zone = kmem_zone_init(sizeof(ktrace_t),
"ktrace_hdr");
ASSERT(ktrace_hdr_zone);
ktrace_ent_zone = kmem_zone_init(ktrace_zentries
* sizeof(ktrace_entry_t),
"ktrace_ent");
ASSERT(ktrace_ent_zone);
}
void __exit
ktrace_uninit(void)
{
kmem_zone_destroy(ktrace_hdr_zone);
kmem_zone_destroy(ktrace_ent_zone);
}
/*
* ktrace_alloc()
*
* Allocate a ktrace header and enough buffering for the given
* number of entries. Round the number of entries up to a
* power of 2 so we can do fast masking to get the index from
* the atomic index counter.
*/
ktrace_t *
ktrace_alloc(int nentries, unsigned int __nocast sleep)
{
ktrace_t *ktp;
ktrace_entry_t *ktep;
int entries;
ktp = (ktrace_t*)kmem_zone_alloc(ktrace_hdr_zone, sleep);
if (ktp == (ktrace_t*)NULL) {
/*
* KM_SLEEP callers don't expect failure.
*/
if (sleep & KM_SLEEP)
panic("ktrace_alloc: NULL memory on KM_SLEEP request!");
return NULL;
}
/*
* Special treatment for buffers with the ktrace_zentries entries
*/
entries = roundup_pow_of_two(nentries);
if (entries == ktrace_zentries) {
ktep = (ktrace_entry_t*)kmem_zone_zalloc(ktrace_ent_zone,
sleep);
} else {
ktep = (ktrace_entry_t*)kmem_zalloc((entries * sizeof(*ktep)),
sleep | KM_LARGE);
}
if (ktep == NULL) {
/*
* KM_SLEEP callers don't expect failure.
*/
if (sleep & KM_SLEEP)
panic("ktrace_alloc: NULL memory on KM_SLEEP request!");
kmem_free(ktp);
return NULL;
}
ktp->kt_entries = ktep;
ktp->kt_nentries = entries;
ASSERT(is_power_of_2(entries));
ktp->kt_index_mask = entries - 1;
atomic_set(&ktp->kt_index, 0);
ktp->kt_rollover = 0;
return ktp;
}
/*
* ktrace_free()
*
* Free up the ktrace header and buffer. It is up to the caller
* to ensure that no-one is referencing it.
*/
void
ktrace_free(ktrace_t *ktp)
{
if (ktp == (ktrace_t *)NULL)
return;
/*
* Special treatment for the Vnode trace buffer.
*/
if (ktp->kt_nentries == ktrace_zentries)
kmem_zone_free(ktrace_ent_zone, ktp->kt_entries);
else
kmem_free(ktp->kt_entries);
kmem_zone_free(ktrace_hdr_zone, ktp);
}
/*
* Enter the given values into the "next" entry in the trace buffer.
* kt_index is always the index of the next entry to be filled.
*/
void
ktrace_enter(
ktrace_t *ktp,
void *val0,
void *val1,
void *val2,
void *val3,
void *val4,
void *val5,
void *val6,
void *val7,
void *val8,
void *val9,
void *val10,
void *val11,
void *val12,
void *val13,
void *val14,
void *val15)
{
int index;
ktrace_entry_t *ktep;
ASSERT(ktp != NULL);
/*
* Grab an entry by pushing the index up to the next one.
*/
index = atomic_add_return(1, &ktp->kt_index);
index = (index - 1) & ktp->kt_index_mask;
if (!ktp->kt_rollover && index == ktp->kt_nentries - 1)
ktp->kt_rollover = 1;
ASSERT((index >= 0) && (index < ktp->kt_nentries));
ktep = &(ktp->kt_entries[index]);
ktep->val[0] = val0;
ktep->val[1] = val1;
ktep->val[2] = val2;
ktep->val[3] = val3;
ktep->val[4] = val4;
ktep->val[5] = val5;
ktep->val[6] = val6;
ktep->val[7] = val7;
ktep->val[8] = val8;
ktep->val[9] = val9;
ktep->val[10] = val10;
ktep->val[11] = val11;
ktep->val[12] = val12;
ktep->val[13] = val13;
ktep->val[14] = val14;
ktep->val[15] = val15;
}
/*
* Return the number of entries in the trace buffer.
*/
int
ktrace_nentries(
ktrace_t *ktp)
{
int index;
if (ktp == NULL)
return 0;
index = atomic_read(&ktp->kt_index) & ktp->kt_index_mask;
return (ktp->kt_rollover ? ktp->kt_nentries : index);
}
/*
* ktrace_first()
*
* This is used to find the start of the trace buffer.
* In conjunction with ktrace_next() it can be used to
* iterate through the entire trace buffer. This code does
* not do any locking because it is assumed that it is called
* from the debugger.
*
* The caller must pass in a pointer to a ktrace_snap
* structure in which we will keep some state used to
* iterate through the buffer. This state must not touched
* by any code outside of this module.
*/
ktrace_entry_t *
ktrace_first(ktrace_t *ktp, ktrace_snap_t *ktsp)
{
ktrace_entry_t *ktep;
int index;
int nentries;
if (ktp->kt_rollover)
index = atomic_read(&ktp->kt_index) & ktp->kt_index_mask;
else
index = 0;
ktsp->ks_start = index;
ktep = &(ktp->kt_entries[index]);
nentries = ktrace_nentries(ktp);
index++;
if (index < nentries) {
ktsp->ks_index = index;
} else {
ktsp->ks_index = 0;
if (index > nentries)
ktep = NULL;
}
return ktep;
}
/*
* ktrace_next()
*
* This is used to iterate through the entries of the given
* trace buffer. The caller must pass in the ktrace_snap_t
* structure initialized by ktrace_first(). The return value
* will be either a pointer to the next ktrace_entry or NULL
* if all of the entries have been traversed.
*/
ktrace_entry_t *
ktrace_next(
ktrace_t *ktp,
ktrace_snap_t *ktsp)
{
int index;
ktrace_entry_t *ktep;
index = ktsp->ks_index;
if (index == ktsp->ks_start) {
ktep = NULL;
} else {
ktep = &ktp->kt_entries[index];
}
index++;
if (index == ktrace_nentries(ktp)) {
ktsp->ks_index = 0;
} else {
ktsp->ks_index = index;
}
return ktep;
}
/*
* ktrace_skip()
*
* Skip the next "count" entries and return the entry after that.
* Return NULL if this causes us to iterate past the beginning again.
*/
ktrace_entry_t *
ktrace_skip(
ktrace_t *ktp,
int count,
ktrace_snap_t *ktsp)
{
int index;
int new_index;
ktrace_entry_t *ktep;
int nentries = ktrace_nentries(ktp);
index = ktsp->ks_index;
new_index = index + count;
while (new_index >= nentries) {
new_index -= nentries;
}
if (index == ktsp->ks_start) {
/*
* We've iterated around to the start, so we're done.
*/
ktep = NULL;
} else if ((new_index < index) && (index < ktsp->ks_index)) {
/*
* We've skipped past the start again, so we're done.
*/
ktep = NULL;
ktsp->ks_index = ktsp->ks_start;
} else {
ktep = &(ktp->kt_entries[new_index]);
new_index++;
if (new_index == nentries) {
ktsp->ks_index = 0;
} else {
ktsp->ks_index = new_index;
}
}
return ktep;
}

View File

@ -1,85 +0,0 @@
/*
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __XFS_SUPPORT_KTRACE_H__
#define __XFS_SUPPORT_KTRACE_H__
/*
* Trace buffer entry structure.
*/
typedef struct ktrace_entry {
void *val[16];
} ktrace_entry_t;
/*
* Trace buffer header structure.
*/
typedef struct ktrace {
int kt_nentries; /* number of entries in trace buf */
atomic_t kt_index; /* current index in entries */
unsigned int kt_index_mask;
int kt_rollover;
ktrace_entry_t *kt_entries; /* buffer of entries */
} ktrace_t;
/*
* Trace buffer snapshot structure.
*/
typedef struct ktrace_snap {
int ks_start; /* kt_index at time of snap */
int ks_index; /* current index */
} ktrace_snap_t;
#ifdef CONFIG_XFS_TRACE
extern void ktrace_init(int zentries);
extern void ktrace_uninit(void);
extern ktrace_t *ktrace_alloc(int, unsigned int __nocast);
extern void ktrace_free(ktrace_t *);
extern void ktrace_enter(
ktrace_t *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *,
void *);
extern ktrace_entry_t *ktrace_first(ktrace_t *, ktrace_snap_t *);
extern int ktrace_nentries(ktrace_t *);
extern ktrace_entry_t *ktrace_next(ktrace_t *, ktrace_snap_t *);
extern ktrace_entry_t *ktrace_skip(ktrace_t *, int, ktrace_snap_t *);
#else
#define ktrace_init(x) do { } while (0)
#define ktrace_uninit() do { } while (0)
#endif /* CONFIG_XFS_TRACE */
#endif /* __XFS_SUPPORT_KTRACE_H__ */

View File

@ -25,21 +25,5 @@
/* #define QUOTADEBUG 1 */ /* #define QUOTADEBUG 1 */
#endif #endif
#ifdef CONFIG_XFS_TRACE
#define XFS_ALLOC_TRACE 1
#define XFS_ATTR_TRACE 1
#define XFS_BLI_TRACE 1
#define XFS_BMAP_TRACE 1
#define XFS_BTREE_TRACE 1
#define XFS_DIR2_TRACE 1
#define XFS_DQUOT_TRACE 1
#define XFS_ILOCK_TRACE 1
#define XFS_LOG_TRACE 1
#define XFS_RW_TRACE 1
#define XFS_BUF_TRACE 1
#define XFS_INODE_TRACE 1
#define XFS_FILESTREAMS_TRACE 1
#endif
#include <linux-2.6/xfs_linux.h> #include <linux-2.6/xfs_linux.h>
#endif /* __XFS_H__ */ #endif /* __XFS_H__ */

View File

@ -86,6 +86,20 @@ typedef struct xfs_agf {
#define XFS_AGF_NUM_BITS 12 #define XFS_AGF_NUM_BITS 12
#define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1)
#define XFS_AGF_FLAGS \
{ XFS_AGF_MAGICNUM, "MAGICNUM" }, \
{ XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \
{ XFS_AGF_SEQNO, "SEQNO" }, \
{ XFS_AGF_LENGTH, "LENGTH" }, \
{ XFS_AGF_ROOTS, "ROOTS" }, \
{ XFS_AGF_LEVELS, "LEVELS" }, \
{ XFS_AGF_FLFIRST, "FLFIRST" }, \
{ XFS_AGF_FLLAST, "FLLAST" }, \
{ XFS_AGF_FLCOUNT, "FLCOUNT" }, \
{ XFS_AGF_FREEBLKS, "FREEBLKS" }, \
{ XFS_AGF_LONGEST, "LONGEST" }, \
{ XFS_AGF_BTREEBLKS, "BTREEBLKS" }
/* disk block (xfs_daddr_t) in the AG */ /* disk block (xfs_daddr_t) in the AG */
#define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
#define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))

View File

@ -38,6 +38,7 @@
#include "xfs_ialloc.h" #include "xfs_ialloc.h"
#include "xfs_alloc.h" #include "xfs_alloc.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
#define XFS_ABSDIFF(a,b) (((a) <= (b)) ? ((b) - (a)) : ((a) - (b))) #define XFS_ABSDIFF(a,b) (((a) <= (b)) ? ((b) - (a)) : ((a) - (b)))
@ -51,30 +52,6 @@ xfs_alloc_search_busy(xfs_trans_t *tp,
xfs_agblock_t bno, xfs_agblock_t bno,
xfs_extlen_t len); xfs_extlen_t len);
#if defined(XFS_ALLOC_TRACE)
ktrace_t *xfs_alloc_trace_buf;
#define TRACE_ALLOC(s,a) \
xfs_alloc_trace_alloc(__func__, s, a, __LINE__)
#define TRACE_FREE(s,a,b,x,f) \
xfs_alloc_trace_free(__func__, s, mp, a, b, x, f, __LINE__)
#define TRACE_MODAGF(s,a,f) \
xfs_alloc_trace_modagf(__func__, s, mp, a, f, __LINE__)
#define TRACE_BUSY(__func__,s,ag,agb,l,sl,tp) \
xfs_alloc_trace_busy(__func__, s, mp, ag, agb, l, sl, tp, XFS_ALLOC_KTRACE_BUSY, __LINE__)
#define TRACE_UNBUSY(__func__,s,ag,sl,tp) \
xfs_alloc_trace_busy(__func__, s, mp, ag, -1, -1, sl, tp, XFS_ALLOC_KTRACE_UNBUSY, __LINE__)
#define TRACE_BUSYSEARCH(__func__,s,ag,agb,l,tp) \
xfs_alloc_trace_busy(__func__, s, mp, ag, agb, l, 0, tp, XFS_ALLOC_KTRACE_BUSYSEARCH, __LINE__)
#else
#define TRACE_ALLOC(s,a)
#define TRACE_FREE(s,a,b,x,f)
#define TRACE_MODAGF(s,a,f)
#define TRACE_BUSY(s,a,ag,agb,l,sl,tp)
#define TRACE_UNBUSY(fname,s,ag,sl,tp)
#define TRACE_BUSYSEARCH(fname,s,ag,agb,l,tp)
#endif /* XFS_ALLOC_TRACE */
/* /*
* Prototypes for per-ag allocation routines * Prototypes for per-ag allocation routines
*/ */
@ -498,124 +475,6 @@ xfs_alloc_read_agfl(
return 0; return 0;
} }
#if defined(XFS_ALLOC_TRACE)
/*
* Add an allocation trace entry for an alloc call.
*/
STATIC void
xfs_alloc_trace_alloc(
const char *name, /* function tag string */
char *str, /* additional string */
xfs_alloc_arg_t *args, /* allocation argument structure */
int line) /* source line number */
{
ktrace_enter(xfs_alloc_trace_buf,
(void *)(__psint_t)(XFS_ALLOC_KTRACE_ALLOC | (line << 16)),
(void *)name,
(void *)str,
(void *)args->mp,
(void *)(__psunsigned_t)args->agno,
(void *)(__psunsigned_t)args->agbno,
(void *)(__psunsigned_t)args->minlen,
(void *)(__psunsigned_t)args->maxlen,
(void *)(__psunsigned_t)args->mod,
(void *)(__psunsigned_t)args->prod,
(void *)(__psunsigned_t)args->minleft,
(void *)(__psunsigned_t)args->total,
(void *)(__psunsigned_t)args->alignment,
(void *)(__psunsigned_t)args->len,
(void *)((((__psint_t)args->type) << 16) |
(__psint_t)args->otype),
(void *)(__psint_t)((args->wasdel << 3) |
(args->wasfromfl << 2) |
(args->isfl << 1) |
(args->userdata << 0)));
}
/*
* Add an allocation trace entry for a free call.
*/
STATIC void
xfs_alloc_trace_free(
const char *name, /* function tag string */
char *str, /* additional string */
xfs_mount_t *mp, /* file system mount point */
xfs_agnumber_t agno, /* allocation group number */
xfs_agblock_t agbno, /* a.g. relative block number */
xfs_extlen_t len, /* length of extent */
int isfl, /* set if is freelist allocation/free */
int line) /* source line number */
{
ktrace_enter(xfs_alloc_trace_buf,
(void *)(__psint_t)(XFS_ALLOC_KTRACE_FREE | (line << 16)),
(void *)name,
(void *)str,
(void *)mp,
(void *)(__psunsigned_t)agno,
(void *)(__psunsigned_t)agbno,
(void *)(__psunsigned_t)len,
(void *)(__psint_t)isfl,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
/*
* Add an allocation trace entry for modifying an agf.
*/
STATIC void
xfs_alloc_trace_modagf(
const char *name, /* function tag string */
char *str, /* additional string */
xfs_mount_t *mp, /* file system mount point */
xfs_agf_t *agf, /* new agf value */
int flags, /* logging flags for agf */
int line) /* source line number */
{
ktrace_enter(xfs_alloc_trace_buf,
(void *)(__psint_t)(XFS_ALLOC_KTRACE_MODAGF | (line << 16)),
(void *)name,
(void *)str,
(void *)mp,
(void *)(__psint_t)flags,
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_seqno),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_length),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_flfirst),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_fllast),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_flcount),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_freeblks),
(void *)(__psunsigned_t)be32_to_cpu(agf->agf_longest));
}
STATIC void
xfs_alloc_trace_busy(
const char *name, /* function tag string */
char *str, /* additional string */
xfs_mount_t *mp, /* file system mount point */
xfs_agnumber_t agno, /* allocation group number */
xfs_agblock_t agbno, /* a.g. relative block number */
xfs_extlen_t len, /* length of extent */
int slot, /* perag Busy slot */
xfs_trans_t *tp,
int trtype, /* type: add, delete, search */
int line) /* source line number */
{
ktrace_enter(xfs_alloc_trace_buf,
(void *)(__psint_t)(trtype | (line << 16)),
(void *)name,
(void *)str,
(void *)mp,
(void *)(__psunsigned_t)agno,
(void *)(__psunsigned_t)agbno,
(void *)(__psunsigned_t)len,
(void *)(__psint_t)slot,
(void *)tp,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
#endif /* XFS_ALLOC_TRACE */
/* /*
* Allocation group level functions. * Allocation group level functions.
*/ */
@ -665,9 +524,6 @@ xfs_alloc_ag_vextent(
*/ */
if (args->agbno != NULLAGBLOCK) { if (args->agbno != NULLAGBLOCK) {
xfs_agf_t *agf; /* allocation group freelist header */ xfs_agf_t *agf; /* allocation group freelist header */
#ifdef XFS_ALLOC_TRACE
xfs_mount_t *mp = args->mp;
#endif
long slen = (long)args->len; long slen = (long)args->len;
ASSERT(args->len >= args->minlen && args->len <= args->maxlen); ASSERT(args->len >= args->minlen && args->len <= args->maxlen);
@ -682,7 +538,6 @@ xfs_alloc_ag_vextent(
args->pag->pagf_freeblks -= args->len; args->pag->pagf_freeblks -= args->len;
ASSERT(be32_to_cpu(agf->agf_freeblks) <= ASSERT(be32_to_cpu(agf->agf_freeblks) <=
be32_to_cpu(agf->agf_length)); be32_to_cpu(agf->agf_length));
TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS);
xfs_alloc_log_agf(args->tp, args->agbp, xfs_alloc_log_agf(args->tp, args->agbp,
XFS_AGF_FREEBLKS); XFS_AGF_FREEBLKS);
/* search the busylist for these blocks */ /* search the busylist for these blocks */
@ -792,13 +647,14 @@ xfs_alloc_ag_vextent_exact(
} }
xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
TRACE_ALLOC("normal", args);
trace_xfs_alloc_exact_done(args);
args->wasfromfl = 0; args->wasfromfl = 0;
return 0; return 0;
error0: error0:
xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
TRACE_ALLOC("error", args); trace_xfs_alloc_exact_error(args);
return error; return error;
} }
@ -958,7 +814,7 @@ xfs_alloc_ag_vextent_near(
args->len = blen; args->len = blen;
if (!xfs_alloc_fix_minleft(args)) { if (!xfs_alloc_fix_minleft(args)) {
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
TRACE_ALLOC("nominleft", args); trace_xfs_alloc_near_nominleft(args);
return 0; return 0;
} }
blen = args->len; blen = args->len;
@ -981,7 +837,8 @@ xfs_alloc_ag_vextent_near(
goto error0; goto error0;
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
TRACE_ALLOC("first", args);
trace_xfs_alloc_near_first(args);
return 0; return 0;
} }
/* /*
@ -1272,7 +1129,7 @@ xfs_alloc_ag_vextent_near(
* If we couldn't get anything, give up. * If we couldn't get anything, give up.
*/ */
if (bno_cur_lt == NULL && bno_cur_gt == NULL) { if (bno_cur_lt == NULL && bno_cur_gt == NULL) {
TRACE_ALLOC("neither", args); trace_xfs_alloc_size_neither(args);
args->agbno = NULLAGBLOCK; args->agbno = NULLAGBLOCK;
return 0; return 0;
} }
@ -1299,7 +1156,7 @@ xfs_alloc_ag_vextent_near(
args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
xfs_alloc_fix_len(args); xfs_alloc_fix_len(args);
if (!xfs_alloc_fix_minleft(args)) { if (!xfs_alloc_fix_minleft(args)) {
TRACE_ALLOC("nominleft", args); trace_xfs_alloc_near_nominleft(args);
xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
return 0; return 0;
@ -1314,13 +1171,18 @@ xfs_alloc_ag_vextent_near(
if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen,
ltnew, rlen, XFSA_FIXUP_BNO_OK))) ltnew, rlen, XFSA_FIXUP_BNO_OK)))
goto error0; goto error0;
TRACE_ALLOC(j ? "gt" : "lt", args);
if (j)
trace_xfs_alloc_near_greater(args);
else
trace_xfs_alloc_near_lesser(args);
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
return 0; return 0;
error0: error0:
TRACE_ALLOC("error", args); trace_xfs_alloc_near_error(args);
if (cnt_cur != NULL) if (cnt_cur != NULL)
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
if (bno_cur_lt != NULL) if (bno_cur_lt != NULL)
@ -1371,7 +1233,7 @@ xfs_alloc_ag_vextent_size(
goto error0; goto error0;
if (i == 0 || flen == 0) { if (i == 0 || flen == 0) {
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
TRACE_ALLOC("noentry", args); trace_xfs_alloc_size_noentry(args);
return 0; return 0;
} }
ASSERT(i == 1); ASSERT(i == 1);
@ -1448,7 +1310,7 @@ xfs_alloc_ag_vextent_size(
xfs_alloc_fix_len(args); xfs_alloc_fix_len(args);
if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) {
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
TRACE_ALLOC("nominleft", args); trace_xfs_alloc_size_nominleft(args);
args->agbno = NULLAGBLOCK; args->agbno = NULLAGBLOCK;
return 0; return 0;
} }
@ -1471,11 +1333,11 @@ xfs_alloc_ag_vextent_size(
args->agbno + args->len <= args->agbno + args->len <=
be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
error0); error0);
TRACE_ALLOC("normal", args); trace_xfs_alloc_size_done(args);
return 0; return 0;
error0: error0:
TRACE_ALLOC("error", args); trace_xfs_alloc_size_error(args);
if (cnt_cur) if (cnt_cur)
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
if (bno_cur) if (bno_cur)
@ -1534,7 +1396,7 @@ xfs_alloc_ag_vextent_small(
be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
error0); error0);
args->wasfromfl = 1; args->wasfromfl = 1;
TRACE_ALLOC("freelist", args); trace_xfs_alloc_small_freelist(args);
*stat = 0; *stat = 0;
return 0; return 0;
} }
@ -1556,17 +1418,17 @@ xfs_alloc_ag_vextent_small(
*/ */
if (flen < args->minlen) { if (flen < args->minlen) {
args->agbno = NULLAGBLOCK; args->agbno = NULLAGBLOCK;
TRACE_ALLOC("notenough", args); trace_xfs_alloc_small_notenough(args);
flen = 0; flen = 0;
} }
*fbnop = fbno; *fbnop = fbno;
*flenp = flen; *flenp = flen;
*stat = 1; *stat = 1;
TRACE_ALLOC("normal", args); trace_xfs_alloc_small_done(args);
return 0; return 0;
error0: error0:
TRACE_ALLOC("error", args); trace_xfs_alloc_small_error(args);
return error; return error;
} }
@ -1809,17 +1671,14 @@ xfs_free_ag_extent(
be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_freeblks) <=
be32_to_cpu(agf->agf_length), be32_to_cpu(agf->agf_length),
error0); error0);
TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS);
xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS);
if (!isfl) if (!isfl)
xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len);
XFS_STATS_INC(xs_freex); XFS_STATS_INC(xs_freex);
XFS_STATS_ADD(xs_freeb, len); XFS_STATS_ADD(xs_freeb, len);
} }
TRACE_FREE(haveleft ?
(haveright ? "both" : "left") : trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright);
(haveright ? "right" : "none"),
agno, bno, len, isfl);
/* /*
* Since blocks move to the free list without the coordination * Since blocks move to the free list without the coordination
@ -1836,7 +1695,7 @@ xfs_free_ag_extent(
return 0; return 0;
error0: error0:
TRACE_FREE("error", agno, bno, len, isfl); trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1);
if (bno_cur) if (bno_cur)
xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
if (cnt_cur) if (cnt_cur)
@ -2122,7 +1981,6 @@ xfs_alloc_get_freelist(
logflags |= XFS_AGF_BTREEBLKS; logflags |= XFS_AGF_BTREEBLKS;
} }
TRACE_MODAGF(NULL, agf, logflags);
xfs_alloc_log_agf(tp, agbp, logflags); xfs_alloc_log_agf(tp, agbp, logflags);
*bnop = bno; *bnop = bno;
@ -2165,6 +2023,8 @@ xfs_alloc_log_agf(
sizeof(xfs_agf_t) sizeof(xfs_agf_t)
}; };
trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_);
xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last);
xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last);
} }
@ -2230,13 +2090,11 @@ xfs_alloc_put_freelist(
logflags |= XFS_AGF_BTREEBLKS; logflags |= XFS_AGF_BTREEBLKS;
} }
TRACE_MODAGF(NULL, agf, logflags);
xfs_alloc_log_agf(tp, agbp, logflags); xfs_alloc_log_agf(tp, agbp, logflags);
ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp));
blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)];
*blockp = cpu_to_be32(bno); *blockp = cpu_to_be32(bno);
TRACE_MODAGF(NULL, agf, logflags);
xfs_alloc_log_agf(tp, agbp, logflags); xfs_alloc_log_agf(tp, agbp, logflags);
xfs_trans_log_buf(tp, agflbp, xfs_trans_log_buf(tp, agflbp,
(int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl),
@ -2399,7 +2257,7 @@ xfs_alloc_vextent(
args->minlen > args->maxlen || args->minlen > agsize || args->minlen > args->maxlen || args->minlen > agsize ||
args->mod >= args->prod) { args->mod >= args->prod) {
args->fsbno = NULLFSBLOCK; args->fsbno = NULLFSBLOCK;
TRACE_ALLOC("badargs", args); trace_xfs_alloc_vextent_badargs(args);
return 0; return 0;
} }
minleft = args->minleft; minleft = args->minleft;
@ -2418,12 +2276,12 @@ xfs_alloc_vextent(
error = xfs_alloc_fix_freelist(args, 0); error = xfs_alloc_fix_freelist(args, 0);
args->minleft = minleft; args->minleft = minleft;
if (error) { if (error) {
TRACE_ALLOC("nofix", args); trace_xfs_alloc_vextent_nofix(args);
goto error0; goto error0;
} }
if (!args->agbp) { if (!args->agbp) {
up_read(&mp->m_peraglock); up_read(&mp->m_peraglock);
TRACE_ALLOC("noagbp", args); trace_xfs_alloc_vextent_noagbp(args);
break; break;
} }
args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
@ -2488,7 +2346,7 @@ xfs_alloc_vextent(
error = xfs_alloc_fix_freelist(args, flags); error = xfs_alloc_fix_freelist(args, flags);
args->minleft = minleft; args->minleft = minleft;
if (error) { if (error) {
TRACE_ALLOC("nofix", args); trace_xfs_alloc_vextent_nofix(args);
goto error0; goto error0;
} }
/* /*
@ -2499,7 +2357,9 @@ xfs_alloc_vextent(
goto error0; goto error0;
break; break;
} }
TRACE_ALLOC("loopfailed", args);
trace_xfs_alloc_vextent_loopfailed(args);
/* /*
* Didn't work, figure out the next iteration. * Didn't work, figure out the next iteration.
*/ */
@ -2526,7 +2386,7 @@ xfs_alloc_vextent(
if (args->agno == sagno) { if (args->agno == sagno) {
if (no_min == 1) { if (no_min == 1) {
args->agbno = NULLAGBLOCK; args->agbno = NULLAGBLOCK;
TRACE_ALLOC("allfailed", args); trace_xfs_alloc_vextent_allfailed(args);
break; break;
} }
if (flags == 0) { if (flags == 0) {
@ -2642,16 +2502,16 @@ xfs_alloc_mark_busy(xfs_trans_t *tp,
} }
} }
trace_xfs_alloc_busy(mp, agno, bno, len, n);
if (n < XFS_PAGB_NUM_SLOTS) { if (n < XFS_PAGB_NUM_SLOTS) {
bsy = &mp->m_perag[agno].pagb_list[n]; bsy = &mp->m_perag[agno].pagb_list[n];
mp->m_perag[agno].pagb_count++; mp->m_perag[agno].pagb_count++;
TRACE_BUSY("xfs_alloc_mark_busy", "got", agno, bno, len, n, tp);
bsy->busy_start = bno; bsy->busy_start = bno;
bsy->busy_length = len; bsy->busy_length = len;
bsy->busy_tp = tp; bsy->busy_tp = tp;
xfs_trans_add_busy(tp, agno, n); xfs_trans_add_busy(tp, agno, n);
} else { } else {
TRACE_BUSY("xfs_alloc_mark_busy", "FULL", agno, bno, len, -1, tp);
/* /*
* The busy list is full! Since it is now not possible to * The busy list is full! Since it is now not possible to
* track the free block, make this a synchronous transaction * track the free block, make this a synchronous transaction
@ -2678,12 +2538,12 @@ xfs_alloc_clear_busy(xfs_trans_t *tp,
list = mp->m_perag[agno].pagb_list; list = mp->m_perag[agno].pagb_list;
ASSERT(idx < XFS_PAGB_NUM_SLOTS); ASSERT(idx < XFS_PAGB_NUM_SLOTS);
trace_xfs_alloc_unbusy(mp, agno, idx, list[idx].busy_tp == tp);
if (list[idx].busy_tp == tp) { if (list[idx].busy_tp == tp) {
TRACE_UNBUSY("xfs_alloc_clear_busy", "found", agno, idx, tp);
list[idx].busy_tp = NULL; list[idx].busy_tp = NULL;
mp->m_perag[agno].pagb_count--; mp->m_perag[agno].pagb_count--;
} else {
TRACE_UNBUSY("xfs_alloc_clear_busy", "missing", agno, idx, tp);
} }
spin_unlock(&mp->m_perag[agno].pagb_lock); spin_unlock(&mp->m_perag[agno].pagb_lock);
@ -2724,24 +2584,22 @@ xfs_alloc_search_busy(xfs_trans_t *tp,
if ((bno > bend) || (uend < bsy->busy_start)) { if ((bno > bend) || (uend < bsy->busy_start)) {
cnt--; cnt--;
} else { } else {
TRACE_BUSYSEARCH("xfs_alloc_search_busy",
"found1", agno, bno, len, tp);
break; break;
} }
} }
} }
trace_xfs_alloc_busysearch(mp, agno, bno, len, !!cnt);
/* /*
* If a block was found, force the log through the LSN of the * If a block was found, force the log through the LSN of the
* transaction that freed the block * transaction that freed the block
*/ */
if (cnt) { if (cnt) {
TRACE_BUSYSEARCH("xfs_alloc_search_busy", "found", agno, bno, len, tp);
lsn = bsy->busy_tp->t_commit_lsn; lsn = bsy->busy_tp->t_commit_lsn;
spin_unlock(&mp->m_perag[agno].pagb_lock); spin_unlock(&mp->m_perag[agno].pagb_lock);
xfs_log_force(mp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); xfs_log_force(mp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC);
} else { } else {
TRACE_BUSYSEARCH("xfs_alloc_search_busy", "not-found", agno, bno, len, tp);
spin_unlock(&mp->m_perag[agno].pagb_lock); spin_unlock(&mp->m_perag[agno].pagb_lock);
} }
} }

View File

@ -37,6 +37,15 @@ typedef enum xfs_alloctype
XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */ XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */
} xfs_alloctype_t; } xfs_alloctype_t;
#define XFS_ALLOC_TYPES \
{ XFS_ALLOCTYPE_ANY_AG, "ANY_AG" }, \
{ XFS_ALLOCTYPE_FIRST_AG, "FIRST_AG" }, \
{ XFS_ALLOCTYPE_START_AG, "START_AG" }, \
{ XFS_ALLOCTYPE_THIS_AG, "THIS_AG" }, \
{ XFS_ALLOCTYPE_START_BNO, "START_BNO" }, \
{ XFS_ALLOCTYPE_NEAR_BNO, "NEAR_BNO" }, \
{ XFS_ALLOCTYPE_THIS_BNO, "THIS_BNO" }
/* /*
* Flags for xfs_alloc_fix_freelist. * Flags for xfs_alloc_fix_freelist.
*/ */
@ -109,24 +118,6 @@ xfs_alloc_longest_free_extent(struct xfs_mount *mp,
#ifdef __KERNEL__ #ifdef __KERNEL__
#if defined(XFS_ALLOC_TRACE)
/*
* Allocation tracing buffer size.
*/
#define XFS_ALLOC_TRACE_SIZE 4096
extern ktrace_t *xfs_alloc_trace_buf;
/*
* Types for alloc tracing.
*/
#define XFS_ALLOC_KTRACE_ALLOC 1
#define XFS_ALLOC_KTRACE_FREE 2
#define XFS_ALLOC_KTRACE_MODAGF 3
#define XFS_ALLOC_KTRACE_BUSY 4
#define XFS_ALLOC_KTRACE_UNBUSY 5
#define XFS_ALLOC_KTRACE_BUSYSEARCH 6
#endif
void void
xfs_alloc_mark_busy(xfs_trans_t *tp, xfs_alloc_mark_busy(xfs_trans_t *tp,
xfs_agnumber_t agno, xfs_agnumber_t agno,

View File

@ -39,6 +39,7 @@
#include "xfs_ialloc.h" #include "xfs_ialloc.h"
#include "xfs_alloc.h" #include "xfs_alloc.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
STATIC struct xfs_btree_cur * STATIC struct xfs_btree_cur *

View File

@ -47,6 +47,7 @@
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
/* /*
* xfs_attr.c * xfs_attr.c
@ -89,10 +90,6 @@ STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args);
#define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */
#if defined(XFS_ATTR_TRACE)
ktrace_t *xfs_attr_trace_buf;
#endif
STATIC int STATIC int
xfs_attr_name_to_xname( xfs_attr_name_to_xname(
struct xfs_name *xname, struct xfs_name *xname,
@ -640,7 +637,6 @@ xfs_attr_list_int(xfs_attr_list_context_t *context)
return EIO; return EIO;
xfs_ilock(dp, XFS_ILOCK_SHARED); xfs_ilock(dp, XFS_ILOCK_SHARED);
xfs_attr_trace_l_c("syscall start", context);
/* /*
* Decide on what work routines to call based on the inode size. * Decide on what work routines to call based on the inode size.
@ -656,7 +652,6 @@ xfs_attr_list_int(xfs_attr_list_context_t *context)
} }
xfs_iunlock(dp, XFS_ILOCK_SHARED); xfs_iunlock(dp, XFS_ILOCK_SHARED);
xfs_attr_trace_l_c("syscall end", context);
return error; return error;
} }
@ -702,7 +697,7 @@ xfs_attr_put_listent(xfs_attr_list_context_t *context, int flags,
context->count * sizeof(alist->al_offset[0]); context->count * sizeof(alist->al_offset[0]);
context->firstu -= ATTR_ENTSIZE(namelen); context->firstu -= ATTR_ENTSIZE(namelen);
if (context->firstu < arraytop) { if (context->firstu < arraytop) {
xfs_attr_trace_l_c("buffer full", context); trace_xfs_attr_list_full(context);
alist->al_more = 1; alist->al_more = 1;
context->seen_enough = 1; context->seen_enough = 1;
return 1; return 1;
@ -714,7 +709,7 @@ xfs_attr_put_listent(xfs_attr_list_context_t *context, int flags,
aep->a_name[namelen] = 0; aep->a_name[namelen] = 0;
alist->al_offset[context->count++] = context->firstu; alist->al_offset[context->count++] = context->firstu;
alist->al_count = context->count; alist->al_count = context->count;
xfs_attr_trace_l_c("add", context); trace_xfs_attr_list_add(context);
return 0; return 0;
} }
@ -1853,7 +1848,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
node = bp->data; node = bp->data;
switch (be16_to_cpu(node->hdr.info.magic)) { switch (be16_to_cpu(node->hdr.info.magic)) {
case XFS_DA_NODE_MAGIC: case XFS_DA_NODE_MAGIC:
xfs_attr_trace_l_cn("wrong blk", context, node); trace_xfs_attr_list_wrong_blk(context);
xfs_da_brelse(NULL, bp); xfs_da_brelse(NULL, bp);
bp = NULL; bp = NULL;
break; break;
@ -1861,20 +1856,18 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
leaf = bp->data; leaf = bp->data;
if (cursor->hashval > be32_to_cpu(leaf->entries[ if (cursor->hashval > be32_to_cpu(leaf->entries[
be16_to_cpu(leaf->hdr.count)-1].hashval)) { be16_to_cpu(leaf->hdr.count)-1].hashval)) {
xfs_attr_trace_l_cl("wrong blk", trace_xfs_attr_list_wrong_blk(context);
context, leaf);
xfs_da_brelse(NULL, bp); xfs_da_brelse(NULL, bp);
bp = NULL; bp = NULL;
} else if (cursor->hashval <= } else if (cursor->hashval <=
be32_to_cpu(leaf->entries[0].hashval)) { be32_to_cpu(leaf->entries[0].hashval)) {
xfs_attr_trace_l_cl("maybe wrong blk", trace_xfs_attr_list_wrong_blk(context);
context, leaf);
xfs_da_brelse(NULL, bp); xfs_da_brelse(NULL, bp);
bp = NULL; bp = NULL;
} }
break; break;
default: default:
xfs_attr_trace_l_c("wrong blk - ??", context); trace_xfs_attr_list_wrong_blk(context);
xfs_da_brelse(NULL, bp); xfs_da_brelse(NULL, bp);
bp = NULL; bp = NULL;
} }
@ -1919,8 +1912,8 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
if (cursor->hashval if (cursor->hashval
<= be32_to_cpu(btree->hashval)) { <= be32_to_cpu(btree->hashval)) {
cursor->blkno = be32_to_cpu(btree->before); cursor->blkno = be32_to_cpu(btree->before);
xfs_attr_trace_l_cb("descending", trace_xfs_attr_list_node_descend(context,
context, btree); btree);
break; break;
} }
} }
@ -2270,85 +2263,3 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
} }
return(0); return(0);
} }
#if defined(XFS_ATTR_TRACE)
/*
* Add a trace buffer entry for an attr_list context structure.
*/
void
xfs_attr_trace_l_c(char *where, struct xfs_attr_list_context *context)
{
xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_C, where, context,
(__psunsigned_t)NULL,
(__psunsigned_t)NULL,
(__psunsigned_t)NULL);
}
/*
* Add a trace buffer entry for a context structure and a Btree node.
*/
void
xfs_attr_trace_l_cn(char *where, struct xfs_attr_list_context *context,
struct xfs_da_intnode *node)
{
xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CN, where, context,
(__psunsigned_t)be16_to_cpu(node->hdr.count),
(__psunsigned_t)be32_to_cpu(node->btree[0].hashval),
(__psunsigned_t)be32_to_cpu(node->btree[
be16_to_cpu(node->hdr.count)-1].hashval));
}
/*
* Add a trace buffer entry for a context structure and a Btree element.
*/
void
xfs_attr_trace_l_cb(char *where, struct xfs_attr_list_context *context,
struct xfs_da_node_entry *btree)
{
xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CB, where, context,
(__psunsigned_t)be32_to_cpu(btree->hashval),
(__psunsigned_t)be32_to_cpu(btree->before),
(__psunsigned_t)NULL);
}
/*
* Add a trace buffer entry for a context structure and a leaf block.
*/
void
xfs_attr_trace_l_cl(char *where, struct xfs_attr_list_context *context,
struct xfs_attr_leafblock *leaf)
{
xfs_attr_trace_enter(XFS_ATTR_KTRACE_L_CL, where, context,
(__psunsigned_t)be16_to_cpu(leaf->hdr.count),
(__psunsigned_t)be32_to_cpu(leaf->entries[0].hashval),
(__psunsigned_t)be32_to_cpu(leaf->entries[
be16_to_cpu(leaf->hdr.count)-1].hashval));
}
/*
* Add a trace buffer entry for the arguments given to the routine,
* generic form.
*/
void
xfs_attr_trace_enter(int type, char *where,
struct xfs_attr_list_context *context,
__psunsigned_t a13, __psunsigned_t a14,
__psunsigned_t a15)
{
ASSERT(xfs_attr_trace_buf);
ktrace_enter(xfs_attr_trace_buf, (void *)((__psunsigned_t)type),
(void *)((__psunsigned_t)where),
(void *)((__psunsigned_t)context->dp),
(void *)((__psunsigned_t)context->cursor->hashval),
(void *)((__psunsigned_t)context->cursor->blkno),
(void *)((__psunsigned_t)context->cursor->offset),
(void *)((__psunsigned_t)context->alist),
(void *)((__psunsigned_t)context->bufsize),
(void *)((__psunsigned_t)context->count),
(void *)((__psunsigned_t)context->firstu),
NULL,
(void *)((__psunsigned_t)context->dupcnt),
(void *)((__psunsigned_t)context->flags),
(void *)a13, (void *)a14, (void *)a15);
}
#endif /* XFS_ATTR_TRACE */

View File

@ -48,6 +48,16 @@ struct xfs_attr_list_context;
#define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */
#define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */ #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */
#define XFS_ATTR_FLAGS \
{ ATTR_DONTFOLLOW, "DONTFOLLOW" }, \
{ ATTR_ROOT, "ROOT" }, \
{ ATTR_TRUST, "TRUST" }, \
{ ATTR_SECURE, "SECURE" }, \
{ ATTR_CREATE, "CREATE" }, \
{ ATTR_REPLACE, "REPLACE" }, \
{ ATTR_KERNOTIME, "KERNOTIME" }, \
{ ATTR_KERNOVAL, "KERNOVAL" }
/* /*
* The maximum size (into the kernel or returned from the kernel) of an * The maximum size (into the kernel or returned from the kernel) of an
* attribute value or the buffer used for an attr_list() call. Larger * attribute value or the buffer used for an attr_list() call. Larger

View File

@ -42,6 +42,7 @@
#include "xfs_attr.h" #include "xfs_attr.h"
#include "xfs_attr_leaf.h" #include "xfs_attr_leaf.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* xfs_attr_leaf.c * xfs_attr_leaf.c
@ -594,7 +595,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
cursor = context->cursor; cursor = context->cursor;
ASSERT(cursor != NULL); ASSERT(cursor != NULL);
xfs_attr_trace_l_c("sf start", context); trace_xfs_attr_list_sf(context);
/* /*
* If the buffer is large enough and the cursor is at the start, * If the buffer is large enough and the cursor is at the start,
@ -627,7 +628,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
return error; return error;
sfe = XFS_ATTR_SF_NEXTENTRY(sfe); sfe = XFS_ATTR_SF_NEXTENTRY(sfe);
} }
xfs_attr_trace_l_c("sf big-gulp", context); trace_xfs_attr_list_sf_all(context);
return(0); return(0);
} }
@ -653,7 +654,6 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
XFS_CORRUPTION_ERROR("xfs_attr_shortform_list", XFS_CORRUPTION_ERROR("xfs_attr_shortform_list",
XFS_ERRLEVEL_LOW, XFS_ERRLEVEL_LOW,
context->dp->i_mount, sfe); context->dp->i_mount, sfe);
xfs_attr_trace_l_c("sf corrupted", context);
kmem_free(sbuf); kmem_free(sbuf);
return XFS_ERROR(EFSCORRUPTED); return XFS_ERROR(EFSCORRUPTED);
} }
@ -693,7 +693,6 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
} }
if (i == nsbuf) { if (i == nsbuf) {
kmem_free(sbuf); kmem_free(sbuf);
xfs_attr_trace_l_c("blk end", context);
return(0); return(0);
} }
@ -719,7 +718,6 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
} }
kmem_free(sbuf); kmem_free(sbuf);
xfs_attr_trace_l_c("sf E-O-F", context);
return(0); return(0);
} }
@ -2323,7 +2321,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context)
cursor = context->cursor; cursor = context->cursor;
cursor->initted = 1; cursor->initted = 1;
xfs_attr_trace_l_cl("blk start", context, leaf); trace_xfs_attr_list_leaf(context);
/* /*
* Re-find our place in the leaf block if this is a new syscall. * Re-find our place in the leaf block if this is a new syscall.
@ -2344,7 +2342,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context)
} }
} }
if (i == be16_to_cpu(leaf->hdr.count)) { if (i == be16_to_cpu(leaf->hdr.count)) {
xfs_attr_trace_l_c("not found", context); trace_xfs_attr_list_notfound(context);
return(0); return(0);
} }
} else { } else {
@ -2419,7 +2417,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context)
break; break;
cursor->offset++; cursor->offset++;
} }
xfs_attr_trace_l_cl("blk end", context, leaf); trace_xfs_attr_list_leaf_end(context);
return(retval); return(retval);
} }

View File

@ -25,8 +25,6 @@
* to fit into the literal area of the inode. * to fit into the literal area of the inode.
*/ */
struct xfs_inode;
/* /*
* Entries are packed toward the top as tight as possible. * Entries are packed toward the top as tight as possible.
*/ */
@ -69,42 +67,4 @@ typedef struct xfs_attr_sf_sort {
(be16_to_cpu(((xfs_attr_shortform_t *) \ (be16_to_cpu(((xfs_attr_shortform_t *) \
((dp)->i_afp->if_u1.if_data))->hdr.totsize)) ((dp)->i_afp->if_u1.if_data))->hdr.totsize))
#if defined(XFS_ATTR_TRACE)
/*
* Kernel tracing support for attribute lists
*/
struct xfs_attr_list_context;
struct xfs_da_intnode;
struct xfs_da_node_entry;
struct xfs_attr_leafblock;
#define XFS_ATTR_TRACE_SIZE 4096 /* size of global trace buffer */
extern ktrace_t *xfs_attr_trace_buf;
/*
* Trace record types.
*/
#define XFS_ATTR_KTRACE_L_C 1 /* context */
#define XFS_ATTR_KTRACE_L_CN 2 /* context, node */
#define XFS_ATTR_KTRACE_L_CB 3 /* context, btree */
#define XFS_ATTR_KTRACE_L_CL 4 /* context, leaf */
void xfs_attr_trace_l_c(char *where, struct xfs_attr_list_context *context);
void xfs_attr_trace_l_cn(char *where, struct xfs_attr_list_context *context,
struct xfs_da_intnode *node);
void xfs_attr_trace_l_cb(char *where, struct xfs_attr_list_context *context,
struct xfs_da_node_entry *btree);
void xfs_attr_trace_l_cl(char *where, struct xfs_attr_list_context *context,
struct xfs_attr_leafblock *leaf);
void xfs_attr_trace_enter(int type, char *where,
struct xfs_attr_list_context *context,
__psunsigned_t a13, __psunsigned_t a14,
__psunsigned_t a15);
#else
#define xfs_attr_trace_l_c(w,c)
#define xfs_attr_trace_l_cn(w,c,n)
#define xfs_attr_trace_l_cb(w,c,b)
#define xfs_attr_trace_l_cl(w,c,l)
#endif /* XFS_ATTR_TRACE */
#endif /* __XFS_ATTR_SF_H__ */ #endif /* __XFS_ATTR_SF_H__ */

File diff suppressed because it is too large Load Diff

View File

@ -95,6 +95,21 @@ typedef struct xfs_bmap_free
/* need write cache flushing and no */ /* need write cache flushing and no */
/* additional allocation alignments */ /* additional allocation alignments */
#define XFS_BMAPI_FLAGS \
{ XFS_BMAPI_WRITE, "WRITE" }, \
{ XFS_BMAPI_DELAY, "DELAY" }, \
{ XFS_BMAPI_ENTIRE, "ENTIRE" }, \
{ XFS_BMAPI_METADATA, "METADATA" }, \
{ XFS_BMAPI_EXACT, "EXACT" }, \
{ XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \
{ XFS_BMAPI_ASYNC, "ASYNC" }, \
{ XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \
{ XFS_BMAPI_PREALLOC, "PREALLOC" }, \
{ XFS_BMAPI_IGSTATE, "IGSTATE" }, \
{ XFS_BMAPI_CONTIG, "CONTIG" }, \
{ XFS_BMAPI_CONVERT, "CONVERT" }
static inline int xfs_bmapi_aflag(int w) static inline int xfs_bmapi_aflag(int w)
{ {
return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0);
@ -135,36 +150,43 @@ typedef struct xfs_bmalloca {
char conv; /* overwriting unwritten extents */ char conv; /* overwriting unwritten extents */
} xfs_bmalloca_t; } xfs_bmalloca_t;
#if defined(__KERNEL__) && defined(XFS_BMAP_TRACE)
/* /*
* Trace operations for bmap extent tracing * Flags for xfs_bmap_add_extent*.
*/ */
#define XFS_BMAP_KTRACE_DELETE 1 #define BMAP_LEFT_CONTIG (1 << 0)
#define XFS_BMAP_KTRACE_INSERT 2 #define BMAP_RIGHT_CONTIG (1 << 1)
#define XFS_BMAP_KTRACE_PRE_UP 3 #define BMAP_LEFT_FILLING (1 << 2)
#define XFS_BMAP_KTRACE_POST_UP 4 #define BMAP_RIGHT_FILLING (1 << 3)
#define BMAP_LEFT_DELAY (1 << 4)
#define BMAP_RIGHT_DELAY (1 << 5)
#define BMAP_LEFT_VALID (1 << 6)
#define BMAP_RIGHT_VALID (1 << 7)
#define BMAP_ATTRFORK (1 << 8)
#define XFS_BMAP_TRACE_SIZE 4096 /* size of global trace buffer */ #define XFS_BMAP_EXT_FLAGS \
#define XFS_BMAP_KTRACE_SIZE 32 /* size of per-inode trace buffer */ { BMAP_LEFT_CONTIG, "LC" }, \
extern ktrace_t *xfs_bmap_trace_buf; { BMAP_RIGHT_CONTIG, "RC" }, \
{ BMAP_LEFT_FILLING, "LF" }, \
{ BMAP_RIGHT_FILLING, "RF" }, \
{ BMAP_ATTRFORK, "ATTR" }
/* /*
* Add bmap trace insert entries for all the contents of the extent list. * Add bmap trace insert entries for all the contents of the extent list.
*
* Quite excessive tracing. Only do this for debug builds.
*/ */
#if defined(__KERNEL) && defined(DEBUG)
void void
xfs_bmap_trace_exlist( xfs_bmap_trace_exlist(
const char *fname, /* function name */
struct xfs_inode *ip, /* incore inode pointer */ struct xfs_inode *ip, /* incore inode pointer */
xfs_extnum_t cnt, /* count of entries in list */ xfs_extnum_t cnt, /* count of entries in list */
int whichfork); /* data or attr fork */ int whichfork,
unsigned long caller_ip); /* data or attr fork */
#define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \
xfs_bmap_trace_exlist(__func__,ip,c,w) xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_)
#else
#else /* __KERNEL__ && XFS_BMAP_TRACE */
#define XFS_BMAP_TRACE_EXLIST(ip,c,w) #define XFS_BMAP_TRACE_EXLIST(ip,c,w)
#endif
#endif /* __KERNEL__ && XFS_BMAP_TRACE */
/* /*
* Convert inode from non-attributed to attributed. * Convert inode from non-attributed to attributed.

View File

@ -768,12 +768,6 @@ xfs_bmbt_trace_enter(
(void *)a0, (void *)a1, (void *)a2, (void *)a3, (void *)a0, (void *)a1, (void *)a2, (void *)a3,
(void *)a4, (void *)a5, (void *)a6, (void *)a7, (void *)a4, (void *)a5, (void *)a6, (void *)a7,
(void *)a8, (void *)a9, (void *)a10); (void *)a8, (void *)a9, (void *)a10);
ktrace_enter(ip->i_btrace,
(void *)((__psint_t)type | (whichfork << 8) | (line << 16)),
(void *)func, (void *)s, (void *)ip, (void *)cur,
(void *)a0, (void *)a1, (void *)a2, (void *)a3,
(void *)a4, (void *)a5, (void *)a6, (void *)a7,
(void *)a8, (void *)a9, (void *)a10);
} }
STATIC void STATIC void

View File

@ -39,6 +39,7 @@
#include "xfs_btree_trace.h" #include "xfs_btree_trace.h"
#include "xfs_ialloc.h" #include "xfs_ialloc.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* Cursor allocation zone. * Cursor allocation zone.
@ -81,7 +82,7 @@ xfs_btree_check_lblock(
XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_ERRTAG_BTREE_CHECK_LBLOCK,
XFS_RANDOM_BTREE_CHECK_LBLOCK))) { XFS_RANDOM_BTREE_CHECK_LBLOCK))) {
if (bp) if (bp)
xfs_buftrace("LBTREE ERROR", bp); trace_xfs_btree_corrupt(bp, _RET_IP_);
XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW,
mp); mp);
return XFS_ERROR(EFSCORRUPTED); return XFS_ERROR(EFSCORRUPTED);
@ -119,7 +120,7 @@ xfs_btree_check_sblock(
XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_ERRTAG_BTREE_CHECK_SBLOCK,
XFS_RANDOM_BTREE_CHECK_SBLOCK))) { XFS_RANDOM_BTREE_CHECK_SBLOCK))) {
if (bp) if (bp)
xfs_buftrace("SBTREE ERROR", bp); trace_xfs_btree_corrupt(bp, _RET_IP_);
XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", XFS_CORRUPTION_ERROR("xfs_btree_check_sblock",
XFS_ERRLEVEL_LOW, cur->bc_mp, block); XFS_ERRLEVEL_LOW, cur->bc_mp, block);
return XFS_ERROR(EFSCORRUPTED); return XFS_ERROR(EFSCORRUPTED);

View File

@ -58,8 +58,6 @@ void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *,
struct xfs_buf *, int, int); struct xfs_buf *, int, int);
void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *, void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *,
struct xfs_buf *, int, int, int); struct xfs_buf *, int, int, int);
void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *,
xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int);
void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int); void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int);
void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int, void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int,
union xfs_btree_ptr, union xfs_btree_key *, int); union xfs_btree_ptr, union xfs_btree_key *, int);
@ -71,24 +69,10 @@ void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *,
union xfs_btree_rec *, int); union xfs_btree_rec *, int);
void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int); void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int);
#define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */
extern ktrace_t *xfs_allocbt_trace_buf;
#define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */
extern ktrace_t *xfs_inobt_trace_buf;
#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */
#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */
extern ktrace_t *xfs_bmbt_trace_buf;
#define XFS_BTREE_TRACE_ARGBI(c, b, i) \ #define XFS_BTREE_TRACE_ARGBI(c, b, i) \
xfs_btree_trace_argbi(__func__, c, b, i, __LINE__) xfs_btree_trace_argbi(__func__, c, b, i, __LINE__)
#define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \ #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \
xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__) xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__)
#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \
xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__)
#define XFS_BTREE_TRACE_ARGI(c, i) \ #define XFS_BTREE_TRACE_ARGI(c, i) \
xfs_btree_trace_argi(__func__, c, i, __LINE__) xfs_btree_trace_argi(__func__, c, i, __LINE__)
#define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \ #define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \
@ -104,7 +88,6 @@ extern ktrace_t *xfs_bmbt_trace_buf;
#else #else
#define XFS_BTREE_TRACE_ARGBI(c, b, i) #define XFS_BTREE_TRACE_ARGBI(c, b, i)
#define XFS_BTREE_TRACE_ARGBII(c, b, i, j) #define XFS_BTREE_TRACE_ARGBII(c, b, i, j)
#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j)
#define XFS_BTREE_TRACE_ARGI(c, i) #define XFS_BTREE_TRACE_ARGI(c, i)
#define XFS_BTREE_TRACE_ARGIPK(c, i, p, s) #define XFS_BTREE_TRACE_ARGIPK(c, i, p, s)
#define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) #define XFS_BTREE_TRACE_ARGIPR(c, i, p, r)

View File

@ -29,6 +29,7 @@
#include "xfs_buf_item.h" #include "xfs_buf_item.h"
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
kmem_zone_t *xfs_buf_item_zone; kmem_zone_t *xfs_buf_item_zone;
@ -164,7 +165,7 @@ xfs_buf_item_size(
* is the buf log format structure with the * is the buf log format structure with the
* cancel flag in it. * cancel flag in it.
*/ */
xfs_buf_item_trace("SIZE STALE", bip); trace_xfs_buf_item_size_stale(bip);
ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL);
return 1; return 1;
} }
@ -206,7 +207,7 @@ xfs_buf_item_size(
} }
} }
xfs_buf_item_trace("SIZE NORM", bip); trace_xfs_buf_item_size(bip);
return nvecs; return nvecs;
} }
@ -259,7 +260,7 @@ xfs_buf_item_format(
* is the buf log format structure with the * is the buf log format structure with the
* cancel flag in it. * cancel flag in it.
*/ */
xfs_buf_item_trace("FORMAT STALE", bip); trace_xfs_buf_item_format_stale(bip);
ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL);
bip->bli_format.blf_size = nvecs; bip->bli_format.blf_size = nvecs;
return; return;
@ -335,7 +336,7 @@ xfs_buf_item_format(
/* /*
* Check to make sure everything is consistent. * Check to make sure everything is consistent.
*/ */
xfs_buf_item_trace("FORMAT NORM", bip); trace_xfs_buf_item_format(bip);
xfs_buf_item_log_check(bip); xfs_buf_item_log_check(bip);
} }
@ -355,8 +356,7 @@ xfs_buf_item_pin(
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || ASSERT((bip->bli_flags & XFS_BLI_LOGGED) ||
(bip->bli_flags & XFS_BLI_STALE)); (bip->bli_flags & XFS_BLI_STALE));
xfs_buf_item_trace("PIN", bip); trace_xfs_buf_item_pin(bip);
xfs_buftrace("XFS_PIN", bp);
xfs_bpin(bp); xfs_bpin(bp);
} }
@ -383,8 +383,7 @@ xfs_buf_item_unpin(
ASSERT(bp != NULL); ASSERT(bp != NULL);
ASSERT(XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *) == bip); ASSERT(XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *) == bip);
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
xfs_buf_item_trace("UNPIN", bip); trace_xfs_buf_item_unpin(bip);
xfs_buftrace("XFS_UNPIN", bp);
freed = atomic_dec_and_test(&bip->bli_refcount); freed = atomic_dec_and_test(&bip->bli_refcount);
ailp = bip->bli_item.li_ailp; ailp = bip->bli_item.li_ailp;
@ -395,8 +394,8 @@ xfs_buf_item_unpin(
ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); ASSERT(!(XFS_BUF_ISDELAYWRITE(bp)));
ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(XFS_BUF_ISSTALE(bp));
ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL);
xfs_buf_item_trace("UNPIN STALE", bip); trace_xfs_buf_item_unpin_stale(bip);
xfs_buftrace("XFS_UNPIN STALE", bp);
/* /*
* If we get called here because of an IO error, we may * If we get called here because of an IO error, we may
* or may not have the item on the AIL. xfs_trans_ail_delete() * or may not have the item on the AIL. xfs_trans_ail_delete()
@ -440,8 +439,8 @@ xfs_buf_item_unpin_remove(
if ((atomic_read(&bip->bli_refcount) == 1) && if ((atomic_read(&bip->bli_refcount) == 1) &&
(bip->bli_flags & XFS_BLI_STALE)) { (bip->bli_flags & XFS_BLI_STALE)) {
ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0);
xfs_buf_item_trace("UNPIN REMOVE", bip); trace_xfs_buf_item_unpin_stale(bip);
xfs_buftrace("XFS_UNPIN_REMOVE", bp);
/* /*
* yes -- clear the xaction descriptor in-use flag * yes -- clear the xaction descriptor in-use flag
* and free the chunk if required. We can safely * and free the chunk if required. We can safely
@ -495,7 +494,7 @@ xfs_buf_item_trylock(
XFS_BUF_HOLD(bp); XFS_BUF_HOLD(bp);
ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); ASSERT(!(bip->bli_flags & XFS_BLI_STALE));
xfs_buf_item_trace("TRYLOCK SUCCESS", bip); trace_xfs_buf_item_trylock(bip);
return XFS_ITEM_SUCCESS; return XFS_ITEM_SUCCESS;
} }
@ -524,7 +523,6 @@ xfs_buf_item_unlock(
uint hold; uint hold;
bp = bip->bli_buf; bp = bip->bli_buf;
xfs_buftrace("XFS_UNLOCK", bp);
/* /*
* Clear the buffer's association with this transaction. * Clear the buffer's association with this transaction.
@ -547,7 +545,7 @@ xfs_buf_item_unlock(
*/ */
if (bip->bli_flags & XFS_BLI_STALE) { if (bip->bli_flags & XFS_BLI_STALE) {
bip->bli_flags &= ~XFS_BLI_LOGGED; bip->bli_flags &= ~XFS_BLI_LOGGED;
xfs_buf_item_trace("UNLOCK STALE", bip); trace_xfs_buf_item_unlock_stale(bip);
ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL);
if (!aborted) if (!aborted)
return; return;
@ -574,7 +572,7 @@ xfs_buf_item_unlock(
* release the buffer at the end of this routine. * release the buffer at the end of this routine.
*/ */
hold = bip->bli_flags & XFS_BLI_HOLD; hold = bip->bli_flags & XFS_BLI_HOLD;
xfs_buf_item_trace("UNLOCK", bip); trace_xfs_buf_item_unlock(bip);
/* /*
* If the buf item isn't tracking any data, free it. * If the buf item isn't tracking any data, free it.
@ -618,7 +616,8 @@ xfs_buf_item_committed(
xfs_buf_log_item_t *bip, xfs_buf_log_item_t *bip,
xfs_lsn_t lsn) xfs_lsn_t lsn)
{ {
xfs_buf_item_trace("COMMITTED", bip); trace_xfs_buf_item_committed(bip);
if ((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && if ((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&
(bip->bli_item.li_lsn != 0)) { (bip->bli_item.li_lsn != 0)) {
return bip->bli_item.li_lsn; return bip->bli_item.li_lsn;
@ -640,7 +639,7 @@ xfs_buf_item_push(
xfs_buf_t *bp; xfs_buf_t *bp;
ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); ASSERT(!(bip->bli_flags & XFS_BLI_STALE));
xfs_buf_item_trace("PUSH", bip); trace_xfs_buf_item_push(bip);
bp = bip->bli_buf; bp = bip->bli_buf;
@ -738,9 +737,6 @@ xfs_buf_item_init(
bip->bli_format.blf_blkno = (__int64_t)XFS_BUF_ADDR(bp); bip->bli_format.blf_blkno = (__int64_t)XFS_BUF_ADDR(bp);
bip->bli_format.blf_len = (ushort)BTOBB(XFS_BUF_COUNT(bp)); bip->bli_format.blf_len = (ushort)BTOBB(XFS_BUF_COUNT(bp));
bip->bli_format.blf_map_size = map_size; bip->bli_format.blf_map_size = map_size;
#ifdef XFS_BLI_TRACE
bip->bli_trace = ktrace_alloc(XFS_BLI_TRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_TRANS_DEBUG #ifdef XFS_TRANS_DEBUG
/* /*
@ -878,9 +874,6 @@ xfs_buf_item_free(
kmem_free(bip->bli_logged); kmem_free(bip->bli_logged);
#endif /* XFS_TRANS_DEBUG */ #endif /* XFS_TRANS_DEBUG */
#ifdef XFS_BLI_TRACE
ktrace_free(bip->bli_trace);
#endif
kmem_zone_free(xfs_buf_item_zone, bip); kmem_zone_free(xfs_buf_item_zone, bip);
} }
@ -897,7 +890,8 @@ xfs_buf_item_relse(
{ {
xfs_buf_log_item_t *bip; xfs_buf_log_item_t *bip;
xfs_buftrace("XFS_RELSE", bp); trace_xfs_buf_item_relse(bp, _RET_IP_);
bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t*); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t*);
XFS_BUF_SET_FSPRIVATE(bp, bip->bli_item.li_bio_list); XFS_BUF_SET_FSPRIVATE(bp, bip->bli_item.li_bio_list);
if ((XFS_BUF_FSPRIVATE(bp, void *) == NULL) && if ((XFS_BUF_FSPRIVATE(bp, void *) == NULL) &&
@ -994,7 +988,7 @@ xfs_buf_iodone_callbacks(
if (XFS_FORCED_SHUTDOWN(mp)) { if (XFS_FORCED_SHUTDOWN(mp)) {
ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp);
XFS_BUF_SUPER_STALE(bp); XFS_BUF_SUPER_STALE(bp);
xfs_buftrace("BUF_IODONE_CB", bp); trace_xfs_buf_item_iodone(bp, _RET_IP_);
xfs_buf_do_callbacks(bp, lip); xfs_buf_do_callbacks(bp, lip);
XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_SET_FSPRIVATE(bp, NULL);
XFS_BUF_CLR_IODONE_FUNC(bp); XFS_BUF_CLR_IODONE_FUNC(bp);
@ -1030,7 +1024,7 @@ xfs_buf_iodone_callbacks(
XFS_BUF_SET_START(bp); XFS_BUF_SET_START(bp);
} }
ASSERT(XFS_BUF_IODONE_FUNC(bp)); ASSERT(XFS_BUF_IODONE_FUNC(bp));
xfs_buftrace("BUF_IODONE ASYNC", bp); trace_xfs_buf_item_iodone_async(bp, _RET_IP_);
xfs_buf_relse(bp); xfs_buf_relse(bp);
} else { } else {
/* /*
@ -1053,9 +1047,7 @@ xfs_buf_iodone_callbacks(
} }
return; return;
} }
#ifdef XFSERRORDEBUG
xfs_buftrace("XFS BUFCB NOERR", bp);
#endif
xfs_buf_do_callbacks(bp, lip); xfs_buf_do_callbacks(bp, lip);
XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_SET_FSPRIVATE(bp, NULL);
XFS_BUF_CLR_IODONE_FUNC(bp); XFS_BUF_CLR_IODONE_FUNC(bp);
@ -1081,7 +1073,9 @@ xfs_buf_error_relse(
XFS_BUF_DONE(bp); XFS_BUF_DONE(bp);
XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_UNDELAYWRITE(bp);
XFS_BUF_ERROR(bp,0); XFS_BUF_ERROR(bp,0);
xfs_buftrace("BUF_ERROR_RELSE", bp);
trace_xfs_buf_error_relse(bp, _RET_IP_);
if (! XFS_FORCED_SHUTDOWN(mp)) if (! XFS_FORCED_SHUTDOWN(mp))
xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
/* /*
@ -1128,34 +1122,3 @@ xfs_buf_iodone(
xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip); xfs_trans_ail_delete(ailp, (xfs_log_item_t *)bip);
xfs_buf_item_free(bip); xfs_buf_item_free(bip);
} }
#if defined(XFS_BLI_TRACE)
void
xfs_buf_item_trace(
char *id,
xfs_buf_log_item_t *bip)
{
xfs_buf_t *bp;
ASSERT(bip->bli_trace != NULL);
bp = bip->bli_buf;
ktrace_enter(bip->bli_trace,
(void *)id,
(void *)bip->bli_buf,
(void *)((unsigned long)bip->bli_flags),
(void *)((unsigned long)bip->bli_recur),
(void *)((unsigned long)atomic_read(&bip->bli_refcount)),
(void *)((unsigned long)
(0xFFFFFFFF & XFS_BUF_ADDR(bp) >> 32)),
(void *)((unsigned long)(0xFFFFFFFF & XFS_BUF_ADDR(bp))),
(void *)((unsigned long)XFS_BUF_COUNT(bp)),
(void *)((unsigned long)XFS_BUF_BFLAGS(bp)),
XFS_BUF_FSPRIVATE(bp, void *),
XFS_BUF_FSPRIVATE2(bp, void *),
(void *)(unsigned long)XFS_BUF_ISPINNED(bp),
(void *)XFS_BUF_IODONE_FUNC(bp),
(void *)((unsigned long)(XFS_BUF_VALUSEMA(bp))),
(void *)bip->bli_item.li_desc,
(void *)((unsigned long)bip->bli_item.li_flags));
}
#endif /* XFS_BLI_TRACE */

View File

@ -70,22 +70,21 @@ typedef struct xfs_buf_log_format_t {
#define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_INODE_ALLOC_BUF 0x10
#define XFS_BLI_STALE_INODE 0x20 #define XFS_BLI_STALE_INODE 0x20
#define XFS_BLI_FLAGS \
{ XFS_BLI_HOLD, "HOLD" }, \
{ XFS_BLI_DIRTY, "DIRTY" }, \
{ XFS_BLI_STALE, "STALE" }, \
{ XFS_BLI_LOGGED, "LOGGED" }, \
{ XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \
{ XFS_BLI_STALE_INODE, "STALE_INODE" }
#ifdef __KERNEL__ #ifdef __KERNEL__
struct xfs_buf; struct xfs_buf;
struct ktrace;
struct xfs_mount; struct xfs_mount;
struct xfs_buf_log_item; struct xfs_buf_log_item;
#if defined(XFS_BLI_TRACE)
#define XFS_BLI_TRACE_SIZE 32
void xfs_buf_item_trace(char *, struct xfs_buf_log_item *);
#else
#define xfs_buf_item_trace(id, bip)
#endif
/* /*
* This is the in core log item structure used to track information * This is the in core log item structure used to track information
* needed to log buffers. It tracks how many times the lock has been * needed to log buffers. It tracks how many times the lock has been
@ -97,9 +96,6 @@ typedef struct xfs_buf_log_item {
unsigned int bli_flags; /* misc flags */ unsigned int bli_flags; /* misc flags */
unsigned int bli_recur; /* lock recursion count */ unsigned int bli_recur; /* lock recursion count */
atomic_t bli_refcount; /* cnt of tp refs */ atomic_t bli_refcount; /* cnt of tp refs */
#ifdef XFS_BLI_TRACE
struct ktrace *bli_trace; /* event trace buf */
#endif
#ifdef XFS_TRANS_DEBUG #ifdef XFS_TRANS_DEBUG
char *bli_orig; /* original buffer copy */ char *bli_orig; /* original buffer copy */
char *bli_logged; /* bytes logged (bitmap) */ char *bli_logged; /* bytes logged (bitmap) */

View File

@ -46,6 +46,7 @@
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_node.h" #include "xfs_dir2_node.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* xfs_da_btree.c * xfs_da_btree.c
@ -2107,7 +2108,7 @@ xfs_da_do_buf(
(be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC), (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC),
mp, XFS_ERRTAG_DA_READ_BUF, mp, XFS_ERRTAG_DA_READ_BUF,
XFS_RANDOM_DA_READ_BUF))) { XFS_RANDOM_DA_READ_BUF))) {
xfs_buftrace("DA READ ERROR", rbp->bps[0]); trace_xfs_da_btree_corrupt(rbp->bps[0], _RET_IP_);
XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)",
XFS_ERRLEVEL_LOW, mp, info); XFS_ERRLEVEL_LOW, mp, info);
error = XFS_ERROR(EFSCORRUPTED); error = XFS_ERROR(EFSCORRUPTED);

View File

@ -125,6 +125,13 @@ typedef struct xfs_da_args {
#define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */
#define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */
#define XFS_DA_OP_FLAGS \
{ XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \
{ XFS_DA_OP_RENAME, "RENAME" }, \
{ XFS_DA_OP_ADDNAME, "ADDNAME" }, \
{ XFS_DA_OP_OKNOENT, "OKNOENT" }, \
{ XFS_DA_OP_CILOOKUP, "CILOOKUP" }
/* /*
* Structure to describe buffer(s) for a block. * Structure to describe buffer(s) for a block.
* This is needed in the directory version 2 format case, when * This is needed in the directory version 2 format case, when

View File

@ -43,6 +43,7 @@
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
/* /*
* Syssgi interface for swapext * Syssgi interface for swapext
@ -168,7 +169,6 @@ xfs_swap_extents(
} }
if (VN_CACHED(VFS_I(tip)) != 0) { if (VN_CACHED(VFS_I(tip)) != 0) {
xfs_inval_cached_trace(tip, 0, -1, 0, -1);
error = xfs_flushinval_pages(tip, 0, -1, error = xfs_flushinval_pages(tip, 0, -1,
FI_REMAPF_LOCKED); FI_REMAPF_LOCKED);
if (error) if (error)

View File

@ -40,9 +40,9 @@
#include "xfs_dir2_leaf.h" #include "xfs_dir2_leaf.h"
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_node.h" #include "xfs_dir2_node.h"
#include "xfs_dir2_trace.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
struct xfs_name xfs_name_dotdot = {"..", 2}; struct xfs_name xfs_name_dotdot = {"..", 2};
@ -525,7 +525,8 @@ xfs_dir2_grow_inode(
xfs_trans_t *tp; xfs_trans_t *tp;
xfs_drfsbno_t nblks; xfs_drfsbno_t nblks;
xfs_dir2_trace_args_s("grow_inode", args, space); trace_xfs_dir2_grow_inode(args, space);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
@ -703,7 +704,8 @@ xfs_dir2_shrink_inode(
xfs_mount_t *mp; xfs_mount_t *mp;
xfs_trans_t *tp; xfs_trans_t *tp;
xfs_dir2_trace_args_db("shrink_inode", args, db, bp); trace_xfs_dir2_shrink_inode(args, db);
dp = args->dp; dp = args->dp;
mp = dp->i_mount; mp = dp->i_mount;
tp = args->trans; tp = args->trans;

View File

@ -36,8 +36,8 @@
#include "xfs_dir2_data.h" #include "xfs_dir2_data.h"
#include "xfs_dir2_leaf.h" #include "xfs_dir2_leaf.h"
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_trace.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* Local function prototypes. * Local function prototypes.
@ -94,7 +94,8 @@ xfs_dir2_block_addname(
__be16 *tagp; /* pointer to tag value */ __be16 *tagp; /* pointer to tag value */
xfs_trans_t *tp; /* transaction structure */ xfs_trans_t *tp; /* transaction structure */
xfs_dir2_trace_args("block_addname", args); trace_xfs_dir2_block_addname(args);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
@ -590,7 +591,8 @@ xfs_dir2_block_lookup(
int error; /* error return value */ int error; /* error return value */
xfs_mount_t *mp; /* filesystem mount point */ xfs_mount_t *mp; /* filesystem mount point */
xfs_dir2_trace_args("block_lookup", args); trace_xfs_dir2_block_lookup(args);
/* /*
* Get the buffer, look up the entry. * Get the buffer, look up the entry.
* If not found (ENOENT) then return, have no buffer. * If not found (ENOENT) then return, have no buffer.
@ -747,7 +749,8 @@ xfs_dir2_block_removename(
int size; /* shortform size */ int size; /* shortform size */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args("block_removename", args); trace_xfs_dir2_block_removename(args);
/* /*
* Look up the entry in the block. Gets the buffer and entry index. * Look up the entry in the block. Gets the buffer and entry index.
* It will always be there, the vnodeops level does a lookup first. * It will always be there, the vnodeops level does a lookup first.
@ -823,7 +826,8 @@ xfs_dir2_block_replace(
int error; /* error return value */ int error; /* error return value */
xfs_mount_t *mp; /* filesystem mount point */ xfs_mount_t *mp; /* filesystem mount point */
xfs_dir2_trace_args("block_replace", args); trace_xfs_dir2_block_replace(args);
/* /*
* Lookup the entry in the directory. Get buffer and entry index. * Lookup the entry in the directory. Get buffer and entry index.
* This will always succeed since the caller has already done a lookup. * This will always succeed since the caller has already done a lookup.
@ -897,7 +901,8 @@ xfs_dir2_leaf_to_block(
int to; /* block/leaf to index */ int to; /* block/leaf to index */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_bb("leaf_to_block", args, lbp, dbp); trace_xfs_dir2_leaf_to_block(args);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
@ -1044,7 +1049,8 @@ xfs_dir2_sf_to_block(
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
struct xfs_name name; struct xfs_name name;
xfs_dir2_trace_args("sf_to_block", args); trace_xfs_dir2_sf_to_block(args);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;

View File

@ -38,8 +38,8 @@
#include "xfs_dir2_leaf.h" #include "xfs_dir2_leaf.h"
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_node.h" #include "xfs_dir2_node.h"
#include "xfs_dir2_trace.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* Local function declarations. * Local function declarations.
@ -80,7 +80,8 @@ xfs_dir2_block_to_leaf(
int needscan; /* need to rescan bestfree */ int needscan; /* need to rescan bestfree */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_b("block_to_leaf", args, dbp); trace_xfs_dir2_block_to_leaf(args);
dp = args->dp; dp = args->dp;
mp = dp->i_mount; mp = dp->i_mount;
tp = args->trans; tp = args->trans;
@ -188,7 +189,8 @@ xfs_dir2_leaf_addname(
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_db_t use_block; /* data block number */ xfs_dir2_db_t use_block; /* data block number */
xfs_dir2_trace_args("leaf_addname", args); trace_xfs_dir2_leaf_addname(args);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
@ -1266,7 +1268,8 @@ xfs_dir2_leaf_lookup(
xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args("leaf_lookup", args); trace_xfs_dir2_leaf_lookup(args);
/* /*
* Look up name in the leaf block, returning both buffers and index. * Look up name in the leaf block, returning both buffers and index.
*/ */
@ -1454,7 +1457,8 @@ xfs_dir2_leaf_removename(
xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_dir2_data_off_t oldbest; /* old value of best free */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args("leaf_removename", args); trace_xfs_dir2_leaf_removename(args);
/* /*
* Lookup the leaf entry, get the leaf and data blocks read in. * Lookup the leaf entry, get the leaf and data blocks read in.
*/ */
@ -1586,7 +1590,8 @@ xfs_dir2_leaf_replace(
xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_dir2_leaf_entry_t *lep; /* leaf entry */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args("leaf_replace", args); trace_xfs_dir2_leaf_replace(args);
/* /*
* Look up the entry. * Look up the entry.
*/ */
@ -1766,7 +1771,9 @@ xfs_dir2_node_to_leaf(
if (state->path.active > 1) if (state->path.active > 1)
return 0; return 0;
args = state->args; args = state->args;
xfs_dir2_trace_args("node_to_leaf", args);
trace_xfs_dir2_node_to_leaf(args);
mp = state->mp; mp = state->mp;
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;

View File

@ -37,8 +37,8 @@
#include "xfs_dir2_leaf.h" #include "xfs_dir2_leaf.h"
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_node.h" #include "xfs_dir2_node.h"
#include "xfs_dir2_trace.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
/* /*
* Function declarations. * Function declarations.
@ -123,7 +123,8 @@ xfs_dir2_leaf_to_node(
__be16 *to; /* pointer to freespace entry */ __be16 *to; /* pointer to freespace entry */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_b("leaf_to_node", args, lbp); trace_xfs_dir2_leaf_to_node(args);
dp = args->dp; dp = args->dp;
mp = dp->i_mount; mp = dp->i_mount;
tp = args->trans; tp = args->trans;
@ -196,7 +197,8 @@ xfs_dir2_leafn_add(
xfs_mount_t *mp; /* filesystem mount point */ xfs_mount_t *mp; /* filesystem mount point */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_sb("leafn_add", args, index, bp); trace_xfs_dir2_leafn_add(args, index);
dp = args->dp; dp = args->dp;
mp = dp->i_mount; mp = dp->i_mount;
tp = args->trans; tp = args->trans;
@ -711,8 +713,8 @@ xfs_dir2_leafn_moveents(
int stale; /* count stale leaves copied */ int stale; /* count stale leaves copied */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_bibii("leafn_moveents", args, bp_s, start_s, bp_d, trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count);
start_d, count);
/* /*
* Silently return if nothing to do. * Silently return if nothing to do.
*/ */
@ -933,7 +935,8 @@ xfs_dir2_leafn_remove(
int needscan; /* need to rescan data frees */ int needscan; /* need to rescan data frees */
xfs_trans_t *tp; /* transaction pointer */ xfs_trans_t *tp; /* transaction pointer */
xfs_dir2_trace_args_sb("leafn_remove", args, index, bp); trace_xfs_dir2_leafn_remove(args, index);
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
@ -1363,7 +1366,8 @@ xfs_dir2_node_addname(
int rval; /* sub-return value */ int rval; /* sub-return value */
xfs_da_state_t *state; /* btree cursor */ xfs_da_state_t *state; /* btree cursor */
xfs_dir2_trace_args("node_addname", args); trace_xfs_dir2_node_addname(args);
/* /*
* Allocate and initialize the state (btree cursor). * Allocate and initialize the state (btree cursor).
*/ */
@ -1822,7 +1826,8 @@ xfs_dir2_node_lookup(
int rval; /* operation return value */ int rval; /* operation return value */
xfs_da_state_t *state; /* btree cursor */ xfs_da_state_t *state; /* btree cursor */
xfs_dir2_trace_args("node_lookup", args); trace_xfs_dir2_node_lookup(args);
/* /*
* Allocate and initialize the btree cursor. * Allocate and initialize the btree cursor.
*/ */
@ -1875,7 +1880,8 @@ xfs_dir2_node_removename(
int rval; /* operation return value */ int rval; /* operation return value */
xfs_da_state_t *state; /* btree cursor */ xfs_da_state_t *state; /* btree cursor */
xfs_dir2_trace_args("node_removename", args); trace_xfs_dir2_node_removename(args);
/* /*
* Allocate and initialize the btree cursor. * Allocate and initialize the btree cursor.
*/ */
@ -1944,7 +1950,8 @@ xfs_dir2_node_replace(
int rval; /* internal return value */ int rval; /* internal return value */
xfs_da_state_t *state; /* btree cursor */ xfs_da_state_t *state; /* btree cursor */
xfs_dir2_trace_args("node_replace", args); trace_xfs_dir2_node_replace(args);
/* /*
* Allocate and initialize the btree cursor. * Allocate and initialize the btree cursor.
*/ */

View File

@ -37,7 +37,7 @@
#include "xfs_dir2_data.h" #include "xfs_dir2_data.h"
#include "xfs_dir2_leaf.h" #include "xfs_dir2_leaf.h"
#include "xfs_dir2_block.h" #include "xfs_dir2_block.h"
#include "xfs_dir2_trace.h" #include "xfs_trace.h"
/* /*
* Prototypes for internal functions. * Prototypes for internal functions.
@ -169,7 +169,8 @@ xfs_dir2_block_to_sf(
xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_t *sfp; /* shortform structure */
xfs_ino_t temp; xfs_ino_t temp;
xfs_dir2_trace_args_sb("block_to_sf", args, size, bp); trace_xfs_dir2_block_to_sf(args);
dp = args->dp; dp = args->dp;
mp = dp->i_mount; mp = dp->i_mount;
@ -281,7 +282,8 @@ xfs_dir2_sf_addname(
xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_t *sfp; /* shortform structure */
xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */
xfs_dir2_trace_args("sf_addname", args); trace_xfs_dir2_sf_addname(args);
ASSERT(xfs_dir2_sf_lookup(args) == ENOENT); ASSERT(xfs_dir2_sf_lookup(args) == ENOENT);
dp = args->dp; dp = args->dp;
ASSERT(dp->i_df.if_flags & XFS_IFINLINE); ASSERT(dp->i_df.if_flags & XFS_IFINLINE);
@ -654,7 +656,8 @@ xfs_dir2_sf_create(
xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_t *sfp; /* shortform structure */
int size; /* directory size */ int size; /* directory size */
xfs_dir2_trace_args_i("sf_create", args, pino); trace_xfs_dir2_sf_create(args);
dp = args->dp; dp = args->dp;
ASSERT(dp != NULL); ASSERT(dp != NULL);
@ -808,7 +811,8 @@ xfs_dir2_sf_lookup(
enum xfs_dacmp cmp; /* comparison result */ enum xfs_dacmp cmp; /* comparison result */
xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */
xfs_dir2_trace_args("sf_lookup", args); trace_xfs_dir2_sf_lookup(args);
xfs_dir2_sf_check(args); xfs_dir2_sf_check(args);
dp = args->dp; dp = args->dp;
@ -891,7 +895,8 @@ xfs_dir2_sf_removename(
xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */
xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_t *sfp; /* shortform structure */
xfs_dir2_trace_args("sf_removename", args); trace_xfs_dir2_sf_removename(args);
dp = args->dp; dp = args->dp;
ASSERT(dp->i_df.if_flags & XFS_IFINLINE); ASSERT(dp->i_df.if_flags & XFS_IFINLINE);
@ -982,7 +987,8 @@ xfs_dir2_sf_replace(
xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */
xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_t *sfp; /* shortform structure */
xfs_dir2_trace_args("sf_replace", args); trace_xfs_dir2_sf_replace(args);
dp = args->dp; dp = args->dp;
ASSERT(dp->i_df.if_flags & XFS_IFINLINE); ASSERT(dp->i_df.if_flags & XFS_IFINLINE);
@ -1125,7 +1131,8 @@ xfs_dir2_sf_toino4(
xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */
xfs_dir2_sf_t *sfp; /* new sf directory */ xfs_dir2_sf_t *sfp; /* new sf directory */
xfs_dir2_trace_args("sf_toino4", args); trace_xfs_dir2_sf_toino4(args);
dp = args->dp; dp = args->dp;
/* /*
@ -1202,7 +1209,8 @@ xfs_dir2_sf_toino8(
xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */
xfs_dir2_sf_t *sfp; /* new sf directory */ xfs_dir2_sf_t *sfp; /* new sf directory */
xfs_dir2_trace_args("sf_toino8", args); trace_xfs_dir2_sf_toino8(args);
dp = args->dp; dp = args->dp;
/* /*

View File

@ -1,216 +0,0 @@
/*
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "xfs.h"
#include "xfs_fs.h"
#include "xfs_types.h"
#include "xfs_inum.h"
#include "xfs_dir2.h"
#include "xfs_da_btree.h"
#include "xfs_bmap_btree.h"
#include "xfs_dir2_sf.h"
#include "xfs_attr_sf.h"
#include "xfs_dinode.h"
#include "xfs_inode.h"
#include "xfs_dir2_trace.h"
#ifdef XFS_DIR2_TRACE
ktrace_t *xfs_dir2_trace_buf;
/*
* Enter something in the trace buffers.
*/
static void
xfs_dir2_trace_enter(
xfs_inode_t *dp,
int type,
char *where,
char *name,
int namelen,
void *a0,
void *a1,
void *a2,
void *a3,
void *a4,
void *a5,
void *a6,
void *a7)
{
void *n[5];
ASSERT(xfs_dir2_trace_buf);
ASSERT(dp->i_dir_trace);
if (name)
memcpy(n, name, min((int)sizeof(n), namelen));
else
memset((char *)n, 0, sizeof(n));
ktrace_enter(xfs_dir2_trace_buf,
(void *)(long)type, (void *)where,
(void *)a0, (void *)a1, (void *)a2, (void *)a3,
(void *)a4, (void *)a5, (void *)a6, (void *)a7,
(void *)(long)namelen,
(void *)n[0], (void *)n[1], (void *)n[2],
(void *)n[3], (void *)n[4]);
ktrace_enter(dp->i_dir_trace,
(void *)(long)type, (void *)where,
(void *)a0, (void *)a1, (void *)a2, (void *)a3,
(void *)a4, (void *)a5, (void *)a6, (void *)a7,
(void *)(long)namelen,
(void *)n[0], (void *)n[1], (void *)n[2],
(void *)n[3], (void *)n[4]);
}
void
xfs_dir2_trace_args(
char *where,
xfs_da_args_t *args)
{
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
NULL, NULL);
}
void
xfs_dir2_trace_args_b(
char *where,
xfs_da_args_t *args,
xfs_dabuf_t *bp)
{
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_B, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)(bp ? bp->bps[0] : NULL), NULL);
}
void
xfs_dir2_trace_args_bb(
char *where,
xfs_da_args_t *args,
xfs_dabuf_t *lbp,
xfs_dabuf_t *dbp)
{
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_BB, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)(lbp ? lbp->bps[0] : NULL),
(void *)(dbp ? dbp->bps[0] : NULL));
}
void
xfs_dir2_trace_args_bibii(
char *where,
xfs_da_args_t *args,
xfs_dabuf_t *bs,
int ss,
xfs_dabuf_t *bd,
int sd,
int c)
{
xfs_buf_t *bpbs = bs ? bs->bps[0] : NULL;
xfs_buf_t *bpbd = bd ? bd->bps[0] : NULL;
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_BIBII, where,
(char *)args->name, (int)args->namelen,
(void *)args->dp, (void *)args->trans,
(void *)bpbs, (void *)(long)ss, (void *)bpbd, (void *)(long)sd,
(void *)(long)c, NULL);
}
void
xfs_dir2_trace_args_db(
char *where,
xfs_da_args_t *args,
xfs_dir2_db_t db,
xfs_dabuf_t *bp)
{
xfs_buf_t *dbp = bp ? bp->bps[0] : NULL;
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_DB, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)(long)db, (void *)dbp);
}
void
xfs_dir2_trace_args_i(
char *where,
xfs_da_args_t *args,
xfs_ino_t i)
{
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_I, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)((unsigned long)(i >> 32)),
(void *)((unsigned long)(i & 0xFFFFFFFF)));
}
void
xfs_dir2_trace_args_s(
char *where,
xfs_da_args_t *args,
int s)
{
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_S, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)(long)s, NULL);
}
void
xfs_dir2_trace_args_sb(
char *where,
xfs_da_args_t *args,
int s,
xfs_dabuf_t *bp)
{
xfs_buf_t *dbp = bp ? bp->bps[0] : NULL;
xfs_dir2_trace_enter(args->dp, XFS_DIR2_KTRACE_ARGS_SB, where,
(char *)args->name, (int)args->namelen,
(void *)(unsigned long)args->hashval,
(void *)((unsigned long)(args->inumber >> 32)),
(void *)((unsigned long)(args->inumber & 0xFFFFFFFF)),
(void *)args->dp, (void *)args->trans,
(void *)(unsigned long)(args->op_flags & XFS_DA_OP_JUSTCHECK),
(void *)(long)s, (void *)dbp);
}
#endif /* XFS_DIR2_TRACE */

View File

@ -1,72 +0,0 @@
/*
* Copyright (c) 2000,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __XFS_DIR2_TRACE_H__
#define __XFS_DIR2_TRACE_H__
/*
* Tracing for xfs v2 directories.
*/
#if defined(XFS_DIR2_TRACE)
struct ktrace;
struct xfs_dabuf;
struct xfs_da_args;
#define XFS_DIR2_GTRACE_SIZE 4096 /* global buffer */
#define XFS_DIR2_KTRACE_SIZE 32 /* per-inode buffer */
extern struct ktrace *xfs_dir2_trace_buf;
#define XFS_DIR2_KTRACE_ARGS 1 /* args only */
#define XFS_DIR2_KTRACE_ARGS_B 2 /* args + buffer */
#define XFS_DIR2_KTRACE_ARGS_BB 3 /* args + 2 buffers */
#define XFS_DIR2_KTRACE_ARGS_DB 4 /* args, db, buffer */
#define XFS_DIR2_KTRACE_ARGS_I 5 /* args, inum */
#define XFS_DIR2_KTRACE_ARGS_S 6 /* args, int */
#define XFS_DIR2_KTRACE_ARGS_SB 7 /* args, int, buffer */
#define XFS_DIR2_KTRACE_ARGS_BIBII 8 /* args, buf/int/buf/int/int */
void xfs_dir2_trace_args(char *where, struct xfs_da_args *args);
void xfs_dir2_trace_args_b(char *where, struct xfs_da_args *args,
struct xfs_dabuf *bp);
void xfs_dir2_trace_args_bb(char *where, struct xfs_da_args *args,
struct xfs_dabuf *lbp, struct xfs_dabuf *dbp);
void xfs_dir2_trace_args_bibii(char *where, struct xfs_da_args *args,
struct xfs_dabuf *bs, int ss,
struct xfs_dabuf *bd, int sd, int c);
void xfs_dir2_trace_args_db(char *where, struct xfs_da_args *args,
xfs_dir2_db_t db, struct xfs_dabuf *bp);
void xfs_dir2_trace_args_i(char *where, struct xfs_da_args *args, xfs_ino_t i);
void xfs_dir2_trace_args_s(char *where, struct xfs_da_args *args, int s);
void xfs_dir2_trace_args_sb(char *where, struct xfs_da_args *args, int s,
struct xfs_dabuf *bp);
#else /* XFS_DIR2_TRACE */
#define xfs_dir2_trace_args(where, args)
#define xfs_dir2_trace_args_b(where, args, bp)
#define xfs_dir2_trace_args_bb(where, args, lbp, dbp)
#define xfs_dir2_trace_args_bibii(where, args, bs, ss, bd, sd, c)
#define xfs_dir2_trace_args_db(where, args, db, bp)
#define xfs_dir2_trace_args_i(where, args, i)
#define xfs_dir2_trace_args_s(where, args, s)
#define xfs_dir2_trace_args_sb(where, args, s, bp)
#endif /* XFS_DIR2_TRACE */
#endif /* __XFS_DIR2_TRACE_H__ */

View File

@ -34,6 +34,7 @@
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_mru_cache.h" #include "xfs_mru_cache.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_trace.h"
#ifdef XFS_FILESTREAMS_TRACE #ifdef XFS_FILESTREAMS_TRACE
@ -394,9 +395,7 @@ xfs_filestream_init(void)
item_zone = kmem_zone_init(sizeof(fstrm_item_t), "fstrm_item"); item_zone = kmem_zone_init(sizeof(fstrm_item_t), "fstrm_item");
if (!item_zone) if (!item_zone)
return -ENOMEM; return -ENOMEM;
#ifdef XFS_FILESTREAMS_TRACE
xfs_filestreams_trace_buf = ktrace_alloc(XFS_FSTRM_KTRACE_SIZE, KM_NOFS);
#endif
return 0; return 0;
} }
@ -407,9 +406,6 @@ xfs_filestream_init(void)
void void
xfs_filestream_uninit(void) xfs_filestream_uninit(void)
{ {
#ifdef XFS_FILESTREAMS_TRACE
ktrace_free(xfs_filestreams_trace_buf);
#endif
kmem_zone_destroy(item_zone); kmem_zone_destroy(item_zone);
} }

View File

@ -45,6 +45,7 @@
#include "xfs_rtalloc.h" #include "xfs_rtalloc.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_trace.h"
/* /*
* File system operations * File system operations
@ -347,6 +348,7 @@ xfs_growfs_data_private(
be32_add_cpu(&agf->agf_length, new); be32_add_cpu(&agf->agf_length, new);
ASSERT(be32_to_cpu(agf->agf_length) == ASSERT(be32_to_cpu(agf->agf_length) ==
be32_to_cpu(agi->agi_length)); be32_to_cpu(agi->agi_length));
xfs_alloc_log_agf(tp, bp, XFS_AGF_LENGTH); xfs_alloc_log_agf(tp, bp, XFS_AGF_LENGTH);
/* /*
* Free the new space. * Free the new space.

View File

@ -43,7 +43,7 @@
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_bmap.h" #include "xfs_bmap.h"
#include "xfs_btree_trace.h" #include "xfs_btree_trace.h"
#include "xfs_dir2_trace.h" #include "xfs_trace.h"
/* /*
@ -90,28 +90,6 @@ xfs_inode_alloc(
ip->i_size = 0; ip->i_size = 0;
ip->i_new_size = 0; ip->i_new_size = 0;
/*
* Initialize inode's trace buffers.
*/
#ifdef XFS_INODE_TRACE
ip->i_trace = ktrace_alloc(INODE_TRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_BMAP_TRACE
ip->i_xtrace = ktrace_alloc(XFS_BMAP_KTRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_BTREE_TRACE
ip->i_btrace = ktrace_alloc(XFS_BMBT_KTRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_RW_TRACE
ip->i_rwtrace = ktrace_alloc(XFS_RW_KTRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_ILOCK_TRACE
ip->i_lock_trace = ktrace_alloc(XFS_ILOCK_KTRACE_SIZE, KM_NOFS);
#endif
#ifdef XFS_DIR2_TRACE
ip->i_dir_trace = ktrace_alloc(XFS_DIR2_KTRACE_SIZE, KM_NOFS);
#endif
/* prevent anyone from using this yet */ /* prevent anyone from using this yet */
VFS_I(ip)->i_state = I_NEW|I_LOCK; VFS_I(ip)->i_state = I_NEW|I_LOCK;
@ -133,25 +111,6 @@ xfs_inode_free(
if (ip->i_afp) if (ip->i_afp)
xfs_idestroy_fork(ip, XFS_ATTR_FORK); xfs_idestroy_fork(ip, XFS_ATTR_FORK);
#ifdef XFS_INODE_TRACE
ktrace_free(ip->i_trace);
#endif
#ifdef XFS_BMAP_TRACE
ktrace_free(ip->i_xtrace);
#endif
#ifdef XFS_BTREE_TRACE
ktrace_free(ip->i_btrace);
#endif
#ifdef XFS_RW_TRACE
ktrace_free(ip->i_rwtrace);
#endif
#ifdef XFS_ILOCK_TRACE
ktrace_free(ip->i_lock_trace);
#endif
#ifdef XFS_DIR2_TRACE
ktrace_free(ip->i_dir_trace);
#endif
if (ip->i_itemp) { if (ip->i_itemp) {
/* /*
* Only if we are shutting down the fs will we see an * Only if we are shutting down the fs will we see an
@ -210,6 +169,7 @@ xfs_iget_cache_hit(
* instead of polling for it. * instead of polling for it.
*/ */
if (ip->i_flags & (XFS_INEW|XFS_IRECLAIM)) { if (ip->i_flags & (XFS_INEW|XFS_IRECLAIM)) {
trace_xfs_iget_skip(ip);
XFS_STATS_INC(xs_ig_frecycle); XFS_STATS_INC(xs_ig_frecycle);
error = EAGAIN; error = EAGAIN;
goto out_error; goto out_error;
@ -228,7 +188,7 @@ xfs_iget_cache_hit(
* Need to carefully get it back into useable state. * Need to carefully get it back into useable state.
*/ */
if (ip->i_flags & XFS_IRECLAIMABLE) { if (ip->i_flags & XFS_IRECLAIMABLE) {
xfs_itrace_exit_tag(ip, "xfs_iget.alloc"); trace_xfs_iget_reclaim(ip);
/* /*
* We need to set XFS_INEW atomically with clearing the * We need to set XFS_INEW atomically with clearing the
@ -254,6 +214,7 @@ xfs_iget_cache_hit(
ip->i_flags &= ~XFS_INEW; ip->i_flags &= ~XFS_INEW;
ip->i_flags |= XFS_IRECLAIMABLE; ip->i_flags |= XFS_IRECLAIMABLE;
__xfs_inode_set_reclaim_tag(pag, ip); __xfs_inode_set_reclaim_tag(pag, ip);
trace_xfs_iget_reclaim(ip);
goto out_error; goto out_error;
} }
inode->i_state = I_LOCK|I_NEW; inode->i_state = I_LOCK|I_NEW;
@ -273,8 +234,9 @@ xfs_iget_cache_hit(
xfs_ilock(ip, lock_flags); xfs_ilock(ip, lock_flags);
xfs_iflags_clear(ip, XFS_ISTALE); xfs_iflags_clear(ip, XFS_ISTALE);
xfs_itrace_exit_tag(ip, "xfs_iget.found");
XFS_STATS_INC(xs_ig_found); XFS_STATS_INC(xs_ig_found);
trace_xfs_iget_found(ip);
return 0; return 0;
out_error: out_error:
@ -308,7 +270,7 @@ xfs_iget_cache_miss(
if (error) if (error)
goto out_destroy; goto out_destroy;
xfs_itrace_exit_tag(ip, "xfs_iget.alloc"); xfs_itrace_entry(ip);
if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) { if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) {
error = ENOENT; error = ENOENT;
@ -353,6 +315,8 @@ xfs_iget_cache_miss(
write_unlock(&pag->pag_ici_lock); write_unlock(&pag->pag_ici_lock);
radix_tree_preload_end(); radix_tree_preload_end();
trace_xfs_iget_alloc(ip);
*ipp = ip; *ipp = ip;
return 0; return 0;
@ -639,7 +603,7 @@ xfs_ilock(
else if (lock_flags & XFS_ILOCK_SHARED) else if (lock_flags & XFS_ILOCK_SHARED)
mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
xfs_ilock_trace(ip, 1, lock_flags, (inst_t *)__return_address); trace_xfs_ilock(ip, lock_flags, _RET_IP_);
} }
/* /*
@ -684,7 +648,7 @@ xfs_ilock_nowait(
if (!mrtryaccess(&ip->i_lock)) if (!mrtryaccess(&ip->i_lock))
goto out_undo_iolock; goto out_undo_iolock;
} }
xfs_ilock_trace(ip, 2, lock_flags, (inst_t *)__return_address); trace_xfs_ilock_nowait(ip, lock_flags, _RET_IP_);
return 1; return 1;
out_undo_iolock: out_undo_iolock:
@ -746,7 +710,7 @@ xfs_iunlock(
xfs_trans_unlocked_item(ip->i_itemp->ili_item.li_ailp, xfs_trans_unlocked_item(ip->i_itemp->ili_item.li_ailp,
(xfs_log_item_t*)(ip->i_itemp)); (xfs_log_item_t*)(ip->i_itemp));
} }
xfs_ilock_trace(ip, 3, lock_flags, (inst_t *)__return_address); trace_xfs_iunlock(ip, lock_flags, _RET_IP_);
} }
/* /*
@ -765,6 +729,8 @@ xfs_ilock_demote(
mrdemote(&ip->i_lock); mrdemote(&ip->i_lock);
if (lock_flags & XFS_IOLOCK_EXCL) if (lock_flags & XFS_IOLOCK_EXCL)
mrdemote(&ip->i_iolock); mrdemote(&ip->i_iolock);
trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_);
} }
#ifdef DEBUG #ifdef DEBUG
@ -795,52 +761,3 @@ xfs_isilocked(
return 1; return 1;
} }
#endif #endif
#ifdef XFS_INODE_TRACE
#define KTRACE_ENTER(ip, vk, s, line, ra) \
ktrace_enter((ip)->i_trace, \
/* 0 */ (void *)(__psint_t)(vk), \
/* 1 */ (void *)(s), \
/* 2 */ (void *)(__psint_t) line, \
/* 3 */ (void *)(__psint_t)atomic_read(&VFS_I(ip)->i_count), \
/* 4 */ (void *)(ra), \
/* 5 */ NULL, \
/* 6 */ (void *)(__psint_t)current_cpu(), \
/* 7 */ (void *)(__psint_t)current_pid(), \
/* 8 */ (void *)__return_address, \
/* 9 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL)
/*
* Vnode tracing code.
*/
void
_xfs_itrace_entry(xfs_inode_t *ip, const char *func, inst_t *ra)
{
KTRACE_ENTER(ip, INODE_KTRACE_ENTRY, func, 0, ra);
}
void
_xfs_itrace_exit(xfs_inode_t *ip, const char *func, inst_t *ra)
{
KTRACE_ENTER(ip, INODE_KTRACE_EXIT, func, 0, ra);
}
void
xfs_itrace_hold(xfs_inode_t *ip, char *file, int line, inst_t *ra)
{
KTRACE_ENTER(ip, INODE_KTRACE_HOLD, file, line, ra);
}
void
_xfs_itrace_ref(xfs_inode_t *ip, char *file, int line, inst_t *ra)
{
KTRACE_ENTER(ip, INODE_KTRACE_REF, file, line, ra);
}
void
xfs_itrace_rele(xfs_inode_t *ip, char *file, int line, inst_t *ra)
{
KTRACE_ENTER(ip, INODE_KTRACE_RELE, file, line, ra);
}
#endif /* XFS_INODE_TRACE */

View File

@ -47,10 +47,10 @@
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_dir2_trace.h"
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_ifork_zone;
kmem_zone_t *xfs_inode_zone; kmem_zone_t *xfs_inode_zone;
@ -1291,42 +1291,6 @@ xfs_file_last_byte(
return last_byte; return last_byte;
} }
#if defined(XFS_RW_TRACE)
STATIC void
xfs_itrunc_trace(
int tag,
xfs_inode_t *ip,
int flag,
xfs_fsize_t new_size,
xfs_off_t toss_start,
xfs_off_t toss_finish)
{
if (ip->i_rwtrace == NULL) {
return;
}
ktrace_enter(ip->i_rwtrace,
(void*)((long)tag),
(void*)ip,
(void*)(unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff),
(void*)(unsigned long)(ip->i_d.di_size & 0xffffffff),
(void*)((long)flag),
(void*)(unsigned long)((new_size >> 32) & 0xffffffff),
(void*)(unsigned long)(new_size & 0xffffffff),
(void*)(unsigned long)((toss_start >> 32) & 0xffffffff),
(void*)(unsigned long)(toss_start & 0xffffffff),
(void*)(unsigned long)((toss_finish >> 32) & 0xffffffff),
(void*)(unsigned long)(toss_finish & 0xffffffff),
(void*)(unsigned long)current_cpu(),
(void*)(unsigned long)current_pid(),
(void*)NULL,
(void*)NULL,
(void*)NULL);
}
#else
#define xfs_itrunc_trace(tag, ip, flag, new_size, toss_start, toss_finish)
#endif
/* /*
* Start the truncation of the file to new_size. The new size * Start the truncation of the file to new_size. The new size
* must be smaller than the current size. This routine will * must be smaller than the current size. This routine will
@ -1409,8 +1373,7 @@ xfs_itruncate_start(
return 0; return 0;
} }
last_byte = xfs_file_last_byte(ip); last_byte = xfs_file_last_byte(ip);
xfs_itrunc_trace(XFS_ITRUNC_START, ip, flags, new_size, toss_start, trace_xfs_itruncate_start(ip, flags, new_size, toss_start, last_byte);
last_byte);
if (last_byte > toss_start) { if (last_byte > toss_start) {
if (flags & XFS_ITRUNC_DEFINITE) { if (flags & XFS_ITRUNC_DEFINITE) {
xfs_tosspages(ip, toss_start, xfs_tosspages(ip, toss_start,
@ -1514,7 +1477,8 @@ xfs_itruncate_finish(
new_size = 0LL; new_size = 0LL;
} }
first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size); first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
xfs_itrunc_trace(XFS_ITRUNC_FINISH1, ip, 0, new_size, 0, 0); trace_xfs_itruncate_finish_start(ip, new_size);
/* /*
* The first thing we do is set the size to new_size permanently * The first thing we do is set the size to new_size permanently
* on disk. This way we don't have to worry about anyone ever * on disk. This way we don't have to worry about anyone ever
@ -1731,7 +1695,7 @@ xfs_itruncate_finish(
ASSERT((new_size != 0) || ASSERT((new_size != 0) ||
(fork == XFS_ATTR_FORK) || (fork == XFS_ATTR_FORK) ||
(ip->i_d.di_nextents == 0)); (ip->i_d.di_nextents == 0));
xfs_itrunc_trace(XFS_ITRUNC_FINISH2, ip, 0, new_size, 0, 0); trace_xfs_itruncate_finish_end(ip, new_size);
return 0; return 0;
} }
@ -3252,23 +3216,6 @@ xfs_iflush_int(
return XFS_ERROR(EFSCORRUPTED); return XFS_ERROR(EFSCORRUPTED);
} }
#ifdef XFS_ILOCK_TRACE
void
xfs_ilock_trace(xfs_inode_t *ip, int lock, unsigned int lockflags, inst_t *ra)
{
ktrace_enter(ip->i_lock_trace,
(void *)ip,
(void *)(unsigned long)lock, /* 1 = LOCK, 3=UNLOCK, etc */
(void *)(unsigned long)lockflags, /* XFS_ILOCK_EXCL etc */
(void *)ra, /* caller of ilock */
(void *)(unsigned long)current_cpu(),
(void *)(unsigned long)current_pid(),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
#endif
/* /*
* Return a pointer to the extent record at file index idx. * Return a pointer to the extent record at file index idx.
*/ */
@ -3300,13 +3247,17 @@ xfs_iext_get_ext(
*/ */
void void
xfs_iext_insert( xfs_iext_insert(
xfs_ifork_t *ifp, /* inode fork pointer */ xfs_inode_t *ip, /* incore inode pointer */
xfs_extnum_t idx, /* starting index of new items */ xfs_extnum_t idx, /* starting index of new items */
xfs_extnum_t count, /* number of inserted items */ xfs_extnum_t count, /* number of inserted items */
xfs_bmbt_irec_t *new) /* items to insert */ xfs_bmbt_irec_t *new, /* items to insert */
int state) /* type of extent conversion */
{ {
xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
xfs_extnum_t i; /* extent record index */ xfs_extnum_t i; /* extent record index */
trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_);
ASSERT(ifp->if_flags & XFS_IFEXTENTS); ASSERT(ifp->if_flags & XFS_IFEXTENTS);
xfs_iext_add(ifp, idx, count); xfs_iext_add(ifp, idx, count);
for (i = idx; i < idx + count; i++, new++) for (i = idx; i < idx + count; i++, new++)
@ -3549,13 +3500,17 @@ xfs_iext_add_indirect_multi(
*/ */
void void
xfs_iext_remove( xfs_iext_remove(
xfs_ifork_t *ifp, /* inode fork pointer */ xfs_inode_t *ip, /* incore inode pointer */
xfs_extnum_t idx, /* index to begin removing exts */ xfs_extnum_t idx, /* index to begin removing exts */
int ext_diff) /* number of extents to remove */ int ext_diff, /* number of extents to remove */
int state) /* type of extent conversion */
{ {
xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
xfs_extnum_t nextents; /* number of extents in file */ xfs_extnum_t nextents; /* number of extents in file */
int new_size; /* size of extents after removal */ int new_size; /* size of extents after removal */
trace_xfs_iext_remove(ip, idx, state, _RET_IP_);
ASSERT(ext_diff > 0); ASSERT(ext_diff > 0);
nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t); new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t);

View File

@ -213,7 +213,6 @@ typedef struct xfs_icdinode {
struct bhv_desc; struct bhv_desc;
struct cred; struct cred;
struct ktrace;
struct xfs_buf; struct xfs_buf;
struct xfs_bmap_free; struct xfs_bmap_free;
struct xfs_bmbt_irec; struct xfs_bmbt_irec;
@ -222,13 +221,6 @@ struct xfs_mount;
struct xfs_trans; struct xfs_trans;
struct xfs_dquot; struct xfs_dquot;
#if defined(XFS_ILOCK_TRACE)
#define XFS_ILOCK_KTRACE_SIZE 32
extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *);
#else
#define xfs_ilock_trace(i,n,f,ra)
#endif
typedef struct dm_attrs_s { typedef struct dm_attrs_s {
__uint32_t da_dmevmask; /* DMIG event mask */ __uint32_t da_dmevmask; /* DMIG event mask */
__uint16_t da_dmstate; /* DMIG state info */ __uint16_t da_dmstate; /* DMIG state info */
@ -271,26 +263,6 @@ typedef struct xfs_inode {
/* VFS inode */ /* VFS inode */
struct inode i_vnode; /* embedded VFS inode */ struct inode i_vnode; /* embedded VFS inode */
/* Trace buffers per inode. */
#ifdef XFS_INODE_TRACE
struct ktrace *i_trace; /* general inode trace */
#endif
#ifdef XFS_BMAP_TRACE
struct ktrace *i_xtrace; /* inode extent list trace */
#endif
#ifdef XFS_BTREE_TRACE
struct ktrace *i_btrace; /* inode bmap btree trace */
#endif
#ifdef XFS_RW_TRACE
struct ktrace *i_rwtrace; /* inode read/write trace */
#endif
#ifdef XFS_ILOCK_TRACE
struct ktrace *i_lock_trace; /* inode lock/unlock trace */
#endif
#ifdef XFS_DIR2_TRACE
struct ktrace *i_dir_trace; /* inode directory trace */
#endif
} xfs_inode_t; } xfs_inode_t;
#define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ #define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \
@ -406,6 +378,14 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)
#define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
| XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED)
#define XFS_LOCK_FLAGS \
{ XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \
{ XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \
{ XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \
{ XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \
{ XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" }
/* /*
* Flags for lockdep annotations. * Flags for lockdep annotations.
* *
@ -455,6 +435,10 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)
#define XFS_ITRUNC_DEFINITE 0x1 #define XFS_ITRUNC_DEFINITE 0x1
#define XFS_ITRUNC_MAYBE 0x2 #define XFS_ITRUNC_MAYBE 0x2
#define XFS_ITRUNC_FLAGS \
{ XFS_ITRUNC_DEFINITE, "DEFINITE" }, \
{ XFS_ITRUNC_MAYBE, "MAYBE" }
/* /*
* For multiple groups support: if S_ISGID bit is set in the parent * For multiple groups support: if S_ISGID bit is set in the parent
* directory, group of new file is set to that of the parent, and * directory, group of new file is set to that of the parent, and
@ -507,48 +491,16 @@ void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint);
void xfs_synchronize_times(xfs_inode_t *); void xfs_synchronize_times(xfs_inode_t *);
void xfs_mark_inode_dirty_sync(xfs_inode_t *); void xfs_mark_inode_dirty_sync(xfs_inode_t *);
#if defined(XFS_INODE_TRACE)
#define INODE_TRACE_SIZE 16 /* number of trace entries */
#define INODE_KTRACE_ENTRY 1
#define INODE_KTRACE_EXIT 2
#define INODE_KTRACE_HOLD 3
#define INODE_KTRACE_REF 4
#define INODE_KTRACE_RELE 5
extern void _xfs_itrace_entry(struct xfs_inode *, const char *, inst_t *);
extern void _xfs_itrace_exit(struct xfs_inode *, const char *, inst_t *);
extern void xfs_itrace_hold(struct xfs_inode *, char *, int, inst_t *);
extern void _xfs_itrace_ref(struct xfs_inode *, char *, int, inst_t *);
extern void xfs_itrace_rele(struct xfs_inode *, char *, int, inst_t *);
#define xfs_itrace_entry(ip) \
_xfs_itrace_entry(ip, __func__, (inst_t *)__return_address)
#define xfs_itrace_exit(ip) \
_xfs_itrace_exit(ip, __func__, (inst_t *)__return_address)
#define xfs_itrace_exit_tag(ip, tag) \
_xfs_itrace_exit(ip, tag, (inst_t *)__return_address)
#define xfs_itrace_ref(ip) \
_xfs_itrace_ref(ip, __FILE__, __LINE__, (inst_t *)__return_address)
#else
#define xfs_itrace_entry(a)
#define xfs_itrace_exit(a)
#define xfs_itrace_exit_tag(a, b)
#define xfs_itrace_hold(a, b, c, d)
#define xfs_itrace_ref(a)
#define xfs_itrace_rele(a, b, c, d)
#endif
#define IHOLD(ip) \ #define IHOLD(ip) \
do { \ do { \
ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \
atomic_inc(&(VFS_I(ip)->i_count)); \ atomic_inc(&(VFS_I(ip)->i_count)); \
xfs_itrace_hold((ip), __FILE__, __LINE__, (inst_t *)__return_address); \ trace_xfs_ihold(ip, _THIS_IP_); \
} while (0) } while (0)
#define IRELE(ip) \ #define IRELE(ip) \
do { \ do { \
xfs_itrace_rele((ip), __FILE__, __LINE__, (inst_t *)__return_address); \ trace_xfs_irele(ip, _THIS_IP_); \
iput(VFS_I(ip)); \ iput(VFS_I(ip)); \
} while (0) } while (0)
@ -577,11 +529,11 @@ int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int);
int xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int); int xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int);
xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t); xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t);
void xfs_iext_insert(xfs_ifork_t *, xfs_extnum_t, xfs_extnum_t, void xfs_iext_insert(xfs_inode_t *, xfs_extnum_t, xfs_extnum_t,
xfs_bmbt_irec_t *); xfs_bmbt_irec_t *, int);
void xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int);
void xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int); void xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int);
void xfs_iext_remove(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove(xfs_inode_t *, xfs_extnum_t, int, int);
void xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int);
void xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int);
void xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int);

View File

@ -41,6 +41,7 @@
#include "xfs_ialloc.h" #include "xfs_ialloc.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_trace.h"
kmem_zone_t *xfs_ili_zone; /* inode log item zone */ kmem_zone_t *xfs_ili_zone; /* inode log item zone */
@ -800,7 +801,9 @@ xfs_inode_item_pushbuf(
!completion_done(&ip->i_flush)); !completion_done(&ip->i_flush));
iip->ili_pushbuf_flag = 0; iip->ili_pushbuf_flag = 0;
xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_iunlock(ip, XFS_ILOCK_SHARED);
xfs_buftrace("INODE ITEM PUSH", bp);
trace_xfs_inode_item_push(bp, _RET_IP_);
if (XFS_BUF_ISPINNED(bp)) { if (XFS_BUF_ISPINNED(bp)) {
xfs_log_force(mp, (xfs_lsn_t)0, xfs_log_force(mp, (xfs_lsn_t)0,
XFS_LOG_FORCE); XFS_LOG_FORCE);

View File

@ -47,72 +47,8 @@
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_iomap.h" #include "xfs_iomap.h"
#include "xfs_trace.h"
#if defined(XFS_RW_TRACE)
void
xfs_iomap_enter_trace(
int tag,
xfs_inode_t *ip,
xfs_off_t offset,
ssize_t count)
{
if (!ip->i_rwtrace)
return;
ktrace_enter(ip->i_rwtrace,
(void *)((unsigned long)tag),
(void *)ip,
(void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)),
(void *)((unsigned long)((offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(offset & 0xffffffff)),
(void *)((unsigned long)count),
(void *)((unsigned long)((ip->i_new_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_new_size & 0xffffffff)),
(void *)((unsigned long)current_pid()),
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL,
(void *)NULL);
}
void
xfs_iomap_map_trace(
int tag,
xfs_inode_t *ip,
xfs_off_t offset,
ssize_t count,
xfs_iomap_t *iomapp,
xfs_bmbt_irec_t *imapp,
int flags)
{
if (!ip->i_rwtrace)
return;
ktrace_enter(ip->i_rwtrace,
(void *)((unsigned long)tag),
(void *)ip,
(void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)),
(void *)((unsigned long)((offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(offset & 0xffffffff)),
(void *)((unsigned long)count),
(void *)((unsigned long)flags),
(void *)((unsigned long)((iomapp->iomap_offset >> 32) & 0xffffffff)),
(void *)((unsigned long)(iomapp->iomap_offset & 0xffffffff)),
(void *)((unsigned long)(iomapp->iomap_delta)),
(void *)((unsigned long)(iomapp->iomap_bsize)),
(void *)((unsigned long)(iomapp->iomap_bn)),
(void *)(__psint_t)(imapp->br_startoff),
(void *)((unsigned long)(imapp->br_blockcount)),
(void *)(__psint_t)(imapp->br_startblock));
}
#else
#define xfs_iomap_enter_trace(tag, io, offset, count)
#define xfs_iomap_map_trace(tag, io, offset, count, iomapp, imapp, flags)
#endif
#define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \
<< mp->m_writeio_log) << mp->m_writeio_log)
@ -187,21 +123,20 @@ xfs_iomap(
if (XFS_FORCED_SHUTDOWN(mp)) if (XFS_FORCED_SHUTDOWN(mp))
return XFS_ERROR(EIO); return XFS_ERROR(EIO);
trace_xfs_iomap_enter(ip, offset, count, flags, NULL);
switch (flags & (BMAPI_READ | BMAPI_WRITE | BMAPI_ALLOCATE)) { switch (flags & (BMAPI_READ | BMAPI_WRITE | BMAPI_ALLOCATE)) {
case BMAPI_READ: case BMAPI_READ:
xfs_iomap_enter_trace(XFS_IOMAP_READ_ENTER, ip, offset, count);
lockmode = xfs_ilock_map_shared(ip); lockmode = xfs_ilock_map_shared(ip);
bmapi_flags = XFS_BMAPI_ENTIRE; bmapi_flags = XFS_BMAPI_ENTIRE;
break; break;
case BMAPI_WRITE: case BMAPI_WRITE:
xfs_iomap_enter_trace(XFS_IOMAP_WRITE_ENTER, ip, offset, count);
lockmode = XFS_ILOCK_EXCL; lockmode = XFS_ILOCK_EXCL;
if (flags & BMAPI_IGNSTATE) if (flags & BMAPI_IGNSTATE)
bmapi_flags |= XFS_BMAPI_IGSTATE|XFS_BMAPI_ENTIRE; bmapi_flags |= XFS_BMAPI_IGSTATE|XFS_BMAPI_ENTIRE;
xfs_ilock(ip, lockmode); xfs_ilock(ip, lockmode);
break; break;
case BMAPI_ALLOCATE: case BMAPI_ALLOCATE:
xfs_iomap_enter_trace(XFS_IOMAP_ALLOC_ENTER, ip, offset, count);
lockmode = XFS_ILOCK_SHARED; lockmode = XFS_ILOCK_SHARED;
bmapi_flags = XFS_BMAPI_ENTIRE; bmapi_flags = XFS_BMAPI_ENTIRE;
@ -237,8 +172,7 @@ xfs_iomap(
if (nimaps && if (nimaps &&
(imap.br_startblock != HOLESTARTBLOCK) && (imap.br_startblock != HOLESTARTBLOCK) &&
(imap.br_startblock != DELAYSTARTBLOCK)) { (imap.br_startblock != DELAYSTARTBLOCK)) {
xfs_iomap_map_trace(XFS_IOMAP_WRITE_MAP, ip, trace_xfs_iomap_found(ip, offset, count, flags, &imap);
offset, count, iomapp, &imap, flags);
break; break;
} }
@ -250,8 +184,7 @@ xfs_iomap(
&imap, &nimaps); &imap, &nimaps);
} }
if (!error) { if (!error) {
xfs_iomap_map_trace(XFS_IOMAP_ALLOC_MAP, ip, trace_xfs_iomap_alloc(ip, offset, count, flags, &imap);
offset, count, iomapp, &imap, flags);
} }
iomap_flags = IOMAP_NEW; iomap_flags = IOMAP_NEW;
break; break;
@ -261,8 +194,7 @@ xfs_iomap(
lockmode = 0; lockmode = 0;
if (nimaps && !isnullstartblock(imap.br_startblock)) { if (nimaps && !isnullstartblock(imap.br_startblock)) {
xfs_iomap_map_trace(XFS_IOMAP_WRITE_MAP, ip, trace_xfs_iomap_found(ip, offset, count, flags, &imap);
offset, count, iomapp, &imap, flags);
break; break;
} }
@ -623,8 +555,7 @@ xfs_iomap_write_delay(
* delalloc blocks and retry without EOF preallocation. * delalloc blocks and retry without EOF preallocation.
*/ */
if (nimaps == 0) { if (nimaps == 0) {
xfs_iomap_enter_trace(XFS_IOMAP_WRITE_NOSPACE, trace_xfs_delalloc_enospc(ip, offset, count);
ip, offset, count);
if (flushed) if (flushed)
return XFS_ERROR(ENOSPC); return XFS_ERROR(ENOSPC);
@ -837,7 +768,7 @@ xfs_iomap_write_unwritten(
int committed; int committed;
int error; int error;
xfs_iomap_enter_trace(XFS_IOMAP_UNWRITTEN, ip, offset, count); trace_xfs_unwritten_convert(ip, offset, count);
offset_fsb = XFS_B_TO_FSBT(mp, offset); offset_fsb = XFS_B_TO_FSBT(mp, offset);
count_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); count_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count);

View File

@ -43,6 +43,14 @@ typedef enum {
BMAPI_TRYLOCK = (1 << 7), /* non-blocking request */ BMAPI_TRYLOCK = (1 << 7), /* non-blocking request */
} bmapi_flags_t; } bmapi_flags_t;
#define BMAPI_FLAGS \
{ BMAPI_READ, "READ" }, \
{ BMAPI_WRITE, "WRITE" }, \
{ BMAPI_ALLOCATE, "ALLOCATE" }, \
{ BMAPI_IGNSTATE, "IGNSTATE" }, \
{ BMAPI_DIRECT, "DIRECT" }, \
{ BMAPI_MMAP, "MMAP" }, \
{ BMAPI_TRYLOCK, "TRYLOCK" }
/* /*
* xfs_iomap_t: File system I/O map * xfs_iomap_t: File system I/O map

View File

@ -40,6 +40,7 @@
#include "xfs_dinode.h" #include "xfs_dinode.h"
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_trace.h"
kmem_zone_t *xfs_log_ticket_zone; kmem_zone_t *xfs_log_ticket_zone;
@ -122,85 +123,6 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog,
STATIC int xlog_iclogs_empty(xlog_t *log); STATIC int xlog_iclogs_empty(xlog_t *log);
#if defined(XFS_LOG_TRACE)
#define XLOG_TRACE_LOGGRANT_SIZE 2048
#define XLOG_TRACE_ICLOG_SIZE 256
void
xlog_trace_loggrant_alloc(xlog_t *log)
{
log->l_grant_trace = ktrace_alloc(XLOG_TRACE_LOGGRANT_SIZE, KM_NOFS);
}
void
xlog_trace_loggrant_dealloc(xlog_t *log)
{
ktrace_free(log->l_grant_trace);
}
void
xlog_trace_loggrant(xlog_t *log, xlog_ticket_t *tic, xfs_caddr_t string)
{
unsigned long cnts;
/* ticket counts are 1 byte each */
cnts = ((unsigned long)tic->t_ocnt) | ((unsigned long)tic->t_cnt) << 8;
ktrace_enter(log->l_grant_trace,
(void *)tic,
(void *)log->l_reserve_headq,
(void *)log->l_write_headq,
(void *)((unsigned long)log->l_grant_reserve_cycle),
(void *)((unsigned long)log->l_grant_reserve_bytes),
(void *)((unsigned long)log->l_grant_write_cycle),
(void *)((unsigned long)log->l_grant_write_bytes),
(void *)((unsigned long)log->l_curr_cycle),
(void *)((unsigned long)log->l_curr_block),
(void *)((unsigned long)CYCLE_LSN(log->l_tail_lsn)),
(void *)((unsigned long)BLOCK_LSN(log->l_tail_lsn)),
(void *)string,
(void *)((unsigned long)tic->t_trans_type),
(void *)cnts,
(void *)((unsigned long)tic->t_curr_res),
(void *)((unsigned long)tic->t_unit_res));
}
void
xlog_trace_iclog_alloc(xlog_in_core_t *iclog)
{
iclog->ic_trace = ktrace_alloc(XLOG_TRACE_ICLOG_SIZE, KM_NOFS);
}
void
xlog_trace_iclog_dealloc(xlog_in_core_t *iclog)
{
ktrace_free(iclog->ic_trace);
}
void
xlog_trace_iclog(xlog_in_core_t *iclog, uint state)
{
ktrace_enter(iclog->ic_trace,
(void *)((unsigned long)state),
(void *)((unsigned long)current_pid()),
(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,
(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,
(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,
(void *)NULL, (void *)NULL);
}
#else
#define xlog_trace_loggrant_alloc(log)
#define xlog_trace_loggrant_dealloc(log)
#define xlog_trace_loggrant(log,tic,string)
#define xlog_trace_iclog_alloc(iclog)
#define xlog_trace_iclog_dealloc(iclog)
#define xlog_trace_iclog(iclog,state)
#endif /* XFS_LOG_TRACE */
static void static void
xlog_ins_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic) xlog_ins_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic)
@ -353,15 +275,17 @@ xfs_log_done(xfs_mount_t *mp,
if ((ticket->t_flags & XLOG_TIC_PERM_RESERV) == 0 || if ((ticket->t_flags & XLOG_TIC_PERM_RESERV) == 0 ||
(flags & XFS_LOG_REL_PERM_RESERV)) { (flags & XFS_LOG_REL_PERM_RESERV)) {
trace_xfs_log_done_nonperm(log, ticket);
/* /*
* Release ticket if not permanent reservation or a specific * Release ticket if not permanent reservation or a specific
* request has been made to release a permanent reservation. * request has been made to release a permanent reservation.
*/ */
xlog_trace_loggrant(log, ticket, "xfs_log_done: (non-permanent)");
xlog_ungrant_log_space(log, ticket); xlog_ungrant_log_space(log, ticket);
xfs_log_ticket_put(ticket); xfs_log_ticket_put(ticket);
} else { } else {
xlog_trace_loggrant(log, ticket, "xfs_log_done: (permanent)"); trace_xfs_log_done_perm(log, ticket);
xlog_regrant_reserve_log_space(log, ticket); xlog_regrant_reserve_log_space(log, ticket);
/* If this ticket was a permanent reservation and we aren't /* If this ticket was a permanent reservation and we aren't
* trying to release it, reset the inited flags; so next time * trying to release it, reset the inited flags; so next time
@ -505,10 +429,13 @@ xfs_log_reserve(xfs_mount_t *mp,
XFS_STATS_INC(xs_try_logspace); XFS_STATS_INC(xs_try_logspace);
if (*ticket != NULL) { if (*ticket != NULL) {
ASSERT(flags & XFS_LOG_PERM_RESERV); ASSERT(flags & XFS_LOG_PERM_RESERV);
internal_ticket = (xlog_ticket_t *)*ticket; internal_ticket = (xlog_ticket_t *)*ticket;
xlog_trace_loggrant(log, internal_ticket, "xfs_log_reserve: existing ticket (permanent trans)");
trace_xfs_log_reserve(log, internal_ticket);
xlog_grant_push_ail(mp, internal_ticket->t_unit_res); xlog_grant_push_ail(mp, internal_ticket->t_unit_res);
retval = xlog_regrant_write_log_space(log, internal_ticket); retval = xlog_regrant_write_log_space(log, internal_ticket);
} else { } else {
@ -519,10 +446,9 @@ xfs_log_reserve(xfs_mount_t *mp,
return XFS_ERROR(ENOMEM); return XFS_ERROR(ENOMEM);
internal_ticket->t_trans_type = t_type; internal_ticket->t_trans_type = t_type;
*ticket = internal_ticket; *ticket = internal_ticket;
xlog_trace_loggrant(log, internal_ticket,
(internal_ticket->t_flags & XLOG_TIC_PERM_RESERV) ? trace_xfs_log_reserve(log, internal_ticket);
"xfs_log_reserve: create new ticket (permanent trans)" :
"xfs_log_reserve: create new ticket");
xlog_grant_push_ail(mp, xlog_grant_push_ail(mp,
(internal_ticket->t_unit_res * (internal_ticket->t_unit_res *
internal_ticket->t_cnt)); internal_ticket->t_cnt));
@ -734,7 +660,7 @@ xfs_log_unmount_write(xfs_mount_t *mp)
spin_unlock(&log->l_icloglock); spin_unlock(&log->l_icloglock);
} }
if (tic) { if (tic) {
xlog_trace_loggrant(log, tic, "unmount rec"); trace_xfs_log_umount_write(log, tic);
xlog_ungrant_log_space(log, tic); xlog_ungrant_log_space(log, tic);
xfs_log_ticket_put(tic); xfs_log_ticket_put(tic);
} }
@ -1030,7 +956,6 @@ xlog_iodone(xfs_buf_t *bp)
xfs_fs_cmn_err(CE_WARN, l->l_mp, xfs_fs_cmn_err(CE_WARN, l->l_mp,
"xlog_iodone: Barriers are no longer supported" "xlog_iodone: Barriers are no longer supported"
" by device. Disabling barriers\n"); " by device. Disabling barriers\n");
xfs_buftrace("XLOG_IODONE BARRIERS OFF", bp);
} }
/* /*
@ -1085,13 +1010,10 @@ xlog_bdstrat_cb(struct xfs_buf *bp)
return 0; return 0;
} }
xfs_buftrace("XLOG__BDSTRAT IOERROR", bp);
XFS_BUF_ERROR(bp, EIO); XFS_BUF_ERROR(bp, EIO);
XFS_BUF_STALE(bp); XFS_BUF_STALE(bp);
xfs_biodone(bp); xfs_biodone(bp);
return XFS_ERROR(EIO); return XFS_ERROR(EIO);
} }
/* /*
@ -1246,7 +1168,6 @@ xlog_alloc_log(xfs_mount_t *mp,
spin_lock_init(&log->l_grant_lock); spin_lock_init(&log->l_grant_lock);
sv_init(&log->l_flush_wait, 0, "flush_wait"); sv_init(&log->l_flush_wait, 0, "flush_wait");
xlog_trace_loggrant_alloc(log);
/* log record size must be multiple of BBSIZE; see xlog_rec_header_t */ /* log record size must be multiple of BBSIZE; see xlog_rec_header_t */
ASSERT((XFS_BUF_SIZE(bp) & BBMASK) == 0); ASSERT((XFS_BUF_SIZE(bp) & BBMASK) == 0);
@ -1305,8 +1226,6 @@ xlog_alloc_log(xfs_mount_t *mp,
sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force"); sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force");
sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write"); sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write");
xlog_trace_iclog_alloc(iclog);
iclogp = &iclog->ic_next; iclogp = &iclog->ic_next;
} }
*iclogp = log->l_iclog; /* complete ring */ *iclogp = log->l_iclog; /* complete ring */
@ -1321,13 +1240,11 @@ xlog_alloc_log(xfs_mount_t *mp,
sv_destroy(&iclog->ic_force_wait); sv_destroy(&iclog->ic_force_wait);
sv_destroy(&iclog->ic_write_wait); sv_destroy(&iclog->ic_write_wait);
xfs_buf_free(iclog->ic_bp); xfs_buf_free(iclog->ic_bp);
xlog_trace_iclog_dealloc(iclog);
} }
kmem_free(iclog); kmem_free(iclog);
} }
spinlock_destroy(&log->l_icloglock); spinlock_destroy(&log->l_icloglock);
spinlock_destroy(&log->l_grant_lock); spinlock_destroy(&log->l_grant_lock);
xlog_trace_loggrant_dealloc(log);
xfs_buf_free(log->l_xbuf); xfs_buf_free(log->l_xbuf);
out_free_log: out_free_log:
kmem_free(log); kmem_free(log);
@ -1607,7 +1524,6 @@ xlog_dealloc_log(xlog_t *log)
sv_destroy(&iclog->ic_force_wait); sv_destroy(&iclog->ic_force_wait);
sv_destroy(&iclog->ic_write_wait); sv_destroy(&iclog->ic_write_wait);
xfs_buf_free(iclog->ic_bp); xfs_buf_free(iclog->ic_bp);
xlog_trace_iclog_dealloc(iclog);
next_iclog = iclog->ic_next; next_iclog = iclog->ic_next;
kmem_free(iclog); kmem_free(iclog);
iclog = next_iclog; iclog = next_iclog;
@ -1616,7 +1532,6 @@ xlog_dealloc_log(xlog_t *log)
spinlock_destroy(&log->l_grant_lock); spinlock_destroy(&log->l_grant_lock);
xfs_buf_free(log->l_xbuf); xfs_buf_free(log->l_xbuf);
xlog_trace_loggrant_dealloc(log);
log->l_mp->m_log = NULL; log->l_mp->m_log = NULL;
kmem_free(log); kmem_free(log);
} /* xlog_dealloc_log */ } /* xlog_dealloc_log */
@ -2414,7 +2329,6 @@ xlog_state_get_iclog_space(xlog_t *log,
iclog = log->l_iclog; iclog = log->l_iclog;
if (iclog->ic_state != XLOG_STATE_ACTIVE) { if (iclog->ic_state != XLOG_STATE_ACTIVE) {
xlog_trace_iclog(iclog, XLOG_TRACE_SLEEP_FLUSH);
XFS_STATS_INC(xs_log_noiclogs); XFS_STATS_INC(xs_log_noiclogs);
/* Wait for log writes to have flushed */ /* Wait for log writes to have flushed */
@ -2520,13 +2434,15 @@ xlog_grant_log_space(xlog_t *log,
/* Is there space or do we need to sleep? */ /* Is there space or do we need to sleep? */
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
xlog_trace_loggrant(log, tic, "xlog_grant_log_space: enter");
trace_xfs_log_grant_enter(log, tic);
/* something is already sleeping; insert new transaction at end */ /* something is already sleeping; insert new transaction at end */
if (log->l_reserve_headq) { if (log->l_reserve_headq) {
xlog_ins_ticketq(&log->l_reserve_headq, tic); xlog_ins_ticketq(&log->l_reserve_headq, tic);
xlog_trace_loggrant(log, tic,
"xlog_grant_log_space: sleep 1"); trace_xfs_log_grant_sleep1(log, tic);
/* /*
* Gotta check this before going to sleep, while we're * Gotta check this before going to sleep, while we're
* holding the grant lock. * holding the grant lock.
@ -2540,8 +2456,7 @@ xlog_grant_log_space(xlog_t *log,
* If we got an error, and the filesystem is shutting down, * If we got an error, and the filesystem is shutting down,
* we'll catch it down below. So just continue... * we'll catch it down below. So just continue...
*/ */
xlog_trace_loggrant(log, tic, trace_xfs_log_grant_wake1(log, tic);
"xlog_grant_log_space: wake 1");
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
} }
if (tic->t_flags & XFS_LOG_PERM_RESERV) if (tic->t_flags & XFS_LOG_PERM_RESERV)
@ -2558,8 +2473,9 @@ xlog_grant_log_space(xlog_t *log,
if (free_bytes < need_bytes) { if (free_bytes < need_bytes) {
if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) if ((tic->t_flags & XLOG_TIC_IN_Q) == 0)
xlog_ins_ticketq(&log->l_reserve_headq, tic); xlog_ins_ticketq(&log->l_reserve_headq, tic);
xlog_trace_loggrant(log, tic,
"xlog_grant_log_space: sleep 2"); trace_xfs_log_grant_sleep2(log, tic);
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
xlog_grant_push_ail(log->l_mp, need_bytes); xlog_grant_push_ail(log->l_mp, need_bytes);
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
@ -2571,8 +2487,8 @@ xlog_grant_log_space(xlog_t *log,
if (XLOG_FORCED_SHUTDOWN(log)) if (XLOG_FORCED_SHUTDOWN(log))
goto error_return; goto error_return;
xlog_trace_loggrant(log, tic, trace_xfs_log_grant_wake2(log, tic);
"xlog_grant_log_space: wake 2");
goto redo; goto redo;
} else if (tic->t_flags & XLOG_TIC_IN_Q) } else if (tic->t_flags & XLOG_TIC_IN_Q)
xlog_del_ticketq(&log->l_reserve_headq, tic); xlog_del_ticketq(&log->l_reserve_headq, tic);
@ -2592,7 +2508,7 @@ xlog_grant_log_space(xlog_t *log,
ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn)));
} }
#endif #endif
xlog_trace_loggrant(log, tic, "xlog_grant_log_space: exit"); trace_xfs_log_grant_exit(log, tic);
xlog_verify_grant_head(log, 1); xlog_verify_grant_head(log, 1);
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
return 0; return 0;
@ -2600,7 +2516,9 @@ xlog_grant_log_space(xlog_t *log,
error_return: error_return:
if (tic->t_flags & XLOG_TIC_IN_Q) if (tic->t_flags & XLOG_TIC_IN_Q)
xlog_del_ticketq(&log->l_reserve_headq, tic); xlog_del_ticketq(&log->l_reserve_headq, tic);
xlog_trace_loggrant(log, tic, "xlog_grant_log_space: err_ret");
trace_xfs_log_grant_error(log, tic);
/* /*
* If we are failing, make sure the ticket doesn't have any * If we are failing, make sure the ticket doesn't have any
* current reservations. We don't want to add this back when * current reservations. We don't want to add this back when
@ -2640,7 +2558,8 @@ xlog_regrant_write_log_space(xlog_t *log,
#endif #endif
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
xlog_trace_loggrant(log, tic, "xlog_regrant_write_log_space: enter");
trace_xfs_log_regrant_write_enter(log, tic);
if (XLOG_FORCED_SHUTDOWN(log)) if (XLOG_FORCED_SHUTDOWN(log))
goto error_return; goto error_return;
@ -2669,8 +2588,8 @@ xlog_regrant_write_log_space(xlog_t *log,
if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) if ((tic->t_flags & XLOG_TIC_IN_Q) == 0)
xlog_ins_ticketq(&log->l_write_headq, tic); xlog_ins_ticketq(&log->l_write_headq, tic);
xlog_trace_loggrant(log, tic, trace_xfs_log_regrant_write_sleep1(log, tic);
"xlog_regrant_write_log_space: sleep 1");
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
xlog_grant_push_ail(log->l_mp, need_bytes); xlog_grant_push_ail(log->l_mp, need_bytes);
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
@ -2685,8 +2604,7 @@ xlog_regrant_write_log_space(xlog_t *log,
if (XLOG_FORCED_SHUTDOWN(log)) if (XLOG_FORCED_SHUTDOWN(log))
goto error_return; goto error_return;
xlog_trace_loggrant(log, tic, trace_xfs_log_regrant_write_wake1(log, tic);
"xlog_regrant_write_log_space: wake 1");
} }
} }
@ -2704,6 +2622,8 @@ xlog_regrant_write_log_space(xlog_t *log,
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
XFS_STATS_INC(xs_sleep_logspace); XFS_STATS_INC(xs_sleep_logspace);
trace_xfs_log_regrant_write_sleep2(log, tic);
sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s);
/* If we're shutting down, this tic is already off the queue */ /* If we're shutting down, this tic is already off the queue */
@ -2711,8 +2631,7 @@ xlog_regrant_write_log_space(xlog_t *log,
if (XLOG_FORCED_SHUTDOWN(log)) if (XLOG_FORCED_SHUTDOWN(log))
goto error_return; goto error_return;
xlog_trace_loggrant(log, tic, trace_xfs_log_regrant_write_wake2(log, tic);
"xlog_regrant_write_log_space: wake 2");
goto redo; goto redo;
} else if (tic->t_flags & XLOG_TIC_IN_Q) } else if (tic->t_flags & XLOG_TIC_IN_Q)
xlog_del_ticketq(&log->l_write_headq, tic); xlog_del_ticketq(&log->l_write_headq, tic);
@ -2727,7 +2646,8 @@ xlog_regrant_write_log_space(xlog_t *log,
} }
#endif #endif
xlog_trace_loggrant(log, tic, "xlog_regrant_write_log_space: exit"); trace_xfs_log_regrant_write_exit(log, tic);
xlog_verify_grant_head(log, 1); xlog_verify_grant_head(log, 1);
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
return 0; return 0;
@ -2736,7 +2656,9 @@ xlog_regrant_write_log_space(xlog_t *log,
error_return: error_return:
if (tic->t_flags & XLOG_TIC_IN_Q) if (tic->t_flags & XLOG_TIC_IN_Q)
xlog_del_ticketq(&log->l_reserve_headq, tic); xlog_del_ticketq(&log->l_reserve_headq, tic);
xlog_trace_loggrant(log, tic, "xlog_regrant_write_log_space: err_ret");
trace_xfs_log_regrant_write_error(log, tic);
/* /*
* If we are failing, make sure the ticket doesn't have any * If we are failing, make sure the ticket doesn't have any
* current reservations. We don't want to add this back when * current reservations. We don't want to add this back when
@ -2760,8 +2682,8 @@ STATIC void
xlog_regrant_reserve_log_space(xlog_t *log, xlog_regrant_reserve_log_space(xlog_t *log,
xlog_ticket_t *ticket) xlog_ticket_t *ticket)
{ {
xlog_trace_loggrant(log, ticket, trace_xfs_log_regrant_reserve_enter(log, ticket);
"xlog_regrant_reserve_log_space: enter");
if (ticket->t_cnt > 0) if (ticket->t_cnt > 0)
ticket->t_cnt--; ticket->t_cnt--;
@ -2769,8 +2691,9 @@ xlog_regrant_reserve_log_space(xlog_t *log,
xlog_grant_sub_space(log, ticket->t_curr_res); xlog_grant_sub_space(log, ticket->t_curr_res);
ticket->t_curr_res = ticket->t_unit_res; ticket->t_curr_res = ticket->t_unit_res;
xlog_tic_reset_res(ticket); xlog_tic_reset_res(ticket);
xlog_trace_loggrant(log, ticket,
"xlog_regrant_reserve_log_space: sub current res"); trace_xfs_log_regrant_reserve_sub(log, ticket);
xlog_verify_grant_head(log, 1); xlog_verify_grant_head(log, 1);
/* just return if we still have some of the pre-reserved space */ /* just return if we still have some of the pre-reserved space */
@ -2780,8 +2703,9 @@ xlog_regrant_reserve_log_space(xlog_t *log,
} }
xlog_grant_add_space_reserve(log, ticket->t_unit_res); xlog_grant_add_space_reserve(log, ticket->t_unit_res);
xlog_trace_loggrant(log, ticket,
"xlog_regrant_reserve_log_space: exit"); trace_xfs_log_regrant_reserve_exit(log, ticket);
xlog_verify_grant_head(log, 0); xlog_verify_grant_head(log, 0);
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
ticket->t_curr_res = ticket->t_unit_res; ticket->t_curr_res = ticket->t_unit_res;
@ -2811,11 +2735,11 @@ xlog_ungrant_log_space(xlog_t *log,
ticket->t_cnt--; ticket->t_cnt--;
spin_lock(&log->l_grant_lock); spin_lock(&log->l_grant_lock);
xlog_trace_loggrant(log, ticket, "xlog_ungrant_log_space: enter"); trace_xfs_log_ungrant_enter(log, ticket);
xlog_grant_sub_space(log, ticket->t_curr_res); xlog_grant_sub_space(log, ticket->t_curr_res);
xlog_trace_loggrant(log, ticket, "xlog_ungrant_log_space: sub current"); trace_xfs_log_ungrant_sub(log, ticket);
/* If this is a permanent reservation ticket, we may be able to free /* If this is a permanent reservation ticket, we may be able to free
* up more space based on the remaining count. * up more space based on the remaining count.
@ -2825,7 +2749,8 @@ xlog_ungrant_log_space(xlog_t *log,
xlog_grant_sub_space(log, ticket->t_unit_res*ticket->t_cnt); xlog_grant_sub_space(log, ticket->t_unit_res*ticket->t_cnt);
} }
xlog_trace_loggrant(log, ticket, "xlog_ungrant_log_space: exit"); trace_xfs_log_ungrant_exit(log, ticket);
xlog_verify_grant_head(log, 1); xlog_verify_grant_head(log, 1);
spin_unlock(&log->l_grant_lock); spin_unlock(&log->l_grant_lock);
xfs_log_move_tail(log->l_mp, 1); xfs_log_move_tail(log->l_mp, 1);

View File

@ -19,7 +19,6 @@
#define __XFS_LOG_PRIV_H__ #define __XFS_LOG_PRIV_H__
struct xfs_buf; struct xfs_buf;
struct ktrace;
struct log; struct log;
struct xlog_ticket; struct xlog_ticket;
struct xfs_buf_cancel; struct xfs_buf_cancel;
@ -135,6 +134,12 @@ static inline uint xlog_get_client_id(__be32 i)
#define XLOG_TIC_INITED 0x1 /* has been initialized */ #define XLOG_TIC_INITED 0x1 /* has been initialized */
#define XLOG_TIC_PERM_RESERV 0x2 /* permanent reservation */ #define XLOG_TIC_PERM_RESERV 0x2 /* permanent reservation */
#define XLOG_TIC_IN_Q 0x4 #define XLOG_TIC_IN_Q 0x4
#define XLOG_TIC_FLAGS \
{ XLOG_TIC_INITED, "XLOG_TIC_INITED" }, \
{ XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" }, \
{ XLOG_TIC_IN_Q, "XLOG_TIC_IN_Q" }
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ #define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */
@ -361,9 +366,6 @@ typedef struct xlog_in_core {
int ic_bwritecnt; int ic_bwritecnt;
unsigned short ic_state; unsigned short ic_state;
char *ic_datap; /* pointer to iclog data */ char *ic_datap; /* pointer to iclog data */
#ifdef XFS_LOG_TRACE
struct ktrace *ic_trace;
#endif
/* Callback structures need their own cacheline */ /* Callback structures need their own cacheline */
spinlock_t ic_callback_lock ____cacheline_aligned_in_smp; spinlock_t ic_callback_lock ____cacheline_aligned_in_smp;
@ -429,10 +431,6 @@ typedef struct log {
int l_grant_write_cycle; int l_grant_write_cycle;
int l_grant_write_bytes; int l_grant_write_bytes;
#ifdef XFS_LOG_TRACE
struct ktrace *l_grant_trace;
#endif
/* The following field are used for debugging; need to hold icloglock */ /* The following field are used for debugging; need to hold icloglock */
#ifdef DEBUG #ifdef DEBUG
char *l_iclog_bak[XLOG_MAX_ICLOGS]; char *l_iclog_bak[XLOG_MAX_ICLOGS];
@ -456,12 +454,6 @@ extern void xlog_put_bp(struct xfs_buf *);
extern kmem_zone_t *xfs_log_ticket_zone; extern kmem_zone_t *xfs_log_ticket_zone;
/* iclog tracing */
#define XLOG_TRACE_GRAB_FLUSH 1
#define XLOG_TRACE_REL_FLUSH 2
#define XLOG_TRACE_SLEEP_FLUSH 3
#define XLOG_TRACE_WAKE_FLUSH 4
/* /*
* Unmount record type is used as a pseudo transaction type for the ticket. * Unmount record type is used as a pseudo transaction type for the ticket.
* It's value must be outside the range of XFS_TRANS_* values. * It's value must be outside the range of XFS_TRANS_* values.

View File

@ -46,6 +46,7 @@
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_trace.h"
STATIC int xlog_find_zeroed(xlog_t *, xfs_daddr_t *); STATIC int xlog_find_zeroed(xlog_t *, xfs_daddr_t *);
STATIC int xlog_clear_stale_blocks(xlog_t *, xfs_lsn_t); STATIC int xlog_clear_stale_blocks(xlog_t *, xfs_lsn_t);

View File

@ -44,6 +44,8 @@
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_fsops.h" #include "xfs_fsops.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_trace.h"
STATIC void xfs_unmountfs_wait(xfs_mount_t *); STATIC void xfs_unmountfs_wait(xfs_mount_t *);

View File

@ -92,6 +92,14 @@ typedef struct xfs_dqblk {
#define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP)
#define XFS_DQ_FLAGS \
{ XFS_DQ_USER, "USER" }, \
{ XFS_DQ_PROJ, "PROJ" }, \
{ XFS_DQ_GROUP, "GROUP" }, \
{ XFS_DQ_DIRTY, "DIRTY" }, \
{ XFS_DQ_WANT, "WANT" }, \
{ XFS_DQ_INACTIVE, "INACTIVE" }
/* /*
* In the worst case, when both user and group quotas are on, * In the worst case, when both user and group quotas are on,
* we can have a max of three dquots changing in a single transaction. * we can have a max of three dquots changing in a single transaction.

View File

@ -39,6 +39,7 @@
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
/* /*

View File

@ -45,6 +45,7 @@
#include "xfs_inode_item.h" #include "xfs_inode_item.h"
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_utils.h" #include "xfs_utils.h"
#include "xfs_trace.h"
/* /*

View File

@ -44,6 +44,7 @@
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_buf_item.h" #include "xfs_buf_item.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_trace.h"
/* /*
* This is a subroutine for xfs_write() and other writers (xfs_ioctl) * This is a subroutine for xfs_write() and other writers (xfs_ioctl)
@ -171,7 +172,6 @@ xfs_bioerror(
* No need to wait until the buffer is unpinned. * No need to wait until the buffer is unpinned.
* We aren't flushing it. * We aren't flushing it.
*/ */
xfs_buftrace("XFS IOERROR", bp);
XFS_BUF_ERROR(bp, EIO); XFS_BUF_ERROR(bp, EIO);
/* /*
* We're calling biodone, so delete B_DONE flag. Either way * We're calling biodone, so delete B_DONE flag. Either way
@ -205,7 +205,6 @@ xfs_bioerror_relse(
ASSERT(XFS_BUF_IODONE_FUNC(bp) != xfs_buf_iodone_callbacks); ASSERT(XFS_BUF_IODONE_FUNC(bp) != xfs_buf_iodone_callbacks);
ASSERT(XFS_BUF_IODONE_FUNC(bp) != xlog_iodone); ASSERT(XFS_BUF_IODONE_FUNC(bp) != xlog_iodone);
xfs_buftrace("XFS IOERRELSE", bp);
fl = XFS_BUF_BFLAGS(bp); fl = XFS_BUF_BFLAGS(bp);
/* /*
* No need to wait until the buffer is unpinned. * No need to wait until the buffer is unpinned.

View File

@ -100,6 +100,49 @@ typedef struct xfs_trans_header {
#define XFS_TRANS_TYPE_MAX 41 #define XFS_TRANS_TYPE_MAX 41
/* new transaction types need to be reflected in xfs_logprint(8) */ /* new transaction types need to be reflected in xfs_logprint(8) */
#define XFS_TRANS_TYPES \
{ XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \
{ XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \
{ XFS_TRANS_INACTIVE, "INACTIVE" }, \
{ XFS_TRANS_CREATE, "CREATE" }, \
{ XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \
{ XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \
{ XFS_TRANS_REMOVE, "REMOVE" }, \
{ XFS_TRANS_LINK, "LINK" }, \
{ XFS_TRANS_RENAME, "RENAME" }, \
{ XFS_TRANS_MKDIR, "MKDIR" }, \
{ XFS_TRANS_RMDIR, "RMDIR" }, \
{ XFS_TRANS_SYMLINK, "SYMLINK" }, \
{ XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \
{ XFS_TRANS_GROWFS, "GROWFS" }, \
{ XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \
{ XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \
{ XFS_TRANS_WRITEID, "WRITEID" }, \
{ XFS_TRANS_ADDAFORK, "ADDAFORK" }, \
{ XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \
{ XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \
{ XFS_TRANS_ATTR_SET, "ATTR_SET" }, \
{ XFS_TRANS_ATTR_RM, "ATTR_RM" }, \
{ XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \
{ XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \
{ XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \
{ XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \
{ XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \
{ XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \
{ XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \
{ XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \
{ XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \
{ XFS_TRANS_SB_UNIT, "SB_UNIT" }, \
{ XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \
{ XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \
{ XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \
{ XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \
{ XFS_TRANS_SWAPEXT, "SWAPEXT" }, \
{ XFS_TRANS_SB_COUNT, "SB_COUNT" }, \
{ XFS_TRANS_DUMMY1, "DUMMY1" }, \
{ XFS_TRANS_DUMMY2, "DUMMY2" }, \
{ XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" }
/* /*
* This structure is used to track log items associated with * This structure is used to track log items associated with
* a transaction. It points to the log item and keeps some * a transaction. It points to the log item and keeps some
@ -782,6 +825,10 @@ typedef struct xfs_log_item {
#define XFS_LI_IN_AIL 0x1 #define XFS_LI_IN_AIL 0x1
#define XFS_LI_ABORTED 0x2 #define XFS_LI_ABORTED 0x2
#define XFS_LI_FLAGS \
{ XFS_LI_IN_AIL, "IN_AIL" }, \
{ XFS_LI_ABORTED, "ABORTED" }
typedef struct xfs_item_ops { typedef struct xfs_item_ops {
uint (*iop_size)(xfs_log_item_t *); uint (*iop_size)(xfs_log_item_t *);
void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *);

View File

@ -38,6 +38,7 @@
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_error.h" #include "xfs_error.h"
#include "xfs_rw.h" #include "xfs_rw.h"
#include "xfs_trace.h"
STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *, STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *,
@ -95,26 +96,23 @@ xfs_trans_get_buf(xfs_trans_t *tp,
} }
if (bp != NULL) { if (bp != NULL) {
ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); ASSERT(XFS_BUF_VALUSEMA(bp) <= 0);
if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) { if (XFS_FORCED_SHUTDOWN(tp->t_mountp))
xfs_buftrace("TRANS GET RECUR SHUT", bp);
XFS_BUF_SUPER_STALE(bp); XFS_BUF_SUPER_STALE(bp);
}
/* /*
* If the buffer is stale then it was binval'ed * If the buffer is stale then it was binval'ed
* since last read. This doesn't matter since the * since last read. This doesn't matter since the
* caller isn't allowed to use the data anyway. * caller isn't allowed to use the data anyway.
*/ */
else if (XFS_BUF_ISSTALE(bp)) { else if (XFS_BUF_ISSTALE(bp))
xfs_buftrace("TRANS GET RECUR STALE", bp);
ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); ASSERT(!XFS_BUF_ISDELAYWRITE(bp));
}
ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp);
bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *);
ASSERT(bip != NULL); ASSERT(bip != NULL);
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
bip->bli_recur++; bip->bli_recur++;
xfs_buftrace("TRANS GET RECUR", bp); trace_xfs_trans_get_buf_recur(bip);
xfs_buf_item_trace("GET RECUR", bip);
return (bp); return (bp);
} }
@ -166,8 +164,7 @@ xfs_trans_get_buf(xfs_trans_t *tp,
*/ */
XFS_BUF_SET_FSPRIVATE2(bp, tp); XFS_BUF_SET_FSPRIVATE2(bp, tp);
xfs_buftrace("TRANS GET", bp); trace_xfs_trans_get_buf(bip);
xfs_buf_item_trace("GET", bip);
return (bp); return (bp);
} }
@ -207,7 +204,7 @@ xfs_trans_getsb(xfs_trans_t *tp,
ASSERT(bip != NULL); ASSERT(bip != NULL);
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
bip->bli_recur++; bip->bli_recur++;
xfs_buf_item_trace("GETSB RECUR", bip); trace_xfs_trans_getsb_recur(bip);
return (bp); return (bp);
} }
@ -249,7 +246,7 @@ xfs_trans_getsb(xfs_trans_t *tp,
*/ */
XFS_BUF_SET_FSPRIVATE2(bp, tp); XFS_BUF_SET_FSPRIVATE2(bp, tp);
xfs_buf_item_trace("GETSB", bip); trace_xfs_trans_getsb(bip);
return (bp); return (bp);
} }
@ -347,7 +344,7 @@ xfs_trans_read_buf(
ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL);
ASSERT((XFS_BUF_ISERROR(bp)) == 0); ASSERT((XFS_BUF_ISERROR(bp)) == 0);
if (!(XFS_BUF_ISDONE(bp))) { if (!(XFS_BUF_ISDONE(bp))) {
xfs_buftrace("READ_BUF_INCORE !DONE", bp); trace_xfs_trans_read_buf_io(bp, _RET_IP_);
ASSERT(!XFS_BUF_ISASYNC(bp)); ASSERT(!XFS_BUF_ISASYNC(bp));
XFS_BUF_READ(bp); XFS_BUF_READ(bp);
xfsbdstrat(tp->t_mountp, bp); xfsbdstrat(tp->t_mountp, bp);
@ -372,7 +369,7 @@ xfs_trans_read_buf(
* brelse it either. Just get out. * brelse it either. Just get out.
*/ */
if (XFS_FORCED_SHUTDOWN(mp)) { if (XFS_FORCED_SHUTDOWN(mp)) {
xfs_buftrace("READ_BUF_INCORE XFSSHUTDN", bp); trace_xfs_trans_read_buf_shut(bp, _RET_IP_);
*bpp = NULL; *bpp = NULL;
return XFS_ERROR(EIO); return XFS_ERROR(EIO);
} }
@ -382,7 +379,7 @@ xfs_trans_read_buf(
bip->bli_recur++; bip->bli_recur++;
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
xfs_buf_item_trace("READ RECUR", bip); trace_xfs_trans_read_buf_recur(bip);
*bpp = bp; *bpp = bp;
return 0; return 0;
} }
@ -402,7 +399,6 @@ xfs_trans_read_buf(
} }
if (XFS_BUF_GETERROR(bp) != 0) { if (XFS_BUF_GETERROR(bp) != 0) {
XFS_BUF_SUPER_STALE(bp); XFS_BUF_SUPER_STALE(bp);
xfs_buftrace("READ ERROR", bp);
error = XFS_BUF_GETERROR(bp); error = XFS_BUF_GETERROR(bp);
xfs_ioerror_alert("xfs_trans_read_buf", mp, xfs_ioerror_alert("xfs_trans_read_buf", mp,
@ -461,8 +457,7 @@ xfs_trans_read_buf(
*/ */
XFS_BUF_SET_FSPRIVATE2(bp, tp); XFS_BUF_SET_FSPRIVATE2(bp, tp);
xfs_buftrace("TRANS READ", bp); trace_xfs_trans_read_buf(bip);
xfs_buf_item_trace("READ", bip);
*bpp = bp; *bpp = bp;
return 0; return 0;
@ -480,7 +475,7 @@ xfs_trans_read_buf(
ASSERT((XFS_BUF_BFLAGS(bp) & (XFS_B_STALE|XFS_B_DELWRI)) != ASSERT((XFS_BUF_BFLAGS(bp) & (XFS_B_STALE|XFS_B_DELWRI)) !=
(XFS_B_STALE|XFS_B_DELWRI)); (XFS_B_STALE|XFS_B_DELWRI));
xfs_buftrace("READ_BUF XFSSHUTDN", bp); trace_xfs_trans_read_buf_shut(bp, _RET_IP_);
xfs_buf_relse(bp); xfs_buf_relse(bp);
*bpp = NULL; *bpp = NULL;
return XFS_ERROR(EIO); return XFS_ERROR(EIO);
@ -546,13 +541,14 @@ xfs_trans_brelse(xfs_trans_t *tp,
lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip);
ASSERT(lidp != NULL); ASSERT(lidp != NULL);
trace_xfs_trans_brelse(bip);
/* /*
* If the release is just for a recursive lock, * If the release is just for a recursive lock,
* then decrement the count and return. * then decrement the count and return.
*/ */
if (bip->bli_recur > 0) { if (bip->bli_recur > 0) {
bip->bli_recur--; bip->bli_recur--;
xfs_buf_item_trace("RELSE RECUR", bip);
return; return;
} }
@ -560,10 +556,8 @@ xfs_trans_brelse(xfs_trans_t *tp,
* If the buffer is dirty within this transaction, we can't * If the buffer is dirty within this transaction, we can't
* release it until we commit. * release it until we commit.
*/ */
if (lidp->lid_flags & XFS_LID_DIRTY) { if (lidp->lid_flags & XFS_LID_DIRTY)
xfs_buf_item_trace("RELSE DIRTY", bip);
return; return;
}
/* /*
* If the buffer has been invalidated, then we can't release * If the buffer has been invalidated, then we can't release
@ -571,13 +565,10 @@ xfs_trans_brelse(xfs_trans_t *tp,
* as part of this transaction. This prevents us from pulling * as part of this transaction. This prevents us from pulling
* the item from the AIL before we should. * the item from the AIL before we should.
*/ */
if (bip->bli_flags & XFS_BLI_STALE) { if (bip->bli_flags & XFS_BLI_STALE)
xfs_buf_item_trace("RELSE STALE", bip);
return; return;
}
ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED));
xfs_buf_item_trace("RELSE", bip);
/* /*
* Free up the log item descriptor tracking the released item. * Free up the log item descriptor tracking the released item.
@ -674,7 +665,7 @@ xfs_trans_bjoin(xfs_trans_t *tp,
*/ */
XFS_BUF_SET_FSPRIVATE2(bp, tp); XFS_BUF_SET_FSPRIVATE2(bp, tp);
xfs_buf_item_trace("BJOIN", bip); trace_xfs_trans_bjoin(bip);
} }
/* /*
@ -698,7 +689,7 @@ xfs_trans_bhold(xfs_trans_t *tp,
ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL));
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
bip->bli_flags |= XFS_BLI_HOLD; bip->bli_flags |= XFS_BLI_HOLD;
xfs_buf_item_trace("BHOLD", bip); trace_xfs_trans_bhold(bip);
} }
/* /*
@ -721,7 +712,8 @@ xfs_trans_bhold_release(xfs_trans_t *tp,
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
ASSERT(bip->bli_flags & XFS_BLI_HOLD); ASSERT(bip->bli_flags & XFS_BLI_HOLD);
bip->bli_flags &= ~XFS_BLI_HOLD; bip->bli_flags &= ~XFS_BLI_HOLD;
xfs_buf_item_trace("BHOLD RELEASE", bip);
trace_xfs_trans_bhold_release(bip);
} }
/* /*
@ -767,6 +759,8 @@ xfs_trans_log_buf(xfs_trans_t *tp,
XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks);
bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone;
trace_xfs_trans_log_buf(bip);
/* /*
* If we invalidated the buffer within this transaction, then * If we invalidated the buffer within this transaction, then
* cancel the invalidation now that we're dirtying the buffer * cancel the invalidation now that we're dirtying the buffer
@ -774,7 +768,6 @@ xfs_trans_log_buf(xfs_trans_t *tp,
* because we have a reference to the buffer this entire time. * because we have a reference to the buffer this entire time.
*/ */
if (bip->bli_flags & XFS_BLI_STALE) { if (bip->bli_flags & XFS_BLI_STALE) {
xfs_buf_item_trace("BLOG UNSTALE", bip);
bip->bli_flags &= ~XFS_BLI_STALE; bip->bli_flags &= ~XFS_BLI_STALE;
ASSERT(XFS_BUF_ISSTALE(bp)); ASSERT(XFS_BUF_ISSTALE(bp));
XFS_BUF_UNSTALE(bp); XFS_BUF_UNSTALE(bp);
@ -789,7 +782,6 @@ xfs_trans_log_buf(xfs_trans_t *tp,
lidp->lid_flags &= ~XFS_LID_BUF_STALE; lidp->lid_flags &= ~XFS_LID_BUF_STALE;
bip->bli_flags |= XFS_BLI_LOGGED; bip->bli_flags |= XFS_BLI_LOGGED;
xfs_buf_item_log(bip, first, last); xfs_buf_item_log(bip, first, last);
xfs_buf_item_trace("BLOG", bip);
} }
@ -828,6 +820,8 @@ xfs_trans_binval(
ASSERT(lidp != NULL); ASSERT(lidp != NULL);
ASSERT(atomic_read(&bip->bli_refcount) > 0); ASSERT(atomic_read(&bip->bli_refcount) > 0);
trace_xfs_trans_binval(bip);
if (bip->bli_flags & XFS_BLI_STALE) { if (bip->bli_flags & XFS_BLI_STALE) {
/* /*
* If the buffer is already invalidated, then * If the buffer is already invalidated, then
@ -840,8 +834,6 @@ xfs_trans_binval(
ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL);
ASSERT(lidp->lid_flags & XFS_LID_DIRTY); ASSERT(lidp->lid_flags & XFS_LID_DIRTY);
ASSERT(tp->t_flags & XFS_TRANS_DIRTY); ASSERT(tp->t_flags & XFS_TRANS_DIRTY);
xfs_buftrace("XFS_BINVAL RECUR", bp);
xfs_buf_item_trace("BINVAL RECUR", bip);
return; return;
} }
@ -875,8 +867,6 @@ xfs_trans_binval(
(bip->bli_format.blf_map_size * sizeof(uint))); (bip->bli_format.blf_map_size * sizeof(uint)));
lidp->lid_flags |= XFS_LID_DIRTY|XFS_LID_BUF_STALE; lidp->lid_flags |= XFS_LID_DIRTY|XFS_LID_BUF_STALE;
tp->t_flags |= XFS_TRANS_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY;
xfs_buftrace("XFS_BINVAL", bp);
xfs_buf_item_trace("BINVAL", bip);
} }
/* /*

View File

@ -53,6 +53,7 @@
#include "xfs_log_priv.h" #include "xfs_log_priv.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_vnodeops.h" #include "xfs_vnodeops.h"
#include "xfs_trace.h"
int int
xfs_setattr( xfs_setattr(
@ -1397,7 +1398,6 @@ xfs_lookup(
if (error) if (error)
goto out_free_name; goto out_free_name;
xfs_itrace_ref(*ipp);
return 0; return 0;
out_free_name: out_free_name:
@ -1543,7 +1543,6 @@ xfs_create(
* At this point, we've gotten a newly allocated inode. * At this point, we've gotten a newly allocated inode.
* It is locked (and joined to the transaction). * It is locked (and joined to the transaction).
*/ */
xfs_itrace_ref(ip);
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
/* /*
@ -2003,9 +2002,6 @@ xfs_remove(
if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) if (!is_dir && link_zero && xfs_inode_is_filestream(ip))
xfs_filestream_deassociate(ip); xfs_filestream_deassociate(ip);
xfs_itrace_exit(ip);
xfs_itrace_exit(dp);
std_return: std_return:
if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) {
XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL,
@ -2302,7 +2298,6 @@ xfs_symlink(
goto error_return; goto error_return;
goto error1; goto error1;
} }
xfs_itrace_ref(ip);
/* /*
* An error after we've joined dp to the transaction will result in the * An error after we've joined dp to the transaction will result in the
@ -2845,7 +2840,6 @@ xfs_free_file_space(
ioffset = offset & ~(rounding - 1); ioffset = offset & ~(rounding - 1);
if (VN_CACHED(VFS_I(ip)) != 0) { if (VN_CACHED(VFS_I(ip)) != 0) {
xfs_inval_cached_trace(ip, ioffset, -1, ioffset, -1);
error = xfs_flushinval_pages(ip, ioffset, -1, FI_REMAPF_LOCKED); error = xfs_flushinval_pages(ip, ioffset, -1, FI_REMAPF_LOCKED);
if (error) if (error)
goto out_unlock_iolock; goto out_unlock_iolock;