MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2AddEntry

Function Ext2AddEntry

Ext4Fsd/ext3/generic.c:1845–1914  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1843
1844
1845NTSTATUS
1846Ext2AddEntry (
1847 IN PEXT2_IRP_CONTEXT IrpContext,
1848 IN PEXT2_VCB Vcb,
1849 IN PEXT2_FCB Dcb,
1850 IN struct inode *Inode,
1851 IN PUNICODE_STRING FileName,
1852 struct dentry **Dentry
1853)
1854{
1855 struct dentry *de = NULL;
1856
1857 NTSTATUS status = STATUS_UNSUCCESSFUL;
1858 OEM_STRING oem;
1859 int rc;
1860
1861 BOOLEAN MainResourceAcquired = FALSE;
1862
1863 if (!IsDirectory(Dcb)) {
1864 DbgBreak();
1865 return STATUS_NOT_A_DIRECTORY;
1866 }
1867
1868 ExAcquireResourceExclusiveLite(&Dcb->MainResource, TRUE);
1869 MainResourceAcquired = TRUE;
1870
1871 __try {
1872
1873 Ext2ReferXcb(&Dcb->ReferenceCount);
1874 de = Ext2BuildEntry(Vcb, Dcb->Mcb, FileName);
1875 if (!de) {
1876 status = STATUS_INSUFFICIENT_RESOURCES;
1877 __leave;
1878 }
1879 de->d_inode = Inode;
1880
1881 rc = ext3_add_entry(IrpContext, de, Inode);
1882 status = Ext2WinntError(rc);
1883 if (NT_SUCCESS(status)) {
1884
1885 /* increase dir inode's nlink for .. */
1886 if (S_ISDIR(Inode->i_mode)) {
1887 ext3_inc_count(Dcb->Inode);
1888 ext3_mark_inode_dirty(IrpContext, Dcb->Inode);
1889 }
1890
1891 /* increase inode nlink reference */
1892 ext3_inc_count(Inode);
1893 ext3_mark_inode_dirty(IrpContext, Inode);
1894
1895 if (Dentry) {
1896 *Dentry = de;
1897 de = NULL;
1898 }
1899 }
1900
1901 } __finally {
1902

Callers 3

Ext2SetRenameInfoFunction · 0.85
Ext2SetLinkInfoFunction · 0.85
Ext2CreateInodeFunction · 0.85

Calls 6

Ext2BuildEntryFunction · 0.85
ext3_add_entryFunction · 0.85
Ext2WinntErrorFunction · 0.85
ext3_inc_countFunction · 0.85
ext3_mark_inode_dirtyFunction · 0.85
Ext2FreeEntryFunction · 0.85

Tested by

no test coverage detected