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

Function Ext2SetFileType

Ext4Fsd/ext3/generic.c:1917–1985  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1915
1916
1917NTSTATUS
1918Ext2SetFileType (
1919 IN PEXT2_IRP_CONTEXT IrpContext,
1920 IN PEXT2_VCB Vcb,
1921 IN PEXT2_FCB Dcb,
1922 IN PEXT2_MCB Mcb,
1923 IN umode_t mode
1924 )
1925{
1926 struct inode *dir = Dcb->Inode;
1927 struct buffer_head *bh = NULL;
1928 struct ext3_dir_entry_2 *de;
1929 struct inode *inode;
1930 NTSTATUS Status = STATUS_UNSUCCESSFUL;
1931 BOOLEAN MainResourceAcquired = FALSE;
1932
1933 if (!EXT4_HAS_INCOMPAT_FEATURE(dir->i_sb, EXT3_FEATURE_INCOMPAT_FILETYPE)) {
1934 return STATUS_SUCCESS;
1935 }
1936
1937 if (!IsDirectory(Dcb)) {
1938 return STATUS_NOT_A_DIRECTORY;
1939 }
1940
1941 ExAcquireResourceExclusiveLite(&Dcb->MainResource, TRUE);
1942 MainResourceAcquired = TRUE;
1943
1944 __try {
1945
1946 Ext2ReferXcb(&Dcb->ReferenceCount);
1947
1948 bh = ext3_find_entry(IrpContext, Mcb->de, &de);
1949 if (!bh)
1950 __leave;
1951
1952 inode = &Mcb->Inode;
1953 if (le32_to_cpu(de->inode) != inode->i_ino)
1954 __leave;
1955
1956 ext3_set_de_type(inode->i_sb, de, mode);
1957 mark_buffer_dirty(bh);
1958
1959 if (S_ISDIR(inode->i_mode) == S_ISDIR(mode)) {
1960 } else if (S_ISDIR(inode->i_mode)) {
1961 ext3_dec_count(dir);
1962 } else if (S_ISDIR(mode)) {
1963 ext3_inc_count(dir);
1964 }
1965 dir->i_ctime = dir->i_mtime = ext3_current_time(dir);
1966 ext3_mark_inode_dirty(IrpContext, dir);
1967
1968 inode->i_mode = mode;
1969 ext3_mark_inode_dirty(IrpContext, inode);
1970
1971 Status = STATUS_SUCCESS;
1972
1973 } __finally {
1974

Callers 1

Ext2SetReparsePointFunction · 0.85

Calls 8

ext3_find_entryFunction · 0.85
ext3_set_de_typeFunction · 0.85
mark_buffer_dirtyFunction · 0.85
ext3_dec_countFunction · 0.85
ext3_inc_countFunction · 0.85
ext3_current_timeFunction · 0.85
ext3_mark_inode_dirtyFunction · 0.85
brelseFunction · 0.85

Tested by

no test coverage detected