| 636 | } |
| 637 | |
| 638 | NTSTATUS Ext2AddDotEntries(struct ext2_icb *icb, struct inode *dir, |
| 639 | struct inode *inode) |
| 640 | { |
| 641 | struct ext3_dir_entry_2 * de; |
| 642 | struct buffer_head * bh; |
| 643 | struct ext4_dir_entry_tail *t; |
| 644 | ext3_lblk_t block = 0; |
| 645 | unsigned int blocksize = dir->i_sb->s_blocksize; |
| 646 | int csum_size = 0; |
| 647 | int rc = 0; |
| 648 | |
| 649 | if (ext4_has_metadata_csum(dir->i_sb)) |
| 650 | csum_size = sizeof(struct ext4_dir_entry_tail); |
| 651 | |
| 652 | bh = ext3_append(icb, inode, &block, &rc); |
| 653 | if (!bh) { |
| 654 | goto errorout; |
| 655 | } |
| 656 | |
| 657 | de = (struct ext3_dir_entry_2 *) bh->b_data; |
| 658 | de->inode = cpu_to_le32(inode->i_ino); |
| 659 | de->name_len = 1; |
| 660 | de->rec_len = cpu_to_le16(EXT3_DIR_REC_LEN(de->name_len)); |
| 661 | strcpy (de->name, "."); |
| 662 | ext3_set_de_type(inode->i_sb, de, S_IFDIR); |
| 663 | de = (struct ext3_dir_entry_2 *) |
| 664 | ((char *) de + le16_to_cpu(de->rec_len)); |
| 665 | de->inode = cpu_to_le32(dir->i_ino); |
| 666 | de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize-EXT3_DIR_REC_LEN(1)-csum_size); |
| 667 | de->name_len = 2; |
| 668 | strcpy (de->name, ".."); |
| 669 | ext3_set_de_type(inode->i_sb, de, S_IFDIR); |
| 670 | inode->i_nlink = 2; |
| 671 | if (csum_size) { |
| 672 | t = EXT4_DIRENT_TAIL(bh->b_data, blocksize); |
| 673 | initialize_dirent_tail(t, blocksize); |
| 674 | } |
| 675 | ext4_dirent_csum_set(inode, (struct ext4_dir_entry *)bh->b_data); |
| 676 | set_buffer_dirty(bh); |
| 677 | ext3_mark_inode_dirty(icb, inode); |
| 678 | |
| 679 | errorout: |
| 680 | if (bh) |
| 681 | __brelse (bh); |
| 682 | |
| 683 | return Ext2WinntError(rc); |
| 684 | } |
| 685 | |
| 686 | // |
| 687 | // Any call to this routine must have Fcb's MainResource and FcbLock acquired. |
no test coverage detected