X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_vfs_single.c;h=1abbfd859a4217767a90d6af13d9a9862a091e19;hp=d77c87dabfd85b3dafa9b9eb9fd9fc5975a5f344;hb=HEAD;hpb=9ec94eea1865dfb884640c4db487d6855f801107 diff --git a/yaffs_vfs_single.c b/yaffs_vfs_single.c index d77c87d..0817ff0 100644 --- a/yaffs_vfs_single.c +++ b/yaffs_vfs_single.c @@ -1,8 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering + * Copyright (C) 2002-2018 Aleph One Ltd. * * Created by Charles Manning * Acknowledgements: @@ -1490,15 +1489,34 @@ static void yaffs_flush_inodes(struct super_block *sb) { struct inode *iptr; struct yaffs_obj *obj; + struct yaffs_dev *dev = yaffs_super_to_dev(sb); + spin_lock(&sb->s_inode_list_lock); list_for_each_entry(iptr, &sb->s_inodes, i_sb_list) { + spin_lock(&inode->i_lock); + if (iptr->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + spin_unlock(&inode->i_lock); + continue; + } + + __iget(iptr); + spin_unlock(&inode->i_lock); + spin_unlock(&sb->s_inode_list_lock); + obj = yaffs_inode_to_obj(iptr); if (obj) { yaffs_trace(YAFFS_TRACE_OS, "flushing obj %d", obj->obj_id); yaffs_flush_file(obj, 1, 0, 0); } + + yaffs_gross_unlock(dev); + iput(iptr); + yaffs_gross_lock(dev); + + spin_lock(&sb->s_inode_list_lock); } + spin_unlock(&sb->s_inode_list_lock); } static void yaffs_flush_super(struct super_block *sb, int do_checkpoint) @@ -1872,11 +1890,11 @@ static void yaffs_fill_inode_from_obj(struct inode *inode, inode->i_rdev = old_decode_dev(obj->yst_rdev); - inode->i_atime.tv_sec = (time_t) (obj->yst_atime); + inode->i_atime.tv_sec = (YTIME_T) (obj->yst_atime); inode->i_atime.tv_nsec = 0; - inode->i_mtime.tv_sec = (time_t) obj->yst_mtime; + inode->i_mtime.tv_sec = (YTIME_T) obj->yst_mtime; inode->i_mtime.tv_nsec = 0; - inode->i_ctime.tv_sec = (time_t) obj->yst_ctime; + inode->i_ctime.tv_sec = (YTIME_T) obj->yst_ctime; inode->i_ctime.tv_nsec = 0; inode->i_size = yaffs_get_obj_length(obj); inode->i_blocks = (inode->i_size + 511) >> 9;