]> git.neil.brown.name Git - LaFS.git/blob - sync.doc
README update
[LaFS.git] / sync.doc
1
2 To handle sys_sync, we want to schedule writes for all data blocks,
3 then trigger a checkpoint.  This will force all inode metadata out.
4
5 By contrast, fsync just writes the inode without a checkpoint by
6 doing an update for the metadata in the inode.
7
8 For a sys_sync, we want to avoid all the inode syncs.
9
10 Now do_sync does:
11
12   wakeup_pdflush(0)
13      This writes all the data blocks
14   sync_inodes(0)
15      sync_inodes_sb(sb, 0)
16        sync_sb_inodes
17          __writeback_single_inode
18           do_writepages
19           __sync_single_inode
20             do_writepages
21             write_inode
22               lafs_write_inode (0)
23      sync_blockdev!!
24
25
26   sync_supers
27      write_super
28        ->lafs_write_super
29
30   sync_filesystems(0)
31       ->lafs_sync_fs
32
33   sync_filesystems(wait)
34
35   sync_inodes(wait) (1)
36
37 So write_inode is called from
38
39    __sync_single_inode(wbc)
40
41       __writeback_single_inode(wbc)
42
43          sync_sb_inodes(wbc)
44              writeback_inodes(wbc) - for all filesystems
45                 balance_dirty_pages - WB_SYNC_NONE
46                 background_writeout NONE
47                 wb_kupdate NONE
48              sync_inodes_sb(sb, wait) - for one filesystem
49                 __sync_inodes(wait)
50                    sync_inodes(wait)
51                      do_sync0, 1
52                 fsync_super
53                    umount/remount
54
55          write_inode_now(sync)
56              EXPORTED
57                nfsd!!
58              generic_osync_inode - sets wait.
59                   EXPORTED
60
61          sync_inode(wbc)
62              EXPORTED
63