21 #include <linux/module.h>
33 #include <linux/slab.h>
34 #include <asm/uaccess.h>
58 #define MAX_COMMIT_THREADS 64
59 static int commit_threads = 0;
67 #ifdef CONFIG_JFS_DEBUG
68 int jfsloglevel = JFS_LOGLEVEL_WARN;
83 panic(
"JFS (device %s): panic forced after error\n",
86 jfs_err(
"ERROR: (device %s): remounting filesystem "
97 static char error_buf[256];
101 vsnprintf(error_buf,
sizeof(error_buf),
function, args);
104 pr_err(
"ERROR: (device %s): %s\n", sb->
s_id, error_buf);
106 jfs_handle_error(sb);
126 static void jfs_destroy_inode(
struct inode *
inode)
164 ((sbi->
bmap->db_nfree >> imap->im_l2nbperiext)
171 sizeof(sbi->
uuid)/2);
188 jfs_err(
"jfs_umount failed with return code %d", rc);
228 void *nls_map = (
void *)-1;
256 if (nls_map && nls_map != (
void *) -1)
263 pr_err(
"JFS: charset not found\n");
270 char *resize = args[0].
from;
276 *newLVSize = sb->
s_bdev->bd_inode->i_size >>
279 pr_err(
"JFS: Cannot determine volume size\n");
285 if (!errors || !*errors)
287 if (!
strcmp(errors,
"continue")) {
291 }
else if (!
strcmp(errors,
"remount-ro")) {
295 }
else if (!
strcmp(errors,
"panic")) {
300 pr_err(
"JFS: %s is an invalid error handler\n",
319 pr_err(
"JFS: quota operations not supported\n");
327 if (!uid_valid(sbi->
uid))
337 if (!gid_valid(sbi->
gid))
346 if (sbi->
umask & ~0777) {
347 pr_err(
"JFS: Invalid value of umask\n");
361 if (blk_queue_discard(q)) {
364 pr_err(
"JFS: discard option " \
365 "not supported on device\n");
377 char *minblks_trim = args[0].
from;
378 if (blk_queue_discard(q)) {
381 minblks_trim, &minblks_trim, 0);
383 pr_err(
"JFS: discard option " \
384 "not supported on device\n");
390 printk(
"jfs: Unrecognized mount option \"%s\" "
391 " or missing value\n", p);
396 if (nls_map != (
void *) -1) {
404 if (nls_map && nls_map != (
void *) -1)
413 int flag = JFS_SBI(sb)->flag;
416 if (!parse_options(data, sb, &newLVSize, &flag)) {
422 pr_err(
"JFS: resize requires volume" \
423 " to be mounted read-write\n");
438 JFS_SBI(sb)->flag =
flag;
447 if ((!(sb->
s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) {
448 rc = dquot_suspend(sb, -1);
453 JFS_SBI(sb)->flag =
flag;
457 if (!(sb->
s_flags & MS_RDONLY)) {
462 JFS_SBI(sb)->flag =
flag;
466 JFS_SBI(sb)->flag =
flag;
471 static int jfs_fill_super(
struct super_block *sb,
void *data,
int silent)
481 if (!new_valid_dev(sb->
s_bdev->bd_dev))
498 if (!parse_options((
char *) data, sb, &newLVSize, &flag))
502 #ifdef CONFIG_JFS_POSIX_ACL
507 pr_err(
"resize option for remount only\n");
519 sb->
s_op = &jfs_super_operations;
537 insert_inode_hash(inode);
545 jfs_err(
"jfs_mount failed w/return code = %d", rc);
547 goto out_mount_failed;
555 jfs_err(
"jfs_mount_rw failed, return code = %d",
569 ret = PTR_ERR(inode);
578 #if BITS_PER_LONG == 32
589 jfs_err(
"jfs_read_super: get root dentry failed");
594 jfs_err(
"jfs_umount failed with return code %d", rc);
615 if (!(sb->
s_flags & MS_RDONLY)) {
629 if (!(sb->
s_flags & MS_RDONLY)) {
632 jfs_err(
"jfs_unlock failed with return code %d", rc);
640 int flags,
const char *dev_name,
void *data)
642 return mount_bdev(fs_type, flags, dev_name, data, jfs_fill_super);
647 struct jfs_log *log = JFS_SBI(sb)->log;
663 static int jfs_show_options(
struct seq_file *seq,
struct dentry *root)
667 if (uid_valid(sbi->
uid))
669 if (gid_valid(sbi->
gid))
671 if (sbi->
umask != -1)
673 if (sbi->
flag & JFS_NOINTEGRITY)
702 size_t len, loff_t off)
704 struct inode *inode = sb_dqopt(sb)->files[
type];
710 struct buffer_head tmp_bh;
711 struct buffer_head *bh;
712 loff_t i_size = i_size_read(inode);
716 if (off+len > i_size)
728 if (!buffer_mapped(&tmp_bh))
731 bh = sb_bread(sb, tmp_bh.b_blocknr);
734 memcpy(data, bh->b_data+offset, tocopy);
747 const char *data,
size_t len, loff_t off)
749 struct inode *inode = sb_dqopt(sb)->files[
type];
754 size_t towrite = len;
755 struct buffer_head tmp_bh;
756 struct buffer_head *bh;
759 while (towrite > 0) {
769 bh = sb_bread(sb, tmp_bh.b_blocknr);
771 bh = sb_getblk(sb, tmp_bh.b_blocknr);
777 memcpy(bh->b_data+offset, data, tocopy);
779 set_buffer_uptodate(bh);
789 if (len == towrite) {
793 if (inode->
i_size < off+len-towrite)
794 i_size_write(inode, off+len-towrite);
797 mark_inode_dirty(inode);
799 return len - towrite;
805 .alloc_inode = jfs_alloc_inode,
806 .destroy_inode = jfs_destroy_inode,
810 .put_super = jfs_put_super,
811 .sync_fs = jfs_sync_fs,
812 .freeze_fs = jfs_freeze,
813 .unfreeze_fs = jfs_unfreeze,
814 .statfs = jfs_statfs,
815 .remount_fs = jfs_remount,
816 .show_options = jfs_show_options,
818 .quota_read = jfs_quota_read,
819 .quota_write = jfs_quota_write,
832 .mount = jfs_do_mount,
837 static void init_once(
void *
foo)
851 static int __init init_jfs_fs(
void)
860 if (jfs_inode_cachep ==
NULL)
868 jfs_err(
"metapage_init failed w/rc = %d", rc);
877 jfs_err(
"txInit failed w/rc = %d", rc);
885 if (IS_ERR(jfsIOthread)) {
886 rc = PTR_ERR(jfsIOthread);
887 jfs_err(
"init_jfs_fs: fork failed w/rc = %d", rc);
891 if (commit_threads < 1)
896 for (i = 0; i < commit_threads; i++) {
898 if (IS_ERR(jfsCommitThread[i])) {
899 rc = PTR_ERR(jfsCommitThread[i]);
900 jfs_err(
"init_jfs_fs: fork failed w/rc = %d", rc);
902 goto kill_committask;
907 if (IS_ERR(jfsSyncThread)) {
908 rc = PTR_ERR(jfsSyncThread);
909 jfs_err(
"init_jfs_fs: fork failed w/rc = %d", rc);
910 goto kill_committask;
926 for (i = 0; i < commit_threads; i++)
938 static void __exit exit_jfs_fs(
void)
948 for (i = 0; i < commit_threads; i++)