Loading fs/ocfs2/dlmglue.c +39 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ #include "dcache.h" #include "dlmglue.h" #include "extent_map.h" #include "file.h" #include "heartbeat.h" #include "inode.h" #include "journal.h" Loading Loading @@ -1723,6 +1724,44 @@ int ocfs2_meta_lock_with_page(struct inode *inode, return ret; } int ocfs2_meta_lock_atime(struct inode *inode, struct vfsmount *vfsmnt, int *level) { int ret; mlog_entry_void(); ret = ocfs2_meta_lock(inode, NULL, 0); if (ret < 0) { mlog_errno(ret); return ret; } /* * If we should update atime, we will get EX lock, * otherwise we just get PR lock. */ if (ocfs2_should_update_atime(inode, vfsmnt)) { struct buffer_head *bh = NULL; ocfs2_meta_unlock(inode, 0); ret = ocfs2_meta_lock(inode, &bh, 1); if (ret < 0) { mlog_errno(ret); return ret; } *level = 1; if (ocfs2_should_update_atime(inode, vfsmnt)) ocfs2_update_inode_atime(inode, bh); if (bh) brelse(bh); } else *level = 0; mlog_exit(ret); return ret; } void ocfs2_meta_unlock(struct inode *inode, int ex) { Loading fs/ocfs2/dlmglue.h +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ void ocfs2_data_unlock(struct inode *inode, int write); int ocfs2_rw_lock(struct inode *inode, int write); void ocfs2_rw_unlock(struct inode *inode, int write); int ocfs2_meta_lock_atime(struct inode *inode, struct vfsmount *vfsmnt, int *level); int ocfs2_meta_lock_full(struct inode *inode, struct buffer_head **ret_bh, int ex, Loading fs/ocfs2/file.c +52 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <linux/uio.h> #include <linux/sched.h> #include <linux/pipe_fs_i.h> #include <linux/mount.h> #define MLOG_MASK_PREFIX ML_INODE #include <cluster/masklog.h> Loading Loading @@ -135,6 +136,57 @@ static int ocfs2_sync_file(struct file *file, return (err < 0) ? -EIO : 0; } int ocfs2_should_update_atime(struct inode *inode, struct vfsmount *vfsmnt) { struct timespec now; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) return 0; if ((inode->i_flags & S_NOATIME) || ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))) return 0; if ((vfsmnt->mnt_flags & MNT_NOATIME) || ((vfsmnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))) return 0; now = CURRENT_TIME; if ((now.tv_sec - inode->i_atime.tv_sec <= osb->s_atime_quantum)) return 0; else return 1; } int ocfs2_update_inode_atime(struct inode *inode, struct buffer_head *bh) { int ret; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); handle_t *handle; mlog_entry_void(); handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); if (handle == NULL) { ret = -ENOMEM; mlog_errno(ret); goto out; } inode->i_atime = CURRENT_TIME; ret = ocfs2_mark_inode_dirty(handle, inode, bh); if (ret < 0) mlog_errno(ret); ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle); out: mlog_exit(ret); return ret; } int ocfs2_set_inode_size(handle_t *handle, struct inode *inode, struct buffer_head *fe_bh, Loading fs/ocfs2/file.h +5 −0 Original line number Diff line number Diff line Loading @@ -54,4 +54,9 @@ int ocfs2_set_inode_size(handle_t *handle, struct buffer_head *fe_bh, u64 new_i_size); int ocfs2_should_update_atime(struct inode *inode, struct vfsmount *vfsmnt); int ocfs2_update_inode_atime(struct inode *inode, struct buffer_head *bh); #endif /* OCFS2_FILE_H */ fs/ocfs2/inode.c +0 −1 Original line number Diff line number Diff line Loading @@ -360,7 +360,6 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, inode); ocfs2_set_inode_flags(inode); inode->i_flags |= S_NOATIME; status = 0; bail: Loading Loading
fs/ocfs2/dlmglue.c +39 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ #include "dcache.h" #include "dlmglue.h" #include "extent_map.h" #include "file.h" #include "heartbeat.h" #include "inode.h" #include "journal.h" Loading Loading @@ -1723,6 +1724,44 @@ int ocfs2_meta_lock_with_page(struct inode *inode, return ret; } int ocfs2_meta_lock_atime(struct inode *inode, struct vfsmount *vfsmnt, int *level) { int ret; mlog_entry_void(); ret = ocfs2_meta_lock(inode, NULL, 0); if (ret < 0) { mlog_errno(ret); return ret; } /* * If we should update atime, we will get EX lock, * otherwise we just get PR lock. */ if (ocfs2_should_update_atime(inode, vfsmnt)) { struct buffer_head *bh = NULL; ocfs2_meta_unlock(inode, 0); ret = ocfs2_meta_lock(inode, &bh, 1); if (ret < 0) { mlog_errno(ret); return ret; } *level = 1; if (ocfs2_should_update_atime(inode, vfsmnt)) ocfs2_update_inode_atime(inode, bh); if (bh) brelse(bh); } else *level = 0; mlog_exit(ret); return ret; } void ocfs2_meta_unlock(struct inode *inode, int ex) { Loading
fs/ocfs2/dlmglue.h +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ void ocfs2_data_unlock(struct inode *inode, int write); int ocfs2_rw_lock(struct inode *inode, int write); void ocfs2_rw_unlock(struct inode *inode, int write); int ocfs2_meta_lock_atime(struct inode *inode, struct vfsmount *vfsmnt, int *level); int ocfs2_meta_lock_full(struct inode *inode, struct buffer_head **ret_bh, int ex, Loading
fs/ocfs2/file.c +52 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include <linux/uio.h> #include <linux/sched.h> #include <linux/pipe_fs_i.h> #include <linux/mount.h> #define MLOG_MASK_PREFIX ML_INODE #include <cluster/masklog.h> Loading Loading @@ -135,6 +136,57 @@ static int ocfs2_sync_file(struct file *file, return (err < 0) ? -EIO : 0; } int ocfs2_should_update_atime(struct inode *inode, struct vfsmount *vfsmnt) { struct timespec now; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) return 0; if ((inode->i_flags & S_NOATIME) || ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))) return 0; if ((vfsmnt->mnt_flags & MNT_NOATIME) || ((vfsmnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))) return 0; now = CURRENT_TIME; if ((now.tv_sec - inode->i_atime.tv_sec <= osb->s_atime_quantum)) return 0; else return 1; } int ocfs2_update_inode_atime(struct inode *inode, struct buffer_head *bh) { int ret; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); handle_t *handle; mlog_entry_void(); handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); if (handle == NULL) { ret = -ENOMEM; mlog_errno(ret); goto out; } inode->i_atime = CURRENT_TIME; ret = ocfs2_mark_inode_dirty(handle, inode, bh); if (ret < 0) mlog_errno(ret); ocfs2_commit_trans(OCFS2_SB(inode->i_sb), handle); out: mlog_exit(ret); return ret; } int ocfs2_set_inode_size(handle_t *handle, struct inode *inode, struct buffer_head *fe_bh, Loading
fs/ocfs2/file.h +5 −0 Original line number Diff line number Diff line Loading @@ -54,4 +54,9 @@ int ocfs2_set_inode_size(handle_t *handle, struct buffer_head *fe_bh, u64 new_i_size); int ocfs2_should_update_atime(struct inode *inode, struct vfsmount *vfsmnt); int ocfs2_update_inode_atime(struct inode *inode, struct buffer_head *bh); #endif /* OCFS2_FILE_H */
fs/ocfs2/inode.c +0 −1 Original line number Diff line number Diff line Loading @@ -360,7 +360,6 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, inode); ocfs2_set_inode_flags(inode); inode->i_flags |= S_NOATIME; status = 0; bail: Loading