// File: /workspace/github_cpp_makefile_star2_O2/ljl0222[P]SecondFileSystem/INode.cpp
// Function: Inode::ITrunc()
void Inode::ITrunc()
{
	/* ���ɴ��̸��ٻ�����ȡ����һ�μ��ӡ����μ����������Ĵ��̿� */
	BufferManager& bm = globalBufferManager;
	/* ��ȡg_FileSystem���������ã�ִ���ͷŴ��̿��Ĳ��� */
	FileSystem& filesys = globalFileSystem;

	/* ����FILO��ʽ�ͷţ��Ծ���ʹ��SuperBlock�м�¼�Ŀ����̿���������
	 *
	 * Unix V6++���ļ������ṹ��(С�͡����ͺ;����ļ�)
	 * (1) i_addr[0] - i_addr[5]Ϊֱ�����������ļ����ȷ�Χ��0 - 6���̿飻
	 *
	 * (2) i_addr[6] - i_addr[7]����һ�μ������������ڴ��̿��ţ�ÿ���̿�
	 * �ϴ���128���ļ������̿��ţ������ļ����ȷ�Χ��7 - (128 * 2 + 6)���̿飻
	 *
	 * (3) i_addr[8] - i_addr[9]���Ŷ��μ������������ڴ��̿��ţ�ÿ�����μ���
	 * ��������¼128��һ�μ������������ڴ��̿��ţ������ļ����ȷ�Χ��
	 * (128 * 2 + 6 ) < size <= (128 * 128 * 2 + 128 * 2 + 6)
	 */
	for (int i = 9; i >= 0; i--)		/* ��i_addr[9]��i_addr[0] */
	{
		/* ����i_addr[]�е�i���������� */
		if (this->i_addr[i] != 0)
		{
			/* ������i_addr[]�е�һ�μ��ӡ����μ��������� */
			if (i >= 6 && i <= 9)
			{
				/* ���������������뻺�� */
				Buf* pFirstBuf = bm.Bread(this->i_addr[i]);
				/* ��ȡ��������ַ */
				int* pFirst = (int*)pFirstBuf->b_addr;

				/* ÿ�ż�����������¼ 512/sizeof(int) = 128�����̿��ţ�������ȫ��128�����̿� */
				for (int j = 128 - 1; j >= 0; j--)
				{
					if (pFirst[j] != 0)	/* ���������������� */
					{
						/*
						 * ���������μ�����������i_addr[8]��i_addr[9]�
						 * ��ô���ַ�����¼����128��һ�μ������������ŵĴ��̿���
						 */
						if (i >= 8 && i <= 9)
						{
							Buf* pSecondBuf = bm.Bread(pFirst[j]);
							int* pSecond = (int*)pSecondBuf->b_addr;

							for (int k = 128 - 1; k >= 0; k--)
							{
								if (pSecond[k] != 0)
								{
									/* �ͷ�ָ���Ĵ��̿� */
									filesys.Free(pSecond[k]);
								}
							}
							/* ����ʹ�����ϣ��ͷ��Ա㱻��������ʹ�� */
							bm.Brelse(pSecondBuf);
						}
						filesys.Free(pFirst[j]);
					}
				}
				bm.Brelse(pFirstBuf);
			}
			/* �ͷ�����������ռ�õĴ��̿� */
			filesys.Free(this->i_addr[i]);
			/* 0��ʾ����������� */
			this->i_addr[i] = 0;
		}
	}

	/* �̿��ͷ����ϣ��ļ���С���� */
	this->i_size = 0;
	/* ����IUPD��־λ����ʾ���ڴ�Inode��Ҫͬ������Ӧ����Inode */
	this->i_flag |= Inode::IUPD;
	/* �����ļ���־ ��ԭ����RWXRWXRWX����*/
	this->i_mode &= ~(Inode::ILARG);
	this->i_nlink = 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
pushq $0x9
popq %r13
leaq 0x153d9(%rip), %r15     # 0x1ade8
movq %rdi, -0x30(%rbp)
testl %r13d, %r13d
js 0x5b03
movl %r13d, %r14d
movl 0x20(%rbx,%r14,4), %esi
testl %esi, %esi
je 0x5afb
leal -0x6(%r13), %eax
cmpl $0x3, %eax
ja 0x5aed
movq %r14, -0x40(%rbp)
leaq 0x681c(%rip), %rdi      # 0xc260
callq 0x3a46
movq %rax, -0x38(%rbp)
movq 0x20(%rax), %rbx
pushq $0x7f
popq %r14
movq %r13, -0x50(%rbp)
movq %rbx, -0x48(%rbp)
testl %r14d, %r14d
js 0x5ad0
movl %r14d, %r12d
movl (%rbx,%r12,4), %esi
testl %esi, %esi
je 0x5acb
cmpl $0x8, %r13d
jb 0x5ac3
leaq 0x67e6(%rip), %rdi      # 0xc260
callq 0x3a46
movq %rax, -0x58(%rbp)
movq 0x20(%rax), %rbx
pushq $0x7f
popq %r13
testl %r13d, %r13d
js 0x5aa7
movl %r13d, %eax
movl (%rbx,%rax,4), %esi
testl %esi, %esi
je 0x5aa2
movq %r15, %rdi
callq 0x540a
decl %r13d
jmp 0x5a8b
leaq 0x67b2(%rip), %rdi      # 0xc260
movq -0x58(%rbp), %rsi
callq 0x3a16
movq -0x48(%rbp), %rbx
movl (%rbx,%r12,4), %esi
movq -0x50(%rbp), %r13
movq %r15, %rdi
callq 0x540a
decl %r14d
jmp 0x5a5d
leaq 0x6789(%rip), %rdi      # 0xc260
movq -0x38(%rbp), %rsi
callq 0x3a16
movq -0x30(%rbp), %rbx
movq -0x40(%rbp), %r14
movl 0x20(%rbx,%r14,4), %esi
movq %r15, %rdi
callq 0x540a
andl $0x0, 0x20(%rbx,%r14,4)
decl %r13d
jmp 0x5a13
andl $0x0, 0x1c(%rbx)
orb $0x2, (%rbx)
andb $-0x11, 0x5(%rbx)
movl $0x1, 0xc(%rbx)
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq