if (l > sizeof (inode->u.ext2_i.i_data)) { /* slow symlink */ inode->i_op = &page_symlink_inode_operations; inode->i_mapping->a_ops = &ext2_aops; err = block_symlink(inode, symname, l); if (err) goto out_fail; } else { /* fast symlink */ inode->i_op = &ext2_fast_symlink_inode_operations; memcpy((char*)&inode->u.ext2_i.i_data,symname,l); inode->i_size = l-1; } So since most ext2 filesystems have more inodes allocated than they can use and most symlinks are short, symlinks are usually no more likely to make you run low on space than hardlinks. The big problem in rsync is that using -H doubles the amount of space used to store the file list: hlink.c:57 if (!(hlink_list = (struct file_struct *)malloc(sizeof(hlink_list[0])*flist->count))) out_of_memory("init_hard_links"); There are certainly better ways to do this. To start with, hlink.c only needs to even *think* about non-directories which have nlinks>1. -- Martin