ufs: permit mounting of BorderWare filesystems
[safe/jmp/linux-2.6] / fs / qnx4 / inode.c
index 95c12fc..277575d 100644 (file)
  */
 
 #include <linux/module.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/slab.h>
-#include <linux/fs.h>
-#include <linux/qnx4_fs.h>
 #include <linux/init.h>
+#include <linux/slab.h>
 #include <linux/highuid.h>
 #include <linux/smp_lock.h>
 #include <linux/pagemap.h>
 #include <linux/buffer_head.h>
-#include <linux/vfs.h>
-#include <asm/uaccess.h>
+#include <linux/writeback.h>
+#include <linux/statfs.h>
+#include "qnx4.h"
 
 #define QNX4_VERSION  4
 #define QNX4_BMNAME   ".bitmap"
 
 static const struct super_operations qnx4_sops;
 
-#ifdef CONFIG_QNX4FS_RW
-
-int qnx4_sync_inode(struct inode *inode)
-{
-       int err = 0;
-# if 0
-       struct buffer_head *bh;
-
-       bh = qnx4_update_inode(inode);
-       if (bh && buffer_dirty(bh))
-       {
-               sync_dirty_buffer(bh);
-               if (buffer_req(bh) && !buffer_uptodate(bh))
-               {
-                       printk ("IO error syncing qnx4 inode [%s:%08lx]\n",
-                               inode->i_sb->s_id, inode->i_ino);
-                       err = -1;
-               }
-               brelse (bh);
-       } else if (!bh) {
-               err = -1;
-       }
-# endif
-
-       return err;
-}
-
-static void qnx4_delete_inode(struct inode *inode)
-{
-       QNX4DEBUG(("qnx4: deleting inode [%lu]\n", (unsigned long) inode->i_ino));
-       truncate_inode_pages(&inode->i_data, 0);
-       inode->i_size = 0;
-       qnx4_truncate(inode);
-       lock_kernel();
-       qnx4_free_inode(inode);
-       unlock_kernel();
-}
-
-static int qnx4_write_inode(struct inode *inode, int unused)
-{
-       struct qnx4_inode_entry *raw_inode;
-       int block, ino;
-       struct buffer_head *bh;
-       ino = inode->i_ino;
-
-       QNX4DEBUG(("qnx4: write inode 1.\n"));
-       if (inode->i_nlink == 0) {
-               return 0;
-       }
-       if (!ino) {
-               printk("qnx4: bad inode number on dev %s: %d is out of range\n",
-                      inode->i_sb->s_id, ino);
-               return -EIO;
-       }
-       QNX4DEBUG(("qnx4: write inode 2.\n"));
-       block = ino / QNX4_INODES_PER_BLOCK;
-       lock_kernel();
-       if (!(bh = sb_bread(inode->i_sb, block))) {
-               printk("qnx4: major problem: unable to read inode from dev "
-                      "%s\n", inode->i_sb->s_id);
-               unlock_kernel();
-               return -EIO;
-       }
-       raw_inode = ((struct qnx4_inode_entry *) bh->b_data) +
-           (ino % QNX4_INODES_PER_BLOCK);
-       raw_inode->di_mode  = cpu_to_le16(inode->i_mode);
-       raw_inode->di_uid   = cpu_to_le16(fs_high2lowuid(inode->i_uid));
-       raw_inode->di_gid   = cpu_to_le16(fs_high2lowgid(inode->i_gid));
-       raw_inode->di_nlink = cpu_to_le16(inode->i_nlink);
-       raw_inode->di_size  = cpu_to_le32(inode->i_size);
-       raw_inode->di_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
-       raw_inode->di_atime = cpu_to_le32(inode->i_atime.tv_sec);
-       raw_inode->di_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
-       raw_inode->di_first_xtnt.xtnt_size = cpu_to_le32(inode->i_blocks);
-       mark_buffer_dirty(bh);
-       brelse(bh);
-       unlock_kernel();
-       return 0;
-}
-
-#endif
-
 static void qnx4_put_super(struct super_block *sb);
 static struct inode *qnx4_alloc_inode(struct super_block *sb);
 static void qnx4_destroy_inode(struct inode *inode);
@@ -127,10 +41,6 @@ static const struct super_operations qnx4_sops =
        .put_super      = qnx4_put_super,
        .statfs         = qnx4_statfs,
        .remount_fs     = qnx4_remount,
