mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
xfs: move xfs_update_prealloc_flags() to xfs_pnfs.c
The operations that xfs_update_prealloc_flags() perform are now unique to xfs_fs_map_blocks(), so move xfs_update_prealloc_flags() to be a static function in xfs_pnfs.c and cut out all the other functionality that is doesn't use anymore. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
parent
0b02c8c0d7
commit
b39a04636f
@ -66,38 +66,6 @@ xfs_is_falloc_aligned(
|
||||
return !((pos | len) & mask);
|
||||
}
|
||||
|
||||
int
|
||||
xfs_update_prealloc_flags(
|
||||
struct xfs_inode *ip,
|
||||
enum xfs_prealloc_flags flags)
|
||||
{
|
||||
struct xfs_trans *tp;
|
||||
int error;
|
||||
|
||||
error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_writeid,
|
||||
0, 0, 0, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||
|
||||
if (!(flags & XFS_PREALLOC_INVISIBLE)) {
|
||||
VFS_I(ip)->i_mode &= ~S_ISUID;
|
||||
if (VFS_I(ip)->i_mode & S_IXGRP)
|
||||
VFS_I(ip)->i_mode &= ~S_ISGID;
|
||||
xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
||||
}
|
||||
|
||||
if (flags & XFS_PREALLOC_SET)
|
||||
ip->i_diflags |= XFS_DIFLAG_PREALLOC;
|
||||
if (flags & XFS_PREALLOC_CLEAR)
|
||||
ip->i_diflags &= ~XFS_DIFLAG_PREALLOC;
|
||||
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
return xfs_trans_commit(tp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fsync operations on directories are much simpler than on regular files,
|
||||
* as there is no file data to flush, and thus also no need for explicit
|
||||
|
@ -462,14 +462,6 @@ xfs_itruncate_extents(
|
||||
}
|
||||
|
||||
/* from xfs_file.c */
|
||||
enum xfs_prealloc_flags {
|
||||
XFS_PREALLOC_SET = (1 << 1),
|
||||
XFS_PREALLOC_CLEAR = (1 << 2),
|
||||
XFS_PREALLOC_INVISIBLE = (1 << 3),
|
||||
};
|
||||
|
||||
int xfs_update_prealloc_flags(struct xfs_inode *ip,
|
||||
enum xfs_prealloc_flags flags);
|
||||
int xfs_break_layouts(struct inode *inode, uint *iolock,
|
||||
enum layout_break_reason reason);
|
||||
|
||||
|
@ -70,6 +70,40 @@ xfs_fs_get_uuid(
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot use file based VFS helpers such as file_modified() to update
|
||||
* inode state as we modify the data/metadata in the inode here. Hence we have
|
||||
* to open code the timestamp updates and SUID/SGID stripping. We also need
|
||||
* to set the inode prealloc flag to ensure that the extents we allocate are not
|
||||
* removed if the inode is reclaimed from memory before xfs_fs_block_commit()
|
||||
* is from the client to indicate that data has been written and the file size
|
||||
* can be extended.
|
||||
*/
|
||||
static int
|
||||
xfs_fs_map_update_inode(
|
||||
struct xfs_inode *ip)
|
||||
{
|
||||
struct xfs_trans *tp;
|
||||
int error;
|
||||
|
||||
error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_writeid,
|
||||
0, 0, 0, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||
|
||||
VFS_I(ip)->i_mode &= ~S_ISUID;
|
||||
if (VFS_I(ip)->i_mode & S_IXGRP)
|
||||
VFS_I(ip)->i_mode &= ~S_ISGID;
|
||||
xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
||||
ip->i_diflags |= XFS_DIFLAG_PREALLOC;
|
||||
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
return xfs_trans_commit(tp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a layout for the pNFS client.
|
||||
*/
|
||||
@ -164,7 +198,7 @@ xfs_fs_map_blocks(
|
||||
* that the blocks allocated and handed out to the client are
|
||||
* guaranteed to be present even after a server crash.
|
||||
*/
|
||||
error = xfs_update_prealloc_flags(ip, XFS_PREALLOC_SET);
|
||||
error = xfs_fs_map_update_inode(ip);
|
||||
if (!error)
|
||||
error = xfs_log_force_inode(ip);
|
||||
if (error)
|
||||
@ -257,7 +291,7 @@ xfs_fs_commit_blocks(
|
||||
length = end - start;
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
|
||||
/*
|
||||
* Make sure reads through the pagecache see the new data.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user