diff options
Diffstat (limited to 'fs/ext4/inline.c')
-rw-r--r-- | fs/ext4/inline.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 0a8f5a865496..f5e9c0e6d737 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c | |||
@@ -1510,6 +1510,61 @@ out_find: | |||
1510 | return iloc.bh; | 1510 | return iloc.bh; |
1511 | } | 1511 | } |
1512 | 1512 | ||
1513 | int ext4_delete_inline_entry(handle_t *handle, | ||
1514 | struct inode *dir, | ||
1515 | struct ext4_dir_entry_2 *de_del, | ||
1516 | struct buffer_head *bh, | ||
1517 | int *has_inline_data) | ||
1518 | { | ||
1519 | int err, inline_size; | ||
1520 | struct ext4_iloc iloc; | ||
1521 | void *inline_start; | ||
1522 | |||
1523 | err = ext4_get_inode_loc(dir, &iloc); | ||
1524 | if (err) | ||
1525 | return err; | ||
1526 | |||
1527 | down_write(&EXT4_I(dir)->xattr_sem); | ||
1528 | if (!ext4_has_inline_data(dir)) { | ||
1529 | *has_inline_data = 0; | ||
1530 | goto out; | ||
1531 | } | ||
1532 | |||
1533 | if ((void *)de_del - ((void *)ext4_raw_inode(&iloc)->i_block) < | ||
1534 | EXT4_MIN_INLINE_DATA_SIZE) { | ||
1535 | inline_start = (void *)ext4_raw_inode(&iloc)->i_block + | ||
1536 | EXT4_INLINE_DOTDOT_SIZE; | ||
1537 | inline_size = EXT4_MIN_INLINE_DATA_SIZE - | ||
1538 | EXT4_INLINE_DOTDOT_SIZE; | ||
1539 | } else { | ||
1540 | inline_start = ext4_get_inline_xattr_pos(dir, &iloc); | ||
1541 | inline_size = ext4_get_inline_size(dir) - | ||
1542 | EXT4_MIN_INLINE_DATA_SIZE; | ||
1543 | } | ||
1544 | |||
1545 | err = ext4_journal_get_write_access(handle, bh); | ||
1546 | if (err) | ||
1547 | goto out; | ||
1548 | |||
1549 | err = ext4_generic_delete_entry(handle, dir, de_del, bh, | ||
1550 | inline_start, inline_size, 0); | ||
1551 | if (err) | ||
1552 | goto out; | ||
1553 | |||
1554 | BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); | ||
1555 | err = ext4_mark_inode_dirty(handle, dir); | ||
1556 | if (unlikely(err)) | ||
1557 | goto out; | ||
1558 | |||
1559 | ext4_show_inline_dir(dir, iloc.bh, inline_start, inline_size); | ||
1560 | out: | ||
1561 | up_write(&EXT4_I(dir)->xattr_sem); | ||
1562 | brelse(iloc.bh); | ||
1563 | if (err != -ENOENT) | ||
1564 | ext4_std_error(dir->i_sb, err); | ||
1565 | return err; | ||
1566 | } | ||
1567 | |||
1513 | int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) | 1568 | int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) |
1514 | { | 1569 | { |
1515 | int ret; | 1570 | int ret; |