-#ifdef CONFIG_QNX4FS_RW
-       .write_inode    = qnx4_write_inode,
-       .delete_inode   = qnx4_delete_inode,
-#endif
 };
 
 static int qnx4_remount(struct super_block *sb, int *flags, char *data)
@@ -139,15 +49,7 @@ static int qnx4_remount(struct super_block *sb, int *flags, char *data)
 
        qs = qnx4_sb(sb);
        qs->Version = QNX4_VERSION;
-#ifndef CONFIG_QNX4FS_RW
        *flags |= MS_RDONLY;
-#endif
-       if (*flags & MS_RDONLY) {
-               return 0;
-       }
-
-       mark_buffer_dirty(qs->sb_buf);
-
        return 0;
 }
 
@@ -162,25 +64,7 @@ static struct buffer_head *qnx4_getblk(struct inode *inode, int nr,
                result = sb_getblk(inode->i_sb, nr);
                return result;
        }
-       if (!create) {
-               return NULL;
-       }
-#if 0
-       tmp = qnx4_new_block(inode->i_sb);
-       if (!tmp) {
-               return NULL;
-       }
-       result = sb_getblk(inode->i_sb, tmp);
-       if (tst) {
-               qnx4_free_block(inode->i_sb, tmp);
-               brelse(result);
-               goto repeat;
-       }
-       tst = tmp;
-#endif
-       inode->i_ctime = CURRENT_TIME_SEC;
-       mark_inode_dirty(inode);
-       return result;
+       return NULL;
 }
 
 struct buffer_head *qnx4_bread(struct inode *inode, int block, int create)
@@ -205,14 +89,12 @@ static int qnx4_get_block( struct inode *inode, sector_t iblock, struct buffer_h
 {
        unsigned long phys;
 
-       QNX4DEBUG(("qnx4: qnx4_get_block inode=[%ld] iblock=[%ld]\n",inode->i_ino,iblock));
+       QNX4DEBUG((KERN_INFO "qnx4: qnx4_get_block inode=[%ld] iblock=[%ld]\n",inode->i_ino,iblock));
 
        phys = qnx4_block_map( inode, iblock );
        if ( phys ) {
                // logical block is before EOF
                map_bh(bh, inode->i_sb, phys);
-       } else if ( create ) {
-               // to be done.
        }
        return 0;
 }
@@ -240,12 +122,12 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock )
                                // read next xtnt block.
                                bh = sb_bread(inode->i_sb, i_xblk - 1);
                                if ( !bh ) {
-                                       QNX4DEBUG(("qnx4: I/O error reading xtnt block [%ld])\n", i_xblk - 1));
+                                       QNX4DEBUG((KERN_ERR "qnx4: I/O error reading xtnt block [%ld])\n", i_xblk - 1));
                                        return -EIO;
                                }
                                xblk = (struct qnx4_xblk*)bh->b_data;
                                if ( memcmp( xblk->xblk_signature, "IamXblk", 7 ) ) {
-                                       QNX4DEBUG(("qnx4: block at %ld is not a valid xtnt\n", qnx4_inode->i_xblk));
+                                       QNX4DEBUG((KERN_ERR "qnx4: block at %ld is not a valid xtnt\n", qnx4_inode->i_xblk));
                                        return -EIO;
                                }
                        }
@@ -266,7 +148,7 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock )
                        brelse( bh );
        }
 
-       QNX4DEBUG(("qnx4: mapping block %ld of inode %ld = %ld\n",iblock,inode->i_ino,block));
+       QNX4DEBUG((KERN_INFO "qnx4: mapping block %ld of inode %ld = %ld\n",iblock,inode->i_ino,block));
        return block;
 }
 
