int bext2_sync_file (struct inode * inode, struct file * file) { int wait, err = 0; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) return -EINVAL; if (S_ISLNK(inode->i_mode) && !(inode->i_blocks)) /* * Don't sync fast links! */ goto skip; for (wait=0; wait<=1; wait++) { err |= sync_direct (inode, wait); err |= sync_indirect (inode, inode->u.ext2_i.i_data+EXT2_IND_BLOCK, wait); err |= sync_dindirect (inode, inode->u.ext2_i.i_data+EXT2_DIND_BLOCK, wait); err |= sync_tindirect (inode, inode->u.ext2_i.i_data+EXT2_TIND_BLOCK, wait); } skip: err |= bext2_sync_inode (inode); return (err < 0) ? -EIO : 0; }
int sysv_sync_file(struct file * file, struct dentry *dentry, int datasync) { int wait, err = 0; struct inode *inode = dentry->d_inode; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) return -EINVAL; lock_kernel(); for (wait=0; wait<=1; wait++) { err |= sync_direct(inode, wait); err |= sync_indirect(inode, inode->u.sysv_i.i_data+10, 0, wait); err |= sync_dindirect(inode, inode->u.sysv_i.i_data+11, 0, wait); err |= sync_tindirect(inode, inode->u.sysv_i.i_data+12, 0, wait); } err |= sysv_sync_inode (inode); unlock_kernel(); return (err < 0) ? -EIO : 0; }