diff options
Diffstat (limited to 'fs/jfs/file.c')
| -rw-r--r-- | fs/jfs/file.c | 43 | 
1 files changed, 28 insertions, 15 deletions
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index c5ce6c1d1ff..33aa0cc1f8b 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -19,6 +19,7 @@  #include <linux/mm.h>  #include <linux/fs.h> +#include <linux/posix_acl.h>  #include <linux/quotaops.h>  #include "jfs_incore.h"  #include "jfs_inode.h" @@ -28,19 +29,26 @@  #include "jfs_acl.h"  #include "jfs_debug.h" -int jfs_fsync(struct file *file, int datasync) +int jfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)  {  	struct inode *inode = file->f_mapping->host;  	int rc = 0; +	rc = filemap_write_and_wait_range(inode->i_mapping, start, end); +	if (rc) +		return rc; + +	mutex_lock(&inode->i_mutex);  	if (!(inode->i_state & I_DIRTY) ||  	    (datasync && !(inode->i_state & I_DIRTY_DATASYNC))) {  		/* Make sure committed changes hit the disk */  		jfs_flush_journal(JFS_SBI(inode->i_sb)->log, 1); +		mutex_unlock(&inode->i_mutex);  		return rc;  	}  	rc |= jfs_commit_inode(inode, 1); +	mutex_unlock(&inode->i_mutex);  	return rc ? -EIO : 0;  } @@ -66,9 +74,9 @@ static int jfs_open(struct inode *inode, struct file *file)  		struct jfs_inode_info *ji = JFS_IP(inode);  		spin_lock_irq(&ji->ag_lock);  		if (ji->active_ag == -1) { -			ji->active_ag = ji->agno; -			atomic_inc( -			    &JFS_SBI(inode->i_sb)->bmap->db_active[ji->agno]); +			struct jfs_sb_info *jfs_sb = JFS_SBI(inode->i_sb); +			ji->active_ag = BLKTOAG(addressPXD(&ji->ixpxd), jfs_sb); +			atomic_inc( &jfs_sb->bmap->db_active[ji->active_ag]);  		}  		spin_unlock_irq(&ji->ag_lock);  	} @@ -101,8 +109,8 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr)  	if (is_quota_modification(inode, iattr))  		dquot_initialize(inode); -	if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || -	    (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { +	if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) || +	    (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) {  		rc = dquot_transfer(inode, iattr);  		if (rc)  			return rc; @@ -110,41 +118,46 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr)  	if ((iattr->ia_valid & ATTR_SIZE) &&  	    iattr->ia_size != i_size_read(inode)) { -		rc = vmtruncate(inode, iattr->ia_size); +		inode_dio_wait(inode); + +		rc = inode_newsize_ok(inode, iattr->ia_size);  		if (rc)  			return rc; + +		truncate_setsize(inode, iattr->ia_size); +		jfs_truncate(inode);  	}  	setattr_copy(inode, iattr);  	mark_inode_dirty(inode);  	if (iattr->ia_valid & ATTR_MODE) -		rc = jfs_acl_chmod(inode); +		rc = posix_acl_chmod(inode, inode->i_mode);  	return rc;  }  const struct inode_operations jfs_file_inode_operations = { -	.truncate	= jfs_truncate,  	.setxattr	= jfs_setxattr,  	.getxattr	= jfs_getxattr,  	.listxattr	= jfs_listxattr,  	.removexattr	= jfs_removexattr,  	.setattr	= jfs_setattr,  #ifdef CONFIG_JFS_POSIX_ACL -	.check_acl	= jfs_check_acl, +	.get_acl	= jfs_get_acl, +	.set_acl	= jfs_set_acl,  #endif  };  const struct file_operations jfs_file_operations = {  	.open		= jfs_open,  	.llseek		= generic_file_llseek, -	.write		= do_sync_write, -	.read		= do_sync_read, -	.aio_read	= generic_file_aio_read, -	.aio_write	= generic_file_aio_write, +	.write		= new_sync_write, +	.read		= new_sync_read, +	.read_iter	= generic_file_read_iter, +	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap,  	.splice_read	= generic_file_splice_read, -	.splice_write	= generic_file_splice_write, +	.splice_write	= iter_file_splice_write,  	.fsync		= jfs_fsync,  	.release	= jfs_release,  	.unlocked_ioctl = jfs_ioctl,  | 
