vserver 2.0 rc7
[linux-2.6.git] / fs / hfs / inode.c
index 674acb1..7519123 100644 (file)
@@ -18,6 +18,9 @@
 #include "hfs_fs.h"
 #include "btree.h"
 
+static struct file_operations hfs_file_operations;
+static struct inode_operations hfs_file_inode_operations;
+
 /*================ Variable-like macros ================*/
 
 #define HFS_VALID_MODE_BITS  (S_IFREG | S_IFDIR | S_IRWXUGO)
@@ -43,7 +46,7 @@ static sector_t hfs_bmap(struct address_space *mapping, sector_t block)
        return generic_block_bmap(mapping, block, hfs_get_block);
 }
 
-int hfs_releasepage(struct page *page, int mask)
+static int hfs_releasepage(struct page *page, int mask)
 {
        struct inode *inode = page->mapping->host;
        struct super_block *sb = inode->i_sb;
@@ -71,12 +74,6 @@ int hfs_releasepage(struct page *page, int mask)
                        ;
                else if (atomic_read(&node->refcnt))
                        res = 0;
-               else for (i = 0; i < tree->pages_per_bnode; i++) {
-                       if (PageActive(node->page[i])) {
-                               res = 0;
-                               break;
-                       }
-               }
                if (res && node) {
                        hfs_bnode_unhash(node);
                        hfs_bnode_free(node);
@@ -100,7 +97,7 @@ int hfs_releasepage(struct page *page, int mask)
                spin_unlock(&tree->hash_lock);
        }
        //printk("releasepage: %lu,%x = %d\n", page->index, mask, res);
-       return res;
+       return res ? try_to_free_buffers(page) : 0;
 }
 
 static int hfs_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks,
@@ -174,14 +171,16 @@ struct inode *hfs_new_inode(struct inode *dir, struct qstr *name, int mode)
        HFS_I(inode)->flags = 0;
        HFS_I(inode)->rsrc_inode = NULL;
        HFS_I(inode)->fs_blocks = 0;
-       if (S_ISDIR(inode->i_mode)) {
+       if (S_ISDIR(mode)) {
                inode->i_size = 2;
                HFS_SB(sb)->folder_count++;
                if (dir->i_ino == HFS_ROOT_CNID)
                        HFS_SB(sb)->root_dirs++;
                inode->i_op = &hfs_dir_inode_operations;
                inode->i_fop = &hfs_dir_operations;
-       } else if (S_ISREG(inode->i_mode)) {
+               inode->i_mode |= S_IRWXUGO;
+               inode->i_mode &= ~HFS_SB(inode->i_sb)->s_dir_umask;
+       } else if (S_ISREG(mode)) {
                HFS_I(inode)->clump_blocks = HFS_SB(sb)->clumpablks;
                HFS_SB(sb)->file_count++;
                if (dir->i_ino == HFS_ROOT_CNID)
@@ -189,6 +188,10 @@ struct inode *hfs_new_inode(struct inode *dir, struct qstr *name, int mode)
                inode->i_op = &hfs_file_inode_operations;
                inode->i_fop = &hfs_file_operations;
                inode->i_mapping->a_ops = &hfs_aops;
+               inode->i_mode |= S_IRUGO|S_IXUGO;
+               if (mode & S_IWUSR)
+                       inode->i_mode |= S_IWUGO;
+               inode->i_mode &= ~HFS_SB(inode->i_sb)->s_file_umask;
                HFS_I(inode)->phys_size = 0;
                HFS_I(inode)->alloc_blocks = 0;
                HFS_I(inode)->first_blocks = 0;
@@ -259,7 +262,7 @@ struct hfs_iget_data {
        hfs_cat_rec *rec;
 };
 
-int hfs_test_inode(struct inode *inode, void *data)
+static int hfs_test_inode(struct inode *inode, void *data)
 {
        struct hfs_iget_data *idata = data;
        hfs_cat_rec *rec;
@@ -279,7 +282,7 @@ int hfs_test_inode(struct inode *inode, void *data)
 /*
  * hfs_read_inode
  */
-int hfs_read_inode(struct inode *inode, void *data)
+static int hfs_read_inode(struct inode *inode, void *data)
 {
        struct hfs_iget_data *idata = data;
        struct hfs_sb_info *hsb = HFS_SB(inode->i_sb);
@@ -317,7 +320,7 @@ int hfs_read_inode(struct inode *inode, void *data)
                inode->i_mode = S_IRUGO | S_IXUGO;
                if (!(rec->file.Flags & HFS_FIL_LOCK))
                        inode->i_mode |= S_IWUGO;
-               inode->i_mode &= hsb->s_file_umask;
+               inode->i_mode &= ~hsb->s_file_umask;
                inode->i_mode |= S_IFREG;
                inode->i_ctime = inode->i_atime = inode->i_mtime =
                                hfs_m_to_utime(rec->file.MdDat);
@@ -329,7 +332,7 @@ int hfs_read_inode(struct inode *inode, void *data)
                inode->i_ino = be32_to_cpu(rec->dir.DirID);
                inode->i_size = be16_to_cpu(rec->dir.Val) + 2;
                HFS_I(inode)->fs_blocks = 0;
-               inode->i_mode = S_IFDIR | (S_IRWXUGO & hsb->s_dir_umask);
+               inode->i_mode = S_IFDIR | (S_IRWXUGO & ~hsb->s_dir_umask);
                inode->i_ctime = inode->i_atime = inode->i_mtime =
                                hfs_m_to_utime(rec->dir.MdDat);
                inode->i_op = &hfs_dir_inode_operations;
@@ -611,7 +614,7 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr)
 }
 
 
-struct file_operations hfs_file_operations = {
+static struct file_operations hfs_file_operations = {
        .llseek         = generic_file_llseek,
        .read           = generic_file_read,
        .write          = generic_file_write,
@@ -622,7 +625,7 @@ struct file_operations hfs_file_operations = {
        .release        = hfs_file_release,
 };
 
-struct inode_operations hfs_file_inode_operations = {
+static struct inode_operations hfs_file_inode_operations = {
        .lookup         = hfs_file_lookup,
        .truncate       = hfs_file_truncate,
        .setattr        = hfs_inode_setattr,