yaffsfs.c: Fix NULL dereference in yaffs_unmount2_reldev()
[yaffs2.git] / yaffs_vfs_single.c
index 0ac24bce467e393d554154764969de224df04b95..0817ff0c30399db41e0104f112226b9d2210175a 100644 (file)
@@ -1489,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)
@@ -1871,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;