1 /* 2 * linux/fs/hfs/super.c 3 * 4 * Copyright (C) 1995-1997 Paul H. Hargrove 5 * (C) 2003 Ardis Technologies <roman@ardistech.com> 6 * This file may be distributed under the terms of the GNU General Public License. 7 * 8 * This file contains hfs_read_super(), some of the super_ops and 9 * init_hfs_fs() and exit_hfs_fs(). The remaining super_ops are in 10 * inode.c since they deal with inodes. 11 * 12 * Based on the minix file system code, (C) 1991, 1992 by Linus Torvalds 13 */ 14 15 #include <linux/module.h> 16 #include <linux/blkdev.h> 17 #include <linux/backing-dev.h> 18 #include <linux/fs_context.h> 19 #include <linux/fs_parser.h> 20 #include <linux/mount.h> 21 #include <linux/init.h> 22 #include <linux/nls.h> 23 #include <linux/seq_file.h> 24 #include <linux/slab.h> 25 #include <linux/vfs.h> 26 27 #include "hfs_fs.h" 28 #include "btree.h" 29 30 static struct kmem_cache *hfs_inode_cachep; 31 32 MODULE_DESCRIPTION("Apple Macintosh file system support"); 33 MODULE_LICENSE("GPL"); 34 35 static int hfs_sync_fs(struct super_block *sb, int wait) 36 { 37 hfs_mdb_commit(sb); 38 return 0; 39 } 40 41 /* 42 * hfs_put_super() 43 * 44 * This is the put_super() entry in the super_operations structure for 45 * HFS filesystems. The purpose is to release the resources 46 * associated with the superblock sb. 47 */ 48 static void hfs_put_super(struct super_block *sb) 49 { 50 cancel_delayed_work_sync(&HFS_SB(sb)->mdb_work); 51 hfs_mdb_close(sb); 52 /* release the MDB's resources */ 53 hfs_mdb_put(sb); 54 } 55 56 static void flush_mdb(struct work_struct *work) 57 { 58 struct hfs_sb_info *sbi; 59 struct super_block *sb; 60 61 sbi = container_of(work, struct hfs_sb_info, mdb_work.work); 62 sb = sbi->sb; 63 64 spin_lock(&sbi->work_lock); 65 sbi->work_queued = 0; 66 spin_unlock(&sbi->work_lock); 67 68 hfs_mdb_commit(sb); 69 } 70 71 void hfs_mark_mdb_dirty(struct super_block *sb) 72 { 73 struct hfs_sb_info *sbi = HFS_SB(sb); 74 unsigned long delay; 75 76 if (sb_rdonly(sb)) 77 return; 78 79 spin_lock(&sbi->work_lock); 80 if (!sbi->work_queued) { 81 delay = msecs_to_jiffies(dirty_writeback_interval * 10); 82 queue_delayed_work(system_long_wq, &sbi->mdb_work, delay); 83 sbi->work_queued = 1; 84 } 85 spin_unlock(&sbi->work_lock); 86 } 87 88 /* 89 * hfs_statfs() 90 * 91 * This is the statfs() entry in the super_operations structure for 92 * HFS filesystems. The purpose is to return various data about the 93 * filesystem. 94 * 95 * changed f_files/f_ffree to reflect the fs_ablock/free_ablocks. 96 */ 97 static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) 98 { 99 struct super_block *sb = dentry->d_sb; 100 u64 id = huge_encode_dev(sb->s_bdev->bd_dev); 101 102 buf->f_type = HFS_SUPER_MAGIC; 103 buf->f_bsize = sb->s_blocksize; 104 buf->f_blocks = (u32)HFS_SB(sb)->fs_ablocks * HFS_SB(sb)->fs_div; 105 buf->f_bfree = (u32)HFS_SB(sb)->free_ablocks * HFS_SB(sb)->fs_div; 106 buf->f_bavail = buf->f_bfree; 107 buf->f_files = HFS_SB(sb)->fs_ablocks; 108 buf->f_ffree = HFS_SB(sb)->free_ablocks; 109 buf->f_fsid = u64_to_fsid(id); 110 buf->f_namelen = HFS_NAMELEN; 111 112 return 0; 113 } 114 115 static int hfs_reconfigure(struct fs_context *fc) 116 { 117 struct super_block *sb = fc->root->d_sb; 118 119 sync_filesystem(sb); 120 fc->sb_flags |= SB_NODIRATIME; 121 if ((bool)(fc->sb_flags & SB_RDONLY) == sb_rdonly(sb)) 122 return 0; 123 124 if (!(fc->sb_flags & SB_RDONLY)) { 125 if (!(HFS_SB(sb)->mdb->drAtrb & cpu_to_be16(HFS_SB_ATTRIB_UNMNT))) { 126 pr_warn("filesystem was not cleanly unmounted, running fsck.hfs is recommended. leaving read-only.\n"); 127 sb->s_flags |= SB_RDONLY; 128 fc->sb_flags |= SB_RDONLY; 129 } else if (HFS_SB(sb)->mdb->drAtrb & cpu_to_be16(HFS_SB_ATTRIB_SLOCK)) { 130 pr_warn("filesystem is marked locked, leaving read-only.\n"); 131 sb->s_flags |= SB_RDONLY; 132 fc->sb_flags |= SB_RDONLY; 133 } 134 } 135 return 0; 136 } 137 138 static int hfs_show_options(struct seq_file *seq, struct dentry *root) 139 { 140 struct hfs_sb_info *sbi = HFS_SB(root->d_sb); 141 142 if (sbi->s_creator != cpu_to_be32(0x3f3f3f3f)) 143 seq_show_option_n(seq, "creator", (char *)&sbi->s_creator, 4); 144 if (sbi->s_type != cpu_to_be32(0x3f3f3f3f)) 145 seq_show_option_n(seq, "type", (char *)&sbi->s_type, 4); 146 seq_printf(seq, ",uid=%u,gid=%u", 147 from_kuid_munged(&init_user_ns, sbi->s_uid), 148 from_kgid_munged(&init_user_ns, sbi->s_gid)); 149 if (sbi->s_file_umask != 0133) 150 seq_printf(seq, ",file_umask=%o", sbi->s_file_umask); 151 if (sbi->s_dir_umask != 0022) 152 seq_printf(seq, ",dir_umask=%o", sbi->s_dir_umask); 153 if (sbi->part >= 0) 154 seq_printf(seq, ",part=%u", sbi->part); 155 if (sbi->session >= 0) 156 seq_printf(seq, ",session=%u", sbi->session); 157 if (sbi->nls_disk) 158 seq_printf(seq, ",codepage=%s", sbi->nls_disk->charset); 159 if (sbi->nls_io) 160 seq_printf(seq, ",iocharset=%s", sbi->nls_io->charset); 161 if (sbi->s_quiet) 162 seq_printf(seq, ",quiet"); 163 return 0; 164 } 165 166 static struct inode *hfs_alloc_inode(struct super_block *sb) 167 { 168 struct hfs_inode_info *i; 169 170 i = alloc_inode_sb(sb, hfs_inode_cachep, GFP_KERNEL); 171 return i ? &i->vfs_inode : NULL; 172 } 173 174 static void hfs_free_inode(struct inode *inode) 175 { 176 kmem_cache_free(hfs_inode_cachep, HFS_I(inode)); 177 } 178 179 static const struct super_operations hfs_super_operations = { 180 .alloc_inode = hfs_alloc_inode, 181 .free_inode = hfs_free_inode, 182 .write_inode = hfs_write_inode, 183 .evict_inode = hfs_evict_inode, 184 .put_super = hfs_put_super, 185 .sync_fs = hfs_sync_fs, 186 .statfs = hfs_statfs, 187 .show_options = hfs_show_options, 188 }; 189 190 enum { 191 opt_uid, opt_gid, opt_umask, opt_file_umask, opt_dir_umask, 192 opt_part, opt_session, opt_type, opt_creator, opt_quiet, 193 opt_codepage, opt_iocharset, 194 }; 195 196 static const struct fs_parameter_spec hfs_param_spec[] = { 197 fsparam_u32 ("uid", opt_uid), 198 fsparam_u32 ("gid", opt_gid), 199 fsparam_u32oct ("umask", opt_umask), 200 fsparam_u32oct ("file_umask", opt_file_umask), 201 fsparam_u32oct ("dir_umask", opt_dir_umask), 202 fsparam_u32 ("part", opt_part), 203 fsparam_u32 ("session", opt_session), 204 fsparam_string ("type", opt_type), 205 fsparam_string ("creator", opt_creator), 206 fsparam_flag ("quiet", opt_quiet), 207 fsparam_string ("codepage", opt_codepage), 208 fsparam_string ("iocharset", opt_iocharset), 209 {} 210 }; 211 212 /* 213 * hfs_parse_param() 214 * 215 * This function is called by the vfs to parse the mount options. 216 */ 217 static int hfs_parse_param(struct fs_context *fc, struct fs_parameter *param) 218 { 219 struct hfs_sb_info *hsb = fc->s_fs_info; 220 struct fs_parse_result result; 221 int opt; 222 223 /* hfs does not honor any fs-specific options on remount */ 224 if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) 225 return 0; 226 227 opt = fs_parse(fc, hfs_param_spec, param, &result); 228 if (opt < 0) 229 return opt; 230 231 switch (opt) { 232 case opt_uid: 233 hsb->s_uid = result.uid; 234 break; 235 case opt_gid: 236 hsb->s_gid = result.gid; 237 break; 238 case opt_umask: 239 hsb->s_file_umask = (umode_t)result.uint_32; 240 hsb->s_dir_umask = (umode_t)result.uint_32; 241 break; 242 case opt_file_umask: 243 hsb->s_file_umask = (umode_t)result.uint_32; 244 break; 245 case opt_dir_umask: 246 hsb->s_dir_umask = (umode_t)result.uint_32; 247 break; 248 case opt_part: 249 hsb->part = result.uint_32; 250 break; 251 case opt_session: 252 hsb->session = result.uint_32; 253 break; 254 case opt_type: 255 if (strlen(param->string) != 4) { 256 pr_err("type requires a 4 character value\n"); 257 return -EINVAL; 258 } 259 memcpy(&hsb->s_type, param->string, 4); 260 break; 261 case opt_creator: 262 if (strlen(param->string) != 4) { 263 pr_err("creator requires a 4 character value\n"); 264 return -EINVAL; 265 } 266 memcpy(&hsb->s_creator, param->string, 4); 267 break; 268 case opt_quiet: 269 hsb->s_quiet = 1; 270 break; 271 case opt_codepage: 272 if (hsb->nls_disk) { 273 pr_err("unable to change codepage\n"); 274 return -EINVAL; 275 } 276 hsb->nls_disk = load_nls(param->string); 277 if (!hsb->nls_disk) { 278 pr_err("unable to load codepage \"%s\"\n", 279 param->string); 280 return -EINVAL; 281 } 282 break; 283 case opt_iocharset: 284 if (hsb->nls_io) { 285 pr_err("unable to change iocharset\n"); 286 return -EINVAL; 287 } 288 hsb->nls_io = load_nls(param->string); 289 if (!hsb->nls_io) { 290 pr_err("unable to load iocharset \"%s\"\n", 291 param->string); 292 return -EINVAL; 293 } 294 break; 295 default: 296 return -EINVAL; 297 } 298 299 return 0; 300 } 301 302 /* 303 * hfs_read_super() 304 * 305 * This is the function that is responsible for mounting an HFS 306 * filesystem. It performs all the tasks necessary to get enough data 307 * from the disk to read the root inode. This includes parsing the 308 * mount options, dealing with Macintosh partitions, reading the 309 * superblock and the allocation bitmap blocks, calling 310 * hfs_btree_init() to get the necessary data about the extents and 311 * catalog B-trees and, finally, reading the root inode into memory. 312 */ 313 static int hfs_fill_super(struct super_block *sb, struct fs_context *fc) 314 { 315 struct hfs_sb_info *sbi = HFS_SB(sb); 316 struct hfs_find_data fd; 317 hfs_cat_rec rec; 318 struct inode *root_inode; 319 int silent = fc->sb_flags & SB_SILENT; 320 int res; 321 322 /* load_nls_default does not fail */ 323 if (sbi->nls_disk && !sbi->nls_io) 324 sbi->nls_io = load_nls_default(); 325 sbi->s_dir_umask &= 0777; 326 sbi->s_file_umask &= 0577; 327 328 spin_lock_init(&sbi->work_lock); 329 INIT_DELAYED_WORK(&sbi->mdb_work, flush_mdb); 330 331 sbi->sb = sb; 332 sb->s_op = &hfs_super_operations; 333 sb->s_xattr = hfs_xattr_handlers; 334 sb->s_flags |= SB_NODIRATIME; 335 mutex_init(&sbi->bitmap_lock); 336 337 res = hfs_mdb_get(sb); 338 if (res) { 339 if (!silent) 340 pr_warn("can't find a HFS filesystem on dev %s\n", 341 hfs_mdb_name(sb)); 342 res = -EINVAL; 343 goto bail; 344 } 345 346 /* try to get the root inode */ 347 res = hfs_find_init(HFS_SB(sb)->cat_tree, &fd); 348 if (res) 349 goto bail_no_root; 350 res = hfs_cat_find_brec(sb, HFS_ROOT_CNID, &fd); 351 if (!res) { 352 if (fd.entrylength != sizeof(rec.dir)) { 353 res = -EIO; 354 goto bail_hfs_find; 355 } 356 hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength); 357 if (rec.type != HFS_CDR_DIR) 358 res = -EIO; 359 } 360 if (res) 361 goto bail_hfs_find; 362 res = -EINVAL; 363 root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); 364 hfs_find_exit(&fd); 365 if (!root_inode) 366 goto bail_no_root; 367 368 sb->s_d_op = &hfs_dentry_operations; 369 res = -ENOMEM; 370 sb->s_root = d_make_root(root_inode); 371 if (!sb->s_root) 372 goto bail_no_root; 373 374 /* everything's okay */ 375 return 0; 376 377 bail_hfs_find: 378 hfs_find_exit(&fd); 379 bail_no_root: 380 pr_err("get root inode failed\n"); 381 bail: 382 hfs_mdb_put(sb); 383 return res; 384 } 385 386 static int hfs_get_tree(struct fs_context *fc) 387 { 388 return get_tree_bdev(fc, hfs_fill_super); 389 } 390 391 static void hfs_free_fc(struct fs_context *fc) 392 { 393 kfree(fc->s_fs_info); 394 } 395 396 static const struct fs_context_operations hfs_context_ops = { 397 .parse_param = hfs_parse_param, 398 .get_tree = hfs_get_tree, 399 .reconfigure = hfs_reconfigure, 400 .free = hfs_free_fc, 401 }; 402 403 static int hfs_init_fs_context(struct fs_context *fc) 404 { 405 struct hfs_sb_info *hsb; 406 407 hsb = kzalloc(sizeof(struct hfs_sb_info), GFP_KERNEL); 408 if (!hsb) 409 return -ENOMEM; 410 411 fc->s_fs_info = hsb; 412 fc->ops = &hfs_context_ops; 413 414 if (fc->purpose != FS_CONTEXT_FOR_RECONFIGURE) { 415 /* initialize options with defaults */ 416 hsb->s_uid = current_uid(); 417 hsb->s_gid = current_gid(); 418 hsb->s_file_umask = 0133; 419 hsb->s_dir_umask = 0022; 420 hsb->s_type = cpu_to_be32(0x3f3f3f3f); /* == '????' */ 421 hsb->s_creator = cpu_to_be32(0x3f3f3f3f); /* == '????' */ 422 hsb->s_quiet = 0; 423 hsb->part = -1; 424 hsb->session = -1; 425 } 426 427 return 0; 428 } 429 430 static struct file_system_type hfs_fs_type = { 431 .owner = THIS_MODULE, 432 .name = "hfs", 433 .kill_sb = kill_block_super, 434 .fs_flags = FS_REQUIRES_DEV, 435 .init_fs_context = hfs_init_fs_context, 436 }; 437 MODULE_ALIAS_FS("hfs"); 438 439 static void hfs_init_once(void *p) 440 { 441 struct hfs_inode_info *i = p; 442 443 inode_init_once(&i->vfs_inode); 444 } 445 446 static int __init init_hfs_fs(void) 447 { 448 int err; 449 450 hfs_inode_cachep = kmem_cache_create("hfs_inode_cache", 451 sizeof(struct hfs_inode_info), 0, 452 SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT, hfs_init_once); 453 if (!hfs_inode_cachep) 454 return -ENOMEM; 455 err = register_filesystem(&hfs_fs_type); 456 if (err) 457 kmem_cache_destroy(hfs_inode_cachep); 458 return err; 459 } 460 461 static void __exit exit_hfs_fs(void) 462 { 463 unregister_filesystem(&hfs_fs_type); 464 465 /* 466 * Make sure all delayed rcu free inodes are flushed before we 467 * destroy cache. 468 */ 469 rcu_barrier(); 470 kmem_cache_destroy(hfs_inode_cachep); 471 } 472 473 module_init(init_hfs_fs) 474 module_exit(exit_hfs_fs) 475