* NAME: flushvol() * DESCRIPTION: flush all pending changes (B*-tree, MDB, VBM) to volume */
| 120 | * DESCRIPTION: flush all pending changes (B*-tree, MDB, VBM) to volume |
| 121 | */ |
| 122 | static |
| 123 | int flushvol(hfsvol *vol, int umount) |
| 124 | { |
| 125 | if (vol->flags & HFS_VOL_READONLY) |
| 126 | goto done; |
| 127 | |
| 128 | if ((vol->ext.flags & HFS_BT_UPDATE_HDR) && |
| 129 | bt_writehdr(&vol->ext) == -1) |
| 130 | goto fail; |
| 131 | |
| 132 | if ((vol->cat.flags & HFS_BT_UPDATE_HDR) && |
| 133 | bt_writehdr(&vol->cat) == -1) |
| 134 | goto fail; |
| 135 | |
| 136 | if ((vol->flags & HFS_VOL_UPDATE_VBM) && |
| 137 | v_writevbm(vol) == -1) |
| 138 | goto fail; |
| 139 | |
| 140 | if (umount && ! (vol->mdb.drAtrb & HFS_ATRB_UMOUNTED)) |
| 141 | { |
| 142 | vol->mdb.drAtrb |= HFS_ATRB_UMOUNTED; |
| 143 | vol->flags |= HFS_VOL_UPDATE_MDB; |
| 144 | } |
| 145 | |
| 146 | if ((vol->flags & (HFS_VOL_UPDATE_MDB | HFS_VOL_UPDATE_ALTMDB)) && |
| 147 | v_writemdb(vol) == -1) |
| 148 | goto fail; |
| 149 | |
| 150 | done: |
| 151 | return 0; |
| 152 | |
| 153 | fail: |
| 154 | return -1; |
| 155 | } |
| 156 | |
| 157 | /* |
| 158 | * NAME: vol->flush() |
no test coverage detected