@@ -307,7 +189,7 @@ static const char *qnx4_checkroot(struct super_block *sb)
        if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') {
                return "no qnx4 filesystem (no root dir).";
        } else {
-               QNX4DEBUG(("QNX4 filesystem found on dev %s.\n", sb->s_id));
+               QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id));
                rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1;
                rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size);
                for (j = 0; j < rl; j++) {
@@ -318,8 +200,9 @@ static const char *qnx4_checkroot(struct super_block *sb)
                        for (i = 0; i < QNX4_INODES_PER_BLOCK; i++) {
                                rootdir = (struct qnx4_inode_entry *) (bh->b_data + i * QNX4_DIR_ENTRY_SIZE);
                                if (rootdir->di_fname != NULL) {
-                                       QNX4DEBUG(("Rootdir entry found : [%s]\n", rootdir->di_fname));
-                                       if (!strncmp(rootdir->di_fname, QNX4_BMNAME, sizeof QNX4_BMNAME)) {
+                                       QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname));
+                                       if (!strcmp(rootdir->di_fname,
+                                                   QNX4_BMNAME)) {
                                                found = 1;
                                                qnx4_sb(sb)->BitMap = kmalloc( sizeof( struct qnx4_inode_entry ), GFP_KERNEL );
                                                if (!qnx4_sb(sb)->BitMap) {
@@ -363,19 +246,17 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
           if we don't belong here... */
        bh = sb_bread(s, 1);
        if (!bh) {
-               printk("qnx4: unable to read the superblock\n");
+               printk(KERN_ERR "qnx4: unable to read the superblock\n");
                goto outnobh;
        }
        if ( le32_to_cpup((__le32*) bh->b_data) != QNX4_SUPER_MAGIC ) {
                if (!silent)
-                       printk("qnx4: wrong fsid in superblock.\n");
+                       printk(KERN_ERR "qnx4: wrong fsid in superblock.\n");
                goto out;
        }
        s->s_op = &qnx4_sops;
        s->s_magic = QNX4_SUPER_MAGIC;
-#ifndef CONFIG_QNX4FS_RW
        s->s_flags |= MS_RDONLY;        /* Yup, read-only yet */
-#endif
        qnx4_sb(s)->sb_buf = bh;
        qnx4_sb(s)->sb = (struct qnx4_super_block *) bh->b_data;
 
@@ -384,14 +265,14 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
        errmsg = qnx4_checkroot(s);
        if (errmsg != NULL) {
                if (!silent)
-                       printk("qnx4: %s\n", errmsg);
+                       printk(KERN_ERR "qnx4: %s\n", errmsg);
                goto out;
        }
 
        /* does root not have inode number QNX4_ROOT_INO ?? */
        root = qnx4_iget(s, QNX4_ROOT_INO * QNX4_INODES_PER_BLOCK);
        if (IS_ERR(root)) {
-               printk("qnx4: get inode failed\n");
+               printk(KERN_ERR "qnx4: get inode failed\n");
                ret = PTR_ERR(root);
                goto out;
        }
@@ -474,7 +355,7 @@ struct inode *qnx4_iget(struct super_block *sb, unsigned long ino)
        qnx4_inode = qnx4_raw_inode(inode);
        inode->i_mode = 0;
 
-       QNX4DEBUG(("Reading inode : [%d]\n", ino));
+       QNX4DEBUG((KERN_INFO "reading inode : [%d]\n", ino));
        if (!ino) {
                printk(KERN_ERR "qnx4: bad inode number on dev %s: %lu is "
                                "out of range\n",
@@ -485,7 +366,7 @@ struct inode *qnx4_iget(struct super_block *sb, unsigned long ino)
        block = ino / QNX4_INODES_PER_BLOCK;
 
        if (!(bh = sb_bread(sb, block))) {
-               printk("qnx4: major problem: unable to read inode from dev "
+               printk(KERN_ERR "qnx4: major problem: unable to read inode from dev "
                       "%s\n", sb->s_id);
                iget_failed(inode);
                return ERR_PTR(-EIO);
@@ -508,8 +389,7 @@ struct inode *qnx4_iget(struct super_block *sb, unsigned long ino)
 
        memcpy(qnx4_inode, raw_inode, QNX4_DIR_ENTRY_SIZE);
        if (S_ISREG(inode->i_mode)) {
-               inode->i_op = &qnx4_file_inode_operations;
-               inode->i_fop = &qnx4_file_operations;
+               inode->i_fop = &generic_ro_fops;
                inode->i_mapping->a_ops = &qnx4_aops;
                qnx4_i(inode)->mmu_private = inode->i_size;
        } else if (S_ISDIR(inode->i_mode)) {
@@ -600,7 +480,7 @@ static int __init init_qnx4_fs(void)
                return err;
        }
 
-       printk("QNX4 filesystem 0.2.3 registered.\n");
+       printk(KERN_INFO "QNX4 filesystem 0.2.3 registered.\n");
        return 0;
 }