[PATCH] replace inode_update_time with file_update_time
To allow various options to work per-mount instead of per-sb we need a struct vfsmount when updating ctime and mtime. This preparation patch replaces the inode_update_time routine with a file_update_atime routine so we can easily get at the vfsmount. (and the file makes more sense in this context anyway). Also get rid of the unused second argument - we always want to update the ctime when calling this routine. Signed-off-by: Christoph Hellwig <hch@lst.de> Cc: Al Viro <viro@ftp.linux.org.uk> Cc: Anton Altaparmakov <aia21@cantab.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
3542c6e18f
commit
870f481793
21
fs/inode.c
21
fs/inode.c
|
@ -1204,16 +1204,20 @@ void update_atime(struct inode *inode)
|
||||||
EXPORT_SYMBOL(update_atime);
|
EXPORT_SYMBOL(update_atime);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inode_update_time - update mtime and ctime time
|
* file_update_time - update mtime and ctime time
|
||||||
* @inode: inode accessed
|
* @file: file accessed
|
||||||
* @ctime_too: update ctime too
|
|
||||||
*
|
*
|
||||||
* Update the mtime time on an inode and mark it for writeback.
|
* Update the mtime and ctime members of an inode and mark the inode
|
||||||
* When ctime_too is specified update the ctime too.
|
* for writeback. Note that this function is meant exclusively for
|
||||||
|
* usage in the file write path of filesystems, and filesystems may
|
||||||
|
* choose to explicitly ignore update via this function with the
|
||||||
|
* S_NOCTIME inode flag, e.g. for network filesystem where these
|
||||||
|
* timestamps are handled by the server.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void inode_update_time(struct inode *inode, int ctime_too)
|
void file_update_time(struct file *file)
|
||||||
{
|
{
|
||||||
|
struct inode *inode = file->f_dentry->d_inode;
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
int sync_it = 0;
|
int sync_it = 0;
|
||||||
|
|
||||||
|
@ -1227,16 +1231,15 @@ void inode_update_time(struct inode *inode, int ctime_too)
|
||||||
sync_it = 1;
|
sync_it = 1;
|
||||||
inode->i_mtime = now;
|
inode->i_mtime = now;
|
||||||
|
|
||||||
if (ctime_too) {
|
|
||||||
if (!timespec_equal(&inode->i_ctime, &now))
|
if (!timespec_equal(&inode->i_ctime, &now))
|
||||||
sync_it = 1;
|
sync_it = 1;
|
||||||
inode->i_ctime = now;
|
inode->i_ctime = now;
|
||||||
}
|
|
||||||
if (sync_it)
|
if (sync_it)
|
||||||
mark_inode_dirty_sync(inode);
|
mark_inode_dirty_sync(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(inode_update_time);
|
EXPORT_SYMBOL(file_update_time);
|
||||||
|
|
||||||
int inode_needs_sync(struct inode *inode)
|
int inode_needs_sync(struct inode *inode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -262,7 +262,7 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
|
||||||
}
|
}
|
||||||
vfree(bouncebuffer);
|
vfree(bouncebuffer);
|
||||||
|
|
||||||
inode_update_time(inode, 1);
|
file_update_time(file);
|
||||||
|
|
||||||
*ppos = pos;
|
*ppos = pos;
|
||||||
|
|
||||||
|
|
|
@ -2173,7 +2173,7 @@ static ssize_t ntfs_file_aio_write_nolock(struct kiocb *iocb,
|
||||||
err = remove_suid(file->f_dentry);
|
err = remove_suid(file->f_dentry);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
inode_update_time(inode, 1);
|
file_update_time(file);
|
||||||
written = ntfs_file_buffered_write(iocb, iov, nr_segs, pos, ppos,
|
written = ntfs_file_buffered_write(iocb, iov, nr_segs, pos, ppos,
|
||||||
count);
|
count);
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -2767,7 +2767,25 @@ unm_done:
|
||||||
up_write(&ni->runlist.lock);
|
up_write(&ni->runlist.lock);
|
||||||
done:
|
done:
|
||||||
/* Update the mtime and ctime on the base inode. */
|
/* Update the mtime and ctime on the base inode. */
|
||||||
inode_update_time(VFS_I(base_ni), 1);
|
/* normally ->truncate shouldn't update ctime or mtime,
|
||||||
|
* but ntfs did before so it got a copy & paste version
|
||||||
|
* of file_update_time. one day someone should fix this
|
||||||
|
* for real.
|
||||||
|
*/
|
||||||
|
if (!IS_NOCMTIME(VFS_I(base_ni)) && !IS_RDONLY(VFS_I(base_ni))) {
|
||||||
|
struct timespec now = current_fs_time(VFS_I(base_ni)->i_sb);
|
||||||
|
int sync_it = 0;
|
||||||
|
|
||||||
|
if (!timespec_equal(&VFS_I(base_ni)->i_mtime, &now) ||
|
||||||
|
!timespec_equal(&VFS_I(base_ni)->i_ctime, &now))
|
||||||
|
sync_it = 1;
|
||||||
|
VFS_I(base_ni)->i_mtime = now;
|
||||||
|
VFS_I(base_ni)->i_ctime = now;
|
||||||
|
|
||||||
|
if (sync_it)
|
||||||
|
mark_inode_dirty_sync(VFS_I(base_ni));
|
||||||
|
}
|
||||||
|
|
||||||
if (likely(!err)) {
|
if (likely(!err)) {
|
||||||
NInoClearTruncateFailed(ni);
|
NInoClearTruncateFailed(ni);
|
||||||
ntfs_debug("Done.");
|
ntfs_debug("Done.");
|
||||||
|
|
|
@ -80,12 +80,8 @@ static struct vm_operations_struct ocfs2_file_vm_ops = {
|
||||||
.nopage = ocfs2_nopage,
|
.nopage = ocfs2_nopage,
|
||||||
};
|
};
|
||||||
|
|
||||||
int ocfs2_mmap(struct file *file,
|
int ocfs2_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
struct vm_area_struct *vma)
|
|
||||||
{
|
{
|
||||||
struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
|
|
||||||
struct inode *inode = mapping->host;
|
|
||||||
|
|
||||||
/* We don't want to support shared writable mappings yet. */
|
/* We don't want to support shared writable mappings yet. */
|
||||||
if (((vma->vm_flags & VM_SHARED) || (vma->vm_flags & VM_MAYSHARE))
|
if (((vma->vm_flags & VM_SHARED) || (vma->vm_flags & VM_MAYSHARE))
|
||||||
&& ((vma->vm_flags & VM_WRITE) || (vma->vm_flags & VM_MAYWRITE))) {
|
&& ((vma->vm_flags & VM_WRITE) || (vma->vm_flags & VM_MAYWRITE))) {
|
||||||
|
@ -95,7 +91,7 @@ int ocfs2_mmap(struct file *file,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_atime(inode);
|
file_accessed(file);
|
||||||
vma->vm_ops = &ocfs2_file_vm_ops;
|
vma->vm_ops = &ocfs2_file_vm_ops;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,7 +347,7 @@ out:
|
||||||
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
|
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
|
||||||
}
|
}
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
inode_update_time(inode, 1); /* mtime and ctime */
|
file_update_time(filp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1360,7 +1360,7 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
|
||||||
if (res)
|
if (res)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
inode_update_time(inode, 1); /* Both mtime and ctime */
|
file_update_time(file);
|
||||||
|
|
||||||
// Ok, we are done with all the checks.
|
// Ok, we are done with all the checks.
|
||||||
|
|
||||||
|
|
|
@ -713,7 +713,7 @@ start:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (likely(!(ioflags & IO_INVIS))) {
|
if (likely(!(ioflags & IO_INVIS))) {
|
||||||
inode_update_time(inode, 1);
|
file_update_time(file);
|
||||||
xfs_ichgtime_fast(xip, inode,
|
xfs_ichgtime_fast(xip, inode,
|
||||||
XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1716,7 +1716,7 @@ extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const vo
|
||||||
extern int inode_change_ok(struct inode *, struct iattr *);
|
extern int inode_change_ok(struct inode *, struct iattr *);
|
||||||
extern int __must_check inode_setattr(struct inode *, struct iattr *);
|
extern int __must_check inode_setattr(struct inode *, struct iattr *);
|
||||||
|
|
||||||
extern void inode_update_time(struct inode *inode, int ctime_too);
|
extern void file_update_time(struct file *file);
|
||||||
|
|
||||||
static inline ino_t parent_ino(struct dentry *dentry)
|
static inline ino_t parent_ino(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2108,7 +2108,7 @@ __generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
inode_update_time(inode, 1);
|
file_update_time(file);
|
||||||
|
|
||||||
/* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
|
/* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
|
||||||
if (unlikely(file->f_flags & O_DIRECT)) {
|
if (unlikely(file->f_flags & O_DIRECT)) {
|
||||||
|
|
|
@ -383,7 +383,7 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_backing;
|
goto out_backing;
|
||||||
|
|
||||||
inode_update_time(inode, 1);
|
file_update_time(filp);
|
||||||
|
|
||||||
ret = __xip_file_write (filp, buf, count, pos, ppos);
|
ret = __xip_file_write (filp, buf, count, pos, ppos);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue