forked from Minki/linux
ubifs: introduce UBIFS_ATIME_SUPPORT to ubifs
To make ubifs support atime flexily, this commit introduces a Kconfig option named as UBIFS_ATIME_SUPPORT. With UBIFS_ATIME_SUPPORT=n: ubifs keeps the full compatibility to no_atime from the start of ubifs. =================UBIFS_ATIME_SUPPORT=n======================= -o - no atime -o atime - no atime -o noatime - no atime -o relatime - no atime -o strictatime - no atime -o lazyatime - no atime With UBIFS_ATIME_SUPPORT=y: ubifs supports the atime same with other main stream file systems. =================UBIFS_ATIME_SUPPORT=y======================= -o - default behavior (relatime currently) -o atime - atime support -o noatime - no atime support -o relatime - relative atime support -o strictatime - strict atime support -o lazyatime - lazy atime support Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com> Reviewed-by: Richard Weinberger <richard@nod.at> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
ab92a20bce
commit
8c1c5f2638
@ -35,3 +35,18 @@ config UBIFS_FS_ZLIB
|
||||
default y
|
||||
help
|
||||
Zlib compresses better than LZO but it is slower. Say 'Y' if unsure.
|
||||
|
||||
config UBIFS_ATIME_SUPPORT
|
||||
bool "Access time support" if UBIFS_FS
|
||||
depends on UBIFS_FS
|
||||
default n
|
||||
help
|
||||
Originally UBIFS did not support atime, because it looked like a bad idea due
|
||||
increased flash wear. This option adds atime support and it is disabled by default
|
||||
to preserve the old behavior. If you enable this option, UBIFS starts updating atime,
|
||||
which means that file-system read operations will cause writes (inode atime
|
||||
updates). This may affect file-system performance and increase flash device wear,
|
||||
so be careful. How often atime is updated depends on the selected strategy:
|
||||
strictatime is the "heavy", relatime is "lighter", etc.
|
||||
|
||||
If unsure, say 'N'
|
||||
|
@ -1186,6 +1186,9 @@ const struct inode_operations ubifs_dir_inode_operations = {
|
||||
.getxattr = ubifs_getxattr,
|
||||
.listxattr = ubifs_listxattr,
|
||||
.removexattr = ubifs_removexattr,
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
.update_time = ubifs_update_time,
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct file_operations ubifs_dir_operations = {
|
||||
|
@ -1354,6 +1354,47 @@ static inline int mctime_update_needed(const struct inode *inode,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
/**
|
||||
* ubifs_update_time - update time of inode.
|
||||
* @inode: inode to update
|
||||
*
|
||||
* This function updates time of the inode.
|
||||
*/
|
||||
int ubifs_update_time(struct inode *inode, struct timespec *time,
|
||||
int flags)
|
||||
{
|
||||
struct ubifs_inode *ui = ubifs_inode(inode);
|
||||
struct ubifs_info *c = inode->i_sb->s_fs_info;
|
||||
struct ubifs_budget_req req = { .dirtied_ino = 1,
|
||||
.dirtied_ino_d = ALIGN(ui->data_len, 8) };
|
||||
int iflags = I_DIRTY_TIME;
|
||||
int err, release;
|
||||
|
||||
err = ubifs_budget_space(c, &req);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mutex_lock(&ui->ui_mutex);
|
||||
if (flags & S_ATIME)
|
||||
inode->i_atime = *time;
|
||||
if (flags & S_CTIME)
|
||||
inode->i_ctime = *time;
|
||||
if (flags & S_MTIME)
|
||||
inode->i_mtime = *time;
|
||||
|
||||
if (!(inode->i_sb->s_flags & MS_LAZYTIME))
|
||||
iflags |= I_DIRTY_SYNC;
|
||||
|
||||
release = ui->dirty;
|
||||
__mark_inode_dirty(inode, iflags);
|
||||
mutex_unlock(&ui->ui_mutex);
|
||||
if (release)
|
||||
ubifs_release_budget(c, &req);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* update_ctime - update mtime and ctime of an inode.
|
||||
* @inode: inode to update
|
||||
@ -1537,6 +1578,9 @@ static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
if (err)
|
||||
return err;
|
||||
vma->vm_ops = &ubifs_file_vm_ops;
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
file_accessed(file);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1557,6 +1601,9 @@ const struct inode_operations ubifs_file_inode_operations = {
|
||||
.getxattr = ubifs_getxattr,
|
||||
.listxattr = ubifs_listxattr,
|
||||
.removexattr = ubifs_removexattr,
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
.update_time = ubifs_update_time,
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct inode_operations ubifs_symlink_inode_operations = {
|
||||
@ -1568,6 +1615,9 @@ const struct inode_operations ubifs_symlink_inode_operations = {
|
||||
.getxattr = ubifs_getxattr,
|
||||
.listxattr = ubifs_listxattr,
|
||||
.removexattr = ubifs_removexattr,
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
.update_time = ubifs_update_time,
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct file_operations ubifs_file_operations = {
|
||||
|
@ -128,7 +128,10 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum)
|
||||
if (err)
|
||||
goto out_ino;
|
||||
|
||||
inode->i_flags |= (S_NOCMTIME | S_NOATIME);
|
||||
inode->i_flags |= S_NOCMTIME;
|
||||
#ifndef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
inode->i_flags |= S_NOATIME;
|
||||
#endif
|
||||
set_nlink(inode, le32_to_cpu(ino->nlink));
|
||||
i_uid_write(inode, le32_to_cpu(ino->uid));
|
||||
i_gid_write(inode, le32_to_cpu(ino->gid));
|
||||
@ -2139,7 +2142,12 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,
|
||||
if (err)
|
||||
goto out_deact;
|
||||
/* We do not support atime */
|
||||
sb->s_flags |= MS_ACTIVE | MS_NOATIME;
|
||||
sb->s_flags |= MS_ACTIVE;
|
||||
#ifndef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
sb->s_flags |= MS_NOATIME;
|
||||
#else
|
||||
ubifs_msg(c, "full atime support is enabled.");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* 'fill_super()' opens ubi again so we must close it here */
|
||||
|
@ -1746,6 +1746,9 @@ int ubifs_calc_dark(const struct ubifs_info *c, int spc);
|
||||
/* file.c */
|
||||
int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync);
|
||||
int ubifs_setattr(struct dentry *dentry, struct iattr *attr);
|
||||
#ifdef CONFIG_UBIFS_ATIME_SUPPORT
|
||||
int ubifs_update_time(struct inode *inode, struct timespec *time, int flags);
|
||||
#endif
|
||||
|
||||
/* dir.c */
|
||||
struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir,
|
||||
|
Loading…
Reference in New Issue
Block a user