2 * Optimized MPEG FS - inode and super operations.
3 * Copyright (C) 2006 Bob Copeland <me@bobcopeland.com>
4 * Released under GPL v2.
6 #include <linux/module.h>
7 #include <linux/sched.h>
8 #include <linux/slab.h>
10 #include <linux/vfs.h>
11 #include <linux/cred.h>
12 #include <linux/parser.h>
13 #include <linux/buffer_head.h>
14 #include <linux/vmalloc.h>
15 #include <linux/writeback.h>
16 #include <linux/seq_file.h>
17 #include <linux/crc-itu-t.h>
20 MODULE_AUTHOR("Bob Copeland <me@bobcopeland.com>");
21 MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux");
22 MODULE_LICENSE("GPL");
24 struct buffer_head
*omfs_bread(struct super_block
*sb
, sector_t block
)
26 struct omfs_sb_info
*sbi
= OMFS_SB(sb
);
27 if (block
>= sbi
->s_num_blocks
)
30 return sb_bread(sb
, clus_to_blk(sbi
, block
));
33 struct inode
*omfs_new_inode(struct inode
*dir
, umode_t mode
)
39 struct omfs_sb_info
*sbi
= OMFS_SB(dir
->i_sb
);
41 inode
= new_inode(dir
->i_sb
);
43 return ERR_PTR(-ENOMEM
);
45 err
= omfs_allocate_range(dir
->i_sb
, sbi
->s_mirrors
, sbi
->s_mirrors
,
50 inode
->i_ino
= new_block
;
51 inode_init_owner(inode
, NULL
, mode
);
52 inode
->i_mapping
->a_ops
= &omfs_aops
;
54 inode
->i_atime
= inode
->i_mtime
= inode
->i_ctime
= current_time(inode
);
55 switch (mode
& S_IFMT
) {
57 inode
->i_op
= &omfs_dir_inops
;
58 inode
->i_fop
= &omfs_dir_operations
;
59 inode
->i_size
= sbi
->s_sys_blocksize
;
63 inode
->i_op
= &omfs_file_inops
;
64 inode
->i_fop
= &omfs_file_operations
;
69 insert_inode_hash(inode
);
70 mark_inode_dirty(inode
);
73 make_bad_inode(inode
);
79 * Update the header checksums for a dirty inode based on its contents.
80 * Caller is expected to hold the buffer head underlying oi and mark it
83 static void omfs_update_checksums(struct omfs_inode
*oi
)
85 int xor, i
, ofs
= 0, count
;
87 unsigned char *ptr
= (unsigned char *) oi
;
89 count
= be32_to_cpu(oi
->i_head
.h_body_size
);
90 ofs
= sizeof(struct omfs_header
);
92 crc
= crc_itu_t(crc
, ptr
+ ofs
, count
);
93 oi
->i_head
.h_crc
= cpu_to_be16(crc
);
96 for (i
= 1; i
< OMFS_XOR_COUNT
; i
++)
99 oi
->i_head
.h_check_xor
= xor;
102 static int __omfs_write_inode(struct inode
*inode
, int wait
)
104 struct omfs_inode
*oi
;
105 struct omfs_sb_info
*sbi
= OMFS_SB(inode
->i_sb
);
106 struct buffer_head
*bh
, *bh2
;
112 /* get current inode since we may have written sibling ptrs etc. */
113 bh
= omfs_bread(inode
->i_sb
, inode
->i_ino
);
117 oi
= (struct omfs_inode
*) bh
->b_data
;
119 oi
->i_head
.h_self
= cpu_to_be64(inode
->i_ino
);
120 if (S_ISDIR(inode
->i_mode
))
121 oi
->i_type
= OMFS_DIR
;
122 else if (S_ISREG(inode
->i_mode
))
123 oi
->i_type
= OMFS_FILE
;
125 printk(KERN_WARNING
"omfs: unknown file type: %d\n",
130 oi
->i_head
.h_body_size
= cpu_to_be32(sbi
->s_sys_blocksize
-
131 sizeof(struct omfs_header
));
132 oi
->i_head
.h_version
= 1;
133 oi
->i_head
.h_type
= OMFS_INODE_NORMAL
;
134 oi
->i_head
.h_magic
= OMFS_IMAGIC
;
135 oi
->i_size
= cpu_to_be64(inode
->i_size
);
137 ctime
= inode
->i_ctime
.tv_sec
* 1000LL +
138 ((inode
->i_ctime
.tv_nsec
+ 999)/1000);
139 oi
->i_ctime
= cpu_to_be64(ctime
);
141 omfs_update_checksums(oi
);
143 mark_buffer_dirty(bh
);
145 sync_dirty_buffer(bh
);
146 if (buffer_req(bh
) && !buffer_uptodate(bh
))
150 /* if mirroring writes, copy to next fsblock */
151 for (i
= 1; i
< sbi
->s_mirrors
; i
++) {
152 bh2
= omfs_bread(inode
->i_sb
, inode
->i_ino
+ i
);
156 memcpy(bh2
->b_data
, bh
->b_data
, bh
->b_size
);
157 mark_buffer_dirty(bh2
);
159 sync_dirty_buffer(bh2
);
160 if (buffer_req(bh2
) && !buffer_uptodate(bh2
))
165 ret
= (sync_failed
) ? -EIO
: 0;
172 static int omfs_write_inode(struct inode
*inode
, struct writeback_control
*wbc
)
174 return __omfs_write_inode(inode
, wbc
->sync_mode
== WB_SYNC_ALL
);
177 int omfs_sync_inode(struct inode
*inode
)
179 return __omfs_write_inode(inode
, 1);
183 * called when an entry is deleted, need to clear the bits in the
186 static void omfs_evict_inode(struct inode
*inode
)
188 truncate_inode_pages_final(&inode
->i_data
);
194 if (S_ISREG(inode
->i_mode
)) {
196 omfs_shrink_inode(inode
);
199 omfs_clear_range(inode
->i_sb
, inode
->i_ino
, 2);
202 struct inode
*omfs_iget(struct super_block
*sb
, ino_t ino
)
204 struct omfs_sb_info
*sbi
= OMFS_SB(sb
);
205 struct omfs_inode
*oi
;
206 struct buffer_head
*bh
;
211 inode
= iget_locked(sb
, ino
);
213 return ERR_PTR(-ENOMEM
);
214 if (!(inode
->i_state
& I_NEW
))
217 bh
= omfs_bread(inode
->i_sb
, ino
);
221 oi
= (struct omfs_inode
*)bh
->b_data
;
224 if (ino
!= be64_to_cpu(oi
->i_head
.h_self
))
227 inode
->i_uid
= sbi
->s_uid
;
228 inode
->i_gid
= sbi
->s_gid
;
230 ctime
= be64_to_cpu(oi
->i_ctime
);
231 nsecs
= do_div(ctime
, 1000) * 1000L;
233 inode
->i_atime
.tv_sec
= ctime
;
234 inode
->i_mtime
.tv_sec
= ctime
;
235 inode
->i_ctime
.tv_sec
= ctime
;
236 inode
->i_atime
.tv_nsec
= nsecs
;
237 inode
->i_mtime
.tv_nsec
= nsecs
;
238 inode
->i_ctime
.tv_nsec
= nsecs
;
240 inode
->i_mapping
->a_ops
= &omfs_aops
;
242 switch (oi
->i_type
) {
244 inode
->i_mode
= S_IFDIR
| (S_IRWXUGO
& ~sbi
->s_dmask
);
245 inode
->i_op
= &omfs_dir_inops
;
246 inode
->i_fop
= &omfs_dir_operations
;
247 inode
->i_size
= sbi
->s_sys_blocksize
;
251 inode
->i_mode
= S_IFREG
| (S_IRWXUGO
& ~sbi
->s_fmask
);
252 inode
->i_fop
= &omfs_file_operations
;
253 inode
->i_size
= be64_to_cpu(oi
->i_size
);
257 unlock_new_inode(inode
);
263 return ERR_PTR(-EIO
);
266 static void omfs_put_super(struct super_block
*sb
)
268 struct omfs_sb_info
*sbi
= OMFS_SB(sb
);
271 sb
->s_fs_info
= NULL
;
274 static int omfs_statfs(struct dentry
*dentry
, struct kstatfs
*buf
)
276 struct super_block
*s
= dentry
->d_sb
;
277 struct omfs_sb_info
*sbi
= OMFS_SB(s
);
278 u64 id
= huge_encode_dev(s
->s_bdev
->bd_dev
);
280 buf
->f_type
= OMFS_MAGIC
;
281 buf
->f_bsize
= sbi
->s_blocksize
;
282 buf
->f_blocks
= sbi
->s_num_blocks
;
283 buf
->f_files
= sbi
->s_num_blocks
;
284 buf
->f_namelen
= OMFS_NAMELEN
;
285 buf
->f_fsid
.val
[0] = (u32
)id
;
286 buf
->f_fsid
.val
[1] = (u32
)(id
>> 32);
288 buf
->f_bfree
= buf
->f_bavail
= buf
->f_ffree
=
295 * Display the mount options in /proc/mounts.
297 static int omfs_show_options(struct seq_file
*m
, struct dentry
*root
)
299 struct omfs_sb_info
*sbi
= OMFS_SB(root
->d_sb
);
300 umode_t cur_umask
= current_umask();
302 if (!uid_eq(sbi
->s_uid
, current_uid()))
303 seq_printf(m
, ",uid=%u",
304 from_kuid_munged(&init_user_ns
, sbi
->s_uid
));
305 if (!gid_eq(sbi
->s_gid
, current_gid()))
306 seq_printf(m
, ",gid=%u",
307 from_kgid_munged(&init_user_ns
, sbi
->s_gid
));
309 if (sbi
->s_dmask
== sbi
->s_fmask
) {
310 if (sbi
->s_fmask
!= cur_umask
)
311 seq_printf(m
, ",umask=%o", sbi
->s_fmask
);
313 if (sbi
->s_dmask
!= cur_umask
)
314 seq_printf(m
, ",dmask=%o", sbi
->s_dmask
);
315 if (sbi
->s_fmask
!= cur_umask
)
316 seq_printf(m
, ",fmask=%o", sbi
->s_fmask
);
322 static const struct super_operations omfs_sops
= {
323 .write_inode
= omfs_write_inode
,
324 .evict_inode
= omfs_evict_inode
,
325 .put_super
= omfs_put_super
,
326 .statfs
= omfs_statfs
,
327 .show_options
= omfs_show_options
,
331 * For Rio Karma, there is an on-disk free bitmap whose location is
332 * stored in the root block. For ReplayTV, there is no such free bitmap
333 * so we have to walk the tree. Both inodes and file data are allocated
334 * from the same map. This array can be big (300k) so we allocate
335 * in units of the blocksize.
337 static int omfs_get_imap(struct super_block
*sb
)
339 unsigned int bitmap_size
, array_size
;
341 struct omfs_sb_info
*sbi
= OMFS_SB(sb
);
342 struct buffer_head
*bh
;
346 bitmap_size
= DIV_ROUND_UP(sbi
->s_num_blocks
, 8);
347 array_size
= DIV_ROUND_UP(bitmap_size
, sb
->s_blocksize
);
349 if (sbi
->s_bitmap_ino
== ~0ULL)
352 sbi
->s_imap_size
= array_size
;
353 sbi
->s_imap
= kcalloc(array_size
, sizeof(unsigned long *), GFP_KERNEL
);
357 block
= clus_to_blk(sbi
, sbi
->s_bitmap_ino
);
358 if (block
>= sbi
->s_num_blocks
)
362 for (count
= bitmap_size
; count
> 0; count
-= sb
->s_blocksize
) {
363 bh
= sb_bread(sb
, block
++);
366 *ptr
= kmalloc(sb
->s_blocksize
, GFP_KERNEL
);
371 memcpy(*ptr
, bh
->b_data
, sb
->s_blocksize
);
372 if (count
< sb
->s_blocksize
)
373 memset((void *)*ptr
+ count
, 0xff,
374 sb
->s_blocksize
- count
);
382 for (count
= 0; count
< array_size
; count
++)
383 kfree(sbi
->s_imap
[count
]);
388 sbi
->s_imap_size
= 0;
393 Opt_uid
, Opt_gid
, Opt_umask
, Opt_dmask
, Opt_fmask
, Opt_err
396 static const match_table_t tokens
= {
399 {Opt_umask
, "umask=%o"},
400 {Opt_dmask
, "dmask=%o"},
401 {Opt_fmask
, "fmask=%o"},
405 static int parse_options(char *options
, struct omfs_sb_info
*sbi
)
408 substring_t args
[MAX_OPT_ARGS
];
414 while ((p
= strsep(&options
, ",")) != NULL
) {
419 token
= match_token(p
, tokens
, args
);
422 if (match_int(&args
[0], &option
))
424 sbi
->s_uid
= make_kuid(current_user_ns(), option
);
425 if (!uid_valid(sbi
->s_uid
))
429 if (match_int(&args
[0], &option
))
431 sbi
->s_gid
= make_kgid(current_user_ns(), option
);
432 if (!gid_valid(sbi
->s_gid
))
436 if (match_octal(&args
[0], &option
))
438 sbi
->s_fmask
= sbi
->s_dmask
= option
;
441 if (match_octal(&args
[0], &option
))
443 sbi
->s_dmask
= option
;
446 if (match_octal(&args
[0], &option
))
448 sbi
->s_fmask
= option
;
457 static int omfs_fill_super(struct super_block
*sb
, void *data
, int silent
)
459 struct buffer_head
*bh
, *bh2
;
460 struct omfs_super_block
*omfs_sb
;
461 struct omfs_root_block
*omfs_rb
;
462 struct omfs_sb_info
*sbi
;
466 sbi
= kzalloc(sizeof(struct omfs_sb_info
), GFP_KERNEL
);
472 sbi
->s_uid
= current_uid();
473 sbi
->s_gid
= current_gid();
474 sbi
->s_dmask
= sbi
->s_fmask
= current_umask();
476 if (!parse_options((char *) data
, sbi
))
479 sb
->s_maxbytes
= 0xffffffff;
481 sb_set_blocksize(sb
, 0x200);
483 bh
= sb_bread(sb
, 0);
487 omfs_sb
= (struct omfs_super_block
*)bh
->b_data
;
489 if (omfs_sb
->s_magic
!= cpu_to_be32(OMFS_MAGIC
)) {
491 printk(KERN_ERR
"omfs: Invalid superblock (%x)\n",
495 sb
->s_magic
= OMFS_MAGIC
;
497 sbi
->s_num_blocks
= be64_to_cpu(omfs_sb
->s_num_blocks
);
498 sbi
->s_blocksize
= be32_to_cpu(omfs_sb
->s_blocksize
);
499 sbi
->s_mirrors
= be32_to_cpu(omfs_sb
->s_mirrors
);
500 sbi
->s_root_ino
= be64_to_cpu(omfs_sb
->s_root_block
);
501 sbi
->s_sys_blocksize
= be32_to_cpu(omfs_sb
->s_sys_blocksize
);
502 mutex_init(&sbi
->s_bitmap_lock
);
504 if (sbi
->s_num_blocks
> OMFS_MAX_BLOCKS
) {
505 printk(KERN_ERR
"omfs: sysblock number (%llx) is out of range\n",
506 (unsigned long long)sbi
->s_num_blocks
);
510 if (sbi
->s_sys_blocksize
> PAGE_SIZE
) {
511 printk(KERN_ERR
"omfs: sysblock size (%d) is out of range\n",
512 sbi
->s_sys_blocksize
);
516 if (sbi
->s_blocksize
< sbi
->s_sys_blocksize
||
517 sbi
->s_blocksize
> OMFS_MAX_BLOCK_SIZE
) {
518 printk(KERN_ERR
"omfs: block size (%d) is out of range\n",
524 * Use sys_blocksize as the fs block since it is smaller than a
525 * page while the fs blocksize can be larger.
527 sb_set_blocksize(sb
, sbi
->s_sys_blocksize
);
530 * ...and the difference goes into a shift. sys_blocksize is always
531 * a power of two factor of blocksize.
533 sbi
->s_block_shift
= get_bitmask_order(sbi
->s_blocksize
) -
534 get_bitmask_order(sbi
->s_sys_blocksize
);
536 bh2
= omfs_bread(sb
, be64_to_cpu(omfs_sb
->s_root_block
));
540 omfs_rb
= (struct omfs_root_block
*)bh2
->b_data
;
542 sbi
->s_bitmap_ino
= be64_to_cpu(omfs_rb
->r_bitmap
);
543 sbi
->s_clustersize
= be32_to_cpu(omfs_rb
->r_clustersize
);
545 if (sbi
->s_num_blocks
!= be64_to_cpu(omfs_rb
->r_num_blocks
)) {
546 printk(KERN_ERR
"omfs: block count discrepancy between "
547 "super and root blocks (%llx, %llx)\n",
548 (unsigned long long)sbi
->s_num_blocks
,
549 (unsigned long long)be64_to_cpu(omfs_rb
->r_num_blocks
));
553 if (sbi
->s_bitmap_ino
!= ~0ULL &&
554 sbi
->s_bitmap_ino
> sbi
->s_num_blocks
) {
555 printk(KERN_ERR
"omfs: free space bitmap location is corrupt "
556 "(%llx, total blocks %llx)\n",
557 (unsigned long long) sbi
->s_bitmap_ino
,
558 (unsigned long long) sbi
->s_num_blocks
);
561 if (sbi
->s_clustersize
< 1 ||
562 sbi
->s_clustersize
> OMFS_MAX_CLUSTER_SIZE
) {
563 printk(KERN_ERR
"omfs: cluster size out of range (%d)",
568 ret
= omfs_get_imap(sb
);
572 sb
->s_op
= &omfs_sops
;
574 root
= omfs_iget(sb
, be64_to_cpu(omfs_rb
->r_root_dir
));
580 sb
->s_root
= d_make_root(root
);
585 printk(KERN_DEBUG
"omfs: Mounted volume %s\n", omfs_rb
->r_name
);
598 static struct dentry
*omfs_mount(struct file_system_type
*fs_type
,
599 int flags
, const char *dev_name
, void *data
)
601 return mount_bdev(fs_type
, flags
, dev_name
, data
, omfs_fill_super
);
604 static struct file_system_type omfs_fs_type
= {
605 .owner
= THIS_MODULE
,
608 .kill_sb
= kill_block_super
,
609 .fs_flags
= FS_REQUIRES_DEV
,
611 MODULE_ALIAS_FS("omfs");
613 static int __init
init_omfs_fs(void)
615 return register_filesystem(&omfs_fs_type
);
618 static void __exit
exit_omfs_fs(void)
620 unregister_filesystem(&omfs_fs_type
);
623 module_init(init_omfs_fs
);
624 module_exit(exit_omfs_fs
);