Lines Matching refs:sb

32 static int hfs_get_last_session(struct super_block *sb,  in hfs_get_last_session()  argument
41 *size = sb->s_bdev->bd_inode->i_size >> 9; in hfs_get_last_session()
43 if (HFS_SB(sb)->session >= 0) { in hfs_get_last_session()
44 te.cdte_track = HFS_SB(sb)->session; in hfs_get_last_session()
46 res = ioctl_by_bdev(sb->s_bdev, CDROMREADTOCENTRY, (unsigned long)&te); in hfs_get_last_session()
55 res = ioctl_by_bdev(sb->s_bdev, CDROMMULTISESSION, (unsigned long)&ms_info); in hfs_get_last_session()
67 int hfs_mdb_get(struct super_block *sb) in hfs_mdb_get() argument
79 size = sb_min_blocksize(sb, HFS_SECTOR_SIZE); in hfs_mdb_get()
83 if (hfs_get_last_session(sb, &part_start, &part_size)) in hfs_mdb_get()
87 bh = sb_bread512(sb, part_start + HFS_MDB_BLK, mdb); in hfs_mdb_get()
98 if (hfs_part_find(sb, &part_start, &part_size)) in hfs_mdb_get()
102 HFS_SB(sb)->alloc_blksz = size = be32_to_cpu(mdb->drAlBlkSiz); in hfs_mdb_get()
108 size = min(HFS_SB(sb)->alloc_blksz, (u32)PAGE_SIZE); in hfs_mdb_get()
117 while (HFS_SB(sb)->alloc_blksz & (size - 1)) in hfs_mdb_get()
120 if (!sb_set_blocksize(sb, size)) { in hfs_mdb_get()
125 bh = sb_bread512(sb, part_start + HFS_MDB_BLK, mdb); in hfs_mdb_get()
131 HFS_SB(sb)->mdb_bh = bh; in hfs_mdb_get()
132 HFS_SB(sb)->mdb = mdb; in hfs_mdb_get()
135 HFS_SB(sb)->part_start = part_start; in hfs_mdb_get()
136 HFS_SB(sb)->fs_ablocks = be16_to_cpu(mdb->drNmAlBlks); in hfs_mdb_get()
137 HFS_SB(sb)->fs_div = HFS_SB(sb)->alloc_blksz >> sb->s_blocksize_bits; in hfs_mdb_get()
138 HFS_SB(sb)->clumpablks = be32_to_cpu(mdb->drClpSiz) / in hfs_mdb_get()
139 HFS_SB(sb)->alloc_blksz; in hfs_mdb_get()
140 if (!HFS_SB(sb)->clumpablks) in hfs_mdb_get()
141 HFS_SB(sb)->clumpablks = 1; in hfs_mdb_get()
142 HFS_SB(sb)->fs_start = (be16_to_cpu(mdb->drAlBlSt) + part_start) >> in hfs_mdb_get()
143 (sb->s_blocksize_bits - HFS_SECTOR_SIZE_BITS); in hfs_mdb_get()
146 HFS_SB(sb)->free_ablocks = be16_to_cpu(mdb->drFreeBks); in hfs_mdb_get()
147 HFS_SB(sb)->next_id = be32_to_cpu(mdb->drNxtCNID); in hfs_mdb_get()
148 HFS_SB(sb)->root_files = be16_to_cpu(mdb->drNmFls); in hfs_mdb_get()
149 HFS_SB(sb)->root_dirs = be16_to_cpu(mdb->drNmRtDirs); in hfs_mdb_get()
150 HFS_SB(sb)->file_count = be32_to_cpu(mdb->drFilCnt); in hfs_mdb_get()
151 HFS_SB(sb)->folder_count = be32_to_cpu(mdb->drDirCnt); in hfs_mdb_get()
155 bh = sb_bread512(sb, sect, mdb2); in hfs_mdb_get()
158 HFS_SB(sb)->alt_mdb_bh = bh; in hfs_mdb_get()
159 HFS_SB(sb)->alt_mdb = mdb2; in hfs_mdb_get()
164 if (!HFS_SB(sb)->alt_mdb) { in hfs_mdb_get()
169 HFS_SB(sb)->bitmap = (__be32 *)__get_free_pages(GFP_KERNEL, PAGE_SIZE < 8192 ? 1 : 0); in hfs_mdb_get()
170 if (!HFS_SB(sb)->bitmap) in hfs_mdb_get()
176 size = (HFS_SB(sb)->fs_ablocks + 8) / 8; in hfs_mdb_get()
177 ptr = (u8 *)HFS_SB(sb)->bitmap; in hfs_mdb_get()
179 bh = sb_bread(sb, off >> sb->s_blocksize_bits); in hfs_mdb_get()
184 off2 = off & (sb->s_blocksize - 1); in hfs_mdb_get()
185 len = min((int)sb->s_blocksize - off2, size); in hfs_mdb_get()
193 HFS_SB(sb)->ext_tree = hfs_btree_open(sb, HFS_EXT_CNID, hfs_ext_keycmp); in hfs_mdb_get()
194 if (!HFS_SB(sb)->ext_tree) { in hfs_mdb_get()
198 HFS_SB(sb)->cat_tree = hfs_btree_open(sb, HFS_CAT_CNID, hfs_cat_keycmp); in hfs_mdb_get()
199 if (!HFS_SB(sb)->cat_tree) { in hfs_mdb_get()
207 sb->s_flags |= MS_RDONLY; in hfs_mdb_get()
211 sb->s_flags |= MS_RDONLY; in hfs_mdb_get()
213 if (!(sb->s_flags & MS_RDONLY)) { in hfs_mdb_get()
221 mark_buffer_dirty(HFS_SB(sb)->mdb_bh); in hfs_mdb_get()
222 sync_dirty_buffer(HFS_SB(sb)->mdb_bh); in hfs_mdb_get()
230 hfs_mdb_put(sb); in hfs_mdb_get()
258 void hfs_mdb_commit(struct super_block *sb) in hfs_mdb_commit() argument
260 struct hfs_mdb *mdb = HFS_SB(sb)->mdb; in hfs_mdb_commit()
262 if (sb->s_flags & MS_RDONLY) in hfs_mdb_commit()
265 lock_buffer(HFS_SB(sb)->mdb_bh); in hfs_mdb_commit()
266 if (test_and_clear_bit(HFS_FLG_MDB_DIRTY, &HFS_SB(sb)->flags)) { in hfs_mdb_commit()
269 mdb->drFreeBks = cpu_to_be16(HFS_SB(sb)->free_ablocks); in hfs_mdb_commit()
270 mdb->drNxtCNID = cpu_to_be32(HFS_SB(sb)->next_id); in hfs_mdb_commit()
271 mdb->drNmFls = cpu_to_be16(HFS_SB(sb)->root_files); in hfs_mdb_commit()
272 mdb->drNmRtDirs = cpu_to_be16(HFS_SB(sb)->root_dirs); in hfs_mdb_commit()
273 mdb->drFilCnt = cpu_to_be32(HFS_SB(sb)->file_count); in hfs_mdb_commit()
274 mdb->drDirCnt = cpu_to_be32(HFS_SB(sb)->folder_count); in hfs_mdb_commit()
277 mark_buffer_dirty(HFS_SB(sb)->mdb_bh); in hfs_mdb_commit()
283 if (test_and_clear_bit(HFS_FLG_ALT_MDB_DIRTY, &HFS_SB(sb)->flags) && in hfs_mdb_commit()
284 HFS_SB(sb)->alt_mdb) { in hfs_mdb_commit()
285 hfs_inode_write_fork(HFS_SB(sb)->ext_tree->inode, mdb->drXTExtRec, in hfs_mdb_commit()
287 hfs_inode_write_fork(HFS_SB(sb)->cat_tree->inode, mdb->drCTExtRec, in hfs_mdb_commit()
290 lock_buffer(HFS_SB(sb)->alt_mdb_bh); in hfs_mdb_commit()
291 memcpy(HFS_SB(sb)->alt_mdb, HFS_SB(sb)->mdb, HFS_SECTOR_SIZE); in hfs_mdb_commit()
292 HFS_SB(sb)->alt_mdb->drAtrb |= cpu_to_be16(HFS_SB_ATTRIB_UNMNT); in hfs_mdb_commit()
293 HFS_SB(sb)->alt_mdb->drAtrb &= cpu_to_be16(~HFS_SB_ATTRIB_INCNSTNT); in hfs_mdb_commit()
294 unlock_buffer(HFS_SB(sb)->alt_mdb_bh); in hfs_mdb_commit()
296 mark_buffer_dirty(HFS_SB(sb)->alt_mdb_bh); in hfs_mdb_commit()
297 sync_dirty_buffer(HFS_SB(sb)->alt_mdb_bh); in hfs_mdb_commit()
300 if (test_and_clear_bit(HFS_FLG_BITMAP_DIRTY, &HFS_SB(sb)->flags)) { in hfs_mdb_commit()
306 block = be16_to_cpu(HFS_SB(sb)->mdb->drVBMSt) + HFS_SB(sb)->part_start; in hfs_mdb_commit()
307 off = (block << HFS_SECTOR_SIZE_BITS) & (sb->s_blocksize - 1); in hfs_mdb_commit()
308 block >>= sb->s_blocksize_bits - HFS_SECTOR_SIZE_BITS; in hfs_mdb_commit()
309 size = (HFS_SB(sb)->fs_ablocks + 7) / 8; in hfs_mdb_commit()
310 ptr = (u8 *)HFS_SB(sb)->bitmap; in hfs_mdb_commit()
312 bh = sb_bread(sb, block); in hfs_mdb_commit()
317 len = min((int)sb->s_blocksize - off, size); in hfs_mdb_commit()
331 unlock_buffer(HFS_SB(sb)->mdb_bh); in hfs_mdb_commit()
334 void hfs_mdb_close(struct super_block *sb) in hfs_mdb_close() argument
337 if (sb->s_flags & MS_RDONLY) in hfs_mdb_close()
339 HFS_SB(sb)->mdb->drAtrb |= cpu_to_be16(HFS_SB_ATTRIB_UNMNT); in hfs_mdb_close()
340 HFS_SB(sb)->mdb->drAtrb &= cpu_to_be16(~HFS_SB_ATTRIB_INCNSTNT); in hfs_mdb_close()
341 mark_buffer_dirty(HFS_SB(sb)->mdb_bh); in hfs_mdb_close()
348 void hfs_mdb_put(struct super_block *sb) in hfs_mdb_put() argument
350 if (!HFS_SB(sb)) in hfs_mdb_put()
353 hfs_btree_close(HFS_SB(sb)->ext_tree); in hfs_mdb_put()
354 hfs_btree_close(HFS_SB(sb)->cat_tree); in hfs_mdb_put()
357 brelse(HFS_SB(sb)->mdb_bh); in hfs_mdb_put()
358 brelse(HFS_SB(sb)->alt_mdb_bh); in hfs_mdb_put()
360 unload_nls(HFS_SB(sb)->nls_io); in hfs_mdb_put()
361 unload_nls(HFS_SB(sb)->nls_disk); in hfs_mdb_put()
363 free_pages((unsigned long)HFS_SB(sb)->bitmap, PAGE_SIZE < 8192 ? 1 : 0); in hfs_mdb_put()
364 kfree(HFS_SB(sb)); in hfs_mdb_put()
365 sb->s_fs_info = NULL; in hfs_mdb_put()