X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fhpfs%2Finode.c;h=56f2c338c4d9a1b9a9639447ae7b23666079b461;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=dec2ad61c3557277c2ef97390a1b09ba454d0f38;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index dec2ad61c..56f2c338c 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -141,14 +141,14 @@ void hpfs_read_inode(struct inode *i) brelse(bh); } -void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) +static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) { struct hpfs_inode_info *hpfs_inode = hpfs_i(i); - if (fnode->acl_size_l || fnode->acl_size_s) { - /* Some unknown structures like ACL may be in fnode, - we'd better not overwrite them */ + /*if (fnode->acl_size_l || fnode->acl_size_s) { + Some unknown structures like ACL may be in fnode, + we'd better not overwrite them hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); - } else if (hpfs_sb(i->i_sb)->sb_eas >= 2) { + } else*/ if (hpfs_sb(i->i_sb)->sb_eas >= 2) { u32 ea; if ((i->i_uid != hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) { ea = cpu_to_le32(i->i_uid); @@ -186,9 +186,9 @@ void hpfs_write_inode(struct inode *i) kfree(hpfs_inode->i_rddir_off); hpfs_inode->i_rddir_off = NULL; } - down(&hpfs_inode->i_parent); + mutex_lock(&hpfs_inode->i_parent_mutex); if (!i->i_nlink) { - up(&hpfs_inode->i_parent); + mutex_unlock(&hpfs_inode->i_parent_mutex); return; } parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); @@ -199,14 +199,14 @@ void hpfs_write_inode(struct inode *i) hpfs_read_inode(parent); unlock_new_inode(parent); } - down(&hpfs_inode->i_sem); + mutex_lock(&hpfs_inode->i_mutex); hpfs_write_inode_nolock(i); - up(&hpfs_inode->i_sem); + mutex_unlock(&hpfs_inode->i_mutex); iput(parent); } else { mark_inode_dirty(i); } - up(&hpfs_inode->i_parent); + mutex_unlock(&hpfs_inode->i_parent_mutex); } void hpfs_write_inode_nolock(struct inode *i) @@ -218,16 +218,18 @@ void hpfs_write_inode_nolock(struct inode *i) struct hpfs_dirent *de; if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return; if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) return; - if (i->i_ino != hpfs_sb(i->i_sb)->sb_root) { + if (i->i_ino != hpfs_sb(i->i_sb)->sb_root && i->i_nlink) { if (!(de = map_fnode_dirent(i->i_sb, i->i_ino, fnode, &qbh))) { brelse(bh); return; } } else de = NULL; if (S_ISREG(i->i_mode)) { - fnode->file_size = de->file_size = i->i_size; + fnode->file_size = i->i_size; + if (de) de->file_size = i->i_size; } else if (S_ISDIR(i->i_mode)) { - fnode->file_size = de->file_size = 0; + fnode->file_size = 0; + if (de) de->file_size = 0; } hpfs_write_inode_ea(i, fnode); if (de) { @@ -282,6 +284,7 @@ void hpfs_write_if_changed(struct inode *inode) void hpfs_delete_inode(struct inode *inode) { + truncate_inode_pages(&inode->i_data, 0); lock_kernel(); hpfs_remove_fnode(inode->i_sb, inode->i_ino); unlock_kernel();