1448
1449 sb = dir->i_sb;
1450 blocksize = sb->s_blocksize;
1451 if (!dentry->d_name.len)
1452 return -EINVAL;
1453 if (is_dx(dir)) {
1454 retval = ext4_dx_add_entry(handle, dentry, inode);
1455 if (!retval || (retval != ERR_BAD_DX_DIR))
1456 return retval;
1457 EXT4_I(dir)->i_flags &= ~EXT4_INDEX_FL;
1458 dx_fallback++;
1459 ext4_mark_inode_dirty(handle, dir);
1460 }
1461 blocks = dir->i_size >> sb->s_blocksize_bits;
1462 for (block = 0, offset = 0; block < blocks; block++) {
1463 bh = ext4_bread(handle, dir, block, 0, &retval);
1464 if(!bh)
1465 return retval;
1466 retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
1467 if (retval != -ENOSPC)
1468 return retval;
1469
1470 if (blocks == 1 && !dx_fallback &&
1471 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX))
1472 return make_indexed_dir(handle, dentry, inode, bh);
1473 brelse(bh);
1474 }
1475 bh = ext4_append(handle, dir, &block, &retval);
1476 if (!bh)
1477 return retval;
1478 de = (struct ext4_dir_entry_2 *) bh->b_data;
1479 de->inode = 0;
1480 de->rec_len = ext4_rec_len_to_disk(blocksize);
1481 return add_dirent_to_buf(handle, dentry, inode, de, bh);
1482}
1483
1484
1485
1486
1487static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
1488 struct inode *inode)