* Re: next-20090310: ext4 hangs
2009-03-25 16:15 ` Jan Kara
@ 2009-03-25 17:07 ` Alexander Beregalov
2009-03-25 19:43 ` Jan Kara
0 siblings, 1 reply; 24+ messages in thread
From: Alexander Beregalov @ 2009-03-25 17:07 UTC (permalink / raw)
To: Jan Kara; +Cc: Theodore Tso, linux-next, linux-ext4, LKML
[-- Attachment #1: Type: text/plain, Size: 13792 bytes --]
2009/3/25 Jan Kara <jack@suse.cz>:
> On Wed 25-03-09 18:29:10, Alexander Beregalov wrote:
>> 2009/3/25 Jan Kara <jack@suse.cz>:
>> > On Wed 25-03-09 18:18:43, Alexander Beregalov wrote:
>> >> 2009/3/25 Jan Kara <jack@suse.cz>:
>> >> >> > So, I think I need to try it on 2.6.29-rc7 again.
>> >> >> I've looked into this. Obviously, what's happenning is that we delete
>> >> >> an inode and jbd2_journal_release_jbd_inode() finds inode is just under
>> >> >> writeout in transaction commit and thus it waits. But it gets never woken
>> >> >> up and because it has a handle from the transaction, every one eventually
>> >> >> blocks on waiting for a transaction to finish.
>> >> >> But I don't really see how that can happen. The code is really
>> >> >> straightforward and everything happens under j_list_lock... Strange.
>> >> > BTW: Is the system SMP?
>> >> No, it is UP system.
>> > Even stranger. And do you have CONFIG_PREEMPT set?
>> >
>> >> The bug exists even in 2.6.29, I posted it with a new topic.
>> > OK, I've sort-of expected this.
>>
>> CONFIG_PREEMPT_RCU=y
>> CONFIG_PREEMPT_RCU_TRACE=y
>> # CONFIG_PREEMPT_NONE is not set
>> # CONFIG_PREEMPT_VOLUNTARY is not set
>> CONFIG_PREEMPT=y
>> CONFIG_DEBUG_PREEMPT=y
>> # CONFIG_PREEMPT_TRACER is not set
>>
>> config is attached.
> Thanks for the data. I still don't see how the wakeup can get lost. The
> process even cannot be preempted when we are in the section protected by
> j_list_lock... Can you send me a disassembly of functions
> jbd2_journal_release_jbd_inode() and journal_submit_data_buffers() so that
> I can see whether the compiler has not reordered something unexpectedly?
void jbd2_journal_release_jbd_inode(journal_t *journal,
struct jbd2_inode *jinode)
{
6d8: 9d e3 bf 00 save %sp, -256, %sp
6dc: 11 00 00 00 sethi %hi(0), %o0
6e0: 40 00 00 00 call 6e0 <jbd2_journal_release_jbd_inode+0x8>
6e4: 90 12 20 00 mov %o0, %o0 ! 0 <jbd2_history_skip_empty>
int writeout = 0;
if (!journal)
6e8: 02 c6 00 30 brz,pn %i0, 7a8
<jbd2_journal_release_jbd_inode+0xd0>
6ec: 03 00 00 00 sethi %hi(0), %g1
return;
restart:
spin_lock(&journal->j_list_lock);
6f0: b0 06 25 70 add %i0, 0x570, %i0
/* Is commit writing out inode - we have to wait */
if (jinode->i_flags & JI_COMMIT_RUNNING) {
wait_queue_head_t *wq;
DEFINE_WAIT_BIT(wait, &jinode->i_flags, __JI_COMMIT_RUNNING);
6f4: aa 10 60 00 mov %g1, %l5
6f8: a2 06 60 28 add %i1, 0x28, %l1
6fc: a8 07 a7 b7 add %fp, 0x7b7, %l4
700: a6 07 a7 df add %fp, 0x7df, %l3
wq = bit_waitqueue(&jinode->i_flags, __JI_COMMIT_RUNNING);
prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
704: a4 07 a7 c7 add %fp, 0x7c7, %l2
int writeout = 0;
if (!journal)
return;
restart:
spin_lock(&journal->j_list_lock);
708: 40 00 00 00 call 708 <jbd2_journal_release_jbd_inode+0x30>
70c: 90 10 00 18 mov %i0, %o0
/* Is commit writing out inode - we have to wait */
if (jinode->i_flags & JI_COMMIT_RUNNING) {
710: c2 06 60 28 ld [ %i1 + 0x28 ], %g1
wait_queue_head_t *wq;
DEFINE_WAIT_BIT(wait, &jinode->i_flags, __JI_COMMIT_RUNNING);
714: 94 10 20 38 mov 0x38, %o2
718: 90 10 00 14 mov %l4, %o0
71c: 92 10 20 00 clr %o1
if (!journal)
return;
restart:
spin_lock(&journal->j_list_lock);
/* Is commit writing out inode - we have to wait */
if (jinode->i_flags & JI_COMMIT_RUNNING) {
720: 80 88 60 01 btst 1, %g1
724: 02 60 00 19 be,pn %xcc, 788
<jbd2_journal_release_jbd_inode+0xb0>
728: a0 10 00 04 mov %g4, %l0
wait_queue_head_t *wq;
DEFINE_WAIT_BIT(wait, &jinode->i_flags, __JI_COMMIT_RUNNING);
72c: 40 00 00 00 call 72c <jbd2_journal_release_jbd_inode+0x54>
730: 01 00 00 00 nop
wq = bit_waitqueue(&jinode->i_flags, __JI_COMMIT_RUNNING);
734: 90 10 00 11 mov %l1, %o0
738: 92 10 20 00 clr %o1
restart:
spin_lock(&journal->j_list_lock);
/* Is commit writing out inode - we have to wait */
if (jinode->i_flags & JI_COMMIT_RUNNING) {
wait_queue_head_t *wq;
DEFINE_WAIT_BIT(wait, &jinode->i_flags, __JI_COMMIT_RUNNING);
73c: e0 77 a7 cf stx %l0, [ %fp + 0x7cf ]
740: e2 77 a7 b7 stx %l1, [ %fp + 0x7b7 ]
744: ea 77 a7 d7 stx %l5, [ %fp + 0x7d7 ]
748: e6 77 a7 df stx %l3, [ %fp + 0x7df ]
wq = bit_waitqueue(&jinode->i_flags, __JI_COMMIT_RUNNING);
74c: 40 00 00 00 call 74c <jbd2_journal_release_jbd_inode+0x74>
750: e6 77 a7 e7 stx %l3, [ %fp + 0x7e7 ]
prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
754: 92 10 00 12 mov %l2, %o1
758: 94 10 20 02 mov 2, %o2
75c: 40 00 00 00 call 75c <jbd2_journal_release_jbd_inode+0x84>
760: a0 10 00 08 mov %o0, %l0
spin_unlock(&journal->j_list_lock);
764: 40 00 00 00 call 764 <jbd2_journal_release_jbd_inode+0x8c>
768: 90 10 00 18 mov %i0, %o0
schedule();
76c: 40 00 00 00 call 76c <jbd2_journal_release_jbd_inode+0x94>
770: 01 00 00 00 nop
finish_wait(wq, &wait.wait);
774: 90 10 00 10 mov %l0, %o0
778: 40 00 00 00 call 778 <jbd2_journal_release_jbd_inode+0xa0>
77c: 92 10 00 12 mov %l2, %o1
780: 10 6f ff e2 b %xcc, 708
<jbd2_journal_release_jbd_inode+0x30>
784: 01 00 00 00 nop
}
/* Do we need to wait for data writeback? */
if (journal->j_committing_transaction == jinode->i_transaction)
writeout = 1;
if (jinode->i_transaction) {
788: c2 5e 40 00 ldx [ %i1 ], %g1
78c: 02 c0 40 05 brz,pn %g1, 7a0
<jbd2_journal_release_jbd_inode+0xc8>
790: 01 00 00 00 nop
list_del(&jinode->i_list);
794: 40 00 00 00 call 794 <jbd2_journal_release_jbd_inode+0xbc>
798: 90 06 60 10 add %i1, 0x10, %o0
jinode->i_transaction = NULL;
79c: c0 76 40 00 clrx [ %i1 ]
}
spin_unlock(&journal->j_list_lock);
7a0: 40 00 00 00 call 7a0 <jbd2_journal_release_jbd_inode+0xc8>
7a4: 90 10 00 18 mov %i0, %o0
7a8: 81 cf e0 08 rett %i7 + 8
7ac: 01 00 00 00 nop
====
By default gcc inlines journal_submit_data_buffers()
Here is -fno-inline version. Default version is in attach.
====
static int journal_submit_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
9c: 9d e3 bf 40 save %sp, -192, %sp
a0: 11 00 00 00 sethi %hi(0), %o0
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
a4: a4 06 25 70 add %i0, 0x570, %l2
* our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
* operate on from being released while we write out pages.
*/
static int journal_submit_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
a8: 90 12 20 00 mov %o0, %o0
ac: 40 00 00 00 call ac <journal_submit_data_buffers+0x10>
b0: b0 10 20 00 clr %i0
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
b4: a6 06 60 60 add %i1, 0x60, %l3
{
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
b8: 40 00 00 00 call b8 <journal_submit_data_buffers+0x1c>
bc: 90 10 00 12 mov %l2, %o0
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
c0: 10 68 00 1d b %xcc, 134 <journal_submit_data_buffers+0x98>
c4: c2 5e 60 60 ldx [ %i1 + 0x60 ], %g1
mapping = jinode->i_vfs_inode->i_mapping;
jinode->i_flags |= JI_COMMIT_RUNNING;
spin_unlock(&journal->j_list_lock);
c8: 90 10 00 12 mov %l2, %o0
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
mapping = jinode->i_vfs_inode->i_mapping;
jinode->i_flags |= JI_COMMIT_RUNNING;
cc: c2 04 60 28 ld [ %l1 + 0x28 ], %g1
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
mapping = jinode->i_vfs_inode->i_mapping;
d0: e0 58 a1 e0 ldx [ %g2 + 0x1e0 ], %l0
jinode->i_flags |= JI_COMMIT_RUNNING;
d4: 82 10 60 01 or %g1, 1, %g1
spin_unlock(&journal->j_list_lock);
d8: 40 00 00 00 call d8 <journal_submit_data_buffers+0x3c>
dc: c2 24 60 28 st %g1, [ %l1 + 0x28 ]
* submit the inode data buffers. We use writepage
* instead of writepages. Because writepages can do
* block allocation with delalloc. We need to write
* only allocated blocks here.
*/
err = journal_submit_inode_data_buffers(mapping);
e0: 7f ff ff d3 call 2c <journal_submit_inode_data_buffers>
e4: 90 10 00 10 mov %l0, %o0
if (!ret)
e8: 80 a6 20 00 cmp %i0, 0
ec: b1 64 40 08 move %icc, %o0, %i0
ret = err;
spin_lock(&journal->j_list_lock);
f0: 40 00 00 00 call f0 <journal_submit_data_buffers+0x54>
f4: 90 10 00 12 mov %l2, %o0
J_ASSERT(jinode->i_transaction == commit_transaction);
f8: c2 5c 40 00 ldx [ %l1 ], %g1
fc: 80 a0 40 19 cmp %g1, %i1
100: 22 68 00 07 be,a %xcc, 11c
<journal_submit_data_buffers+0x80>
104: c2 04 60 28 ld [ %l1 + 0x28 ], %g1
108: 11 00 00 00 sethi %hi(0), %o0
10c: 92 10 21 04 mov 0x104, %o1
110: 40 00 00 00 call 110 <journal_submit_data_buffers+0x74>
114: 90 12 20 00 mov %o0, %o0
118: 91 d0 20 05 ta 5
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
11c: 90 04 60 28 add %l1, 0x28, %o0
120: 92 10 20 00 clr %o1
err = journal_submit_inode_data_buffers(mapping);
if (!ret)
ret = err;
spin_lock(&journal->j_list_lock);
J_ASSERT(jinode->i_transaction == commit_transaction);
jinode->i_flags &= ~JI_COMMIT_RUNNING;
124: 82 08 7f fe and %g1, -2, %g1
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
128: 40 00 00 00 call 128 <journal_submit_data_buffers+0x8c>
12c: c2 24 60 28 st %g1, [ %l1 + 0x28 ]
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
130: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
134: a2 00 7f f0 add %g1, -16, %l1
* prefetches into the prefetch-cache which only is accessible
* by floating point operations in UltraSPARC-III and later.
* By contrast, "#one_write" prefetches into the L2 cache
* in shared state.
*/
__asm__ __volatile__("prefetch [%0], #one_write"
138: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
13c: c7 68 40 00 prefetch [ %g1 ], #one_write
140: 82 04 60 10 add %l1, 0x10, %g1
144: 80 a4 c0 01 cmp %l3, %g1
148: 32 6f ff e0 bne,a %xcc, c8
<journal_submit_data_buffers+0x2c>
14c: c4 5c 60 20 ldx [ %l1 + 0x20 ], %g2
spin_lock(&journal->j_list_lock);
J_ASSERT(jinode->i_transaction == commit_transaction);
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
}
spin_unlock(&journal->j_list_lock);
150: 90 10 00 12 mov %l2, %o0
154: 40 00 00 00 call 154 <journal_submit_data_buffers+0xb8>
158: b1 3e 20 00 sra %i0, 0, %i0
return ret;
}
15c: 81 cf e0 08 rett %i7 + 8
160: 01 00 00 00 nop
[-- Attachment #2: jbd2-commit-noinline.out --]
[-- Type: application/octet-stream, Size: 151910 bytes --]
fs/jbd2/commit.o: file format elf64-sparc
Disassembly of section .text:
0000000000000000 <write_tag_block>:
return checksum;
}
static void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
unsigned long long block)
{
0: 9d e3 bf 40 save %sp, -192, %sp
4: 11 00 00 00 sethi %hi(0), %o0
8: 40 00 00 00 call 8 <write_tag_block+0x8>
c: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
tag->t_blocknr = cpu_to_be32(block & (u32)~0);
if (tag_bytes > JBD2_TAG_SIZE32)
10: 80 a6 20 08 cmp %i0, 8
14: 08 40 00 04 bleu,pn %icc, 24 <write_tag_block+0x24>
18: f4 26 40 00 st %i2, [ %i1 ]
tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
1c: 83 36 b0 20 srlx %i2, 0x20, %g1
20: c2 26 60 08 st %g1, [ %i1 + 8 ]
24: 81 cf e0 08 rett %i7 + 8
28: 01 00 00 00 nop
000000000000002c <journal_submit_inode_data_buffers>:
* We don't do block allocation here even for delalloc. We don't
* use writepages() because with dealyed allocation we may be doing
* block allocation in writepages().
*/
static int journal_submit_inode_data_buffers(struct address_space *mapping)
{
2c: 9d e3 bf 00 save %sp, -256, %sp
30: 11 00 00 00 sethi %hi(0), %o0
.sync_mode = WB_SYNC_ALL,
.nr_to_write = mapping->nrpages * 2,
.range_start = 0,
.range_end = i_size_read(mapping->host),
.for_writepages = 1,
};
34: a2 07 a7 af add %fp, 0x7af, %l1
* We don't do block allocation here even for delalloc. We don't
* use writepages() because with dealyed allocation we may be doing
* block allocation in writepages().
*/
static int journal_submit_inode_data_buffers(struct address_space *mapping)
{
38: 40 00 00 00 call 38 <journal_submit_inode_data_buffers+0xc>
3c: 90 12 20 00 mov %o0, %o0
preempt_disable();
i_size = inode->i_size;
preempt_enable();
return i_size;
#else
return inode->i_size;
40: c2 5e 00 00 ldx [ %i0 ], %g1
.sync_mode = WB_SYNC_ALL,
.nr_to_write = mapping->nrpages * 2,
.range_start = 0,
.range_end = i_size_read(mapping->host),
.for_writepages = 1,
};
44: 94 10 20 40 mov 0x40, %o2
48: 92 10 20 00 clr %o1
4c: 90 10 00 11 mov %l1, %o0
50: e0 5e 20 a8 ldx [ %i0 + 0xa8 ], %l0
54: 40 00 00 00 call 54 <journal_submit_inode_data_buffers+0x28>
58: e4 58 60 68 ldx [ %g1 + 0x68 ], %l2
5c: a1 2c 30 01 sllx %l0, 1, %l0
60: 82 10 20 01 mov 1, %g1
64: c4 5f a7 e7 ldx [ %fp + 0x7e7 ], %g2
ret = generic_writepages(mapping, &wbc);
68: 90 10 00 18 mov %i0, %o0
.sync_mode = WB_SYNC_ALL,
.nr_to_write = mapping->nrpages * 2,
.range_start = 0,
.range_end = i_size_read(mapping->host),
.for_writepages = 1,
};
6c: c2 27 a7 b7 st %g1, [ %fp + 0x7b7 ]
70: 82 10 20 01 mov 1, %g1
ret = generic_writepages(mapping, &wbc);
74: 92 10 00 11 mov %l1, %o1
.sync_mode = WB_SYNC_ALL,
.nr_to_write = mapping->nrpages * 2,
.range_start = 0,
.range_end = i_size_read(mapping->host),
.for_writepages = 1,
};
78: 83 28 70 3b sllx %g1, 0x3b, %g1
7c: e0 77 a7 c7 stx %l0, [ %fp + 0x7c7 ]
80: 84 10 80 01 or %g2, %g1, %g2
84: e4 77 a7 df stx %l2, [ %fp + 0x7df ]
ret = generic_writepages(mapping, &wbc);
88: 40 00 00 00 call 88 <journal_submit_inode_data_buffers+0x5c>
8c: c4 77 a7 e7 stx %g2, [ %fp + 0x7e7 ]
return ret;
}
90: b1 3a 20 00 sra %o0, 0, %i0
94: 81 cf e0 08 rett %i7 + 8
98: 01 00 00 00 nop
000000000000009c <journal_submit_data_buffers>:
* our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
* operate on from being released while we write out pages.
*/
static int journal_submit_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
9c: 9d e3 bf 40 save %sp, -192, %sp
a0: 11 00 00 00 sethi %hi(0), %o0
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
a4: a4 06 25 70 add %i0, 0x570, %l2
* our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently
* operate on from being released while we write out pages.
*/
static int journal_submit_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
a8: 90 12 20 00 mov %o0, %o0
ac: 40 00 00 00 call ac <journal_submit_data_buffers+0x10>
b0: b0 10 20 00 clr %i0
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
b4: a6 06 60 60 add %i1, 0x60, %l3
{
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
b8: 40 00 00 00 call b8 <journal_submit_data_buffers+0x1c>
bc: 90 10 00 12 mov %l2, %o0
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
c0: 10 68 00 1d b %xcc, 134 <journal_submit_data_buffers+0x98>
c4: c2 5e 60 60 ldx [ %i1 + 0x60 ], %g1
mapping = jinode->i_vfs_inode->i_mapping;
jinode->i_flags |= JI_COMMIT_RUNNING;
spin_unlock(&journal->j_list_lock);
c8: 90 10 00 12 mov %l2, %o0
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
mapping = jinode->i_vfs_inode->i_mapping;
jinode->i_flags |= JI_COMMIT_RUNNING;
cc: c2 04 60 28 ld [ %l1 + 0x28 ], %g1
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
mapping = jinode->i_vfs_inode->i_mapping;
d0: e0 58 a1 e0 ldx [ %g2 + 0x1e0 ], %l0
jinode->i_flags |= JI_COMMIT_RUNNING;
d4: 82 10 60 01 or %g1, 1, %g1
spin_unlock(&journal->j_list_lock);
d8: 40 00 00 00 call d8 <journal_submit_data_buffers+0x3c>
dc: c2 24 60 28 st %g1, [ %l1 + 0x28 ]
* submit the inode data buffers. We use writepage
* instead of writepages. Because writepages can do
* block allocation with delalloc. We need to write
* only allocated blocks here.
*/
err = journal_submit_inode_data_buffers(mapping);
e0: 7f ff ff d3 call 2c <journal_submit_inode_data_buffers>
e4: 90 10 00 10 mov %l0, %o0
if (!ret)
e8: 80 a6 20 00 cmp %i0, 0
ec: b1 64 40 08 move %icc, %o0, %i0
ret = err;
spin_lock(&journal->j_list_lock);
f0: 40 00 00 00 call f0 <journal_submit_data_buffers+0x54>
f4: 90 10 00 12 mov %l2, %o0
J_ASSERT(jinode->i_transaction == commit_transaction);
f8: c2 5c 40 00 ldx [ %l1 ], %g1
fc: 80 a0 40 19 cmp %g1, %i1
100: 22 68 00 07 be,a %xcc, 11c <journal_submit_data_buffers+0x80>
104: c2 04 60 28 ld [ %l1 + 0x28 ], %g1
108: 11 00 00 00 sethi %hi(0), %o0
10c: 92 10 21 04 mov 0x104, %o1
110: 40 00 00 00 call 110 <journal_submit_data_buffers+0x74>
114: 90 12 20 00 mov %o0, %o0
118: 91 d0 20 05 ta 5
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
11c: 90 04 60 28 add %l1, 0x28, %o0
120: 92 10 20 00 clr %o1
err = journal_submit_inode_data_buffers(mapping);
if (!ret)
ret = err;
spin_lock(&journal->j_list_lock);
J_ASSERT(jinode->i_transaction == commit_transaction);
jinode->i_flags &= ~JI_COMMIT_RUNNING;
124: 82 08 7f fe and %g1, -2, %g1
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
128: 40 00 00 00 call 128 <journal_submit_data_buffers+0x8c>
12c: c2 24 60 28 st %g1, [ %l1 + 0x28 ]
struct jbd2_inode *jinode;
int err, ret = 0;
struct address_space *mapping;
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
130: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
134: a2 00 7f f0 add %g1, -16, %l1
* prefetches into the prefetch-cache which only is accessible
* by floating point operations in UltraSPARC-III and later.
* By contrast, "#one_write" prefetches into the L2 cache
* in shared state.
*/
__asm__ __volatile__("prefetch [%0], #one_write"
138: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
13c: c7 68 40 00 prefetch [ %g1 ], #one_write
140: 82 04 60 10 add %l1, 0x10, %g1
144: 80 a4 c0 01 cmp %l3, %g1
148: 32 6f ff e0 bne,a %xcc, c8 <journal_submit_data_buffers+0x2c>
14c: c4 5c 60 20 ldx [ %l1 + 0x20 ], %g2
spin_lock(&journal->j_list_lock);
J_ASSERT(jinode->i_transaction == commit_transaction);
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
}
spin_unlock(&journal->j_list_lock);
150: 90 10 00 12 mov %l2, %o0
154: 40 00 00 00 call 154 <journal_submit_data_buffers+0xb8>
158: b1 3e 20 00 sra %i0, 0, %i0
return ret;
}
15c: 81 cf e0 08 rett %i7 + 8
160: 01 00 00 00 nop
0000000000000164 <jbd2_checksum_data>:
return ret;
}
static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
{
164: 9d e3 bf 40 save %sp, -192, %sp
168: 11 00 00 00 sethi %hi(0), %o0
16c: 40 00 00 00 call 16c <jbd2_checksum_data+0x8>
170: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
* no other way to make the pagefault handlers do this. So we do
* disable preemption but we don't necessarily care about that.
*/
static inline void pagefault_disable(void)
{
inc_preempt_count();
174: 90 10 20 01 mov 1, %o0
178: 40 00 00 00 call 178 <jbd2_checksum_data+0x14>
17c: e0 5e 60 10 ldx [ %i1 + 0x10 ], %l0
struct page *page = bh->b_page;
char *addr;
__u32 checksum;
addr = kmap_atomic(page, KM_USER0);
checksum = crc32_be(crc32_sum,
180: 82 10 3f ff mov -1, %g1
184: d2 5e 60 28 ldx [ %i1 + 0x28 ], %o1
188: 90 10 00 18 mov %i0, %o0
18c: c4 5c 20 38 ldx [ %l0 + 0x38 ], %g2
190: 83 30 70 33 srlx %g1, 0x33, %g1
194: 92 0a 40 01 and %o1, %g1, %o1
198: d4 5e 60 20 ldx [ %i1 + 0x20 ], %o2
19c: 40 00 00 00 call 19c <jbd2_checksum_data+0x38>
1a0: 92 00 80 09 add %g2, %o1, %o1
1a4: b0 10 00 08 mov %o0, %i0
/*
* make sure to issue those last loads/stores before enabling
* the pagefault handler again.
*/
barrier();
dec_preempt_count();
1a8: 40 00 00 00 call 1a8 <jbd2_checksum_data+0x44>
1ac: 90 10 20 01 mov 1, %o0
* @nr: bit number to test
* @addr: Address to start counting from
*/
static inline int test_bit(int nr, const volatile unsigned long *addr)
{
return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
1b0: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
/*
* make sure we do..
*/
barrier();
preempt_check_resched();
1b4: 82 08 60 08 and %g1, 8, %g1
1b8: 02 c8 40 04 brz %g1, 1c8 <jbd2_checksum_data+0x64>
1bc: 01 00 00 00 nop
1c0: 40 00 00 00 call 1c0 <jbd2_checksum_data+0x5c>
1c4: 01 00 00 00 nop
(void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
kunmap_atomic(addr, KM_USER0);
return checksum;
}
1c8: 81 cf e0 08 rett %i7 + 8
1cc: 91 32 20 00 srl %o0, 0, %o0
00000000000001d0 <journal_finish_inode_data_buffers>:
* transaction if needed.
*
*/
static int journal_finish_inode_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
1d0: 9d e3 bf 40 save %sp, -192, %sp
1d4: 11 00 00 00 sethi %hi(0), %o0
struct jbd2_inode *jinode, *next_i;
int err, ret = 0;
/* For locking, see the comment in journal_submit_data_buffers() */
spin_lock(&journal->j_list_lock);
1d8: a4 06 25 70 add %i0, 0x570, %l2
* transaction if needed.
*
*/
static int journal_finish_inode_data_buffers(journal_t *journal,
transaction_t *commit_transaction)
{
1dc: 90 12 20 00 mov %o0, %o0
1e0: 40 00 00 00 call 1e0 <journal_finish_inode_data_buffers+0x10>
1e4: b0 10 20 00 clr %i0
struct jbd2_inode *jinode, *next_i;
int err, ret = 0;
/* For locking, see the comment in journal_submit_data_buffers() */
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
1e8: a6 06 60 60 add %i1, 0x60, %l3
{
struct jbd2_inode *jinode, *next_i;
int err, ret = 0;
/* For locking, see the comment in journal_submit_data_buffers() */
spin_lock(&journal->j_list_lock);
1ec: 40 00 00 00 call 1ec <journal_finish_inode_data_buffers+0x1c>
1f0: 90 10 00 12 mov %l2, %o0
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
1f4: 10 68 00 1c b %xcc, 264 <journal_finish_inode_data_buffers+0x94>
1f8: c2 5e 60 60 ldx [ %i1 + 0x60 ], %g1
jinode->i_flags |= JI_COMMIT_RUNNING;
1fc: c2 04 20 28 ld [ %l0 + 0x28 ], %g1
200: 82 10 60 01 or %g1, 1, %g1
spin_unlock(&journal->j_list_lock);
204: 40 00 00 00 call 204 <journal_finish_inode_data_buffers+0x34>
208: c2 24 20 28 st %g1, [ %l0 + 0x28 ]
err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping);
20c: c2 5c 20 20 ldx [ %l0 + 0x20 ], %g1
210: 40 00 00 00 call 210 <journal_finish_inode_data_buffers+0x40>
214: d0 58 61 e0 ldx [ %g1 + 0x1e0 ], %o0
if (err) {
218: 80 a2 20 00 cmp %o0, 0
21c: 02 48 00 09 be %icc, 240 <journal_finish_inode_data_buffers+0x70>
220: a2 10 00 08 mov %o0, %l1
/*
* Because AS_EIO is cleared by
* wait_on_page_writeback_range(), set it again so
* that user process can get -EIO from fsync().
*/
set_bit(AS_EIO,
224: c2 5c 20 20 ldx [ %l0 + 0x20 ], %g1
228: 90 10 20 15 mov 0x15, %o0
22c: d2 58 61 e0 ldx [ %g1 + 0x1e0 ], %o1
230: 40 00 00 00 call 230 <journal_finish_inode_data_buffers+0x60>
234: 92 02 60 c0 add %o1, 0xc0, %o1
&jinode->i_vfs_inode->i_mapping->flags);
if (!ret)
238: 80 a6 20 00 cmp %i0, 0
23c: b1 64 40 11 move %icc, %l1, %i0
ret = err;
}
spin_lock(&journal->j_list_lock);
240: 40 00 00 00 call 240 <journal_finish_inode_data_buffers+0x70>
244: 90 10 00 12 mov %l2, %o0
jinode->i_flags &= ~JI_COMMIT_RUNNING;
248: c2 04 20 28 ld [ %l0 + 0x28 ], %g1
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
24c: 90 04 20 28 add %l0, 0x28, %o0
250: 92 10 20 00 clr %o1
if (!ret)
ret = err;
}
spin_lock(&journal->j_list_lock);
jinode->i_flags &= ~JI_COMMIT_RUNNING;
254: 82 08 7f fe and %g1, -2, %g1
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
258: 40 00 00 00 call 258 <journal_finish_inode_data_buffers+0x88>
25c: c2 24 20 28 st %g1, [ %l0 + 0x28 ]
struct jbd2_inode *jinode, *next_i;
int err, ret = 0;
/* For locking, see the comment in journal_submit_data_buffers() */
spin_lock(&journal->j_list_lock);
list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) {
260: c2 5c 20 10 ldx [ %l0 + 0x10 ], %g1
264: a0 00 7f f0 add %g1, -16, %l0
268: c2 5c 20 10 ldx [ %l0 + 0x10 ], %g1
26c: c7 68 40 00 prefetch [ %g1 ], #one_write
270: 82 04 20 10 add %l0, 0x10, %g1
274: 80 a4 c0 01 cmp %l3, %g1
278: 12 6f ff e1 bne %xcc, 1fc <journal_finish_inode_data_buffers+0x2c>
27c: 90 10 00 12 mov %l2, %o0
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
}
/* Now refile inode to proper lists */
list_for_each_entry_safe(jinode, next_i,
280: c2 5e 60 60 ldx [ %i1 + 0x60 ], %g1
284: b2 00 7f f0 add %g1, -16, %i1
288: 10 68 00 11 b %xcc, 2cc <journal_finish_inode_data_buffers+0xfc>
28c: c2 5e 60 10 ldx [ %i1 + 0x10 ], %g1
&commit_transaction->t_inode_list, i_list) {
list_del(&jinode->i_list);
290: 40 00 00 00 call 290 <journal_finish_inode_data_buffers+0xc0>
294: 01 00 00 00 nop
if (jinode->i_next_transaction) {
298: c2 5e 60 08 ldx [ %i1 + 8 ], %g1
* Insert a new entry after the specified head.
* This is good for implementing stacks.
*/
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
29c: 90 10 00 10 mov %l0, %o0
2a0: 02 c0 40 08 brz,pn %g1, 2c0 <journal_finish_inode_data_buffers+0xf0>
2a4: 92 00 60 60 add %g1, 0x60, %o1
jinode->i_transaction = jinode->i_next_transaction;
jinode->i_next_transaction = NULL;
2a8: c0 76 60 08 clrx [ %i1 + 8 ]
/* Now refile inode to proper lists */
list_for_each_entry_safe(jinode, next_i,
&commit_transaction->t_inode_list, i_list) {
list_del(&jinode->i_list);
if (jinode->i_next_transaction) {
jinode->i_transaction = jinode->i_next_transaction;
2ac: c2 76 40 00 stx %g1, [ %i1 ]
2b0: 40 00 00 00 call 2b0 <journal_finish_inode_data_buffers+0xe0>
2b4: d4 58 60 60 ldx [ %g1 + 0x60 ], %o2
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
}
/* Now refile inode to proper lists */
list_for_each_entry_safe(jinode, next_i,
2b8: 10 68 00 04 b %xcc, 2c8 <journal_finish_inode_data_buffers+0xf8>
2bc: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
jinode->i_transaction = jinode->i_next_transaction;
jinode->i_next_transaction = NULL;
list_add(&jinode->i_list,
&jinode->i_transaction->t_inode_list);
} else {
jinode->i_transaction = NULL;
2c0: c0 76 40 00 clrx [ %i1 ]
jinode->i_flags &= ~JI_COMMIT_RUNNING;
wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING);
}
/* Now refile inode to proper lists */
list_for_each_entry_safe(jinode, next_i,
2c4: c2 5c 60 10 ldx [ %l1 + 0x10 ], %g1
2c8: b2 10 00 11 mov %l1, %i1
2cc: a0 06 60 10 add %i1, 0x10, %l0
2d0: a2 00 7f f0 add %g1, -16, %l1
2d4: 80 a4 00 13 cmp %l0, %l3
2d8: 12 6f ff ee bne %xcc, 290 <journal_finish_inode_data_buffers+0xc0>
2dc: 90 10 00 10 mov %l0, %o0
&jinode->i_transaction->t_inode_list);
} else {
jinode->i_transaction = NULL;
}
}
spin_unlock(&journal->j_list_lock);
2e0: 90 10 00 12 mov %l2, %o0
2e4: 40 00 00 00 call 2e4 <journal_finish_inode_data_buffers+0x114>
2e8: b1 3e 20 00 sra %i0, 0, %i0
return ret;
}
2ec: 81 cf e0 08 rett %i7 + 8
2f0: 01 00 00 00 nop
00000000000002f4 <journal_submit_commit_record>:
*/
static int journal_submit_commit_record(journal_t *journal,
transaction_t *commit_transaction,
struct buffer_head **cbh,
__u32 crc32_sum)
{
2f4: 9d e3 bf 20 save %sp, -224, %sp
2f8: 11 00 00 00 sethi %hi(0), %o0
2fc: a4 10 00 18 mov %i0, %l2
300: 40 00 00 00 call 300 <journal_submit_commit_record+0xc>
304: 90 12 20 00 mov %o0, %o0
struct journal_head *descriptor;
struct commit_header *tmp;
struct buffer_head *bh;
int ret;
int barrier_done = 0;
struct timespec now = current_kernel_time();
308: 40 00 00 00 call 308 <journal_submit_commit_record+0x14>
30c: 01 00 00 00 nop
if (is_journal_aborted(journal))
310: c2 5e 00 00 ldx [ %i0 ], %g1
314: b0 10 20 00 clr %i0
struct journal_head *descriptor;
struct commit_header *tmp;
struct buffer_head *bh;
int ret;
int barrier_done = 0;
struct timespec now = current_kernel_time();
318: d0 77 a7 df stx %o0, [ %fp + 0x7df ]
31c: d2 77 a7 e7 stx %o1, [ %fp + 0x7e7 ]
if (is_journal_aborted(journal))
320: 80 88 60 02 btst 2, %g1
struct journal_head *descriptor;
struct commit_header *tmp;
struct buffer_head *bh;
int ret;
int barrier_done = 0;
struct timespec now = current_kernel_time();
324: d0 77 a7 cf stx %o0, [ %fp + 0x7cf ]
if (is_journal_aborted(journal))
328: 12 68 00 78 bne %xcc, 508 <journal_submit_commit_record+0x214>
32c: d2 77 a7 d7 stx %o1, [ %fp + 0x7d7 ]
return 0;
descriptor = jbd2_journal_get_descriptor_buffer(journal);
330: 90 10 00 12 mov %l2, %o0
334: 40 00 00 00 call 334 <journal_submit_commit_record+0x40>
338: b0 10 20 01 mov 1, %i0
if (!descriptor)
33c: 02 c2 00 73 brz,pn %o0, 508 <journal_submit_commit_record+0x214>
340: 03 30 0e ce sethi %hi(0xc03b3800), %g1
TAS_BUFFER_FNS(RevokeValid, revokevalid)
BUFFER_FNS(Freed, freed)
static inline struct buffer_head *jh2bh(struct journal_head *jh)
{
return jh->b_bh;
344: e2 5a 00 00 ldx [ %o0 ], %l1
return 1;
bh = jh2bh(descriptor);
tmp = (struct commit_header *)bh->b_data;
tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
348: 82 10 61 98 or %g1, 0x198, %g1
if (!descriptor)
return 1;
bh = jh2bh(descriptor);
tmp = (struct commit_header *)bh->b_data;
34c: c4 5c 60 28 ldx [ %l1 + 0x28 ], %g2
tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
350: c2 20 80 00 st %g1, [ %g2 ]
tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK);
354: 82 10 20 02 mov 2, %g1
358: c2 20 a0 04 st %g1, [ %g2 + 4 ]
tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid);
35c: c2 06 60 08 ld [ %i1 + 8 ], %g1
360: c2 20 a0 08 st %g1, [ %g2 + 8 ]
tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
364: c2 5f a7 df ldx [ %fp + 0x7df ], %g1
368: c2 70 a0 30 stx %g1, [ %g2 + 0x30 ]
tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
36c: c2 5f a7 e7 ldx [ %fp + 0x7e7 ], %g1
370: c2 20 a0 38 st %g1, [ %g2 + 0x38 ]
if (JBD2_HAS_COMPAT_FEATURE(journal,
374: c2 04 a0 20 ld [ %l2 + 0x20 ], %g1
378: 80 a0 60 01 cmp %g1, 1
37c: 04 40 00 0c ble,pn %icc, 3ac <journal_submit_commit_record+0xb8>
380: 11 00 00 00 sethi %hi(0), %o0
384: c2 5c a0 18 ldx [ %l2 + 0x18 ], %g1
388: c2 00 60 24 ld [ %g1 + 0x24 ], %g1
38c: 80 88 60 01 btst 1, %g1
390: 02 68 00 07 be %xcc, 3ac <journal_submit_commit_record+0xb8>
394: 01 00 00 00 nop
JBD2_FEATURE_COMPAT_CHECKSUM)) {
tmp->h_chksum_type = JBD2_CRC32_CHKSUM;
398: 82 10 20 01 mov 1, %g1 ! 1 <write_tag_block+0x1>
tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE;
tmp->h_chksum[0] = cpu_to_be32(crc32_sum);
39c: f6 20 a0 10 st %i3, [ %g2 + 0x10 ]
tmp->h_commit_sec = cpu_to_be64(now.tv_sec);
tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec);
if (JBD2_HAS_COMPAT_FEATURE(journal,
JBD2_FEATURE_COMPAT_CHECKSUM)) {
tmp->h_chksum_type = JBD2_CRC32_CHKSUM;
3a0: c2 28 a0 0c stb %g1, [ %g2 + 0xc ]
tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE;
3a4: 82 10 20 04 mov 4, %g1
3a8: c2 28 a0 0d stb %g1, [ %g2 + 0xd ]
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
3ac: 92 10 21 4b mov 0x14b, %o1
3b0: 40 00 00 00 call 3b0 <journal_submit_commit_record+0xbc>
3b4: 90 12 20 00 mov %o0, %o0
__wait_on_buffer(bh);
}
static inline int trylock_buffer(struct buffer_head *bh)
{
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
3b8: 90 10 20 02 mov 2, %o0
3bc: 40 00 00 00 call 3bc <journal_submit_commit_record+0xc8>
3c0: 92 10 00 11 mov %l1, %o1
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
if (!trylock_buffer(bh))
3c4: 80 a2 20 00 cmp %o0, 0
3c8: 02 48 00 05 be %icc, 3dc <journal_submit_commit_record+0xe8>
3cc: 90 10 20 01 mov 1, %o0
__lock_buffer(bh);
3d0: 40 00 00 00 call 3d0 <journal_submit_commit_record+0xdc>
3d4: 90 10 00 11 mov %l1, %o0
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
BUFFER_FNS(Dirty, dirty)
3d8: 90 10 20 01 mov 1, %o0
3dc: 40 00 00 00 call 3dc <journal_submit_commit_record+0xe8>
3e0: 92 10 00 11 mov %l1, %o1
/*
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
3e4: 90 10 20 00 clr %o0
3e8: 40 00 00 00 call 3e8 <journal_submit_commit_record+0xf4>
3ec: 92 10 00 11 mov %l1, %o1
JBUFFER_TRACE(descriptor, "submit commit block");
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
3f0: 03 00 00 00 sethi %hi(0), %g1
3f4: 82 10 60 00 mov %g1, %g1 ! 0 <write_tag_block>
3f8: c2 74 60 38 stx %g1, [ %l1 + 0x38 ]
if (journal->j_flags & JBD2_BARRIER &&
3fc: c2 5c 80 00 ldx [ %l2 ], %g1
400: 82 08 60 20 and %g1, 0x20, %g1
404: 02 c8 40 0f brz %g1, 440 <journal_submit_commit_record+0x14c>
408: a0 10 20 00 clr %l0
40c: c2 04 a0 20 ld [ %l2 + 0x20 ], %g1
410: 80 a0 60 01 cmp %g1, 1
414: 04 40 00 08 ble,pn %icc, 434 <journal_submit_commit_record+0x140>
418: 90 10 20 0c mov 0xc, %o0
41c: c2 5c a0 18 ldx [ %l2 + 0x18 ], %g1
420: c2 00 60 28 ld [ %g1 + 0x28 ], %g1
424: 80 88 60 04 btst 4, %g1
428: 12 68 00 07 bne %xcc, 444 <journal_submit_commit_record+0x150>
42c: 90 10 20 19 mov 0x19, %o0
BUFFER_FNS(Async_Read, async_read)
BUFFER_FNS(Async_Write, async_write)
BUFFER_FNS(Delay, delay)
BUFFER_FNS(Boundary, boundary)
BUFFER_FNS(Write_EIO, write_io_error)
BUFFER_FNS(Ordered, ordered)
430: 90 10 20 0c mov 0xc, %o0
434: 40 00 00 00 call 434 <journal_submit_commit_record+0x140>
438: 92 10 00 11 mov %l1, %o1
43c: a0 10 20 01 mov 1, %l0
!JBD2_HAS_INCOMPAT_FEATURE(journal,
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
set_buffer_ordered(bh);
barrier_done = 1;
}
ret = submit_bh(WRITE_SYNC, bh);
440: 90 10 20 19 mov 0x19, %o0
444: 40 00 00 00 call 444 <journal_submit_commit_record+0x150>
448: 92 10 00 11 mov %l1, %o1
if (barrier_done)
44c: 80 a4 20 00 cmp %l0, 0
450: 02 48 00 05 be %icc, 464 <journal_submit_commit_record+0x170>
454: b0 10 00 08 mov %o0, %i0
458: 90 10 20 0c mov 0xc, %o0
45c: 40 00 00 00 call 45c <journal_submit_commit_record+0x168>
460: 92 10 00 11 mov %l1, %o1
/* is it possible for another commit to fail at roughly
* the same time as this one? If so, we don't want to
* trust the barrier flag in the super, but instead want
* to remember if we sent a barrier request
*/
if (ret == -EOPNOTSUPP && barrier_done) {
464: 82 1e 3f d3 xor %i0, -45, %g1
468: 80 a0 00 01 cmp %g0, %g1
46c: 82 60 3f ff subc %g0, -1, %g1
470: 80 88 40 10 btst %g1, %l0
474: 22 48 00 25 be,a %icc, 508 <journal_submit_commit_record+0x214>
478: e2 76 80 00 stx %l1, [ %i2 ]
printk(KERN_WARNING
47c: 11 00 00 00 sethi %hi(0), %o0
480: 92 04 a5 28 add %l2, 0x528, %o1
484: 90 12 20 00 mov %o0, %o0
488: 40 00 00 00 call 488 <journal_submit_commit_record+0x194>
48c: a0 04 a0 28 add %l2, 0x28, %l0
"JBD: barrier-based sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
490: 40 00 00 00 call 490 <journal_submit_commit_record+0x19c>
494: 90 10 00 10 mov %l0, %o0
journal->j_flags &= ~JBD2_BARRIER;
498: c2 5c 80 00 ldx [ %l2 ], %g1
spin_unlock(&journal->j_state_lock);
49c: 90 10 00 10 mov %l0, %o0
if (ret == -EOPNOTSUPP && barrier_done) {
printk(KERN_WARNING
"JBD: barrier-based sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
journal->j_flags &= ~JBD2_BARRIER;
4a0: 82 08 7f df and %g1, -33, %g1
spin_unlock(&journal->j_state_lock);
4a4: 40 00 00 00 call 4a4 <journal_submit_commit_record+0x1b0>
4a8: c2 74 80 00 stx %g1, [ %l2 ]
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
4ac: 11 00 00 00 sethi %hi(0), %o0
4b0: 92 10 21 4b mov 0x14b, %o1
4b4: 40 00 00 00 call 4b4 <journal_submit_commit_record+0x1c0>
4b8: 90 12 20 00 mov %o0, %o0
__wait_on_buffer(bh);
}
static inline int trylock_buffer(struct buffer_head *bh)
{
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
4bc: 90 10 20 02 mov 2, %o0
4c0: 40 00 00 00 call 4c0 <journal_submit_commit_record+0x1cc>
4c4: 92 10 00 11 mov %l1, %o1
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
if (!trylock_buffer(bh))
4c8: 80 a2 20 00 cmp %o0, 0
4cc: 02 48 00 05 be %icc, 4e0 <journal_submit_commit_record+0x1ec>
4d0: 90 10 20 00 clr %o0
__lock_buffer(bh);
4d4: 40 00 00 00 call 4d4 <journal_submit_commit_record+0x1e0>
4d8: 90 10 00 11 mov %l1, %o0
/*
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
4dc: 90 10 20 00 clr %o0
4e0: 40 00 00 00 call 4e0 <journal_submit_commit_record+0x1ec>
4e4: 92 10 00 11 mov %l1, %o1
BUFFER_FNS(Dirty, dirty)
4e8: 90 10 20 01 mov 1, %o0
4ec: 40 00 00 00 call 4ec <journal_submit_commit_record+0x1f8>
4f0: 92 10 00 11 mov %l1, %o1
/* And try again, without the barrier */
lock_buffer(bh);
set_buffer_uptodate(bh);
clear_buffer_dirty(bh);
ret = submit_bh(WRITE_SYNC, bh);
4f4: 90 10 20 19 mov 0x19, %o0
4f8: 40 00 00 00 call 4f8 <journal_submit_commit_record+0x204>
4fc: 92 10 00 11 mov %l1, %o1
500: b0 10 00 08 mov %o0, %i0
}
*cbh = bh;
504: e2 76 80 00 stx %l1, [ %i2 ]
return ret;
}
508: 81 cf e0 08 rett %i7 + 8
50c: 91 3a 20 00 sra %o0, 0, %o0
0000000000000510 <journal_end_buffer_io_sync>:
/*
* Default IO end handler for temporary BJ_IO buffer_heads.
*/
static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
{
510: 9d e3 bf 40 save %sp, -192, %sp
514: 11 00 00 00 sethi %hi(0), %o0
518: 40 00 00 00 call 518 <journal_end_buffer_io_sync+0x8>
51c: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
BUFFER_TRACE(bh, "");
if (uptodate)
520: 02 ce 40 06 brz %i1, 538 <journal_end_buffer_io_sync+0x28>
524: 90 10 20 00 clr %o0
/*
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
528: 40 00 00 00 call 528 <journal_end_buffer_io_sync+0x18>
52c: 92 10 00 18 mov %i0, %o1
530: 10 68 00 04 b %xcc, 540 <journal_end_buffer_io_sync+0x30>
534: 01 00 00 00 nop
set_buffer_uptodate(bh);
else
clear_buffer_uptodate(bh);
unlock_buffer(bh);
538: 40 00 00 00 call 538 <journal_end_buffer_io_sync+0x28>
53c: 92 10 00 18 mov %i0, %o1
540: 40 00 00 00 call 540 <journal_end_buffer_io_sync+0x30>
544: 90 10 00 18 mov %i0, %o0
}
548: 81 cf e0 08 rett %i7 + 8
54c: 01 00 00 00 nop
0000000000000550 <journal_wait_on_commit_record>:
* This function along with journal_submit_commit_record
* allows to write the commit record asynchronously.
*/
static int journal_wait_on_commit_record(journal_t *journal,
struct buffer_head *bh)
{
550: 9d e3 bf 40 save %sp, -192, %sp
554: 11 00 00 00 sethi %hi(0), %o0
558: a0 10 00 18 mov %i0, %l0
55c: 90 12 20 00 mov %o0, %o0
560: 40 00 00 00 call 560 <journal_wait_on_commit_record+0x10>
564: a4 06 25 28 add %i0, 0x528, %l2
wait_on_buffer(bh);
if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
printk(KERN_WARNING
"JBD2: wait_on_commit_record: sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
568: a2 06 20 28 add %i0, 0x28, %l1
int ret = 0;
retry:
clear_buffer_dirty(bh);
wait_on_buffer(bh);
if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
56c: 29 00 00 08 sethi %hi(0x2000), %l4
* __wait_on_buffer() just to trip a debug check. Because debug code in inline
* functions is bloaty.
*/
static inline void wait_on_buffer(struct buffer_head *bh)
{
might_sleep();
570: 03 00 00 00 sethi %hi(0), %g1
574: a6 10 60 00 mov %g1, %l3 ! 0 <write_tag_block>
printk(KERN_WARNING
578: 03 00 00 00 sethi %hi(0), %g1
57c: ac 10 60 00 mov %g1, %l6 ! 0 <write_tag_block>
spin_unlock(&journal->j_state_lock);
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
580: 03 00 00 00 sethi %hi(0), %g1
584: aa 10 60 00 mov %g1, %l5 ! 0 <write_tag_block>
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
BUFFER_FNS(Dirty, dirty)
588: 92 10 00 19 mov %i1, %o1
58c: 40 00 00 00 call 58c <journal_wait_on_commit_record+0x3c>
590: 90 10 20 01 mov 1, %o0
* __wait_on_buffer() just to trip a debug check. Because debug code in inline
* functions is bloaty.
*/
static inline void wait_on_buffer(struct buffer_head *bh)
{
might_sleep();
594: 90 10 00 13 mov %l3, %o0
598: 40 00 00 00 call 598 <journal_wait_on_commit_record+0x48>
59c: 92 10 21 3f mov 0x13f, %o1
5a0: c2 5e 40 00 ldx [ %i1 ], %g1
if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
5a4: 82 08 60 04 and %g1, 4, %g1
5a8: 0a c0 40 06 brnz,pn %g1, 5c0 <journal_wait_on_commit_record+0x70>
5ac: 90 10 00 19 mov %i1, %o0
5b0: c2 06 60 60 ld [ %i1 + 0x60 ], %g1
5b4: 80 a0 60 00 cmp %g1, 0
5b8: 12 48 00 04 bne %icc, 5c8 <journal_wait_on_commit_record+0x78>
5bc: 01 00 00 00 nop
__wait_on_buffer(bh);
5c0: 40 00 00 00 call 5c0 <journal_wait_on_commit_record+0x70>
5c4: 01 00 00 00 nop
5c8: c2 5e 40 00 ldx [ %i1 ], %g1
int ret = 0;
retry:
clear_buffer_dirty(bh);
wait_on_buffer(bh);
if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
5cc: 82 08 40 14 and %g1, %l4, %g1
5d0: 02 c0 40 2b brz,pn %g1, 67c <journal_wait_on_commit_record+0x12c>
5d4: 01 00 00 00 nop
5d8: c2 5c 00 00 ldx [ %l0 ], %g1
5dc: 82 08 60 20 and %g1, 0x20, %g1
5e0: 02 c8 40 27 brz %g1, 67c <journal_wait_on_commit_record+0x12c>
5e4: 92 10 00 12 mov %l2, %o1
printk(KERN_WARNING
5e8: 40 00 00 00 call 5e8 <journal_wait_on_commit_record+0x98>
5ec: 90 10 00 16 mov %l6, %o0
"JBD2: wait_on_commit_record: sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
5f0: 40 00 00 00 call 5f0 <journal_wait_on_commit_record+0xa0>
5f4: 90 10 00 11 mov %l1, %o0
journal->j_flags &= ~JBD2_BARRIER;
5f8: c2 5c 00 00 ldx [ %l0 ], %g1
spin_unlock(&journal->j_state_lock);
5fc: 90 10 00 11 mov %l1, %o0
if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
printk(KERN_WARNING
"JBD2: wait_on_commit_record: sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
journal->j_flags &= ~JBD2_BARRIER;
600: 82 08 7f df and %g1, -33, %g1
spin_unlock(&journal->j_state_lock);
604: 40 00 00 00 call 604 <journal_wait_on_commit_record+0xb4>
608: c2 74 00 00 stx %g1, [ %l0 ]
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
60c: 90 10 00 13 mov %l3, %o0
610: 40 00 00 00 call 610 <journal_wait_on_commit_record+0xc0>
614: 92 10 21 4b mov 0x14b, %o1
__wait_on_buffer(bh);
}
static inline int trylock_buffer(struct buffer_head *bh)
{
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
618: 92 10 00 19 mov %i1, %o1
61c: 40 00 00 00 call 61c <journal_wait_on_commit_record+0xcc>
620: 90 10 20 02 mov 2, %o0
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
if (!trylock_buffer(bh))
624: 80 a2 20 00 cmp %o0, 0
628: 02 48 00 05 be %icc, 63c <journal_wait_on_commit_record+0xec>
62c: 90 10 20 01 mov 1, %o0
__lock_buffer(bh);
630: 40 00 00 00 call 630 <journal_wait_on_commit_record+0xe0>
634: 90 10 00 19 mov %i1, %o0
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
BUFFER_FNS(Dirty, dirty)
638: 90 10 20 01 mov 1, %o0
63c: 40 00 00 00 call 63c <journal_wait_on_commit_record+0xec>
640: 92 10 00 19 mov %i1, %o1
/*
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
644: 90 10 20 00 clr %o0
648: 40 00 00 00 call 648 <journal_wait_on_commit_record+0xf8>
64c: 92 10 00 19 mov %i1, %o1
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
ret = submit_bh(WRITE_SYNC, bh);
650: 90 10 20 19 mov 0x19, %o0
spin_unlock(&journal->j_state_lock);
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
654: ea 76 60 38 stx %l5, [ %i1 + 0x38 ]
ret = submit_bh(WRITE_SYNC, bh);
658: 40 00 00 00 call 658 <journal_wait_on_commit_record+0x108>
65c: 92 10 00 19 mov %i1, %o1
if (ret) {
660: b0 92 20 00 orcc %o0, 0, %i0
664: 02 4f ff ca be %icc, 58c <journal_wait_on_commit_record+0x3c>
668: 92 10 00 19 mov %i1, %o1
unlock_buffer(bh);
66c: 40 00 00 00 call 66c <journal_wait_on_commit_record+0x11c>
670: 90 10 00 19 mov %i1, %o0
ret = -EIO;
put_bh(bh); /* One for getblk() */
jbd2_journal_put_journal_head(bh2jh(bh));
return ret;
}
674: 81 cf e0 08 rett %i7 + 8
678: 91 3a 20 00 sra %o0, 0, %o0
67c: c2 5e 40 00 ldx [ %i1 ], %g1
return ret;
}
goto retry;
}
if (unlikely(!buffer_uptodate(bh)))
680: b0 10 3f fb mov -5, %i0
684: 80 88 60 01 btst 1, %g1
688: b1 66 70 00 movne %xcc, 0, %i0
}
static inline void put_bh(struct buffer_head *bh)
{
smp_mb__before_atomic_dec();
atomic_dec(&bh->b_count);
68c: 90 10 20 01 mov 1, %o0
690: 40 00 00 00 call 690 <journal_wait_on_commit_record+0x140>
694: 92 06 60 60 add %i1, 0x60, %o1
ret = -EIO;
put_bh(bh); /* One for getblk() */
jbd2_journal_put_journal_head(bh2jh(bh));
698: 40 00 00 00 call 698 <journal_wait_on_commit_record+0x148>
69c: d0 5e 60 40 ldx [ %i1 + 0x40 ], %o0
return ret;
}
6a0: b1 3e 20 00 sra %i0, 0, %i0
6a4: 81 cf e0 08 rett %i7 + 8
6a8: 01 00 00 00 nop
00000000000006ac <release_buffer_page>:
*
* Called under lock_journal(), and possibly under journal_datalist_lock. The
* caller provided us with a ref against the buffer, and we drop that here.
*/
static void release_buffer_page(struct buffer_head *bh)
{
6ac: 9d e3 bf 40 save %sp, -192, %sp
6b0: 11 00 00 00 sethi %hi(0), %o0
6b4: 40 00 00 00 call 6b4 <release_buffer_page+0x8>
6b8: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
6bc: c2 5e 00 00 ldx [ %i0 ], %g1
struct page *page;
if (buffer_dirty(bh))
6c0: 82 08 60 02 and %g1, 2, %g1
6c4: 0a c0 40 2c brnz,pn %g1, 774 <release_buffer_page+0xc8>
6c8: 01 00 00 00 nop
goto nope;
if (atomic_read(&bh->b_count) != 1)
6cc: c2 06 20 60 ld [ %i0 + 0x60 ], %g1
6d0: 80 a0 60 01 cmp %g1, 1
6d4: 12 48 00 28 bne %icc, 774 <release_buffer_page+0xc8>
6d8: 01 00 00 00 nop
goto nope;
page = bh->b_page;
6dc: e0 5e 20 10 ldx [ %i0 + 0x10 ], %l0
if (!page)
6e0: 02 c4 00 25 brz,pn %l0, 774 <release_buffer_page+0xc8>
6e4: 01 00 00 00 nop
goto nope;
if (page->mapping)
6e8: c2 5c 20 18 ldx [ %l0 + 0x18 ], %g1
6ec: 0a c8 40 22 brnz %g1, 774 <release_buffer_page+0xc8>
6f0: 90 10 20 00 clr %o0
__clear_bit(PG_locked, &page->flags);
}
static inline int trylock_page(struct page *page)
{
return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
6f4: 40 00 00 00 call 6f4 <release_buffer_page+0x48>
6f8: 92 10 00 10 mov %l0, %o1
goto nope;
/* OK, it's a truncated page */
if (!trylock_page(page))
6fc: 80 a2 20 00 cmp %o0, 0
700: 12 48 00 1d bne %icc, 774 <release_buffer_page+0xc8>
704: 01 00 00 00 nop
708: c2 5c 00 00 ldx [ %l0 ], %g1
#endif
}
static inline struct page *compound_head(struct page *page)
{
if (unlikely(PageTail(page)))
70c: 05 00 00 10 sethi %hi(0x4000), %g2
710: 82 08 40 02 and %g1, %g2, %g1
714: 02 c8 40 03 brz %g1, 720 <release_buffer_page+0x74>
718: 92 10 00 10 mov %l0, %o1
return page->first_page;
71c: d2 5c 20 10 ldx [ %l0 + 0x10 ], %o1
}
static inline void get_page(struct page *page)
{
page = compound_head(page);
VM_BUG_ON(atomic_read(&page->_count) == 0);
720: c2 02 60 08 ld [ %o1 + 8 ], %g1
724: 80 a0 60 00 cmp %g1, 0
728: 12 48 00 07 bne %icc, 744 <release_buffer_page+0x98>
72c: 92 02 60 08 add %o1, 8, %o1
730: 11 00 00 00 sethi %hi(0), %o0
734: 92 10 21 2e mov 0x12e, %o1
738: 40 00 00 00 call 738 <release_buffer_page+0x8c>
73c: 90 12 20 00 mov %o0, %o0
740: 91 d0 20 05 ta 5
atomic_inc(&page->_count);
744: 40 00 00 00 call 744 <release_buffer_page+0x98>
748: 90 10 20 01 mov 1, %o0
goto nope;
page_cache_get(page);
__brelse(bh);
74c: 40 00 00 00 call 74c <release_buffer_page+0xa0>
750: 90 10 00 18 mov %i0, %o0
try_to_free_buffers(page);
754: 40 00 00 00 call 754 <release_buffer_page+0xa8>
758: 90 10 00 10 mov %l0, %o0
unlock_page(page);
75c: 40 00 00 00 call 75c <release_buffer_page+0xb0>
760: 90 10 00 10 mov %l0, %o0
page_cache_release(page);
764: 40 00 00 00 call 764 <release_buffer_page+0xb8>
768: 90 10 00 10 mov %l0, %o0
76c: 81 cf e0 08 rett %i7 + 8
770: 01 00 00 00 nop
return;
nope:
__brelse(bh);
774: 40 00 00 00 call 774 <release_buffer_page+0xc8>
778: 90 10 00 18 mov %i0, %o0
77c: 81 cf e0 08 rett %i7 + 8
780: 01 00 00 00 nop
0000000000000784 <jbd2_journal_commit_transaction>:
*
* The primary function for committing a transaction to the log. This
* function is called by the journal thread to begin a complete commit.
*/
void jbd2_journal_commit_transaction(journal_t *journal)
{
784: 9d e3 be 90 save %sp, -368, %sp
788: 11 00 00 00 sethi %hi(0), %o0
78c: 40 00 00 00 call 78c <jbd2_journal_commit_transaction+0x8>
790: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
struct transaction_stats_s stats;
transaction_t *commit_transaction;
struct journal_head *jh, *new_jh, *descriptor;
struct buffer_head **wbuf = journal->j_wbuf;
794: c2 5e 26 58 ldx [ %i0 + 0x658 ], %g1
journal_block_tag_t *tag = NULL;
int space_left = 0;
int first_tag = 0;
int tag_flag;
int i, to_free = 0;
int tag_bytes = journal_tag_bytes(journal);
798: 90 10 00 18 mov %i0, %o0
79c: 40 00 00 00 call 79c <jbd2_journal_commit_transaction+0x18>
7a0: c2 77 a7 4f stx %g1, [ %fp + 0x74f ]
summarise_journal_usage(journal);
spin_unlock(&journal->j_list_lock);
#endif
/* Do we need to erase the effects of a prior jbd2_journal_flush? */
if (journal->j_flags & JBD2_FLUSHED) {
7a4: c2 5e 00 00 ldx [ %i0 ], %g1
7a8: 05 00 00 00 sethi %hi(0), %g2
journal_block_tag_t *tag = NULL;
int space_left = 0;
int first_tag = 0;
int tag_flag;
int i, to_free = 0;
int tag_bytes = journal_tag_bytes(journal);
7ac: d0 27 a7 5b st %o0, [ %fp + 0x75b ]
summarise_journal_usage(journal);
spin_unlock(&journal->j_list_lock);
#endif
/* Do we need to erase the effects of a prior jbd2_journal_flush? */
if (journal->j_flags & JBD2_FLUSHED) {
7b0: 82 08 60 08 and %g1, 8, %g1
7b4: 02 c8 40 16 brz %g1, 80c <jbd2_journal_commit_transaction+0x88>
7b8: c0 77 a7 d7 clrx [ %fp + 0x7d7 ]
jbd_debug(3, "super block updated\n");
7bc: c2 08 a0 00 ldub [ %g2 ], %g1
7c0: 80 a0 60 02 cmp %g1, 2
7c4: 28 48 00 0e bleu,a %icc, 7fc <jbd2_journal_commit_transaction+0x78>
7c8: 90 10 00 18 mov %i0, %o0
7cc: 11 00 00 00 sethi %hi(0), %o0
7d0: 13 00 00 00 sethi %hi(0), %o1
7d4: 17 00 00 00 sethi %hi(0), %o3
7d8: 90 12 20 00 mov %o0, %o0
7dc: 92 12 60 00 mov %o1, %o1
7e0: 96 12 e0 00 mov %o3, %o3
7e4: 40 00 00 00 call 7e4 <jbd2_journal_commit_transaction+0x60>
7e8: 94 10 21 80 mov 0x180, %o2
7ec: 11 00 00 00 sethi %hi(0), %o0
7f0: 40 00 00 00 call 7f0 <jbd2_journal_commit_transaction+0x6c>
7f4: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
jbd2_journal_update_superblock(journal, 1);
7f8: 90 10 00 18 mov %i0, %o0
7fc: 40 00 00 00 call 7fc <jbd2_journal_commit_transaction+0x78>
800: 92 10 20 01 mov 1, %o1
} else {
jbd_debug(3, "superblock not updated\n");
}
J_ASSERT(journal->j_running_transaction != NULL);
804: 10 68 00 12 b %xcc, 84c <jbd2_journal_commit_transaction+0xc8>
808: e6 5e 20 d8 ldx [ %i0 + 0xd8 ], %l3
/* Do we need to erase the effects of a prior jbd2_journal_flush? */
if (journal->j_flags & JBD2_FLUSHED) {
jbd_debug(3, "super block updated\n");
jbd2_journal_update_superblock(journal, 1);
} else {
jbd_debug(3, "superblock not updated\n");
80c: c2 08 a0 00 ldub [ %g2 ], %g1
810: 80 a0 60 02 cmp %g1, 2
814: 28 48 00 0e bleu,a %icc, 84c <jbd2_journal_commit_transaction+0xc8>
818: e6 5e 20 d8 ldx [ %i0 + 0xd8 ], %l3
81c: 11 00 00 00 sethi %hi(0), %o0
820: 13 00 00 00 sethi %hi(0), %o1
824: 17 00 00 00 sethi %hi(0), %o3
828: 90 12 20 00 mov %o0, %o0
82c: 92 12 60 00 mov %o1, %o1
830: 96 12 e0 00 mov %o3, %o3
834: 40 00 00 00 call 834 <jbd2_journal_commit_transaction+0xb0>
838: 94 10 21 83 mov 0x183, %o2
83c: 11 00 00 00 sethi %hi(0), %o0
840: 40 00 00 00 call 840 <jbd2_journal_commit_transaction+0xbc>
844: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
}
J_ASSERT(journal->j_running_transaction != NULL);
848: e6 5e 20 d8 ldx [ %i0 + 0xd8 ], %l3
84c: 02 c4 c0 06 brz,pn %l3, 864 <jbd2_journal_commit_transaction+0xe0>
850: 92 10 21 86 mov 0x186, %o1
J_ASSERT(journal->j_committing_transaction == NULL);
854: c2 5e 20 e0 ldx [ %i0 + 0xe0 ], %g1
858: 22 c8 40 08 brz,a %g1, 878 <jbd2_journal_commit_transaction+0xf4>
85c: c2 04 e0 0c ld [ %l3 + 0xc ], %g1
860: 92 10 21 87 mov 0x187, %o1
864: 11 00 00 00 sethi %hi(0), %o0
868: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
86c: 40 00 00 00 call 86c <jbd2_journal_commit_transaction+0xe8>
870: 01 00 00 00 nop
874: 91 d0 20 05 ta 5
commit_transaction = journal->j_running_transaction;
J_ASSERT(commit_transaction->t_state == T_RUNNING);
878: 80 a0 60 00 cmp %g1, 0
87c: 12 47 ff fa bne,pn %icc, 864 <jbd2_journal_commit_transaction+0xe0>
880: 92 10 21 8a mov 0x18a, %o1
trace_mark(jbd2_start_commit, "dev %s transaction %d",
journal->j_devname, commit_transaction->t_tid);
jbd_debug(1, "JBD: starting commit of transaction %d\n",
884: 03 00 00 00 sethi %hi(0), %g1
888: c2 08 60 00 ldub [ %g1 ], %g1
88c: 80 a0 60 00 cmp %g1, 0
890: 22 48 00 0f be,a %icc, 8cc <jbd2_journal_commit_transaction+0x148>
894: b4 06 20 28 add %i0, 0x28, %i2
898: 13 00 00 00 sethi %hi(0), %o1
89c: 11 00 00 00 sethi %hi(0), %o0
8a0: 17 00 00 00 sethi %hi(0), %o3
8a4: 92 12 60 00 mov %o1, %o1
8a8: 90 12 20 00 mov %o0, %o0
8ac: 96 12 e0 00 mov %o3, %o3
8b0: 40 00 00 00 call 8b0 <jbd2_journal_commit_transaction+0x12c>
8b4: 94 10 21 8f mov 0x18f, %o2
8b8: 11 00 00 00 sethi %hi(0), %o0
8bc: d2 04 e0 08 ld [ %l3 + 8 ], %o1
8c0: 40 00 00 00 call 8c0 <jbd2_journal_commit_transaction+0x13c>
8c4: 90 12 20 00 mov %o0, %o0
commit_transaction->t_tid);
spin_lock(&journal->j_state_lock);
8c8: b4 06 20 28 add %i0, 0x28, %i2
stats.u.run.rs_wait = commit_transaction->t_max_wait;
stats.u.run.rs_locked = jiffies;
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
8cc: a2 04 e0 70 add %l3, 0x70, %l1
trace_mark(jbd2_start_commit, "dev %s transaction %d",
journal->j_devname, commit_transaction->t_tid);
jbd_debug(1, "JBD: starting commit of transaction %d\n",
commit_transaction->t_tid);
spin_lock(&journal->j_state_lock);
8d0: 90 10 00 1a mov %i2, %o0
8d4: 40 00 00 00 call 8d4 <jbd2_journal_commit_transaction+0x150>
8d8: a8 06 22 30 add %i0, 0x230, %l4
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
while (commit_transaction->t_updates) {
DEFINE_WAIT(wait);
8dc: a4 07 a7 af add %fp, 0x7af, %l2
8e0: aa 07 a7 c7 add %fp, 0x7c7, %l5
journal->j_devname, commit_transaction->t_tid);
jbd_debug(1, "JBD: starting commit of transaction %d\n",
commit_transaction->t_tid);
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_LOCKED;
8e4: 82 10 20 01 mov 1, %g1
8e8: c2 24 e0 0c st %g1, [ %l3 + 0xc ]
stats.u.run.rs_wait = commit_transaction->t_max_wait;
stats.u.run.rs_locked = jiffies;
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
8ec: 90 10 00 11 mov %l1, %o0
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_LOCKED;
stats.u.run.rs_wait = commit_transaction->t_max_wait;
stats.u.run.rs_locked = jiffies;
8f0: 03 00 00 00 sethi %hi(0), %g1
commit_transaction->t_tid);
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_LOCKED;
stats.u.run.rs_wait = commit_transaction->t_max_wait;
8f4: c4 5c e0 a0 ldx [ %l3 + 0xa0 ], %g2
stats.u.run.rs_locked = jiffies;
8f8: c6 58 60 00 ldx [ %g1 ], %g3
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
return end + (MAX_JIFFY_OFFSET - start);
8fc: 82 10 3f ff mov -1, %g1
commit_transaction->t_tid);
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_LOCKED;
stats.u.run.rs_wait = commit_transaction->t_max_wait;
900: c4 77 a7 6f stx %g2, [ %fp + 0x76f ]
904: 83 28 70 3e sllx %g1, 0x3e, %g1
stats.u.run.rs_locked = jiffies;
908: c6 77 a7 7f stx %g3, [ %fp + 0x77f ]
90c: 82 18 7f fe xor %g1, -2, %g1
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
910: c4 5c e0 a8 ldx [ %l3 + 0xa8 ], %g2
914: 82 00 c0 01 add %g3, %g1, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
918: 80 a0 c0 02 cmp %g3, %g2
return end + (MAX_JIFFY_OFFSET - start);
91c: 82 20 40 02 sub %g1, %g2, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
920: 86 20 c0 02 sub %g3, %g2, %g3
924: 83 67 50 03 movcc %xcc, %g3, %g1
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
928: 40 00 00 00 call 928 <jbd2_journal_commit_transaction+0x1a4>
92c: c2 77 a7 77 stx %g1, [ %fp + 0x777 ]
while (commit_transaction->t_updates) {
DEFINE_WAIT(wait);
930: 03 00 00 00 sethi %hi(0), %g1
934: 10 68 00 1f b %xcc, 9b0 <jbd2_journal_commit_transaction+0x22c>
938: ac 10 60 00 mov %g1, %l6 ! 0 <write_tag_block>
93c: 94 10 20 28 mov 0x28, %o2
940: 90 10 00 12 mov %l2, %o0
944: 40 00 00 00 call 944 <jbd2_journal_commit_transaction+0x1c0>
948: a0 10 00 04 mov %g4, %l0
prepare_to_wait(&journal->j_wait_updates, &wait,
94c: 90 10 00 14 mov %l4, %o0
950: 92 10 00 12 mov %l2, %o1
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
while (commit_transaction->t_updates) {
DEFINE_WAIT(wait);
954: e0 77 a7 b7 stx %l0, [ %fp + 0x7b7 ]
prepare_to_wait(&journal->j_wait_updates, &wait,
958: 94 10 20 02 mov 2, %o2
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
while (commit_transaction->t_updates) {
DEFINE_WAIT(wait);
95c: ec 77 a7 bf stx %l6, [ %fp + 0x7bf ]
960: ea 77 a7 c7 stx %l5, [ %fp + 0x7c7 ]
prepare_to_wait(&journal->j_wait_updates, &wait,
964: 40 00 00 00 call 964 <jbd2_journal_commit_transaction+0x1e0>
968: ea 77 a7 cf stx %l5, [ %fp + 0x7cf ]
TASK_UNINTERRUPTIBLE);
if (commit_transaction->t_updates) {
96c: c2 04 e0 d0 ld [ %l3 + 0xd0 ], %g1
970: 80 a0 60 00 cmp %g1, 0
974: 02 48 00 0d be %icc, 9a8 <jbd2_journal_commit_transaction+0x224>
978: 90 10 00 14 mov %l4, %o0
spin_unlock(&commit_transaction->t_handle_lock);
97c: 40 00 00 00 call 97c <jbd2_journal_commit_transaction+0x1f8>
980: 90 10 00 11 mov %l1, %o0
spin_unlock(&journal->j_state_lock);
984: 40 00 00 00 call 984 <jbd2_journal_commit_transaction+0x200>
988: 90 10 00 1a mov %i2, %o0
schedule();
98c: 40 00 00 00 call 98c <jbd2_journal_commit_transaction+0x208>
990: 01 00 00 00 nop
spin_lock(&journal->j_state_lock);
994: 40 00 00 00 call 994 <jbd2_journal_commit_transaction+0x210>
998: 90 10 00 1a mov %i2, %o0
spin_lock(&commit_transaction->t_handle_lock);
99c: 40 00 00 00 call 99c <jbd2_journal_commit_transaction+0x218>
9a0: 90 10 00 11 mov %l1, %o0
}
finish_wait(&journal->j_wait_updates, &wait);
9a4: 90 10 00 14 mov %l4, %o0
9a8: 40 00 00 00 call 9a8 <jbd2_journal_commit_transaction+0x224>
9ac: 92 10 00 12 mov %l2, %o1
stats.u.run.rs_locked = jiffies;
stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
stats.u.run.rs_locked);
spin_lock(&commit_transaction->t_handle_lock);
while (commit_transaction->t_updates) {
9b0: c2 04 e0 d0 ld [ %l3 + 0xd0 ], %g1
9b4: 80 a0 60 00 cmp %g1, 0
9b8: 12 4f ff e1 bne %icc, 93c <jbd2_journal_commit_transaction+0x1b8>
9bc: 92 10 20 00 clr %o1
spin_lock(&journal->j_state_lock);
spin_lock(&commit_transaction->t_handle_lock);
}
finish_wait(&journal->j_wait_updates, &wait);
}
spin_unlock(&commit_transaction->t_handle_lock);
9c0: 90 10 00 11 mov %l1, %o0
9c4: 40 00 00 00 call 9c4 <jbd2_journal_commit_transaction+0x240>
9c8: 25 00 10 00 sethi %hi(0x400000), %l2
J_ASSERT (commit_transaction->t_outstanding_credits <=
9cc: c4 04 e0 d4 ld [ %l3 + 0xd4 ], %g2
9d0: c2 06 25 d0 ld [ %i0 + 0x5d0 ], %g1
9d4: 80 a0 80 01 cmp %g2, %g1
9d8: 04 48 00 39 ble %icc, abc <jbd2_journal_commit_transaction+0x338>
9dc: 92 10 21 ab mov 0x1ab, %o1
} else {
jbd_debug(3, "superblock not updated\n");
}
J_ASSERT(journal->j_running_transaction != NULL);
J_ASSERT(journal->j_committing_transaction == NULL);
9e0: 10 6f ff a2 b %xcc, 868 <jbd2_journal_commit_transaction+0xe4>
9e4: 11 00 00 00 sethi %hi(0), %o0
JBUFFER_TRACE(jh, "reserved, unused: refile");
/*
* A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may
* leave undo-committed data.
*/
if (jh->b_committed_data) {
9e8: 02 c0 40 32 brz,pn %g1, ab0 <jbd2_journal_commit_transaction+0x32c>
9ec: 90 10 20 01 mov 1, %o0
* the body of the outer loop. If it is contended, then
* within the inner loop a non-atomic test is used to
* busywait with less bus contention for a good time to
* attempt to acquire the lock bit.
*/
preempt_disable();
9f0: 40 00 00 00 call 9f0 <jbd2_journal_commit_transaction+0x26c>
9f4: e0 5c 40 00 ldx [ %l1 ], %l0
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
9f8: 10 68 00 10 b %xcc, a38 <jbd2_journal_commit_transaction+0x2b4>
9fc: 90 10 20 16 mov 0x16, %o0
while (test_bit(bitnum, addr)) {
preempt_enable();
a00: 40 00 00 00 call a00 <jbd2_journal_commit_transaction+0x27c>
a04: 90 10 20 01 mov 1, %o0
a08: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
a0c: 82 08 60 08 and %g1, 8, %g1
a10: 02 c8 40 04 brz %g1, a20 <jbd2_journal_commit_transaction+0x29c>
a14: 01 00 00 00 nop
a18: 40 00 00 00 call a18 <jbd2_journal_commit_transaction+0x294>
a1c: 01 00 00 00 nop
cpu_relax();
preempt_disable();
a20: 40 00 00 00 call a20 <jbd2_journal_commit_transaction+0x29c>
a24: 90 10 20 01 mov 1, %o0 ! 1 <write_tag_block+0x1>
a28: c2 5c 00 00 ldx [ %l0 ], %g1
* attempt to acquire the lock bit.
*/
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
while (test_bit(bitnum, addr)) {
a2c: 82 08 40 12 and %g1, %l2, %g1
a30: 0a f0 7f f4 brnz,pn %g1, a00 <jbd2_journal_commit_transaction+0x27c>
a34: 90 10 20 16 mov 0x16, %o0
* busywait with less bus contention for a good time to
* attempt to acquire the lock bit.
*/
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
a38: 40 00 00 00 call a38 <jbd2_journal_commit_transaction+0x2b4>
a3c: 92 10 00 10 mov %l0, %o1
a40: 80 a2 20 00 cmp %o0, 0
a44: 12 4f ff f9 bne %icc, a28 <jbd2_journal_commit_transaction+0x2a4>
a48: 92 10 3f ff mov -1, %o1
/* Pure 2^n version of get_order */
static __inline__ __attribute_const__ int get_order(unsigned long size)
{
int order;
size = (size - 1) >> (PAGE_SHIFT - 1);
a4c: c2 5c 20 20 ldx [ %l0 + 0x20 ], %g1
struct buffer_head *bh = jh2bh(jh);
jbd_lock_bh_state(bh);
jbd2_free(jh->b_committed_data, bh->b_size);
a50: d0 5c 60 20 ldx [ %l1 + 0x20 ], %o0
a54: 82 00 7f ff add %g1, -1, %g1
a58: 83 30 70 0c srlx %g1, 0xc, %g1
order = -1;
do {
size >>= 1;
a5c: 83 30 70 01 srlx %g1, 1, %g1
order++;
} while (size);
a60: 0a f8 7f ff brnz %g1, a5c <jbd2_journal_commit_transaction+0x2d8>
a64: 92 02 60 01 inc %o1
return (void *)__get_free_pages(flags, get_order(size));
}
static inline void jbd2_free(void *ptr, size_t size)
{
free_pages((unsigned long)ptr, get_order(size));
a68: 40 00 00 00 call a68 <jbd2_journal_commit_transaction+0x2e4>
a6c: 93 32 60 00 srl %o1, 0, %o1
jh->b_committed_data = NULL;
a70: c0 74 60 20 clrx [ %l1 + 0x20 ]
a74: c2 5c 00 00 ldx [ %l0 ], %g1
* bit-based spin_unlock()
*/
static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
{
#ifdef CONFIG_DEBUG_SPINLOCK
BUG_ON(!test_bit(bitnum, addr));
a78: 82 08 40 12 and %g1, %l2, %g1
a7c: 22 c0 43 2e brz,a,pn %g1, 1734 <jbd2_journal_commit_transaction+0xfb0>
a80: 11 00 00 00 sethi %hi(0), %o0
#endif
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
clear_bit_unlock(bitnum, addr);
a84: 90 10 20 16 mov 0x16, %o0
a88: 40 00 00 00 call a88 <jbd2_journal_commit_transaction+0x304>
a8c: 92 10 00 10 mov %l0, %o1
#endif
preempt_enable();
a90: 40 00 00 00 call a90 <jbd2_journal_commit_transaction+0x30c>
a94: 90 10 20 01 mov 1, %o0
a98: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
a9c: 82 08 60 08 and %g1, 8, %g1
aa0: 02 c8 40 05 brz %g1, ab4 <jbd2_journal_commit_transaction+0x330>
aa4: 92 10 00 11 mov %l1, %o1
aa8: 40 00 00 00 call aa8 <jbd2_journal_commit_transaction+0x324>
aac: 01 00 00 00 nop
jbd_unlock_bh_state(bh);
}
jbd2_journal_refile_buffer(journal, jh);
ab0: 92 10 00 11 mov %l1, %o1
ab4: 40 00 00 00 call ab4 <jbd2_journal_commit_transaction+0x330>
ab8: 90 10 00 18 mov %i0, %o0
* we do not require it to remember exactly which old buffers it
* has reserved. This is consistent with the existing behaviour
* that multiple jbd2_journal_get_write_access() calls to the same
* buffer are perfectly permissable.
*/
while (commit_transaction->t_reserved_list) {
abc: e2 5c e0 20 ldx [ %l3 + 0x20 ], %l1
ac0: 2a fc 7f ca brnz,a %l1, 9e8 <jbd2_journal_commit_transaction+0x264>
ac4: c2 5c 60 20 ldx [ %l1 + 0x20 ], %g1
/*
* Now try to drop any written-back buffers from the journal's
* checkpoint lists. We do this *before* commit because it potentially
* frees some memory
*/
spin_lock(&journal->j_list_lock);
ac8: b6 06 25 70 add %i0, 0x570, %i3
acc: 40 00 00 00 call acc <jbd2_journal_commit_transaction+0x348>
ad0: 90 10 00 1b mov %i3, %o0
__jbd2_journal_clean_checkpoint_list(journal);
ad4: 40 00 00 00 call ad4 <jbd2_journal_commit_transaction+0x350>
ad8: 90 10 00 18 mov %i0, %o0
spin_unlock(&journal->j_list_lock);
adc: 40 00 00 00 call adc <jbd2_journal_commit_transaction+0x358>
ae0: 90 10 00 1b mov %i3, %o0
jbd_debug (3, "JBD: commit phase 1\n");
ae4: 03 00 00 00 sethi %hi(0), %g1
ae8: c2 08 60 00 ldub [ %g1 ], %g1
aec: 80 a0 60 02 cmp %g1, 2
af0: 08 48 00 0c bleu %icc, b20 <jbd2_journal_commit_transaction+0x39c>
af4: 13 00 00 00 sethi %hi(0), %o1
af8: 11 00 00 00 sethi %hi(0), %o0
afc: 17 00 00 00 sethi %hi(0), %o3
b00: 90 12 20 00 mov %o0, %o0
b04: 92 12 60 00 mov %o1, %o1
b08: 96 12 e0 00 mov %o3, %o3
b0c: 40 00 00 00 call b0c <jbd2_journal_commit_transaction+0x388>
b10: 94 10 21 d8 mov 0x1d8, %o2
b14: 11 00 00 00 sethi %hi(0), %o0
b18: 40 00 00 00 call b18 <jbd2_journal_commit_transaction+0x394>
b1c: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
/*
* Switch to a new revoke table.
*/
jbd2_journal_switch_revoke_table(journal);
b20: 40 00 00 00 call b20 <jbd2_journal_commit_transaction+0x39c>
b24: 90 10 00 18 mov %i0, %o0
stats.u.run.rs_flushing = jiffies;
b28: 03 00 00 00 sethi %hi(0), %g1
stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
b2c: c6 5f a7 7f ldx [ %fp + 0x77f ], %g3
/*
* Switch to a new revoke table.
*/
jbd2_journal_switch_revoke_table(journal);
stats.u.run.rs_flushing = jiffies;
b30: c4 58 60 00 ldx [ %g1 ], %g2
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
return end + (MAX_JIFFY_OFFSET - start);
b34: 82 10 3f ff mov -1, %g1
b38: 83 28 70 3e sllx %g1, 0x3e, %g1
b3c: 82 18 7f fe xor %g1, -2, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
b40: 80 a0 80 03 cmp %g2, %g3
b44: c4 77 a7 87 stx %g2, [ %fp + 0x787 ]
return end + (MAX_JIFFY_OFFSET - start);
b48: 82 00 80 01 add %g2, %g1, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
b4c: 84 20 80 03 sub %g2, %g3, %g2
return end + (MAX_JIFFY_OFFSET - start);
b50: 82 20 40 03 sub %g1, %g3, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
b54: 83 67 50 02 movcc %xcc, %g2, %g1
stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
b58: c2 77 a7 7f stx %g1, [ %fp + 0x77f ]
stats.u.run.rs_flushing);
commit_transaction->t_state = T_FLUSH;
b5c: 82 10 20 03 mov 3, %g1
b60: c2 24 e0 0c st %g1, [ %l3 + 0xc ]
journal->j_committing_transaction = commit_transaction;
b64: e6 76 20 e0 stx %l3, [ %i0 + 0xe0 ]
journal->j_running_transaction = NULL;
start_time = ktime_get();
b68: 40 00 00 00 call b68 <jbd2_journal_commit_transaction+0x3e4>
b6c: c0 76 20 d8 clrx [ %i0 + 0xd8 ]
commit_transaction->t_log_start = journal->j_head;
b70: c2 5e 24 e8 ldx [ %i0 + 0x4e8 ], %g1
wake_up(&journal->j_wait_transaction_locked);
b74: 92 10 20 03 mov 3, %o1
b78: 94 10 20 01 mov 1, %o2
stats.u.run.rs_flushing);
commit_transaction->t_state = T_FLUSH;
journal->j_committing_transaction = commit_transaction;
journal->j_running_transaction = NULL;
start_time = ktime_get();
b7c: d0 77 a7 3f stx %o0, [ %fp + 0x73f ]
commit_transaction->t_log_start = journal->j_head;
wake_up(&journal->j_wait_transaction_locked);
b80: 96 10 20 00 clr %o3
b84: 90 06 20 f0 add %i0, 0xf0, %o0
b88: 40 00 00 00 call b88 <jbd2_journal_commit_transaction+0x404>
b8c: c2 74 e0 10 stx %g1, [ %l3 + 0x10 ]
spin_unlock(&journal->j_state_lock);
b90: 40 00 00 00 call b90 <jbd2_journal_commit_transaction+0x40c>
b94: 90 10 00 1a mov %i2, %o0
jbd_debug (3, "JBD: commit phase 2\n");
b98: 03 00 00 00 sethi %hi(0), %g1
b9c: c2 08 60 00 ldub [ %g1 ], %g1
ba0: 80 a0 60 02 cmp %g1, 2
ba4: 28 48 00 0e bleu,a %icc, bdc <jbd2_journal_commit_transaction+0x458>
ba8: 90 10 00 18 mov %i0, %o0
bac: 11 00 00 00 sethi %hi(0), %o0
bb0: 13 00 00 00 sethi %hi(0), %o1
bb4: 17 00 00 00 sethi %hi(0), %o3
bb8: 90 12 20 00 mov %o0, %o0
bbc: 92 12 60 00 mov %o1, %o1
bc0: 96 12 e0 00 mov %o3, %o3
bc4: 40 00 00 00 call bc4 <jbd2_journal_commit_transaction+0x440>
bc8: 94 10 21 eb mov 0x1eb, %o2
bcc: 11 00 00 00 sethi %hi(0), %o0
bd0: 40 00 00 00 call bd0 <jbd2_journal_commit_transaction+0x44c>
bd4: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
/*
* Now start flushing things to disk, in the order they appear
* on the transaction lists. Data blocks go first.
*/
err = journal_submit_data_buffers(journal, commit_transaction);
bd8: 90 10 00 18 mov %i0, %o0
bdc: 7f ff fd 30 call 9c <journal_submit_data_buffers>
be0: 92 10 00 13 mov %l3, %o1
if (err)
be4: 80 a2 20 00 cmp %o0, 0
be8: 22 48 00 06 be,a %icc, c00 <jbd2_journal_commit_transaction+0x47c>
bec: 90 10 00 18 mov %i0, %o0
jbd2_journal_abort(journal, err);
bf0: 93 3a 20 00 sra %o0, 0, %o1
bf4: 40 00 00 00 call bf4 <jbd2_journal_commit_transaction+0x470>
bf8: 90 10 00 18 mov %i0, %o0
jbd2_journal_write_revoke_records(journal, commit_transaction);
bfc: 90 10 00 18 mov %i0, %o0
c00: 40 00 00 00 call c00 <jbd2_journal_commit_transaction+0x47c>
c04: 92 10 00 13 mov %l3, %o1
jbd_debug(3, "JBD: commit phase 2\n");
c08: 03 00 00 00 sethi %hi(0), %g1
c0c: c2 08 60 00 ldub [ %g1 ], %g1
c10: 80 a0 60 02 cmp %g1, 2
c14: 08 48 00 0c bleu %icc, c44 <jbd2_journal_commit_transaction+0x4c0>
c18: 11 00 00 00 sethi %hi(0), %o0
c1c: 13 00 00 00 sethi %hi(0), %o1
c20: 17 00 00 00 sethi %hi(0), %o3
c24: 90 12 20 00 mov %o0, %o0
c28: 92 12 60 00 mov %o1, %o1
c2c: 96 12 e0 00 mov %o3, %o3
c30: 40 00 00 00 call c30 <jbd2_journal_commit_transaction+0x4ac>
c34: 94 10 21 f7 mov 0x1f7, %o2
c38: 11 00 00 00 sethi %hi(0), %o0
c3c: 40 00 00 00 call c3c <jbd2_journal_commit_transaction+0x4b8>
c40: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
/*
* Way to go: we have now written out all of the data for a
* transaction! Now comes the tricky part: we need to write out
* metadata. Loop over the transaction's entire buffer list:
*/
spin_lock(&journal->j_state_lock);
c44: 40 00 00 00 call c44 <jbd2_journal_commit_transaction+0x4c0>
c48: 90 10 00 1a mov %i2, %o0
commit_transaction->t_state = T_COMMIT;
c4c: 82 10 20 04 mov 4, %g1
spin_unlock(&journal->j_state_lock);
c50: 90 10 00 1a mov %i2, %o0
c54: 40 00 00 00 call c54 <jbd2_journal_commit_transaction+0x4d0>
c58: c2 24 e0 0c st %g1, [ %l3 + 0xc ]
stats.u.run.rs_logging = jiffies;
c5c: 03 00 00 00 sethi %hi(0), %g1
stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
c60: c6 5f a7 87 ldx [ %fp + 0x787 ], %g3
*/
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_COMMIT;
spin_unlock(&journal->j_state_lock);
stats.u.run.rs_logging = jiffies;
c64: c4 58 60 00 ldx [ %g1 ], %g2
return end + (MAX_JIFFY_OFFSET - start);
c68: 82 10 3f ff mov -1, %g1
c6c: 83 28 70 3e sllx %g1, 0x3e, %g1
c70: 82 18 7f fe xor %g1, -2, %g1
c74: c4 77 a7 8f stx %g2, [ %fp + 0x78f ]
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
c78: 80 a0 80 03 cmp %g2, %g3
return end + (MAX_JIFFY_OFFSET - start);
c7c: 82 00 80 01 add %g2, %g1, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
c80: 84 20 80 03 sub %g2, %g3, %g2
return end + (MAX_JIFFY_OFFSET - start);
c84: 82 20 40 03 sub %g1, %g3, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
c88: 83 67 50 02 movcc %xcc, %g2, %g1
stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
c8c: c2 77 a7 87 stx %g1, [ %fp + 0x787 ]
stats.u.run.rs_logging);
stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
c90: c2 44 e0 d4 ldsw [ %l3 + 0xd4 ], %g1
stats.u.run.rs_blocks_logged = 0;
c94: c0 77 a7 a7 clrx [ %fp + 0x7a7 ]
spin_unlock(&journal->j_state_lock);
stats.u.run.rs_logging = jiffies;
stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
stats.u.run.rs_logging);
stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
c98: c2 77 a7 9f stx %g1, [ %fp + 0x79f ]
stats.u.run.rs_blocks_logged = 0;
J_ASSERT(commit_transaction->t_nr_buffers <=
c9c: c4 04 e0 18 ld [ %l3 + 0x18 ], %g2
ca0: c2 04 e0 d4 ld [ %l3 + 0xd4 ], %g1
ca4: 80 a0 80 01 cmp %g2, %g1
ca8: 14 40 00 0a bg,pn %icc, cd0 <jbd2_journal_commit_transaction+0x54c>
cac: 84 06 25 b8 add %i0, 0x5b8, %g2
tag->t_flags = cpu_to_be32(tag_flag);
tagp += tag_bytes;
space_left -= tag_bytes;
if (first_tag) {
memcpy (tagp, journal->j_uuid, 16);
cb0: ac 10 20 00 clr %l6
cb4: c4 77 a7 47 stx %g2, [ %fp + 0x747 ]
cb8: a8 10 20 00 clr %l4
cbc: aa 10 20 00 clr %l5
cc0: ae 10 20 00 clr %l7
cc4: ba 10 20 00 clr %i5
cc8: 10 68 00 f3 b %xcc, 1094 <jbd2_journal_commit_transaction+0x910>
ccc: b2 10 3f ff mov -1, %i1
stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
stats.u.run.rs_logging);
stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
stats.u.run.rs_blocks_logged = 0;
J_ASSERT(commit_transaction->t_nr_buffers <=
cd0: 10 6f fe e5 b %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
cd4: 92 10 22 09 mov 0x209, %o1
jh = commit_transaction->t_buffers;
/* If we're in abort mode, we just un-journal the buffer and
release it. */
if (is_journal_aborted(journal)) {
cd8: 80 88 60 02 btst 2, %g1
cdc: 02 68 00 14 be %xcc, d2c <jbd2_journal_commit_transaction+0x5a8>
ce0: 01 00 00 00 nop
BH_JBDPrivateStart, /* First bit available for private use by FS */
};
BUFFER_FNS(JBD, jbd)
BUFFER_FNS(JWrite, jwrite)
BUFFER_FNS(JBDDirty, jbddirty)
ce4: d2 5c 80 00 ldx [ %l2 ], %o1
ce8: 40 00 00 00 call ce8 <jbd2_journal_commit_transaction+0x564>
cec: 90 10 20 15 mov 0x15, %o0
clear_buffer_jbddirty(jh2bh(jh));
JBUFFER_TRACE(jh, "journal is aborting: refile");
jbd2_buffer_abort_trigger(jh,
cf0: c4 5c a0 18 ldx [ %l2 + 0x18 ], %g2
cf4: 86 04 a0 60 add %l2, 0x60, %g3
cf8: 82 04 a0 68 add %l2, 0x68, %g1
cfc: 90 10 00 12 mov %l2, %o0
d00: 83 78 84 03 movre %g2, %g3, %g1
d04: 40 00 00 00 call d04 <jbd2_journal_commit_transaction+0x580>
d08: d2 58 40 00 ldx [ %g1 ], %o1
jh->b_frozen_data ?
jh->b_frozen_triggers :
jh->b_triggers);
jbd2_journal_refile_buffer(journal, jh);
d0c: 90 10 00 18 mov %i0, %o0
d10: 40 00 00 00 call d10 <jbd2_journal_commit_transaction+0x58c>
d14: 92 10 00 12 mov %l2, %o1
/* If that was the last one, we need to clean up
* any descriptor buffers which may have been
* already allocated, even if we are now
* aborting. */
if (!commit_transaction->t_buffers)
d18: c2 5c e0 28 ldx [ %l3 + 0x28 ], %g1
d1c: 2a c8 40 df brnz,a %g1, 1098 <jbd2_journal_commit_transaction+0x914>
d20: e4 5c e0 28 ldx [ %l3 + 0x28 ], %l2
submitting the IOs. "tag" still points to
the last tag we set up. */
tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
start_journal_io:
d24: 10 68 00 aa b %xcc, fcc <jbd2_journal_commit_transaction+0x848>
d28: e4 5f a7 4f ldx [ %fp + 0x74f ], %l2
}
/* Make sure we have a descriptor block in which to
record the metadata buffer. */
if (!descriptor) {
d2c: 0a cd 80 4a brnz %l6, e54 <jbd2_journal_commit_transaction+0x6d0>
d30: 90 10 00 18 mov %i0, %o0
struct buffer_head *bh;
J_ASSERT (bufs == 0);
d34: 80 a5 20 00 cmp %l4, 0
d38: 02 48 00 04 be %icc, d48 <jbd2_journal_commit_transaction+0x5c4>
d3c: 07 00 00 00 sethi %hi(0), %g3
d40: 10 6f fe c9 b %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
d44: 92 10 22 2e mov 0x22e, %o1
jbd_debug(4, "JBD: get descriptor\n");
d48: 86 10 e0 00 mov %g3, %g3
d4c: c2 08 c0 00 ldub [ %g3 ], %g1
d50: 80 a0 60 03 cmp %g1, 3
d54: 08 48 00 0c bleu %icc, d84 <jbd2_journal_commit_transaction+0x600>
d58: 13 00 00 00 sethi %hi(0), %o1
d5c: 11 00 00 00 sethi %hi(0), %o0
d60: 17 00 00 00 sethi %hi(0), %o3
d64: 90 12 20 00 mov %o0, %o0
d68: 92 12 60 00 mov %o1, %o1
d6c: 94 10 22 30 mov 0x230, %o2
d70: 40 00 00 00 call d70 <jbd2_journal_commit_transaction+0x5ec>
d74: 96 12 e0 00 mov %o3, %o3
d78: 11 00 00 00 sethi %hi(0), %o0
d7c: 40 00 00 00 call d7c <jbd2_journal_commit_transaction+0x5f8>
d80: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
descriptor = jbd2_journal_get_descriptor_buffer(journal);
d84: 40 00 00 00 call d84 <jbd2_journal_commit_transaction+0x600>
d88: 90 10 00 18 mov %i0, %o0
d8c: ac 10 00 08 mov %o0, %l6
if (!descriptor) {
jbd2_journal_abort(journal, -EIO);
d90: 92 10 3f fb mov -5, %o1
J_ASSERT (bufs == 0);
jbd_debug(4, "JBD: get descriptor\n");
descriptor = jbd2_journal_get_descriptor_buffer(journal);
if (!descriptor) {
d94: 02 c5 80 37 brz,pn %l6, e70 <jbd2_journal_commit_transaction+0x6ec>
d98: 90 10 00 18 mov %i0, %o0
jbd2_journal_abort(journal, -EIO);
continue;
}
bh = jh2bh(descriptor);
jbd_debug(4, "JBD: got buffer %llu (%p)\n",
d9c: 05 00 00 00 sethi %hi(0), %g2
da0: 84 10 a0 00 mov %g2, %g2 ! 0 <write_tag_block>
da4: c2 08 80 00 ldub [ %g2 ], %g1
da8: 80 a0 60 03 cmp %g1, 3
dac: 08 48 00 0f bleu %icc, de8 <jbd2_journal_commit_transaction+0x664>
db0: e0 5d 80 00 ldx [ %l6 ], %l0
db4: 13 00 00 00 sethi %hi(0), %o1
db8: 11 00 00 00 sethi %hi(0), %o0
dbc: 17 00 00 00 sethi %hi(0), %o3
dc0: 92 12 60 00 mov %o1, %o1
dc4: 94 10 22 3a mov 0x23a, %o2
dc8: 90 12 20 00 mov %o0, %o0
dcc: 40 00 00 00 call dcc <jbd2_journal_commit_transaction+0x648>
dd0: 96 12 e0 00 mov %o3, %o3
dd4: 11 00 00 00 sethi %hi(0), %o0
dd8: d2 5c 20 18 ldx [ %l0 + 0x18 ], %o1
ddc: d4 5c 20 28 ldx [ %l0 + 0x28 ], %o2
de0: 40 00 00 00 call de0 <jbd2_journal_commit_transaction+0x65c>
de4: 90 12 20 00 mov %o0, %o0
(unsigned long long)bh->b_blocknr, bh->b_data);
header = (journal_header_t *)&bh->b_data[0];
de8: c4 5c 20 28 ldx [ %l0 + 0x28 ], %g2
header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
dec: 07 30 0e ce sethi %hi(0xc03b3800), %g3
header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
df0: 82 10 20 01 mov 1, %g1
bh = jh2bh(descriptor);
jbd_debug(4, "JBD: got buffer %llu (%p)\n",
(unsigned long long)bh->b_blocknr, bh->b_data);
header = (journal_header_t *)&bh->b_data[0];
header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
df4: 86 10 e1 98 or %g3, 0x198, %g3
BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */
BH_JBDPrivateStart, /* First bit available for private use by FS */
};
BUFFER_FNS(JBD, jbd)
BUFFER_FNS(JWrite, jwrite)
df8: 90 10 20 11 mov 0x11, %o0
dfc: c6 20 80 00 st %g3, [ %g2 ]
e00: 92 10 00 10 mov %l0, %o1
wbuf[bufs++] = bh;
/* Record it so that we can wait for IO
completion later */
BUFFER_TRACE(bh, "ph3: file as descriptor");
jbd2_journal_file_buffer(descriptor, commit_transaction,
e04: a8 10 20 01 mov 1, %l4
bh = jh2bh(descriptor);
jbd_debug(4, "JBD: got buffer %llu (%p)\n",
(unsigned long long)bh->b_blocknr, bh->b_data);
header = (journal_header_t *)&bh->b_data[0];
header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
e08: c2 20 a0 04 st %g1, [ %g2 + 4 ]
wbuf[bufs++] = bh;
/* Record it so that we can wait for IO
completion later */
BUFFER_TRACE(bh, "ph3: file as descriptor");
jbd2_journal_file_buffer(descriptor, commit_transaction,
e0c: ba 10 20 01 mov 1, %i5
jbd_debug(4, "JBD: got buffer %llu (%p)\n",
(unsigned long long)bh->b_blocknr, bh->b_data);
header = (journal_header_t *)&bh->b_data[0];
header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
e10: c2 04 e0 08 ld [ %l3 + 8 ], %g1
e14: c2 20 a0 08 st %g1, [ %g2 + 8 ]
tagp = &bh->b_data[sizeof(journal_header_t)];
e18: c2 5c 20 28 ldx [ %l0 + 0x28 ], %g1
space_left = bh->b_size - sizeof(journal_header_t);
e1c: c4 5c 20 20 ldx [ %l0 + 0x20 ], %g2
header = (journal_header_t *)&bh->b_data[0];
header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK);
header->h_sequence = cpu_to_be32(commit_transaction->t_tid);
tagp = &bh->b_data[sizeof(journal_header_t)];
e20: aa 00 60 0c add %g1, 0xc, %l5
e24: 40 00 00 00 call e24 <jbd2_journal_commit_transaction+0x6a0>
e28: ae 00 bf f4 add %g2, -12, %l7
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
BUFFER_FNS(Dirty, dirty)
e2c: 90 10 20 01 mov 1, %o0
e30: 40 00 00 00 call e30 <jbd2_journal_commit_transaction+0x6ac>
e34: 92 10 00 10 mov %l0, %o1
space_left = bh->b_size - sizeof(journal_header_t);
first_tag = 1;
set_buffer_jwrite(bh);
set_buffer_dirty(bh);
wbuf[bufs++] = bh;
e38: c2 5f a7 4f ldx [ %fp + 0x74f ], %g1
/* Record it so that we can wait for IO
completion later */
BUFFER_TRACE(bh, "ph3: file as descriptor");
jbd2_journal_file_buffer(descriptor, commit_transaction,
e3c: 90 10 00 16 mov %l6, %o0
e40: 92 10 00 13 mov %l3, %o1
e44: 94 10 20 05 mov 5, %o2
e48: 40 00 00 00 call e48 <jbd2_journal_commit_transaction+0x6c4>
e4c: e0 70 40 00 stx %l0, [ %g1 ]
BJ_LogCtl);
}
/* Where is the buffer to be written? */
err = jbd2_journal_next_log_block(journal, &blocknr);
e50: 90 10 00 18 mov %i0, %o0
e54: 40 00 00 00 call e54 <jbd2_journal_commit_transaction+0x6d0>
e58: 92 07 a7 df add %fp, 0x7df, %o1
/* If the block mapping failed, just abandon the buffer
and repeat this loop: we'll fall into the
refile-on-abort condition above. */
if (err) {
e5c: 80 a2 20 00 cmp %o0, 0
e60: 22 48 00 08 be,a %icc, e80 <jbd2_journal_commit_transaction+0x6fc>
e64: c2 04 e0 d4 ld [ %l3 + 0xd4 ], %g1
jbd2_journal_abort(journal, err);
e68: 93 3a 20 00 sra %o0, 0, %o1
e6c: 90 10 00 18 mov %i0, %o0
e70: 40 00 00 00 call e70 <jbd2_journal_commit_transaction+0x6ec>
e74: 01 00 00 00 nop
commit_transaction->t_outstanding_credits);
err = 0;
descriptor = NULL;
bufs = 0;
while (commit_transaction->t_buffers) {
e78: 10 68 00 88 b %xcc, 1098 <jbd2_journal_commit_transaction+0x914>
e7c: e4 5c e0 28 ldx [ %l3 + 0x28 ], %l2
commit_transaction->t_outstanding_credits--;
/* Bump b_count to prevent truncate from stumbling over
the shadowed buffer! @@@ This can go if we ever get
rid of the BJ_IO/BJ_Shadow pairing of buffers. */
atomic_inc(&jh2bh(jh)->b_count);
e80: 90 10 20 01 mov 1, %o0
if (flags & 1)
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
tag = (journal_block_tag_t *) tagp;
e84: b8 10 00 15 mov %l5, %i4
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
tag->t_flags = cpu_to_be32(tag_flag);
tagp += tag_bytes;
space_left -= tag_bytes;
e88: c4 07 a7 5b ld [ %fp + 0x75b ], %g2
/*
* start_this_handle() uses t_outstanding_credits to determine
* the free space in the log, but this counter is changed
* by jbd2_journal_next_log_block() also.
*/
commit_transaction->t_outstanding_credits--;
e8c: 82 00 7f ff add %g1, -1, %g1
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
e90: e2 47 a7 5b ldsw [ %fp + 0x75b ], %l1
/*
* start_this_handle() uses t_outstanding_credits to determine
* the free space in the log, but this counter is changed
* by jbd2_journal_next_log_block() also.
*/
commit_transaction->t_outstanding_credits--;
e94: c2 24 e0 d4 st %g1, [ %l3 + 0xd4 ]
tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
tag->t_flags = cpu_to_be32(tag_flag);
tagp += tag_bytes;
space_left -= tag_bytes;
e98: ae 25 c0 02 sub %l7, %g2, %l7
commit_transaction->t_outstanding_credits--;
/* Bump b_count to prevent truncate from stumbling over
the shadowed buffer! @@@ This can go if we ever get
rid of the BJ_IO/BJ_Shadow pairing of buffers. */
atomic_inc(&jh2bh(jh)->b_count);
e9c: d2 5c 80 00 ldx [ %l2 ], %o1
ea0: 40 00 00 00 call ea0 <jbd2_journal_commit_transaction+0x71c>
ea4: 92 02 60 60 add %o1, 0x60, %o1
/* Make a temporary IO buffer with which to write it out
(this will requeue both the metadata buffer and the
temporary IO buffer). new_bh goes on BJ_IO*/
set_bit(BH_JWrite, &jh2bh(jh)->b_state);
ea8: d2 5c 80 00 ldx [ %l2 ], %o1
eac: 40 00 00 00 call eac <jbd2_journal_commit_transaction+0x728>
eb0: 90 10 20 11 mov 0x11, %o0
* new_bh->b_transaction to commit_transaction.
* We need to clean this up before we release new_bh
* (which is of type BJ_IO)
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
eb4: d6 5f a7 df ldx [ %fp + 0x7df ], %o3
eb8: 94 07 a7 e7 add %fp, 0x7e7, %o2
ebc: 92 10 00 12 mov %l2, %o1
ec0: 40 00 00 00 call ec0 <jbd2_journal_commit_transaction+0x73c>
ec4: 90 10 00 13 mov %l3, %o0
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
ec8: c2 5f a7 e7 ldx [ %fp + 0x7e7 ], %g1
* new_bh->b_transaction to commit_transaction.
* We need to clean this up before we release new_bh
* (which is of type BJ_IO)
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
ecc: a0 10 00 08 mov %o0, %l0
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
ed0: 90 10 20 11 mov 0x11, %o0
wbuf[bufs++] = jh2bh(new_jh);
ed4: a0 0c 20 01 and %l0, 1, %l0
* (which is of type BJ_IO)
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
ed8: 40 00 00 00 call ed8 <jbd2_journal_commit_transaction+0x754>
edc: d2 58 40 00 ldx [ %g1 ], %o1
tag_flag = 0;
if (flags & 1)
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
ee0: 80 a7 60 00 cmp %i5, 0
ee4: 82 14 20 02 or %l0, 2, %g1
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
wbuf[bufs++] = jh2bh(new_jh);
ee8: c6 5f a7 4f ldx [ %fp + 0x74f ], %g3
tag_flag = 0;
if (flags & 1)
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
eec: a1 64 40 01 move %icc, %g1, %l0
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
wbuf[bufs++] = jh2bh(new_jh);
ef0: 85 3d 20 00 sra %l4, 0, %g2
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
ef4: 92 10 00 15 mov %l5, %o1
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
wbuf[bufs++] = jh2bh(new_jh);
ef8: c2 5f a7 e7 ldx [ %fp + 0x7e7 ], %g1
efc: 85 28 b0 03 sllx %g2, 3, %g2
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
f00: 90 10 00 11 mov %l1, %o0
*/
JBUFFER_TRACE(jh, "ph3: write metadata");
flags = jbd2_journal_write_metadata_buffer(commit_transaction,
jh, &new_jh, blocknr);
set_bit(BH_JWrite, &jh2bh(new_jh)->b_state);
wbuf[bufs++] = jh2bh(new_jh);
f04: a8 05 20 01 inc %l4
f08: c2 58 40 00 ldx [ %g1 ], %g1
f0c: c2 70 c0 02 stx %g1, [ %g3 + %g2 ]
tag_flag |= JBD2_FLAG_ESCAPE;
if (!first_tag)
tag_flag |= JBD2_FLAG_SAME_UUID;
tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
f10: c2 5c 80 00 ldx [ %l2 ], %g1
f14: 7f ff fc 3b call 0 <write_tag_block>
f18: d4 58 60 18 ldx [ %g1 + 0x18 ], %o2
tag->t_flags = cpu_to_be32(tag_flag);
f1c: e0 25 60 04 st %l0, [ %l5 + 4 ]
tagp += tag_bytes;
space_left -= tag_bytes;
if (first_tag) {
f20: 80 a7 60 00 cmp %i5, 0
f24: 02 48 00 08 be %icc, f44 <jbd2_journal_commit_transaction+0x7c0>
f28: aa 05 40 11 add %l5, %l1, %l5
memcpy (tagp, journal->j_uuid, 16);
f2c: d2 5f a7 47 ldx [ %fp + 0x747 ], %o1
f30: 90 10 00 15 mov %l5, %o0
f34: 94 10 20 10 mov 0x10, %o2
tagp += 16;
f38: aa 05 60 10 add %l5, 0x10, %l5
tag->t_flags = cpu_to_be32(tag_flag);
tagp += tag_bytes;
space_left -= tag_bytes;
if (first_tag) {
memcpy (tagp, journal->j_uuid, 16);
f3c: 40 00 00 00 call f3c <jbd2_journal_commit_transaction+0x7b8>
f40: ae 05 ff f0 add %l7, -16, %l7
}
/* If there's no more to do, or if the descriptor is full,
let the IO rip! */
if (bufs == journal->j_wbufsize ||
f44: c2 06 26 60 ld [ %i0 + 0x660 ], %g1
f48: 80 a5 00 01 cmp %l4, %g1
f4c: 02 40 00 0a be,pn %icc, f74 <jbd2_journal_commit_transaction+0x7f0>
f50: 07 00 00 00 sethi %hi(0), %g3
f54: c2 5c e0 28 ldx [ %l3 + 0x28 ], %g1
f58: 02 c0 40 07 brz,pn %g1, f74 <jbd2_journal_commit_transaction+0x7f0>
f5c: c4 07 a7 5b ld [ %fp + 0x75b ], %g2
f60: 82 00 a0 10 add %g2, 0x10, %g1
f64: 80 a5 c0 01 cmp %l7, %g1
f68: 16 48 00 4b bge %icc, 1094 <jbd2_journal_commit_transaction+0x910>
f6c: ba 10 20 00 clr %i5
commit_transaction->t_buffers == NULL ||
space_left < tag_bytes + 16) {
jbd_debug(4, "JBD: Submit %d IOs\n", bufs);
f70: 07 00 00 00 sethi %hi(0), %g3
f74: 86 10 e0 00 mov %g3, %g3 ! 0 <write_tag_block>
f78: c2 08 c0 00 ldub [ %g3 ], %g1
f7c: 80 a0 60 03 cmp %g1, 3
f80: 28 48 00 0f bleu,a %icc, fbc <jbd2_journal_commit_transaction+0x838>
f84: c2 07 20 04 ld [ %i4 + 4 ], %g1
f88: 13 00 00 00 sethi %hi(0), %o1
f8c: 11 00 00 00 sethi %hi(0), %o0
f90: 17 00 00 00 sethi %hi(0), %o3
f94: 92 12 60 00 mov %o1, %o1
f98: 90 12 20 00 mov %o0, %o0
f9c: 94 10 22 93 mov 0x293, %o2
fa0: 40 00 00 00 call fa0 <jbd2_journal_commit_transaction+0x81c>
fa4: 96 12 e0 00 mov %o3, %o3
fa8: 11 00 00 00 sethi %hi(0), %o0
fac: 93 3d 20 00 sra %l4, 0, %o1
fb0: 40 00 00 00 call fb0 <jbd2_journal_commit_transaction+0x82c>
fb4: 90 12 20 00 mov %o0, %o0
/* Write an end-of-descriptor marker before
submitting the IOs. "tag" still points to
the last tag we set up. */
tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
fb8: c2 07 20 04 ld [ %i4 + 4 ], %g1
fbc: ba 10 20 00 clr %i5
fc0: 82 10 60 08 or %g1, 8, %g1
fc4: c2 27 20 04 st %g1, [ %i4 + 4 ]
start_journal_io:
fc8: e4 5f a7 4f ldx [ %fp + 0x74f ], %l2
fcc: 10 68 00 28 b %xcc, 106c <jbd2_journal_commit_transaction+0x8e8>
fd0: a2 10 20 00 clr %l1
for (i = 0; i < bufs; i++) {
struct buffer_head *bh = wbuf[i];
/*
* Compute checksum.
*/
if (JBD2_HAS_COMPAT_FEATURE(journal,
fd4: 80 a0 60 01 cmp %g1, 1
fd8: 04 40 00 0b ble,pn %icc, 1004 <jbd2_journal_commit_transaction+0x880>
fdc: e0 5c 80 00 ldx [ %l2 ], %l0
fe0: c2 5e 20 18 ldx [ %i0 + 0x18 ], %g1
fe4: c2 00 60 24 ld [ %g1 + 0x24 ], %g1
fe8: 80 88 60 01 btst 1, %g1
fec: 22 68 00 07 be,a %xcc, 1008 <jbd2_journal_commit_transaction+0x884>
ff0: 11 00 00 00 sethi %hi(0), %o0
JBD2_FEATURE_COMPAT_CHECKSUM)) {
crc32_sum =
ff4: 91 36 60 00 srl %i1, 0, %o0
ff8: 7f ff fc 5b call 164 <jbd2_checksum_data>
ffc: 92 10 00 10 mov %l0, %o1
1000: b2 10 00 08 mov %o0, %i1
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
1004: 11 00 00 00 sethi %hi(0), %o0
1008: 92 10 21 4b mov 0x14b, %o1
100c: 40 00 00 00 call 100c <jbd2_journal_commit_transaction+0x888>
1010: 90 12 20 00 mov %o0, %o0
__wait_on_buffer(bh);
}
static inline int trylock_buffer(struct buffer_head *bh)
{
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
1014: 90 10 20 02 mov 2, %o0
1018: 40 00 00 00 call 1018 <jbd2_journal_commit_transaction+0x894>
101c: 92 10 00 10 mov %l0, %o1
}
static inline void lock_buffer(struct buffer_head *bh)
{
might_sleep();
if (!trylock_buffer(bh))
1020: 80 a2 20 00 cmp %o0, 0
1024: 02 48 00 05 be %icc, 1038 <jbd2_journal_commit_transaction+0x8b4>
1028: 90 10 20 01 mov 1, %o0
__lock_buffer(bh);
102c: 40 00 00 00 call 102c <jbd2_journal_commit_transaction+0x8a8>
1030: 90 10 00 10 mov %l0, %o0
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
BUFFER_FNS(Dirty, dirty)
1034: 90 10 20 01 mov 1, %o0
1038: 40 00 00 00 call 1038 <jbd2_journal_commit_transaction+0x8b4>
103c: 92 10 00 10 mov %l0, %o1
the last tag we set up. */
tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
start_journal_io:
for (i = 0; i < bufs; i++) {
1040: a2 04 60 01 inc %l1
1044: a4 04 a0 08 add %l2, 8, %l2
/*
* Emit the buffer bitops functions. Note that there are also functions
* of the form "mark_buffer_foo()". These are higher-level functions which
* do something in addition to setting a b_state bit.
*/
BUFFER_FNS(Uptodate, uptodate)
1048: 90 10 20 00 clr %o0
104c: 40 00 00 00 call 104c <jbd2_journal_commit_transaction+0x8c8>
1050: 92 10 00 10 mov %l0, %o1
}
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
1054: 03 00 00 00 sethi %hi(0), %g1
submit_bh(WRITE, bh);
1058: 92 10 00 10 mov %l0, %o1
}
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
105c: 82 10 60 00 mov %g1, %g1
submit_bh(WRITE, bh);
1060: 90 10 20 01 mov 1, %o0
1064: 40 00 00 00 call 1064 <jbd2_journal_commit_transaction+0x8e0>
1068: c2 74 20 38 stx %g1, [ %l0 + 0x38 ]
the last tag we set up. */
tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
start_journal_io:
for (i = 0; i < bufs; i++) {
106c: 80 a4 40 14 cmp %l1, %l4
1070: 26 4f ff d9 bl,a %icc, fd4 <jbd2_journal_commit_transaction+0x850>
1074: c2 06 20 20 ld [ %i0 + 0x20 ], %g1
return 0;
}
#else
static inline int cond_resched(void)
{
return _cond_resched();
1078: 40 00 00 00 call 1078 <jbd2_journal_commit_transaction+0x8f4>
107c: ac 10 20 00 clr %l6
set_buffer_uptodate(bh);
bh->b_end_io = journal_end_buffer_io_sync;
submit_bh(WRITE, bh);
}
cond_resched();
stats.u.run.rs_blocks_logged += bufs;
1080: c2 5f a7 a7 ldx [ %fp + 0x7a7 ], %g1
1084: 85 3d 20 00 sra %l4, 0, %g2
1088: a8 10 20 00 clr %l4
108c: 82 00 40 02 add %g1, %g2, %g1
1090: c2 77 a7 a7 stx %g1, [ %fp + 0x7a7 ]
commit_transaction->t_outstanding_credits);
err = 0;
descriptor = NULL;
bufs = 0;
while (commit_transaction->t_buffers) {
1094: e4 5c e0 28 ldx [ %l3 + 0x28 ], %l2
1098: 2a fc bf 10 brnz,a %l2, cd8 <jbd2_journal_commit_transaction+0x554>
109c: c2 5e 00 00 ldx [ %i0 ], %g1
}
}
/* Done it all: now write the commit record asynchronously. */
if (JBD2_HAS_INCOMPAT_FEATURE(journal,
10a0: c2 06 20 20 ld [ %i0 + 0x20 ], %g1
10a4: 80 a0 60 01 cmp %g1, 1
10a8: 04 40 00 10 ble,pn %icc, 10e8 <jbd2_journal_commit_transaction+0x964>
10ac: 90 10 00 18 mov %i0, %o0
10b0: c2 5e 20 18 ldx [ %i0 + 0x18 ], %g1
10b4: c2 00 60 28 ld [ %g1 + 0x28 ], %g1
10b8: 80 88 60 04 btst 4, %g1
10bc: 02 68 00 0b be %xcc, 10e8 <jbd2_journal_commit_transaction+0x964>
10c0: 92 10 00 13 mov %l3, %o1
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
err = journal_submit_commit_record(journal, commit_transaction,
10c4: 94 07 a7 d7 add %fp, 0x7d7, %o2
10c8: 7f ff fc 8b call 2f4 <journal_submit_commit_record>
10cc: 97 36 60 00 srl %i1, 0, %o3
&cbh, crc32_sum);
if (err)
10d0: 80 a2 20 00 cmp %o0, 0
10d4: 02 48 00 05 be %icc, 10e8 <jbd2_journal_commit_transaction+0x964>
10d8: 90 10 00 18 mov %i0, %o0
__jbd2_journal_abort_hard(journal);
10dc: 40 00 00 00 call 10dc <jbd2_journal_commit_transaction+0x958>
10e0: 90 10 00 18 mov %i0, %o0
* and !ASYNC commit. If commit is ASYNC, we need to wait only after
* the commit block went to disk (which happens above). If commit is
* SYNC, we need to wait for data buffers before we start writing
* commit block, which happens below in such setting.
*/
err = journal_finish_inode_data_buffers(journal, commit_transaction);
10e4: 90 10 00 18 mov %i0, %o0
10e8: 7f ff fc 3a call 1d0 <journal_finish_inode_data_buffers>
10ec: 92 10 00 13 mov %l3, %o1
if (err) {
10f0: a4 92 20 00 orcc %o0, 0, %l2
10f4: 02 48 00 0f be %icc, 1130 <jbd2_journal_commit_transaction+0x9ac>
10f8: 03 00 00 00 sethi %hi(0), %g1
printk(KERN_WARNING
10fc: 11 00 00 00 sethi %hi(0), %o0
1100: 92 06 25 28 add %i0, 0x528, %o1
1104: 40 00 00 00 call 1104 <jbd2_journal_commit_transaction+0x980>
1108: 90 12 20 00 mov %o0, %o0
"JBD2: Detected IO errors while flushing file data "
"on %s\n", journal->j_devname);
if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
110c: c2 5e 00 00 ldx [ %i0 ], %g1
1110: 82 08 60 40 and %g1, 0x40, %g1
1114: 22 c8 40 06 brz,a %g1, 112c <jbd2_journal_commit_transaction+0x9a8>
1118: a4 10 20 00 clr %l2
jbd2_journal_abort(journal, err);
111c: 93 3c a0 00 sra %l2, 0, %o1
1120: 40 00 00 00 call 1120 <jbd2_journal_commit_transaction+0x99c>
1124: 90 10 00 18 mov %i0, %o0
1128: a4 10 20 00 clr %l2
Wait for the buffers in reverse order. That way we are
less likely to be woken up until all IOs have completed, and
so we incur less scheduling load.
*/
jbd_debug(3, "JBD: commit phase 3\n");
112c: 03 00 00 00 sethi %hi(0), %g1
1130: c2 08 60 00 ldub [ %g1 ], %g1
1134: 80 a0 60 02 cmp %g1, 2
1138: 28 48 00 50 bleu,a %icc, 1278 <jbd2_journal_commit_transaction+0xaf4>
113c: 03 00 00 00 sethi %hi(0), %g1
1140: 11 00 00 00 sethi %hi(0), %o0
1144: 13 00 00 00 sethi %hi(0), %o1
1148: 17 00 00 00 sethi %hi(0), %o3
114c: 92 12 60 00 mov %o1, %o1
1150: 96 12 e0 00 mov %o3, %o3
1154: 94 10 22 dd mov 0x2dd, %o2
1158: 40 00 00 00 call 1158 <jbd2_journal_commit_transaction+0x9d4>
115c: 90 12 20 00 mov %o0, %o0
1160: 11 00 00 00 sethi %hi(0), %o0
1164: 40 00 00 00 call 1164 <jbd2_journal_commit_transaction+0x9e0>
1168: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
* __wait_on_buffer() just to trip a debug check. Because debug code in inline
* functions is bloaty.
*/
static inline void wait_on_buffer(struct buffer_head *bh)
{
might_sleep();
116c: 10 68 00 43 b %xcc, 1278 <jbd2_journal_commit_transaction+0xaf4>
1170: 03 00 00 00 sethi %hi(0), %g1
TAS_BUFFER_FNS(RevokeValid, revokevalid)
BUFFER_FNS(Freed, freed)
static inline struct buffer_head *jh2bh(struct journal_head *jh)
{
return jh->b_bh;
1174: e0 5c 40 00 ldx [ %l1 ], %l0
1178: c2 5c 00 00 ldx [ %l0 ], %g1
while (commit_transaction->t_iobuf_list != NULL) {
struct buffer_head *bh;
jh = commit_transaction->t_iobuf_list->b_tprev;
bh = jh2bh(jh);
if (buffer_locked(bh)) {
117c: 82 08 60 04 and %g1, 4, %g1
1180: 02 c8 40 10 brz %g1, 11c0 <jbd2_journal_commit_transaction+0xa3c>
1184: 90 10 00 14 mov %l4, %o0
1188: 40 00 00 00 call 1188 <jbd2_journal_commit_transaction+0xa04>
118c: 92 10 21 3f mov 0x13f, %o1
1190: c2 5c 00 00 ldx [ %l0 ], %g1
if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
1194: 82 08 60 04 and %g1, 4, %g1
1198: 0a c0 40 06 brnz,pn %g1, 11b0 <jbd2_journal_commit_transaction+0xa2c>
119c: 01 00 00 00 nop
11a0: c2 04 20 60 ld [ %l0 + 0x60 ], %g1
11a4: 80 a0 60 00 cmp %g1, 0
11a8: 32 48 00 37 bne,a %icc, 1284 <jbd2_journal_commit_transaction+0xb00>
11ac: d0 5c e0 48 ldx [ %l3 + 0x48 ], %o0
__wait_on_buffer(bh);
11b0: 40 00 00 00 call 11b0 <jbd2_journal_commit_transaction+0xa2c>
11b4: 90 10 00 10 mov %l0, %o0
/*
* akpm: these are BJ_IO, and j_list_lock is not needed.
* See __journal_try_to_free_buffer.
*/
wait_for_iobuf:
while (commit_transaction->t_iobuf_list != NULL) {
11b8: 10 68 00 33 b %xcc, 1284 <jbd2_journal_commit_transaction+0xb00>
11bc: d0 5c e0 48 ldx [ %l3 + 0x48 ], %o0
11c0: 40 00 00 00 call 11c0 <jbd2_journal_commit_transaction+0xa3c>
11c4: 01 00 00 00 nop
bh = jh2bh(jh);
if (buffer_locked(bh)) {
wait_on_buffer(bh);
goto wait_for_iobuf;
}
if (cond_resched())
11c8: 80 a2 20 00 cmp %o0, 0
11cc: 32 48 00 2e bne,a %icc, 1284 <jbd2_journal_commit_transaction+0xb00>
11d0: d0 5c e0 48 ldx [ %l3 + 0x48 ], %o0
11d4: c2 5c 00 00 ldx [ %l0 ], %g1
BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */
BH_JBDPrivateStart, /* First bit available for private use by FS */
};
BUFFER_FNS(JBD, jbd)
BUFFER_FNS(JWrite, jwrite)
11d8: 90 10 20 11 mov 0x11, %o0
11dc: 92 10 00 10 mov %l0, %o1
goto wait_for_iobuf;
if (unlikely(!buffer_uptodate(bh)))
11e0: 80 88 60 01 btst 1, %g1
11e4: 40 00 00 00 call 11e4 <jbd2_journal_commit_transaction+0xa60>
11e8: a5 64 77 fb move %xcc, -5, %l2
err = -EIO;
clear_buffer_jwrite(bh);
JBUFFER_TRACE(jh, "ph4: unfile after journal write");
jbd2_journal_unfile_buffer(journal, jh);
11ec: 92 10 00 11 mov %l1, %o1
11f0: 40 00 00 00 call 11f0 <jbd2_journal_commit_transaction+0xa6c>
11f4: 90 10 00 18 mov %i0, %o0
/*
* ->t_iobuf_list should contain only dummy buffer_heads
* which were created by jbd2_journal_write_metadata_buffer().
*/
BUFFER_TRACE(bh, "dumping temporary bh");
jbd2_journal_put_journal_head(jh);
11f8: 40 00 00 00 call 11f8 <jbd2_journal_commit_transaction+0xa74>
11fc: 90 10 00 11 mov %l1, %o0
__brelse(bh);
1200: 40 00 00 00 call 1200 <jbd2_journal_commit_transaction+0xa7c>
1204: 90 10 00 10 mov %l0, %o0
J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
1208: c2 04 20 60 ld [ %l0 + 0x60 ], %g1
120c: 80 a0 60 00 cmp %g1, 0
1210: 12 47 fd 95 bne,pn %icc, 864 <jbd2_journal_commit_transaction+0xe0>
1214: 92 10 22 ff mov 0x2ff, %o1
free_buffer_head(bh);
1218: 40 00 00 00 call 1218 <jbd2_journal_commit_transaction+0xa94>
121c: 90 10 00 10 mov %l0, %o0
/* We also have to unlock and free the corresponding
shadowed buffer */
jh = commit_transaction->t_shadow_list->b_tprev;
1220: c2 5c e0 50 ldx [ %l3 + 0x50 ], %g1
bh = jh2bh(jh);
clear_bit(BH_JWrite, &bh->b_state);
1224: 90 10 20 11 mov 0x11, %o0
J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0);
free_buffer_head(bh);
/* We also have to unlock and free the corresponding
shadowed buffer */
jh = commit_transaction->t_shadow_list->b_tprev;
1228: e2 58 60 40 ldx [ %g1 + 0x40 ], %l1
TAS_BUFFER_FNS(RevokeValid, revokevalid)
BUFFER_FNS(Freed, freed)
static inline struct buffer_head *jh2bh(struct journal_head *jh)
{
return jh->b_bh;
122c: e0 5c 40 00 ldx [ %l1 ], %l0
bh = jh2bh(jh);
clear_bit(BH_JWrite, &bh->b_state);
1230: 40 00 00 00 call 1230 <jbd2_journal_commit_transaction+0xaac>
1234: 92 10 00 10 mov %l0, %o1
1238: c2 5c 00 00 ldx [ %l0 ], %g1
J_ASSERT_BH(bh, buffer_jbddirty(bh));
123c: 82 08 40 15 and %g1, %l5, %g1
1240: 0a c8 40 04 brnz %g1, 1250 <jbd2_journal_commit_transaction+0xacc>
1244: 90 10 00 11 mov %l1, %o0
1248: 10 6f fd 87 b %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
124c: 92 10 23 07 mov 0x307, %o1
/* The metadata is now released for reuse, but we need
to remember it against this transaction so that when
we finally commit, we can do any checkpointing
required. */
JBUFFER_TRACE(jh, "file as BJ_Forget");
jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
1250: 92 10 00 13 mov %l3, %o1
1254: 40 00 00 00 call 1254 <jbd2_journal_commit_transaction+0xad0>
1258: 94 10 20 02 mov 2, %o2
/* Wake up any transactions which were waiting for this
IO to complete */
wake_up_bit(&bh->b_state, BH_Unshadow);
125c: 90 10 00 10 mov %l0, %o0
1260: 40 00 00 00 call 1260 <jbd2_journal_commit_transaction+0xadc>
1264: 92 10 20 18 mov 0x18, %o1
JBUFFER_TRACE(jh, "brelse shadowed buffer");
__brelse(bh);
1268: 40 00 00 00 call 1268 <jbd2_journal_commit_transaction+0xae4>
126c: 90 10 00 10 mov %l0, %o0
/*
* akpm: these are BJ_IO, and j_list_lock is not needed.
* See __journal_try_to_free_buffer.
*/
wait_for_iobuf:
while (commit_transaction->t_iobuf_list != NULL) {
1270: 10 68 00 05 b %xcc, 1284 <jbd2_journal_commit_transaction+0xb00>
1274: d0 5c e0 48 ldx [ %l3 + 0x48 ], %o0
/* We also have to unlock and free the corresponding
shadowed buffer */
jh = commit_transaction->t_shadow_list->b_tprev;
bh = jh2bh(jh);
clear_bit(BH_JWrite, &bh->b_state);
J_ASSERT_BH(bh, buffer_jbddirty(bh));
1278: 2b 00 08 00 sethi %hi(0x200000), %l5
* __wait_on_buffer() just to trip a debug check. Because debug code in inline
* functions is bloaty.
*/
static inline void wait_on_buffer(struct buffer_head *bh)
{
might_sleep();
127c: a8 10 60 00 mov %g1, %l4
/*
* akpm: these are BJ_IO, and j_list_lock is not needed.
* See __journal_try_to_free_buffer.
*/
wait_for_iobuf:
while (commit_transaction->t_iobuf_list != NULL) {
1280: d0 5c e0 48 ldx [ %l3 + 0x48 ], %o0
1284: 2a fa 3f bc brnz,a %o0, 1174 <jbd2_journal_commit_transaction+0x9f0>
1288: e2 5a 20 40 ldx [ %o0 + 0x40 ], %l1
wake_up_bit(&bh->b_state, BH_Unshadow);
JBUFFER_TRACE(jh, "brelse shadowed buffer");
__brelse(bh);
}
J_ASSERT (commit_transaction->t_shadow_list == NULL);
128c: c2 5c e0 50 ldx [ %l3 + 0x50 ], %g1
1290: 0a f0 7d 75 brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
1294: 92 10 23 16 mov 0x316, %o1
jbd_debug(3, "JBD: commit phase 4\n");
1298: 03 00 00 00 sethi %hi(0), %g1
129c: c2 08 60 00 ldub [ %g1 ], %g1
12a0: 80 a0 60 02 cmp %g1, 2
12a4: 28 48 00 36 bleu,a %icc, 137c <jbd2_journal_commit_transaction+0xbf8>
12a8: 03 00 00 00 sethi %hi(0), %g1
12ac: 11 00 00 00 sethi %hi(0), %o0
12b0: 13 00 00 00 sethi %hi(0), %o1
12b4: 17 00 00 00 sethi %hi(0), %o3
12b8: 92 12 60 00 mov %o1, %o1
12bc: 96 12 e0 00 mov %o3, %o3
12c0: 94 10 23 18 mov 0x318, %o2
12c4: 40 00 00 00 call 12c4 <jbd2_journal_commit_transaction+0xb40>
12c8: 90 12 20 00 mov %o0, %o0
12cc: 11 00 00 00 sethi %hi(0), %o0
12d0: 40 00 00 00 call 12d0 <jbd2_journal_commit_transaction+0xb4c>
12d4: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
12d8: 10 68 00 29 b %xcc, 137c <jbd2_journal_commit_transaction+0xbf8>
12dc: 03 00 00 00 sethi %hi(0), %g1
12e0: e0 5c 40 00 ldx [ %l1 ], %l0
12e4: c2 5c 00 00 ldx [ %l0 ], %g1
while (commit_transaction->t_log_list != NULL) {
struct buffer_head *bh;
jh = commit_transaction->t_log_list->b_tprev;
bh = jh2bh(jh);
if (buffer_locked(bh)) {
12e8: 82 08 60 04 and %g1, 4, %g1
12ec: 02 c8 40 10 brz %g1, 132c <jbd2_journal_commit_transaction+0xba8>
12f0: 90 10 00 14 mov %l4, %o0
12f4: 40 00 00 00 call 12f4 <jbd2_journal_commit_transaction+0xb70>
12f8: 92 10 21 3f mov 0x13f, %o1
12fc: c2 5c 00 00 ldx [ %l0 ], %g1
if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
1300: 82 08 60 04 and %g1, 4, %g1
1304: 0a c0 40 06 brnz,pn %g1, 131c <jbd2_journal_commit_transaction+0xb98>
1308: 01 00 00 00 nop
130c: c2 04 20 60 ld [ %l0 + 0x60 ], %g1
1310: 80 a0 60 00 cmp %g1, 0
1314: 32 48 00 1c bne,a %icc, 1384 <jbd2_journal_commit_transaction+0xc00>
1318: d0 5c e0 58 ldx [ %l3 + 0x58 ], %o0
__wait_on_buffer(bh);
131c: 40 00 00 00 call 131c <jbd2_journal_commit_transaction+0xb98>
1320: 90 10 00 10 mov %l0, %o0
jbd_debug(3, "JBD: commit phase 4\n");
/* Here we wait for the revoke record and descriptor record buffers */
wait_for_ctlbuf:
while (commit_transaction->t_log_list != NULL) {
1324: 10 68 00 18 b %xcc, 1384 <jbd2_journal_commit_transaction+0xc00>
1328: d0 5c e0 58 ldx [ %l3 + 0x58 ], %o0
132c: 40 00 00 00 call 132c <jbd2_journal_commit_transaction+0xba8>
1330: 01 00 00 00 nop
bh = jh2bh(jh);
if (buffer_locked(bh)) {
wait_on_buffer(bh);
goto wait_for_ctlbuf;
}
if (cond_resched())
1334: 80 a2 20 00 cmp %o0, 0
1338: 32 48 00 13 bne,a %icc, 1384 <jbd2_journal_commit_transaction+0xc00>
133c: d0 5c e0 58 ldx [ %l3 + 0x58 ], %o0
1340: c2 5c 00 00 ldx [ %l0 ], %g1
BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */
BH_JBDPrivateStart, /* First bit available for private use by FS */
};
BUFFER_FNS(JBD, jbd)
BUFFER_FNS(JWrite, jwrite)
1344: 92 10 00 10 mov %l0, %o1
1348: 90 10 20 11 mov 0x11, %o0
goto wait_for_ctlbuf;
if (unlikely(!buffer_uptodate(bh)))
134c: 80 88 60 01 btst 1, %g1
1350: 40 00 00 00 call 1350 <jbd2_journal_commit_transaction+0xbcc>
1354: a5 64 77 fb move %xcc, -5, %l2
err = -EIO;
BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
clear_buffer_jwrite(bh);
jbd2_journal_unfile_buffer(journal, jh);
1358: 90 10 00 18 mov %i0, %o0
135c: 40 00 00 00 call 135c <jbd2_journal_commit_transaction+0xbd8>
1360: 92 10 00 11 mov %l1, %o1
jbd2_journal_put_journal_head(jh);
1364: 40 00 00 00 call 1364 <jbd2_journal_commit_transaction+0xbe0>
1368: 90 10 00 11 mov %l1, %o0
__brelse(bh); /* One for getblk */
136c: 40 00 00 00 call 136c <jbd2_journal_commit_transaction+0xbe8>
1370: 90 10 00 10 mov %l0, %o0
jbd_debug(3, "JBD: commit phase 4\n");
/* Here we wait for the revoke record and descriptor record buffers */
wait_for_ctlbuf:
while (commit_transaction->t_log_list != NULL) {
1374: 10 68 00 04 b %xcc, 1384 <jbd2_journal_commit_transaction+0xc00>
1378: d0 5c e0 58 ldx [ %l3 + 0x58 ], %o0
* __wait_on_buffer() just to trip a debug check. Because debug code in inline
* functions is bloaty.
*/
static inline void wait_on_buffer(struct buffer_head *bh)
{
might_sleep();
137c: a8 10 60 00 mov %g1, %l4
1380: d0 5c e0 58 ldx [ %l3 + 0x58 ], %o0
1384: 2a fa 3f d7 brnz,a %o0, 12e0 <jbd2_journal_commit_transaction+0xb5c>
1388: e2 5a 20 40 ldx [ %o0 + 0x40 ], %l1
jbd2_journal_put_journal_head(jh);
__brelse(bh); /* One for getblk */
/* AKPM: bforget here */
}
if (err)
138c: 80 a4 a0 00 cmp %l2, 0
1390: 02 48 00 06 be %icc, 13a8 <jbd2_journal_commit_transaction+0xc24>
1394: 03 00 00 00 sethi %hi(0), %g1
jbd2_journal_abort(journal, err);
1398: 90 10 00 18 mov %i0, %o0
139c: 40 00 00 00 call 139c <jbd2_journal_commit_transaction+0xc18>
13a0: 93 3c a0 00 sra %l2, 0, %o1
jbd_debug(3, "JBD: commit phase 5\n");
13a4: 03 00 00 00 sethi %hi(0), %g1
13a8: c2 08 60 00 ldub [ %g1 ], %g1
13ac: 80 a0 60 02 cmp %g1, 2
13b0: 28 48 00 0e bleu,a %icc, 13e8 <jbd2_journal_commit_transaction+0xc64>
13b4: c2 06 20 20 ld [ %i0 + 0x20 ], %g1
13b8: 11 00 00 00 sethi %hi(0), %o0
13bc: 13 00 00 00 sethi %hi(0), %o1
13c0: 17 00 00 00 sethi %hi(0), %o3
13c4: 90 12 20 00 mov %o0, %o0
13c8: 92 12 60 00 mov %o1, %o1
13cc: 96 12 e0 00 mov %o3, %o3
13d0: 40 00 00 00 call 13d0 <jbd2_journal_commit_transaction+0xc4c>
13d4: 94 10 23 36 mov 0x336, %o2
13d8: 11 00 00 00 sethi %hi(0), %o0
13dc: 40 00 00 00 call 13dc <jbd2_journal_commit_transaction+0xc58>
13e0: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
if (!JBD2_HAS_INCOMPAT_FEATURE(journal,
13e4: c2 06 20 20 ld [ %i0 + 0x20 ], %g1
13e8: 80 a0 60 01 cmp %g1, 1
13ec: 04 40 00 08 ble,pn %icc, 140c <jbd2_journal_commit_transaction+0xc88>
13f0: 97 36 60 00 srl %i1, 0, %o3
13f4: c2 5e 20 18 ldx [ %i0 + 0x18 ], %g1
13f8: c2 00 60 28 ld [ %g1 + 0x28 ], %g1
13fc: 80 88 60 04 btst 4, %g1
1400: 12 68 00 0e bne %xcc, 1438 <jbd2_journal_commit_transaction+0xcb4>
1404: 80 a4 a0 00 cmp %l2, 0
JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
err = journal_submit_commit_record(journal, commit_transaction,
1408: 97 36 60 00 srl %i1, 0, %o3
140c: 90 10 00 18 mov %i0, %o0
1410: 92 10 00 13 mov %l3, %o1
1414: 7f ff fb b8 call 2f4 <journal_submit_commit_record>
1418: 94 07 a7 d7 add %fp, 0x7d7, %o2
&cbh, crc32_sum);
if (err)
141c: a4 92 20 00 orcc %o0, 0, %l2
1420: 22 48 00 09 be,a %icc, 1444 <jbd2_journal_commit_transaction+0xcc0>
1424: c2 5e 00 00 ldx [ %i0 ], %g1
__jbd2_journal_abort_hard(journal);
1428: 40 00 00 00 call 1428 <jbd2_journal_commit_transaction+0xca4>
142c: 90 10 00 18 mov %i0, %o0
}
if (!err && !is_journal_aborted(journal))
err = journal_wait_on_commit_record(journal, cbh);
if (err)
jbd2_journal_abort(journal, err);
1430: 10 68 00 0f b %xcc, 146c <jbd2_journal_commit_transaction+0xce8>
1434: 93 3c a0 00 sra %l2, 0, %o1
err = journal_submit_commit_record(journal, commit_transaction,
&cbh, crc32_sum);
if (err)
__jbd2_journal_abort_hard(journal);
}
if (!err && !is_journal_aborted(journal))
1438: 12 48 00 0d bne %icc, 146c <jbd2_journal_commit_transaction+0xce8>
143c: 93 3c a0 00 sra %l2, 0, %o1
1440: c2 5e 00 00 ldx [ %i0 ], %g1
1444: 80 88 60 02 btst 2, %g1
1448: 12 68 00 0c bne %xcc, 1478 <jbd2_journal_commit_transaction+0xcf4>
144c: 03 00 00 00 sethi %hi(0), %g1
err = journal_wait_on_commit_record(journal, cbh);
1450: d2 5f a7 d7 ldx [ %fp + 0x7d7 ], %o1
1454: 7f ff fc 3f call 550 <journal_wait_on_commit_record>
1458: 90 10 00 18 mov %i0, %o0
if (err)
145c: a4 92 20 00 orcc %o0, 0, %l2
1460: 02 48 00 06 be %icc, 1478 <jbd2_journal_commit_transaction+0xcf4>
1464: 03 00 00 00 sethi %hi(0), %g1
jbd2_journal_abort(journal, err);
1468: 93 3c a0 00 sra %l2, 0, %o1
146c: 40 00 00 00 call 146c <jbd2_journal_commit_transaction+0xce8>
1470: 90 10 00 18 mov %i0, %o0
/* End of a transaction! Finally, we can do checkpoint
processing: any buffers committed as a result of this
transaction can be removed from any checkpoint list it was on
before. */
jbd_debug(3, "JBD: commit phase 6\n");
1474: 03 00 00 00 sethi %hi(0), %g1
1478: c2 08 60 00 ldub [ %g1 ], %g1
147c: 80 a0 60 02 cmp %g1, 2
1480: 28 48 00 0e bleu,a %icc, 14b8 <jbd2_journal_commit_transaction+0xd34>
1484: c4 5c e0 60 ldx [ %l3 + 0x60 ], %g2
1488: 11 00 00 00 sethi %hi(0), %o0
148c: 13 00 00 00 sethi %hi(0), %o1
1490: 17 00 00 00 sethi %hi(0), %o3
1494: 90 12 20 00 mov %o0, %o0
1498: 92 12 60 00 mov %o1, %o1
149c: 96 12 e0 00 mov %o3, %o3
14a0: 40 00 00 00 call 14a0 <jbd2_journal_commit_transaction+0xd1c>
14a4: 94 10 23 4a mov 0x34a, %o2
14a8: 11 00 00 00 sethi %hi(0), %o0
14ac: 40 00 00 00 call 14ac <jbd2_journal_commit_transaction+0xd28>
14b0: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
J_ASSERT(list_empty(&commit_transaction->t_inode_list));
14b4: c4 5c e0 60 ldx [ %l3 + 0x60 ], %g2
14b8: 82 04 e0 60 add %l3, 0x60, %g1
14bc: 80 a0 80 01 cmp %g2, %g1
14c0: 12 67 fc e9 bne,pn %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
14c4: 92 10 23 4c mov 0x34c, %o1
J_ASSERT(commit_transaction->t_buffers == NULL);
14c8: c2 5c e0 28 ldx [ %l3 + 0x28 ], %g1
14cc: 0a f0 7c e6 brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
14d0: 92 10 23 4d mov 0x34d, %o1
J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
14d4: c2 5c e0 38 ldx [ %l3 + 0x38 ], %g1
14d8: 0a f0 7c e3 brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
14dc: 92 10 23 4e mov 0x34e, %o1
J_ASSERT(commit_transaction->t_iobuf_list == NULL);
14e0: c2 5c e0 48 ldx [ %l3 + 0x48 ], %g1
14e4: 0a f0 7c e0 brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
14e8: 92 10 23 4f mov 0x34f, %o1
J_ASSERT(commit_transaction->t_shadow_list == NULL);
14ec: c2 5c e0 50 ldx [ %l3 + 0x50 ], %g1
14f0: 0a f0 7c dd brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
14f4: 92 10 23 50 mov 0x350, %o1
J_ASSERT(commit_transaction->t_log_list == NULL);
14f8: c2 5c e0 58 ldx [ %l3 + 0x58 ], %g1
* attempt to acquire the lock bit.
*/
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
while (test_bit(bitnum, addr)) {
14fc: 25 00 10 00 sethi %hi(0x400000), %l2
* that buffer in the future now that the last use has
* been committed. That's not only a performance gain,
* it also stops aliasing problems if the buffer is left
* behind for writeback and gets reallocated for another
* use in a different page. */
if (buffer_freed(bh)) {
1500: 2b 00 01 00 sethi %hi(0x40000), %l5
clear_buffer_freed(bh);
clear_buffer_jbddirty(bh);
}
if (buffer_jbddirty(bh)) {
1504: 29 00 08 00 sethi %hi(0x200000), %l4
J_ASSERT(list_empty(&commit_transaction->t_inode_list));
J_ASSERT(commit_transaction->t_buffers == NULL);
J_ASSERT(commit_transaction->t_checkpoint_list == NULL);
J_ASSERT(commit_transaction->t_iobuf_list == NULL);
J_ASSERT(commit_transaction->t_shadow_list == NULL);
J_ASSERT(commit_transaction->t_log_list == NULL);
1508: 0a f0 7c d7 brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
150c: 92 10 23 51 mov 0x351, %o1
restart_loop:
/*
* As there are other places (journal_unmap_buffer()) adding buffers
* to this list we have to be careful and hold the j_list_lock.
*/
spin_lock(&journal->j_list_lock);
1510: 40 00 00 00 call 1510 <jbd2_journal_commit_transaction+0xd8c>
1514: 90 10 00 1b mov %i3, %o0
while (commit_transaction->t_forget) {
1518: 10 68 00 98 b %xcc, 1778 <jbd2_journal_commit_transaction+0xff4>
151c: e0 5c e0 30 ldx [ %l3 + 0x30 ], %l0
transaction_t *cp_transaction;
struct buffer_head *bh;
jh = commit_transaction->t_forget;
spin_unlock(&journal->j_list_lock);
1520: 40 00 00 00 call 1520 <jbd2_journal_commit_transaction+0xd9c>
1524: 90 10 00 1b mov %i3, %o0
* the body of the outer loop. If it is contended, then
* within the inner loop a non-atomic test is used to
* busywait with less bus contention for a good time to
* attempt to acquire the lock bit.
*/
preempt_disable();
1528: 90 10 20 01 mov 1, %o0
152c: 40 00 00 00 call 152c <jbd2_journal_commit_transaction+0xda8>
1530: e2 5c 00 00 ldx [ %l0 ], %l1
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
1534: 10 68 00 10 b %xcc, 1574 <jbd2_journal_commit_transaction+0xdf0>
1538: 90 10 20 16 mov 0x16, %o0
while (test_bit(bitnum, addr)) {
preempt_enable();
153c: 40 00 00 00 call 153c <jbd2_journal_commit_transaction+0xdb8>
1540: 90 10 20 01 mov 1, %o0
1544: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
1548: 82 08 60 08 and %g1, 8, %g1
154c: 02 c8 40 04 brz %g1, 155c <jbd2_journal_commit_transaction+0xdd8>
1550: 01 00 00 00 nop
1554: 40 00 00 00 call 1554 <jbd2_journal_commit_transaction+0xdd0>
1558: 01 00 00 00 nop
cpu_relax();
preempt_disable();
155c: 40 00 00 00 call 155c <jbd2_journal_commit_transaction+0xdd8>
1560: 90 10 20 01 mov 1, %o0 ! 1 <write_tag_block+0x1>
1564: c2 5c 40 00 ldx [ %l1 ], %g1
* attempt to acquire the lock bit.
*/
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
while (test_bit(bitnum, addr)) {
1568: 82 08 40 12 and %g1, %l2, %g1
156c: 0a f0 7f f4 brnz,pn %g1, 153c <jbd2_journal_commit_transaction+0xdb8>
1570: 90 10 20 16 mov 0x16, %o0
* busywait with less bus contention for a good time to
* attempt to acquire the lock bit.
*/
preempt_disable();
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
while (unlikely(test_and_set_bit_lock(bitnum, addr))) {
1574: 40 00 00 00 call 1574 <jbd2_journal_commit_transaction+0xdf0>
1578: 92 10 00 11 mov %l1, %o1
157c: 80 a2 20 00 cmp %o0, 0
1580: 12 4f ff f9 bne %icc, 1564 <jbd2_journal_commit_transaction+0xde0>
1584: 01 00 00 00 nop
bh = jh2bh(jh);
jbd_lock_bh_state(bh);
J_ASSERT_JH(jh, jh->b_transaction == commit_transaction ||
1588: c4 5c 20 28 ldx [ %l0 + 0x28 ], %g2
158c: 80 a0 80 13 cmp %g2, %l3
1590: 22 68 00 08 be,a %xcc, 15b0 <jbd2_journal_commit_transaction+0xe2c>
1594: d0 5c 20 20 ldx [ %l0 + 0x20 ], %o0
1598: c2 5e 20 d8 ldx [ %i0 + 0xd8 ], %g1
159c: 80 a0 80 01 cmp %g2, %g1
15a0: 22 68 00 04 be,a %xcc, 15b0 <jbd2_journal_commit_transaction+0xe2c>
15a4: d0 5c 20 20 ldx [ %l0 + 0x20 ], %o0
15a8: 10 6f fc af b %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
15ac: 92 10 23 62 mov 0x362, %o1
* Otherwise, we can just throw away the frozen data now.
*
* We also know that the frozen data has already fired
* its triggers if they exist, so we can clear that too.
*/
if (jh->b_committed_data) {
15b0: 02 c2 00 0f brz,pn %o0, 15ec <jbd2_journal_commit_transaction+0xe68>
15b4: 92 10 3f ff mov -1, %o1
/* Pure 2^n version of get_order */
static __inline__ __attribute_const__ int get_order(unsigned long size)
{
int order;
size = (size - 1) >> (PAGE_SHIFT - 1);
15b8: c2 5c 60 20 ldx [ %l1 + 0x20 ], %g1
15bc: 82 00 7f ff add %g1, -1, %g1
15c0: 83 30 70 0c srlx %g1, 0xc, %g1
order = -1;
do {
size >>= 1;
15c4: 83 30 70 01 srlx %g1, 1, %g1
order++;
} while (size);
15c8: 0a f8 7f ff brnz %g1, 15c4 <jbd2_journal_commit_transaction+0xe40>
15cc: 92 02 60 01 inc %o1
return (void *)__get_free_pages(flags, get_order(size));
}
static inline void jbd2_free(void *ptr, size_t size)
{
free_pages((unsigned long)ptr, get_order(size));
15d0: 40 00 00 00 call 15d0 <jbd2_journal_commit_transaction+0xe4c>
15d4: 93 32 60 00 srl %o1, 0, %o1
jbd2_free(jh->b_committed_data, bh->b_size);
jh->b_committed_data = NULL;
if (jh->b_frozen_data) {
15d8: c2 5c 20 18 ldx [ %l0 + 0x18 ], %g1
15dc: 02 c0 40 11 brz,pn %g1, 1620 <jbd2_journal_commit_transaction+0xe9c>
15e0: c0 74 20 20 clrx [ %l0 + 0x20 ]
jh->b_committed_data = jh->b_frozen_data;
15e4: 10 68 00 0d b %xcc, 1618 <jbd2_journal_commit_transaction+0xe94>
15e8: c2 74 20 20 stx %g1, [ %l0 + 0x20 ]
jh->b_frozen_data = NULL;
jh->b_frozen_triggers = NULL;
}
} else if (jh->b_frozen_data) {
15ec: d0 5c 20 18 ldx [ %l0 + 0x18 ], %o0
15f0: 02 c2 00 0c brz,pn %o0, 1620 <jbd2_journal_commit_transaction+0xe9c>
15f4: 01 00 00 00 nop
/* Pure 2^n version of get_order */
static __inline__ __attribute_const__ int get_order(unsigned long size)
{
int order;
size = (size - 1) >> (PAGE_SHIFT - 1);
15f8: c2 5c 60 20 ldx [ %l1 + 0x20 ], %g1
15fc: 82 00 7f ff add %g1, -1, %g1
1600: 83 30 70 0c srlx %g1, 0xc, %g1
order = -1;
do {
size >>= 1;
1604: 83 30 70 01 srlx %g1, 1, %g1
order++;
} while (size);
1608: 0a f8 7f ff brnz %g1, 1604 <jbd2_journal_commit_transaction+0xe80>
160c: 92 02 60 01 inc %o1
1610: 40 00 00 00 call 1610 <jbd2_journal_commit_transaction+0xe8c>
1614: 93 32 60 00 srl %o1, 0, %o1
jbd2_free(jh->b_frozen_data, bh->b_size);
jh->b_frozen_data = NULL;
1618: c0 74 20 18 clrx [ %l0 + 0x18 ]
jh->b_frozen_triggers = NULL;
161c: c0 74 20 68 clrx [ %l0 + 0x68 ]
}
spin_lock(&journal->j_list_lock);
1620: 40 00 00 00 call 1620 <jbd2_journal_commit_transaction+0xe9c>
1624: 90 10 00 1b mov %i3, %o0
cp_transaction = jh->b_cp_transaction;
1628: c4 5c 20 48 ldx [ %l0 + 0x48 ], %g2
if (cp_transaction) {
162c: 02 c0 80 06 brz,pn %g2, 1644 <jbd2_journal_commit_transaction+0xec0>
1630: 90 10 00 10 mov %l0, %o0
JBUFFER_TRACE(jh, "remove from old cp transaction");
cp_transaction->t_chp_stats.cs_dropped++;
1634: c2 58 a0 c8 ldx [ %g2 + 0xc8 ], %g1
1638: 82 00 60 01 inc %g1
__jbd2_journal_remove_checkpoint(jh);
163c: 40 00 00 00 call 163c <jbd2_journal_commit_transaction+0xeb8>
1640: c2 70 a0 c8 stx %g1, [ %g2 + 0xc8 ]
1644: c2 5c 40 00 ldx [ %l1 ], %g1
* that buffer in the future now that the last use has
* been committed. That's not only a performance gain,
* it also stops aliasing problems if the buffer is left
* behind for writeback and gets reallocated for another
* use in a different page. */
if (buffer_freed(bh)) {
1648: 82 08 40 15 and %g1, %l5, %g1
164c: 02 c8 40 07 brz %g1, 1668 <jbd2_journal_commit_transaction+0xee4>
1650: 90 10 20 12 mov 0x12, %o0
TAS_BUFFER_FNS(JBDDirty, jbddirty)
BUFFER_FNS(Revoked, revoked)
TAS_BUFFER_FNS(Revoked, revoked)
BUFFER_FNS(RevokeValid, revokevalid)
TAS_BUFFER_FNS(RevokeValid, revokevalid)
BUFFER_FNS(Freed, freed)
1654: 40 00 00 00 call 1654 <jbd2_journal_commit_transaction+0xed0>
1658: 92 10 00 11 mov %l1, %o1
BH_JBDPrivateStart, /* First bit available for private use by FS */
};
BUFFER_FNS(JBD, jbd)
BUFFER_FNS(JWrite, jwrite)
BUFFER_FNS(JBDDirty, jbddirty)
165c: 90 10 20 15 mov 0x15, %o0
1660: 40 00 00 00 call 1660 <jbd2_journal_commit_transaction+0xedc>
1664: 92 10 00 11 mov %l1, %o1
1668: c2 5c 40 00 ldx [ %l1 ], %g1
clear_buffer_freed(bh);
clear_buffer_jbddirty(bh);
}
if (buffer_jbddirty(bh)) {
166c: 82 08 40 14 and %g1, %l4, %g1
1670: 02 c8 40 0e brz %g1, 16a8 <jbd2_journal_commit_transaction+0xf24>
1674: 90 10 00 10 mov %l0, %o0
JBUFFER_TRACE(jh, "add to new checkpointing trans");
__jbd2_journal_insert_checkpoint(jh, commit_transaction);
1678: 40 00 00 00 call 1678 <jbd2_journal_commit_transaction+0xef4>
167c: 92 10 00 13 mov %l3, %o1
if (is_journal_aborted(journal))
1680: c2 5e 00 00 ldx [ %i0 ], %g1
1684: 80 88 60 02 btst 2, %g1
1688: 02 68 00 04 be %xcc, 1698 <jbd2_journal_commit_transaction+0xf14>
168c: 90 10 20 15 mov 0x15, %o0
1690: 40 00 00 00 call 1690 <jbd2_journal_commit_transaction+0xf0c>
1694: 92 10 00 11 mov %l1, %o1
clear_buffer_jbddirty(bh);
JBUFFER_TRACE(jh, "refile for checkpoint writeback");
__jbd2_journal_refile_buffer(jh);
1698: 40 00 00 00 call 1698 <jbd2_journal_commit_transaction+0xf14>
169c: 90 10 00 10 mov %l0, %o0
16a0: 10 68 00 20 b %xcc, 1720 <jbd2_journal_commit_transaction+0xf9c>
16a4: 01 00 00 00 nop
16a8: c2 5c 40 00 ldx [ %l1 ], %g1
jbd_unlock_bh_state(bh);
} else {
J_ASSERT_BH(bh, !buffer_dirty(bh));
16ac: 82 08 60 02 and %g1, 2, %g1
16b0: 0a f0 7c 6d brnz,pn %g1, 864 <jbd2_journal_commit_transaction+0xe0>
16b4: 92 10 23 a3 mov 0x3a3, %o1
* transaction has committed. *BUT* it could be
* reallocated once we have written all the data to
* disk and before we process the buffer on BJ_Forget
* list. */
JBUFFER_TRACE(jh, "refile or unfile freed buffer");
__jbd2_journal_refile_buffer(jh);
16b8: 40 00 00 00 call 16b8 <jbd2_journal_commit_transaction+0xf34>
16bc: 90 10 00 10 mov %l0, %o0
if (!jh->b_transaction) {
16c0: c2 5c 20 28 ldx [ %l0 + 0x28 ], %g1
16c4: 0a c8 40 17 brnz %g1, 1720 <jbd2_journal_commit_transaction+0xf9c>
16c8: 01 00 00 00 nop
16cc: c2 5c 40 00 ldx [ %l1 ], %g1
* bit-based spin_unlock()
*/
static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
{
#ifdef CONFIG_DEBUG_SPINLOCK
BUG_ON(!test_bit(bitnum, addr));
16d0: 82 08 40 12 and %g1, %l2, %g1
16d4: 22 c0 40 18 brz,a,pn %g1, 1734 <jbd2_journal_commit_transaction+0xfb0>
16d8: 11 00 00 00 sethi %hi(0), %o0
#endif
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
clear_bit_unlock(bitnum, addr);
16dc: 90 10 20 16 mov 0x16, %o0
16e0: 40 00 00 00 call 16e0 <jbd2_journal_commit_transaction+0xf5c>
16e4: 92 10 00 11 mov %l1, %o1
#endif
preempt_enable();
16e8: 40 00 00 00 call 16e8 <jbd2_journal_commit_transaction+0xf64>
16ec: 90 10 20 01 mov 1, %o0
16f0: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
16f4: 82 08 60 08 and %g1, 8, %g1
16f8: 02 c8 40 04 brz %g1, 1708 <jbd2_journal_commit_transaction+0xf84>
16fc: 01 00 00 00 nop
1700: 40 00 00 00 call 1700 <jbd2_journal_commit_transaction+0xf7c>
1704: 01 00 00 00 nop
jbd_unlock_bh_state(bh);
/* needs a brelse */
jbd2_journal_remove_journal_head(bh);
1708: 40 00 00 00 call 1708 <jbd2_journal_commit_transaction+0xf84>
170c: 90 10 00 11 mov %l1, %o0
release_buffer_page(bh);
1710: 7f ff fb e7 call 6ac <release_buffer_page>
1714: 90 10 00 11 mov %l1, %o0
1718: 10 68 00 15 b %xcc, 176c <jbd2_journal_commit_transaction+0xfe8>
171c: 01 00 00 00 nop
1720: c2 5c 40 00 ldx [ %l1 ], %g1
* bit-based spin_unlock()
*/
static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
{
#ifdef CONFIG_DEBUG_SPINLOCK
BUG_ON(!test_bit(bitnum, addr));
1724: 82 08 40 12 and %g1, %l2, %g1
1728: 0a c8 40 06 brnz %g1, 1740 <jbd2_journal_commit_transaction+0xfbc>
172c: 01 00 00 00 nop
1730: 11 00 00 00 sethi %hi(0), %o0
1734: 92 10 20 36 mov 0x36, %o1
1738: 10 6f fc 4d b %xcc, 86c <jbd2_journal_commit_transaction+0xe8>
173c: 90 12 20 00 mov %o0, %o0
#endif
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
clear_bit_unlock(bitnum, addr);
1740: 90 10 20 16 mov 0x16, %o0
1744: 40 00 00 00 call 1744 <jbd2_journal_commit_transaction+0xfc0>
1748: 92 10 00 11 mov %l1, %o1
#endif
preempt_enable();
174c: 40 00 00 00 call 174c <jbd2_journal_commit_transaction+0xfc8>
1750: 90 10 20 01 mov 1, %o0
1754: c2 59 a0 08 ldx [ %g6 + 8 ], %g1
1758: 82 08 60 08 and %g1, 8, %g1
175c: 02 c8 40 04 brz %g1, 176c <jbd2_journal_commit_transaction+0xfe8>
1760: 01 00 00 00 nop
1764: 40 00 00 00 call 1764 <jbd2_journal_commit_transaction+0xfe0>
1768: 01 00 00 00 nop
} else
jbd_unlock_bh_state(bh);
}
cond_resched_lock(&journal->j_list_lock);
176c: 40 00 00 00 call 176c <jbd2_journal_commit_transaction+0xfe8>
1770: 90 10 00 1b mov %i3, %o0
/*
* As there are other places (journal_unmap_buffer()) adding buffers
* to this list we have to be careful and hold the j_list_lock.
*/
spin_lock(&journal->j_list_lock);
while (commit_transaction->t_forget) {
1774: e0 5c e0 30 ldx [ %l3 + 0x30 ], %l0
1778: 0a fc 3f 6a brnz %l0, 1520 <jbd2_journal_commit_transaction+0xd9c>
177c: 01 00 00 00 nop
} else
jbd_unlock_bh_state(bh);
}
cond_resched_lock(&journal->j_list_lock);
}
spin_unlock(&journal->j_list_lock);
1780: 40 00 00 00 call 1780 <jbd2_journal_commit_transaction+0xffc>
1784: 90 10 00 1b mov %i3, %o0
* This is a bit sleazy. We use j_list_lock to protect transition
* of a transaction into T_FINISHED state and calling
* __jbd2_journal_drop_transaction(). Otherwise we could race with
* other checkpointing code processing the transaction...
*/
spin_lock(&journal->j_state_lock);
1788: 40 00 00 00 call 1788 <jbd2_journal_commit_transaction+0x1004>
178c: 90 10 00 1a mov %i2, %o0
spin_lock(&journal->j_list_lock);
1790: 40 00 00 00 call 1790 <jbd2_journal_commit_transaction+0x100c>
1794: 90 10 00 1b mov %i3, %o0
/*
* Now recheck if some buffers did not get attached to the transaction
* while the lock was dropped...
*/
if (commit_transaction->t_forget) {
1798: c2 5c e0 30 ldx [ %l3 + 0x30 ], %g1
179c: 02 c0 40 08 brz,pn %g1, 17bc <jbd2_journal_commit_transaction+0x1038>
17a0: 03 00 00 00 sethi %hi(0), %g1
spin_unlock(&journal->j_list_lock);
17a4: 40 00 00 00 call 17a4 <jbd2_journal_commit_transaction+0x1020>
17a8: 90 10 00 1b mov %i3, %o0
spin_unlock(&journal->j_state_lock);
17ac: 40 00 00 00 call 17ac <jbd2_journal_commit_transaction+0x1028>
17b0: 90 10 00 1a mov %i2, %o0
17b4: 10 6f ff 57 b %xcc, 1510 <jbd2_journal_commit_transaction+0xd8c>
17b8: 01 00 00 00 nop
goto restart_loop;
}
/* Done with this transaction! */
jbd_debug(3, "JBD: commit phase 7\n");
17bc: c2 08 60 00 ldub [ %g1 ], %g1
17c0: 80 a0 60 02 cmp %g1, 2
17c4: 28 48 00 0e bleu,a %icc, 17fc <jbd2_journal_commit_transaction+0x1078>
17c8: c2 04 e0 0c ld [ %l3 + 0xc ], %g1
17cc: 11 00 00 00 sethi %hi(0), %o0
17d0: 13 00 00 00 sethi %hi(0), %o1
17d4: 17 00 00 00 sethi %hi(0), %o3
17d8: 90 12 20 00 mov %o0, %o0
17dc: 92 12 60 00 mov %o1, %o1
17e0: 96 12 e0 00 mov %o3, %o3
17e4: 40 00 00 00 call 17e4 <jbd2_journal_commit_transaction+0x1060>
17e8: 94 10 23 cc mov 0x3cc, %o2
17ec: 11 00 00 00 sethi %hi(0), %o0
17f0: 40 00 00 00 call 17f0 <jbd2_journal_commit_transaction+0x106c>
17f4: 90 12 20 00 mov %o0, %o0 ! 0 <write_tag_block>
J_ASSERT(commit_transaction->t_state == T_COMMIT);
17f8: c2 04 e0 0c ld [ %l3 + 0xc ], %g1
17fc: 80 a0 60 04 cmp %g1, 4
1800: 12 47 fc 19 bne,pn %icc, 864 <jbd2_journal_commit_transaction+0xe0>
1804: 92 10 23 ce mov 0x3ce, %o1
commit_transaction->t_start = jiffies;
1808: 03 00 00 00 sethi %hi(0), %g1
commit_transaction->t_start);
/*
* File the transaction for history
*/
stats.ts_type = JBD2_STATS_RUN;
180c: 84 10 20 01 mov 1, %g2
jbd_debug(3, "JBD: commit phase 7\n");
J_ASSERT(commit_transaction->t_state == T_COMMIT);
commit_transaction->t_start = jiffies;
1810: ce 58 60 00 ldx [ %g1 ], %g7
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
return end + (MAX_JIFFY_OFFSET - start);
1814: 82 10 3f ff mov -1, %g1
* File the transaction for history
*/
stats.ts_type = JBD2_STATS_RUN;
stats.ts_tid = commit_transaction->t_tid;
stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
spin_lock(&journal->j_history_lock);
1818: a0 06 26 90 add %i0, 0x690, %l0
181c: 83 28 70 3e sllx %g1, 0x3e, %g1
1820: 90 10 00 10 mov %l0, %o0
jbd_debug(3, "JBD: commit phase 7\n");
J_ASSERT(commit_transaction->t_state == T_COMMIT);
commit_transaction->t_start = jiffies;
1824: ce 74 e0 a8 stx %g7, [ %l3 + 0xa8 ]
1828: 82 18 7f fe xor %g1, -2, %g1
stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
182c: c6 5f a7 8f ldx [ %fp + 0x78f ], %g3
1830: 82 01 c0 01 add %g7, %g1, %g1
commit_transaction->t_start);
/*
* File the transaction for history
*/
stats.ts_type = JBD2_STATS_RUN;
1834: c4 27 a7 5f st %g2, [ %fp + 0x75f ]
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
1838: 80 a1 c0 03 cmp %g7, %g3
return end + (MAX_JIFFY_OFFSET - start);
183c: 82 20 40 03 sub %g1, %g3, %g1
static inline unsigned long
jbd2_time_diff(unsigned long start, unsigned long end)
{
if (end >= start)
return end - start;
1840: 8e 21 c0 03 sub %g7, %g3, %g7
1844: 83 67 50 07 movcc %xcc, %g7, %g1
jbd_debug(3, "JBD: commit phase 7\n");
J_ASSERT(commit_transaction->t_state == T_COMMIT);
commit_transaction->t_start = jiffies;
stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
1848: c2 77 a7 8f stx %g1, [ %fp + 0x78f ]
/*
* File the transaction for history
*/
stats.ts_type = JBD2_STATS_RUN;
stats.ts_tid = commit_transaction->t_tid;
184c: c2 04 e0 08 ld [ %l3 + 8 ], %g1
1850: c2 77 a7 67 stx %g1, [ %fp + 0x767 ]
stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
1854: c2 44 e0 f8 ldsw [ %l3 + 0xf8 ], %g1
spin_lock(&journal->j_history_lock);
1858: 40 00 00 00 call 1858 <jbd2_journal_commit_transaction+0x10d4>
185c: c2 77 a7 97 stx %g1, [ %fp + 0x797 ]
memcpy(journal->j_history + journal->j_history_cur, &stats,
1860: d0 06 26 8c ld [ %i0 + 0x68c ], %o0
1864: 92 07 a7 5f add %fp, 0x75f, %o1
1868: 94 10 20 50 mov 0x50, %o2
186c: c2 5e 26 80 ldx [ %i0 + 0x680 ], %g1
1870: 90 5a 20 50 smul %o0, 0x50, %o0
1874: 40 00 00 00 call 1874 <jbd2_journal_commit_transaction+0x10f0>
1878: 90 00 40 08 add %g1, %o0, %o0
sizeof(stats));
if (++journal->j_history_cur == journal->j_history_max)
187c: c2 06 26 8c ld [ %i0 + 0x68c ], %g1
1880: c4 06 26 88 ld [ %i0 + 0x688 ], %g2
1884: 82 00 60 01 inc %g1
1888: 80 a0 40 02 cmp %g1, %g2
188c: 12 48 00 03 bne %icc, 1898 <jbd2_journal_commit_transaction+0x1114>
1890: c2 26 26 8c st %g1, [ %i0 + 0x68c ]
journal->j_history_cur = 0;
1894: c0 26 26 8c clr [ %i0 + 0x68c ]
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
1898: d2 5e 26 d8 ldx [ %i0 + 0x6d8 ], %o1
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
spin_unlock(&journal->j_history_lock);
189c: 90 10 00 10 mov %l0, %o0
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
18a0: c2 5f a7 6f ldx [ %fp + 0x76f ], %g1
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
18a4: de 5e 26 e0 ldx [ %i0 + 0x6e0 ], %o7
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
18a8: 92 02 40 01 add %o1, %g1, %o1
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
18ac: c2 5f a7 77 ldx [ %fp + 0x777 ], %g1
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
18b0: c6 5e 26 e8 ldx [ %i0 + 0x6e8 ], %g3
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
18b4: 9e 03 c0 01 add %o7, %g1, %o7
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
18b8: c2 5f a7 7f ldx [ %fp + 0x77f ], %g1
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
18bc: ce 5e 26 f0 ldx [ %i0 + 0x6f0 ], %g7
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
18c0: 86 00 c0 01 add %g3, %g1, %g3
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
18c4: c2 5f a7 87 ldx [ %fp + 0x787 ], %g1
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
18c8: da 5e 26 f8 ldx [ %i0 + 0x6f8 ], %o5
*/
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
18cc: 8e 01 c0 01 add %g7, %g1, %g7
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
18d0: c2 5f a7 8f ldx [ %fp + 0x78f ], %g1
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
18d4: d8 5e 27 00 ldx [ %i0 + 0x700 ], %o4
journal->j_stats.ts_tid++;
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
18d8: 9a 03 40 01 add %o5, %g1, %o5
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
18dc: c2 5f a7 97 ldx [ %fp + 0x797 ], %g1
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
18e0: d6 5e 27 08 ldx [ %i0 + 0x708 ], %o3
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
18e4: 98 03 00 01 add %o4, %g1, %o4
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
18e8: c2 5f a7 9f ldx [ %fp + 0x79f ], %g1
journal->j_history_cur = 0;
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
18ec: c4 5e 26 d0 ldx [ %i0 + 0x6d0 ], %g2
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
18f0: d4 5e 27 10 ldx [ %i0 + 0x710 ], %o2
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
18f4: 96 02 c0 01 add %o3, %g1, %o3
journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
18f8: c2 5f a7 a7 ldx [ %fp + 0x7a7 ], %g1
journal->j_history_cur = 0;
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
18fc: 84 00 a0 01 inc %g2
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
1900: d2 76 26 d8 stx %o1, [ %i0 + 0x6d8 ]
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
1904: 94 02 80 01 add %o2, %g1, %o2
journal->j_history_cur = 0;
/*
* Calculate overall stats
*/
journal->j_stats.ts_tid++;
1908: c4 76 26 d0 stx %g2, [ %i0 + 0x6d0 ]
journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
190c: de 76 26 e0 stx %o7, [ %i0 + 0x6e0 ]
journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
1910: c6 76 26 e8 stx %g3, [ %i0 + 0x6e8 ]
journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
1914: ce 76 26 f0 stx %g7, [ %i0 + 0x6f0 ]
journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
1918: da 76 26 f8 stx %o5, [ %i0 + 0x6f8 ]
journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
191c: d8 76 27 00 stx %o4, [ %i0 + 0x700 ]
journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
1920: d6 76 27 08 stx %o3, [ %i0 + 0x708 ]
journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
spin_unlock(&journal->j_history_lock);
1924: 40 00 00 00 call 1924 <jbd2_journal_commit_transaction+0x11a0>
1928: d4 76 27 10 stx %o2, [ %i0 + 0x710 ]
commit_transaction->t_state = T_FINISHED;
192c: 82 10 20 05 mov 5, %g1
1930: c2 24 e0 0c st %g1, [ %l3 + 0xc ]
J_ASSERT(commit_transaction == journal->j_committing_transaction);
1934: e0 5e 20 e0 ldx [ %i0 + 0xe0 ], %l0
1938: 80 a4 c0 10 cmp %l3, %l0
193c: 12 67 fb ca bne,pn %xcc, 864 <jbd2_journal_commit_transaction+0xe0>
1940: 92 10 23 ef mov 0x3ef, %o1
journal->j_commit_sequence = commit_transaction->t_tid;
1944: c2 04 e0 08 ld [ %l3 + 8 ], %g1
journal->j_committing_transaction = NULL;
1948: c0 76 20 e0 clrx [ %i0 + 0xe0 ]
commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time));
194c: 40 00 00 00 call 194c <jbd2_journal_commit_transaction+0x11c8>
1950: c2 26 25 b0 st %g1, [ %i0 + 0x5b0 ]
1954: c6 5f a7 3f ldx [ %fp + 0x73f ], %g3
/*
* weight the commit time higher than the average time so we don't
* react too strongly to vast changes in the commit time
*/
if (likely(journal->j_average_commit_time))
1958: c4 5e 26 68 ldx [ %i0 + 0x668 ], %g2
195c: 02 c0 80 08 brz,pn %g2, 197c <jbd2_journal_commit_transaction+0x11f8>
1960: 90 22 00 03 sub %o0, %g3, %o0
journal->j_average_commit_time = (commit_time +
1964: 83 28 b0 01 sllx %g2, 1, %g1
1968: 82 00 40 02 add %g1, %g2, %g1
196c: 82 02 00 01 add %o0, %g1, %g1
1970: 83 30 70 02 srlx %g1, 2, %g1
1974: 10 68 00 03 b %xcc, 1980 <jbd2_journal_commit_transaction+0x11fc>
1978: c2 76 26 68 stx %g1, [ %i0 + 0x668 ]
journal->j_average_commit_time*3) / 4;
else
journal->j_average_commit_time = commit_time;
197c: d0 76 26 68 stx %o0, [ %i0 + 0x668 ]
spin_unlock(&journal->j_state_lock);
1980: 40 00 00 00 call 1980 <jbd2_journal_commit_transaction+0x11fc>
1984: 90 10 00 1a mov %i2, %o0
if (commit_transaction->t_checkpoint_list == NULL &&
1988: c2 5c e0 38 ldx [ %l3 + 0x38 ], %g1
198c: 2a c8 40 0a brnz,a %g1, 19b4 <jbd2_journal_commit_transaction+0x1230>
1990: c4 5e 20 e8 ldx [ %i0 + 0xe8 ], %g2
1994: c2 5c 20 40 ldx [ %l0 + 0x40 ], %g1
1998: 2a c8 40 07 brnz,a %g1, 19b4 <jbd2_journal_commit_transaction+0x1230>
199c: c4 5e 20 e8 ldx [ %i0 + 0xe8 ], %g2
commit_transaction->t_checkpoint_io_list == NULL) {
__jbd2_journal_drop_transaction(journal, commit_transaction);
19a0: 90 10 00 18 mov %i0, %o0
19a4: 40 00 00 00 call 19a4 <jbd2_journal_commit_transaction+0x1220>
19a8: 92 10 00 10 mov %l0, %o1
19ac: 10 68 00 0f b %xcc, 19e8 <jbd2_journal_commit_transaction+0x1264>
19b0: a2 10 20 01 mov 1, %l1
to_free = 1;
} else {
if (journal->j_checkpoint_transactions == NULL) {
19b4: 2a c8 80 07 brnz,a %g2, 19d0 <jbd2_journal_commit_transaction+0x124c>
19b8: c2 58 a0 e0 ldx [ %g2 + 0xe0 ], %g1
journal->j_checkpoint_transactions = commit_transaction;
19bc: e0 76 20 e8 stx %l0, [ %i0 + 0xe8 ]
commit_transaction->t_cpnext = commit_transaction;
commit_transaction->t_cpprev = commit_transaction;
19c0: a2 10 20 00 clr %l1
__jbd2_journal_drop_transaction(journal, commit_transaction);
to_free = 1;
} else {
if (journal->j_checkpoint_transactions == NULL) {
journal->j_checkpoint_transactions = commit_transaction;
commit_transaction->t_cpnext = commit_transaction;
19c4: e0 74 20 d8 stx %l0, [ %l0 + 0xd8 ]
commit_transaction->t_cpprev = commit_transaction;
19c8: 10 68 00 08 b %xcc, 19e8 <jbd2_journal_commit_transaction+0x1264>
19cc: e0 74 20 e0 stx %l0, [ %l0 + 0xe0 ]
journal->j_checkpoint_transactions;
commit_transaction->t_cpprev =
commit_transaction->t_cpnext->t_cpprev;
commit_transaction->t_cpnext->t_cpprev =
commit_transaction;
commit_transaction->t_cpprev->t_cpnext =
19d0: a2 10 20 00 clr %l1
if (journal->j_checkpoint_transactions == NULL) {
journal->j_checkpoint_transactions = commit_transaction;
commit_transaction->t_cpnext = commit_transaction;
commit_transaction->t_cpprev = commit_transaction;
} else {
commit_transaction->t_cpnext =
19d4: c4 74 20 d8 stx %g2, [ %l0 + 0xd8 ]
journal->j_checkpoint_transactions;
commit_transaction->t_cpprev =
19d8: c2 74 20 e0 stx %g1, [ %l0 + 0xe0 ]
commit_transaction->t_cpnext->t_cpprev;
commit_transaction->t_cpnext->t_cpprev =
19dc: e0 70 a0 e0 stx %l0, [ %g2 + 0xe0 ]
commit_transaction;
commit_transaction->t_cpprev->t_cpnext =
19e0: c2 5c 20 e0 ldx [ %l0 + 0xe0 ], %g1
19e4: e0 70 60 d8 stx %l0, [ %g1 + 0xd8 ]
commit_transaction;
}
}
spin_unlock(&journal->j_list_lock);
19e8: 40 00 00 00 call 19e8 <jbd2_journal_commit_transaction+0x1264>
19ec: 90 10 00 1b mov %i3, %o0
if (journal->j_commit_callback)
19f0: c2 5e 26 78 ldx [ %i0 + 0x678 ], %g1
19f4: 02 c0 40 04 brz,pn %g1, 1a04 <jbd2_journal_commit_transaction+0x1280>
19f8: 90 10 00 18 mov %i0, %o0
journal->j_commit_callback(journal, commit_transaction);
19fc: 9f c0 40 00 call %g1
1a00: 92 10 00 10 mov %l0, %o1
trace_mark(jbd2_end_commit, "dev %s transaction %d head %d",
journal->j_devname, commit_transaction->t_tid,
journal->j_tail_sequence);
jbd_debug(1, "JBD: commit %d complete, head %d\n",
1a04: 03 00 00 00 sethi %hi(0), %g1
1a08: c2 08 60 00 ldub [ %g1 ], %g1
1a0c: 80 a0 60 00 cmp %g1, 0
1a10: 02 48 00 10 be %icc, 1a50 <jbd2_journal_commit_transaction+0x12cc>
1a14: 80 a4 60 00 cmp %l1, 0
1a18: 13 00 00 00 sethi %hi(0), %o1
1a1c: 11 00 00 00 sethi %hi(0), %o0
1a20: 17 00 00 00 sethi %hi(0), %o3
1a24: 92 12 60 00 mov %o1, %o1
1a28: 94 10 24 1c mov 0x41c, %o2
1a2c: 90 12 20 00 mov %o0, %o0
1a30: 40 00 00 00 call 1a30 <jbd2_journal_commit_transaction+0x12ac>
1a34: 96 12 e0 00 mov %o3, %o3
1a38: 11 00 00 00 sethi %hi(0), %o0
1a3c: d2 06 25 b0 ld [ %i0 + 0x5b0 ], %o1
1a40: d4 06 25 a8 ld [ %i0 + 0x5a8 ], %o2
1a44: 40 00 00 00 call 1a44 <jbd2_journal_commit_transaction+0x12c0>
1a48: 90 12 20 00 mov %o0, %o0
journal->j_commit_sequence, journal->j_tail_sequence);
if (to_free)
1a4c: 80 a4 60 00 cmp %l1, 0
1a50: 02 48 00 05 be %icc, 1a64 <jbd2_journal_commit_transaction+0x12e0>
1a54: 90 06 21 70 add %i0, 0x170, %o0
kfree(commit_transaction);
1a58: 40 00 00 00 call 1a58 <jbd2_journal_commit_transaction+0x12d4>
1a5c: 90 10 00 10 mov %l0, %o0
wake_up(&journal->j_wait_done_commit);
1a60: 90 06 21 70 add %i0, 0x170, %o0
1a64: 92 10 20 03 mov 3, %o1
1a68: 94 10 20 01 mov 1, %o2
1a6c: 40 00 00 00 call 1a6c <jbd2_journal_commit_transaction+0x12e8>
1a70: 96 10 20 00 clr %o3
}
1a74: 81 cf e0 08 rett %i7 + 8
1a78: 01 00 00 00 nop
^ permalink raw reply [flat|nested] 24+ messages in thread