* ext3_delete_entry deletes a directory entry by merging it with the * previous entry */
| 1977 | * previous entry |
| 1978 | */ |
| 1979 | int ext3_delete_entry(struct ext2_icb *icb, struct inode *dir, |
| 1980 | struct ext3_dir_entry_2 *de_del, |
| 1981 | struct buffer_head *bh) |
| 1982 | { |
| 1983 | struct ext3_dir_entry_2 *de, *pde = NULL; |
| 1984 | size_t i = 0; |
| 1985 | int csum_size = 0; |
| 1986 | |
| 1987 | if (ext4_has_metadata_csum(dir->i_sb)) |
| 1988 | csum_size = sizeof(struct ext4_dir_entry_tail); |
| 1989 | |
| 1990 | de = (struct ext3_dir_entry_2 *) bh->b_data; |
| 1991 | while (i < bh->b_size - csum_size) { |
| 1992 | if (!ext3_check_dir_entry("ext3_delete_entry", dir, de, bh, i)) |
| 1993 | return -EIO; |
| 1994 | if (de == de_del) { |
| 1995 | if (pde) |
| 1996 | pde->rec_len = ext3_rec_len_to_disk( |
| 1997 | ext3_rec_len_from_disk(pde->rec_len) + |
| 1998 | ext3_rec_len_from_disk(de->rec_len)); |
| 1999 | else |
| 2000 | de->inode = 0; |
| 2001 | dir->i_version++; |
| 2002 | /* ext3_journal_dirty_metadata(handle, bh); */ |
| 2003 | ext4_dirent_csum_set(dir, (struct ext4_dir_entry *)bh->b_data); |
| 2004 | set_buffer_dirty(bh); |
| 2005 | return 0; |
| 2006 | } |
| 2007 | i += ext3_rec_len_from_disk(de->rec_len); |
| 2008 | pde = de; |
| 2009 | de = ext3_next_entry(de); |
| 2010 | } |
| 2011 | return -ENOENT; |
| 2012 | } |
| 2013 | |
| 2014 | /* |
| 2015 | * routine to check that the specified directory is empty (for rmdir) |
no test coverage detected