info->si_freei--;
inode->i_uid = current->fsuid;
inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid;
- inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
+ inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
inode->i_blocks = inode->i_blksize = 0;
inode->i_op = &bfs_file_inops;
inode->i_fop = &bfs_file_operations;
return err;
}
inode->i_nlink++;
- inode->i_ctime = CURRENT_TIME;
+ inode->i_ctime = CURRENT_TIME_SEC;
mark_inode_dirty(inode);
atomic_inc(&inode->i_count);
d_instantiate(new, inode);
}
de->ino = 0;
mark_buffer_dirty(bh);
- dir->i_ctime = dir->i_mtime = CURRENT_TIME;
+ dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
mark_inode_dirty(dir);
inode->i_nlink--;
inode->i_ctime = dir->i_ctime;
goto end_rename;
}
old_de->ino = 0;
- old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
+ old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;
mark_inode_dirty(old_dir);
if (new_inode) {
new_inode->i_nlink--;
- new_inode->i_ctime = CURRENT_TIME;
+ new_inode->i_ctime = CURRENT_TIME_SEC;
mark_inode_dirty(new_inode);
}
mark_buffer_dirty(old_bh);
{
struct buffer_head * bh;
struct bfs_dirent * de;
- int block, sblock, eblock, off;
+ int block, sblock, eblock, off, eoff;
int i;
dprintf("name=%s, namelen=%d\n", name, namelen);
sblock = BFS_I(dir)->i_sblock;
eblock = BFS_I(dir)->i_eblock;
+ eoff = dir->i_size % BFS_BSIZE;
for (block=sblock; block<=eblock; block++) {
bh = sb_bread(dir->i_sb, block);
if(!bh)
return -ENOSPC;
for (off=0; off<BFS_BSIZE; off+=BFS_DIRENT_SIZE) {
de = (struct bfs_dirent *)(bh->b_data + off);
+ if (block==eblock && off>=eoff) {
+ /* Do not read/interpret the garbage in the end of eblock. */
+ de->ino = 0;
+ }
if (!de->ino) {
if ((block-sblock)*BFS_BSIZE + off >= dir->i_size) {
dir->i_size += BFS_DIRENT_SIZE;
- dir->i_ctime = CURRENT_TIME;
+ dir->i_ctime = CURRENT_TIME_SEC;
}
- dir->i_mtime = CURRENT_TIME;
+ dir->i_mtime = CURRENT_TIME_SEC;
mark_inode_dirty(dir);
de->ino = ino;
for (i=0; i<BFS_NAMELEN; i++)