| 1915 | |
| 1916 | |
| 1917 | NTSTATUS |
| 1918 | Ext2SetFileType ( |
| 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 |
no test coverage detected