diff options
Diffstat (limited to 'fs/sysv')
-rw-r--r-- | fs/sysv/inode.c | 9 | ||||
-rw-r--r-- | fs/sysv/itree.c | 1 | ||||
-rw-r--r-- | fs/sysv/namei.c | 14 | ||||
-rw-r--r-- | fs/sysv/super.c | 25 |
4 files changed, 25 insertions, 24 deletions
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index de44d067b9e6..0630eb969a28 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c | |||
@@ -333,11 +333,18 @@ static struct inode *sysv_alloc_inode(struct super_block *sb) | |||
333 | return &si->vfs_inode; | 333 | return &si->vfs_inode; |
334 | } | 334 | } |
335 | 335 | ||
336 | static void sysv_destroy_inode(struct inode *inode) | 336 | static void sysv_i_callback(struct rcu_head *head) |
337 | { | 337 | { |
338 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
339 | INIT_LIST_HEAD(&inode->i_dentry); | ||
338 | kmem_cache_free(sysv_inode_cachep, SYSV_I(inode)); | 340 | kmem_cache_free(sysv_inode_cachep, SYSV_I(inode)); |
339 | } | 341 | } |
340 | 342 | ||
343 | static void sysv_destroy_inode(struct inode *inode) | ||
344 | { | ||
345 | call_rcu(&inode->i_rcu, sysv_i_callback); | ||
346 | } | ||
347 | |||
341 | static void init_once(void *p) | 348 | static void init_once(void *p) |
342 | { | 349 | { |
343 | struct sysv_inode_info *si = (struct sysv_inode_info *)p; | 350 | struct sysv_inode_info *si = (struct sysv_inode_info *)p; |
diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c index 9ca66276315e..fa8d43c92bb8 100644 --- a/fs/sysv/itree.c +++ b/fs/sysv/itree.c | |||
@@ -488,7 +488,6 @@ static sector_t sysv_bmap(struct address_space *mapping, sector_t block) | |||
488 | const struct address_space_operations sysv_aops = { | 488 | const struct address_space_operations sysv_aops = { |
489 | .readpage = sysv_readpage, | 489 | .readpage = sysv_readpage, |
490 | .writepage = sysv_writepage, | 490 | .writepage = sysv_writepage, |
491 | .sync_page = block_sync_page, | ||
492 | .write_begin = sysv_write_begin, | 491 | .write_begin = sysv_write_begin, |
493 | .write_end = generic_write_end, | 492 | .write_end = generic_write_end, |
494 | .bmap = sysv_bmap | 493 | .bmap = sysv_bmap |
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 33e047b59b8d..e474fbcf8bde 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c | |||
@@ -27,7 +27,8 @@ static int add_nondir(struct dentry *dentry, struct inode *inode) | |||
27 | return err; | 27 | return err; |
28 | } | 28 | } |
29 | 29 | ||
30 | static int sysv_hash(struct dentry *dentry, struct qstr *qstr) | 30 | static int sysv_hash(const struct dentry *dentry, const struct inode *inode, |
31 | struct qstr *qstr) | ||
31 | { | 32 | { |
32 | /* Truncate the name in place, avoids having to define a compare | 33 | /* Truncate the name in place, avoids having to define a compare |
33 | function. */ | 34 | function. */ |
@@ -47,7 +48,6 @@ static struct dentry *sysv_lookup(struct inode * dir, struct dentry * dentry, st | |||
47 | struct inode * inode = NULL; | 48 | struct inode * inode = NULL; |
48 | ino_t ino; | 49 | ino_t ino; |
49 | 50 | ||
50 | dentry->d_op = dir->i_sb->s_root->d_op; | ||
51 | if (dentry->d_name.len > SYSV_NAMELEN) | 51 | if (dentry->d_name.len > SYSV_NAMELEN) |
52 | return ERR_PTR(-ENAMETOOLONG); | 52 | return ERR_PTR(-ENAMETOOLONG); |
53 | ino = sysv_inode_by_name(dentry); | 53 | ino = sysv_inode_by_name(dentry); |
@@ -126,7 +126,7 @@ static int sysv_link(struct dentry * old_dentry, struct inode * dir, | |||
126 | 126 | ||
127 | inode->i_ctime = CURRENT_TIME_SEC; | 127 | inode->i_ctime = CURRENT_TIME_SEC; |
128 | inode_inc_link_count(inode); | 128 | inode_inc_link_count(inode); |
129 | atomic_inc(&inode->i_count); | 129 | ihold(inode); |
130 | 130 | ||
131 | return add_nondir(dentry, inode); | 131 | return add_nondir(dentry, inode); |
132 | } | 132 | } |
@@ -245,7 +245,6 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
245 | new_de = sysv_find_entry(new_dentry, &new_page); | 245 | new_de = sysv_find_entry(new_dentry, &new_page); |
246 | if (!new_de) | 246 | if (!new_de) |
247 | goto out_dir; | 247 | goto out_dir; |
248 | inode_inc_link_count(old_inode); | ||
249 | sysv_set_link(new_de, new_page, old_inode); | 248 | sysv_set_link(new_de, new_page, old_inode); |
250 | new_inode->i_ctime = CURRENT_TIME_SEC; | 249 | new_inode->i_ctime = CURRENT_TIME_SEC; |
251 | if (dir_de) | 250 | if (dir_de) |
@@ -257,18 +256,15 @@ static int sysv_rename(struct inode * old_dir, struct dentry * old_dentry, | |||
257 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) | 256 | if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max) |
258 | goto out_dir; | 257 | goto out_dir; |
259 | } | 258 | } |
260 | inode_inc_link_count(old_inode); | ||
261 | err = sysv_add_link(new_dentry, old_inode); | 259 | err = sysv_add_link(new_dentry, old_inode); |
262 | if (err) { | 260 | if (err) |
263 | inode_dec_link_count(old_inode); | ||
264 | goto out_dir; | 261 | goto out_dir; |
265 | } | ||
266 | if (dir_de) | 262 | if (dir_de) |
267 | inode_inc_link_count(new_dir); | 263 | inode_inc_link_count(new_dir); |
268 | } | 264 | } |
269 | 265 | ||
270 | sysv_delete_entry(old_de, old_page); | 266 | sysv_delete_entry(old_de, old_page); |
271 | inode_dec_link_count(old_inode); | 267 | mark_inode_dirty(old_inode); |
272 | 268 | ||
273 | if (dir_de) { | 269 | if (dir_de) { |
274 | sysv_set_link(dir_de, dir_page, new_dir); | 270 | sysv_set_link(dir_de, dir_page, new_dir); |
diff --git a/fs/sysv/super.c b/fs/sysv/super.c index a0b0cda6927e..f60c196913ea 100644 --- a/fs/sysv/super.c +++ b/fs/sysv/super.c | |||
@@ -332,6 +332,10 @@ static int complete_read_super(struct super_block *sb, int silent, int size) | |||
332 | sb->s_magic = SYSV_MAGIC_BASE + sbi->s_type; | 332 | sb->s_magic = SYSV_MAGIC_BASE + sbi->s_type; |
333 | /* set up enough so that it can read an inode */ | 333 | /* set up enough so that it can read an inode */ |
334 | sb->s_op = &sysv_sops; | 334 | sb->s_op = &sysv_sops; |
335 | if (sbi->s_forced_ro) | ||
336 | sb->s_flags |= MS_RDONLY; | ||
337 | if (sbi->s_truncate) | ||
338 | sb->s_d_op = &sysv_dentry_operations; | ||
335 | root_inode = sysv_iget(sb, SYSV_ROOT_INO); | 339 | root_inode = sysv_iget(sb, SYSV_ROOT_INO); |
336 | if (IS_ERR(root_inode)) { | 340 | if (IS_ERR(root_inode)) { |
337 | printk("SysV FS: get root inode failed\n"); | 341 | printk("SysV FS: get root inode failed\n"); |
@@ -343,10 +347,6 @@ static int complete_read_super(struct super_block *sb, int silent, int size) | |||
343 | printk("SysV FS: get root dentry failed\n"); | 347 | printk("SysV FS: get root dentry failed\n"); |
344 | return 0; | 348 | return 0; |
345 | } | 349 | } |
346 | if (sbi->s_forced_ro) | ||
347 | sb->s_flags |= MS_RDONLY; | ||
348 | if (sbi->s_truncate) | ||
349 | sb->s_root->d_op = &sysv_dentry_operations; | ||
350 | return 1; | 350 | return 1; |
351 | } | 351 | } |
352 | 352 | ||
@@ -526,23 +526,22 @@ failed: | |||
526 | 526 | ||
527 | /* Every kernel module contains stuff like this. */ | 527 | /* Every kernel module contains stuff like this. */ |
528 | 528 | ||
529 | static int sysv_get_sb(struct file_system_type *fs_type, | 529 | static struct dentry *sysv_mount(struct file_system_type *fs_type, |
530 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 530 | int flags, const char *dev_name, void *data) |
531 | { | 531 | { |
532 | return get_sb_bdev(fs_type, flags, dev_name, data, sysv_fill_super, | 532 | return mount_bdev(fs_type, flags, dev_name, data, sysv_fill_super); |
533 | mnt); | ||
534 | } | 533 | } |
535 | 534 | ||
536 | static int v7_get_sb(struct file_system_type *fs_type, | 535 | static struct dentry *v7_mount(struct file_system_type *fs_type, |
537 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 536 | int flags, const char *dev_name, void *data) |
538 | { | 537 | { |
539 | return get_sb_bdev(fs_type, flags, dev_name, data, v7_fill_super, mnt); | 538 | return mount_bdev(fs_type, flags, dev_name, data, v7_fill_super); |
540 | } | 539 | } |
541 | 540 | ||
542 | static struct file_system_type sysv_fs_type = { | 541 | static struct file_system_type sysv_fs_type = { |
543 | .owner = THIS_MODULE, | 542 | .owner = THIS_MODULE, |
544 | .name = "sysv", | 543 | .name = "sysv", |
545 | .get_sb = sysv_get_sb, | 544 | .mount = sysv_mount, |
546 | .kill_sb = kill_block_super, | 545 | .kill_sb = kill_block_super, |
547 | .fs_flags = FS_REQUIRES_DEV, | 546 | .fs_flags = FS_REQUIRES_DEV, |
548 | }; | 547 | }; |
@@ -550,7 +549,7 @@ static struct file_system_type sysv_fs_type = { | |||
550 | static struct file_system_type v7_fs_type = { | 549 | static struct file_system_type v7_fs_type = { |
551 | .owner = THIS_MODULE, | 550 | .owner = THIS_MODULE, |
552 | .name = "v7", | 551 | .name = "v7", |
553 | .get_sb = v7_get_sb, | 552 | .mount = v7_mount, |
554 | .kill_sb = kill_block_super, | 553 | .kill_sb = kill_block_super, |
555 | .fs_flags = FS_REQUIRES_DEV, | 554 | .fs_flags = FS_REQUIRES_DEV, |
556 | }; | 555 | }; |