X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fefs%2Fsuper.c;h=dfebf21289f4904a7ae784e1ab4c57ce97bafd6e;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=d4910e43a154af4ddc3428c680d288d3c5eb5fa2;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/efs/super.c b/fs/efs/super.c index d4910e43a..dfebf2128 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -15,10 +15,13 @@ #include #include -static struct super_block *efs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int efs_statfs(struct dentry *dentry, struct kstatfs *buf); +static int efs_fill_super(struct super_block *s, void *d, int silent); + +static int efs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, efs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, efs_fill_super, mnt); } static struct file_system_type efs_fs_type = { @@ -29,12 +32,32 @@ static struct file_system_type efs_fs_type = { .fs_flags = FS_REQUIRES_DEV, }; -static kmem_cache_t * efs_inode_cachep; +static struct pt_types sgi_pt_types[] = { + {0x00, "SGI vh"}, + {0x01, "SGI trkrepl"}, + {0x02, "SGI secrepl"}, + {0x03, "SGI raw"}, + {0x04, "SGI bsd"}, + {SGI_SYSV, "SGI sysv"}, + {0x06, "SGI vol"}, + {SGI_EFS, "SGI efs"}, + {0x08, "SGI lv"}, + {0x09, "SGI rlv"}, + {0x0A, "SGI xfs"}, + {0x0B, "SGI xfslog"}, + {0x0C, "SGI xlv"}, + {0x82, "Linux swap"}, + {0x83, "Linux native"}, + {0, NULL} +}; + + +static struct kmem_cache * efs_inode_cachep; static struct inode *efs_alloc_inode(struct super_block *sb) { struct efs_inode_info *ei; - ei = (struct efs_inode_info *)kmem_cache_alloc(efs_inode_cachep, SLAB_KERNEL); + ei = (struct efs_inode_info *)kmem_cache_alloc(efs_inode_cachep, GFP_KERNEL); if (!ei) return NULL; return &ei->vfs_inode; @@ -45,7 +68,7 @@ static void efs_destroy_inode(struct inode *inode) kmem_cache_free(efs_inode_cachep, INODE_INFO(inode)); } -static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) { struct efs_inode_info *ei = (struct efs_inode_info *) foo; @@ -58,7 +81,7 @@ static int init_inodecache(void) { efs_inode_cachep = kmem_cache_create("efs_inode_cache", sizeof(struct efs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, init_once, NULL); if (efs_inode_cachep == NULL) return -ENOMEM; @@ -67,11 +90,10 @@ static int init_inodecache(void) static void destroy_inodecache(void) { - if (kmem_cache_destroy(efs_inode_cachep)) - printk(KERN_INFO "efs_inode_cache: not all structures were freed\n"); + kmem_cache_destroy(efs_inode_cachep); } -void efs_put_super(struct super_block *s) +static void efs_put_super(struct super_block *s) { kfree(s->s_fs_info); s->s_fs_info = NULL; @@ -92,6 +114,10 @@ static struct super_operations efs_superblock_operations = { .remount_fs = efs_remount, }; +static struct export_operations efs_export_ops = { + .get_parent = efs_get_parent, +}; + static int __init init_efs_fs(void) { int err; printk("EFS: "EFS_VERSION" - http://aeschi.ch.eu.org/efs/\n"); @@ -118,7 +144,8 @@ module_exit(exit_efs_fs) static efs_block_t efs_validate_vh(struct volume_header *vh) { int i; - unsigned int cs, csum, *ui; + __be32 cs, *ui; + int csum; efs_block_t sblock = 0; /* shuts up gcc */ struct pt_types *pt_entry; int pt_type, slice = -1; @@ -132,8 +159,8 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) { return 0; } - ui = ((unsigned int *) (vh + 1)) - 1; - for(csum = 0; ui >= ((unsigned int *) vh);) { + ui = ((__be32 *) (vh + 1)) - 1; + for(csum = 0; ui >= ((__be32 *) vh);) { cs = *ui--; csum += be32_to_cpu(cs); } @@ -194,12 +221,13 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) { sblock); #endif } - return(sblock); + return sblock; } static int efs_validate_super(struct efs_sb_info *sb, struct efs_super *super) { - if (!IS_EFS_MAGIC(be32_to_cpu(super->fs_magic))) return -1; + if (!IS_EFS_MAGIC(be32_to_cpu(super->fs_magic))) + return -1; sb->fs_magic = be32_to_cpu(super->fs_magic); sb->total_blocks = be32_to_cpu(super->fs_size); @@ -213,17 +241,16 @@ static int efs_validate_super(struct efs_sb_info *sb, struct efs_super *super) { return 0; } -int efs_fill_super(struct super_block *s, void *d, int silent) +static int efs_fill_super(struct super_block *s, void *d, int silent) { struct efs_sb_info *sb; struct buffer_head *bh; struct inode *root; - sb = kmalloc(sizeof(struct efs_sb_info), GFP_KERNEL); + sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL); if (!sb) return -ENOMEM; s->s_fs_info = sb; - memset(sb, 0, sizeof(struct efs_sb_info)); s->s_magic = EFS_SUPER_MAGIC; if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { @@ -274,6 +301,7 @@ int efs_fill_super(struct super_block *s, void *d, int silent) s->s_flags |= MS_RDONLY; } s->s_op = &efs_superblock_operations; + s->s_export_op = &efs_export_ops; root = iget(s, EFS_ROOTINODE); s->s_root = d_alloc_root(root); @@ -292,8 +320,8 @@ out_no_fs: return -EINVAL; } -int efs_statfs(struct super_block *s, struct kstatfs *buf) { - struct efs_sb_info *sb = SUPER_INFO(s); +static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct efs_sb_info *sb = SUPER_INFO(dentry->d_sb); buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */ buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */