diff options
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/acl.c | 13 | ||||
-rw-r--r-- | fs/ext2/acl.h | 2 | ||||
-rw-r--r-- | fs/ext2/balloc.c | 9 | ||||
-rw-r--r-- | fs/ext2/dir.c | 21 | ||||
-rw-r--r-- | fs/ext2/ext2.h | 9 | ||||
-rw-r--r-- | fs/ext2/ialloc.c | 5 | ||||
-rw-r--r-- | fs/ext2/inode.c | 25 | ||||
-rw-r--r-- | fs/ext2/ioctl.c | 6 | ||||
-rw-r--r-- | fs/ext2/namei.c | 21 | ||||
-rw-r--r-- | fs/ext2/super.c | 57 | ||||
-rw-r--r-- | fs/ext2/xattr.c | 14 | ||||
-rw-r--r-- | fs/ext2/xattr.h | 6 | ||||
-rw-r--r-- | fs/ext2/xattr_security.c | 5 |
13 files changed, 105 insertions, 88 deletions
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index 2bcc0431bada..abea5a17c764 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c | |||
@@ -232,10 +232,17 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
232 | } | 232 | } |
233 | 233 | ||
234 | int | 234 | int |
235 | ext2_check_acl(struct inode *inode, int mask) | 235 | ext2_check_acl(struct inode *inode, int mask, unsigned int flags) |
236 | { | 236 | { |
237 | struct posix_acl *acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); | 237 | struct posix_acl *acl; |
238 | |||
239 | if (flags & IPERM_FLAG_RCU) { | ||
240 | if (!negative_cached_acl(inode, ACL_TYPE_ACCESS)) | ||
241 | return -ECHILD; | ||
242 | return -EAGAIN; | ||
243 | } | ||
238 | 244 | ||
245 | acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); | ||
239 | if (IS_ERR(acl)) | 246 | if (IS_ERR(acl)) |
240 | return PTR_ERR(acl); | 247 | return PTR_ERR(acl); |
241 | if (acl) { | 248 | if (acl) { |
@@ -399,7 +406,7 @@ ext2_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, | |||
399 | return -EINVAL; | 406 | return -EINVAL; |
400 | if (!test_opt(dentry->d_sb, POSIX_ACL)) | 407 | if (!test_opt(dentry->d_sb, POSIX_ACL)) |
401 | return -EOPNOTSUPP; | 408 | return -EOPNOTSUPP; |
402 | if (!is_owner_or_cap(dentry->d_inode)) | 409 | if (!inode_owner_or_capable(dentry->d_inode)) |
403 | return -EPERM; | 410 | return -EPERM; |
404 | 411 | ||
405 | if (value) { | 412 | if (value) { |
diff --git a/fs/ext2/acl.h b/fs/ext2/acl.h index 3ff6cbb9ac44..c939b7b12099 100644 --- a/fs/ext2/acl.h +++ b/fs/ext2/acl.h | |||
@@ -54,7 +54,7 @@ static inline int ext2_acl_count(size_t size) | |||
54 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | 54 | #ifdef CONFIG_EXT2_FS_POSIX_ACL |
55 | 55 | ||
56 | /* acl.c */ | 56 | /* acl.c */ |
57 | extern int ext2_check_acl (struct inode *, int); | 57 | extern int ext2_check_acl (struct inode *, int, unsigned int); |
58 | extern int ext2_acl_chmod (struct inode *); | 58 | extern int ext2_acl_chmod (struct inode *); |
59 | extern int ext2_init_acl (struct inode *, struct inode *); | 59 | extern int ext2_init_acl (struct inode *, struct inode *); |
60 | 60 | ||
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index c6c684b44ea1..8f44cef1b3ef 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c | |||
@@ -646,10 +646,9 @@ find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) | |||
646 | return here; | 646 | return here; |
647 | } | 647 | } |
648 | 648 | ||
649 | /* | 649 | /** |
650 | * ext2_try_to_allocate() | 650 | * ext2_try_to_allocate() |
651 | * @sb: superblock | 651 | * @sb: superblock |
652 | * @handle: handle to this transaction | ||
653 | * @group: given allocation block group | 652 | * @group: given allocation block group |
654 | * @bitmap_bh: bufferhead holds the block bitmap | 653 | * @bitmap_bh: bufferhead holds the block bitmap |
655 | * @grp_goal: given target block within the group | 654 | * @grp_goal: given target block within the group |
@@ -851,7 +850,7 @@ static int find_next_reservable_window( | |||
851 | rsv_window_remove(sb, my_rsv); | 850 | rsv_window_remove(sb, my_rsv); |
852 | 851 | ||
853 | /* | 852 | /* |
854 | * Let's book the whole avaliable window for now. We will check the | 853 | * Let's book the whole available window for now. We will check the |
855 | * disk bitmap later and then, if there are free blocks then we adjust | 854 | * disk bitmap later and then, if there are free blocks then we adjust |
856 | * the window size if it's larger than requested. | 855 | * the window size if it's larger than requested. |
857 | * Otherwise, we will remove this node from the tree next time | 856 | * Otherwise, we will remove this node from the tree next time |
@@ -1358,9 +1357,9 @@ retry_alloc: | |||
1358 | goto allocated; | 1357 | goto allocated; |
1359 | } | 1358 | } |
1360 | /* | 1359 | /* |
1361 | * We may end up a bogus ealier ENOSPC error due to | 1360 | * We may end up a bogus earlier ENOSPC error due to |
1362 | * filesystem is "full" of reservations, but | 1361 | * filesystem is "full" of reservations, but |
1363 | * there maybe indeed free blocks avaliable on disk | 1362 | * there maybe indeed free blocks available on disk |
1364 | * In this case, we just forget about the reservations | 1363 | * In this case, we just forget about the reservations |
1365 | * just do block allocation as without reservations. | 1364 | * just do block allocation as without reservations. |
1366 | */ | 1365 | */ |
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index 764109886ec0..47cda410b548 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c | |||
@@ -28,21 +28,30 @@ | |||
28 | 28 | ||
29 | typedef struct ext2_dir_entry_2 ext2_dirent; | 29 | typedef struct ext2_dir_entry_2 ext2_dirent; |
30 | 30 | ||
31 | /* | ||
32 | * Tests against MAX_REC_LEN etc were put in place for 64k block | ||
33 | * sizes; if that is not possible on this arch, we can skip | ||
34 | * those tests and speed things up. | ||
35 | */ | ||
31 | static inline unsigned ext2_rec_len_from_disk(__le16 dlen) | 36 | static inline unsigned ext2_rec_len_from_disk(__le16 dlen) |
32 | { | 37 | { |
33 | unsigned len = le16_to_cpu(dlen); | 38 | unsigned len = le16_to_cpu(dlen); |
34 | 39 | ||
40 | #if (PAGE_CACHE_SIZE >= 65536) | ||
35 | if (len == EXT2_MAX_REC_LEN) | 41 | if (len == EXT2_MAX_REC_LEN) |
36 | return 1 << 16; | 42 | return 1 << 16; |
43 | #endif | ||
37 | return len; | 44 | return len; |
38 | } | 45 | } |
39 | 46 | ||
40 | static inline __le16 ext2_rec_len_to_disk(unsigned len) | 47 | static inline __le16 ext2_rec_len_to_disk(unsigned len) |
41 | { | 48 | { |
49 | #if (PAGE_CACHE_SIZE >= 65536) | ||
42 | if (len == (1 << 16)) | 50 | if (len == (1 << 16)) |
43 | return cpu_to_le16(EXT2_MAX_REC_LEN); | 51 | return cpu_to_le16(EXT2_MAX_REC_LEN); |
44 | else | 52 | else |
45 | BUG_ON(len > (1 << 16)); | 53 | BUG_ON(len > (1 << 16)); |
54 | #endif | ||
46 | return cpu_to_le16(len); | 55 | return cpu_to_le16(len); |
47 | } | 56 | } |
48 | 57 | ||
@@ -98,7 +107,7 @@ static int ext2_commit_chunk(struct page *page, loff_t pos, unsigned len) | |||
98 | if (IS_DIRSYNC(dir)) { | 107 | if (IS_DIRSYNC(dir)) { |
99 | err = write_one_page(page, 1); | 108 | err = write_one_page(page, 1); |
100 | if (!err) | 109 | if (!err) |
101 | err = ext2_sync_inode(dir); | 110 | err = sync_inode_metadata(dir, 1); |
102 | } else { | 111 | } else { |
103 | unlock_page(page); | 112 | unlock_page(page); |
104 | } | 113 | } |
@@ -129,15 +138,15 @@ static void ext2_check_page(struct page *page, int quiet) | |||
129 | p = (ext2_dirent *)(kaddr + offs); | 138 | p = (ext2_dirent *)(kaddr + offs); |
130 | rec_len = ext2_rec_len_from_disk(p->rec_len); | 139 | rec_len = ext2_rec_len_from_disk(p->rec_len); |
131 | 140 | ||
132 | if (rec_len < EXT2_DIR_REC_LEN(1)) | 141 | if (unlikely(rec_len < EXT2_DIR_REC_LEN(1))) |
133 | goto Eshort; | 142 | goto Eshort; |
134 | if (rec_len & 3) | 143 | if (unlikely(rec_len & 3)) |
135 | goto Ealign; | 144 | goto Ealign; |
136 | if (rec_len < EXT2_DIR_REC_LEN(p->name_len)) | 145 | if (unlikely(rec_len < EXT2_DIR_REC_LEN(p->name_len))) |
137 | goto Enamelen; | 146 | goto Enamelen; |
138 | if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1)) | 147 | if (unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))) |
139 | goto Espan; | 148 | goto Espan; |
140 | if (le32_to_cpu(p->inode) > max_inumber) | 149 | if (unlikely(le32_to_cpu(p->inode) > max_inumber)) |
141 | goto Einumber; | 150 | goto Einumber; |
142 | } | 151 | } |
143 | if (offs != limit) | 152 | if (offs != limit) |
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 416daa62242c..645be9e7ee47 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h | |||
@@ -110,7 +110,7 @@ extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode *, struct page **); | |||
110 | extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, struct inode *, int); | 110 | extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, struct inode *, int); |
111 | 111 | ||
112 | /* ialloc.c */ | 112 | /* ialloc.c */ |
113 | extern struct inode * ext2_new_inode (struct inode *, int); | 113 | extern struct inode * ext2_new_inode (struct inode *, int, const struct qstr *); |
114 | extern void ext2_free_inode (struct inode *); | 114 | extern void ext2_free_inode (struct inode *); |
115 | extern unsigned long ext2_count_free_inodes (struct super_block *); | 115 | extern unsigned long ext2_count_free_inodes (struct super_block *); |
116 | extern void ext2_check_inodes_bitmap (struct super_block *); | 116 | extern void ext2_check_inodes_bitmap (struct super_block *); |
@@ -120,7 +120,6 @@ extern unsigned long ext2_count_free (struct buffer_head *, unsigned); | |||
120 | extern struct inode *ext2_iget (struct super_block *, unsigned long); | 120 | extern struct inode *ext2_iget (struct super_block *, unsigned long); |
121 | extern int ext2_write_inode (struct inode *, struct writeback_control *); | 121 | extern int ext2_write_inode (struct inode *, struct writeback_control *); |
122 | extern void ext2_evict_inode(struct inode *); | 122 | extern void ext2_evict_inode(struct inode *); |
123 | extern int ext2_sync_inode (struct inode *); | ||
124 | extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int); | 123 | extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int); |
125 | extern int ext2_setattr (struct dentry *, struct iattr *); | 124 | extern int ext2_setattr (struct dentry *, struct iattr *); |
126 | extern void ext2_set_inode_flags(struct inode *inode); | 125 | extern void ext2_set_inode_flags(struct inode *inode); |
@@ -175,3 +174,9 @@ ext2_group_first_block_no(struct super_block *sb, unsigned long group_no) | |||
175 | return group_no * (ext2_fsblk_t)EXT2_BLOCKS_PER_GROUP(sb) + | 174 | return group_no * (ext2_fsblk_t)EXT2_BLOCKS_PER_GROUP(sb) + |
176 | le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block); | 175 | le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block); |
177 | } | 176 | } |
177 | |||
178 | #define ext2_set_bit __test_and_set_bit_le | ||
179 | #define ext2_clear_bit __test_and_clear_bit_le | ||
180 | #define ext2_test_bit test_bit_le | ||
181 | #define ext2_find_first_zero_bit find_first_zero_bit_le | ||
182 | #define ext2_find_next_zero_bit find_next_zero_bit_le | ||
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index ad70479aabff..ee9ed31948e1 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c | |||
@@ -429,7 +429,8 @@ found: | |||
429 | return group; | 429 | return group; |
430 | } | 430 | } |
431 | 431 | ||
432 | struct inode *ext2_new_inode(struct inode *dir, int mode) | 432 | struct inode *ext2_new_inode(struct inode *dir, int mode, |
433 | const struct qstr *qstr) | ||
433 | { | 434 | { |
434 | struct super_block *sb; | 435 | struct super_block *sb; |
435 | struct buffer_head *bitmap_bh = NULL; | 436 | struct buffer_head *bitmap_bh = NULL; |
@@ -585,7 +586,7 @@ got: | |||
585 | if (err) | 586 | if (err) |
586 | goto fail_free_drop; | 587 | goto fail_free_drop; |
587 | 588 | ||
588 | err = ext2_init_security(inode,dir); | 589 | err = ext2_init_security(inode, dir, qstr); |
589 | if (err) | 590 | if (err) |
590 | goto fail_free_drop; | 591 | goto fail_free_drop; |
591 | 592 | ||
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 940c96168868..788e09a07f7e 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -305,7 +305,7 @@ static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind) | |||
305 | return ind->bh->b_blocknr; | 305 | return ind->bh->b_blocknr; |
306 | 306 | ||
307 | /* | 307 | /* |
308 | * It is going to be refered from inode itself? OK, just put it into | 308 | * It is going to be referred from inode itself? OK, just put it into |
309 | * the same cylinder group then. | 309 | * the same cylinder group then. |
310 | */ | 310 | */ |
311 | bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group); | 311 | bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group); |
@@ -458,7 +458,7 @@ failed_out: | |||
458 | * the same format as ext2_get_branch() would do. We are calling it after | 458 | * the same format as ext2_get_branch() would do. We are calling it after |
459 | * we had read the existing part of chain and partial points to the last | 459 | * we had read the existing part of chain and partial points to the last |
460 | * triple of that (one with zero ->key). Upon the exit we have the same | 460 | * triple of that (one with zero ->key). Upon the exit we have the same |
461 | * picture as after the successful ext2_get_block(), excpet that in one | 461 | * picture as after the successful ext2_get_block(), except that in one |
462 | * place chain is disconnected - *branch->p is still zero (we did not | 462 | * place chain is disconnected - *branch->p is still zero (we did not |
463 | * set the last link), but branch->key contains the number that should | 463 | * set the last link), but branch->key contains the number that should |
464 | * be placed into *branch->p to fill that gap. | 464 | * be placed into *branch->p to fill that gap. |
@@ -662,7 +662,7 @@ static int ext2_get_blocks(struct inode *inode, | |||
662 | mutex_lock(&ei->truncate_mutex); | 662 | mutex_lock(&ei->truncate_mutex); |
663 | /* | 663 | /* |
664 | * If the indirect block is missing while we are reading | 664 | * If the indirect block is missing while we are reading |
665 | * the chain(ext3_get_branch() returns -EAGAIN err), or | 665 | * the chain(ext2_get_branch() returns -EAGAIN err), or |
666 | * if the chain has been changed after we grab the semaphore, | 666 | * if the chain has been changed after we grab the semaphore, |
667 | * (either because another process truncated this branch, or | 667 | * (either because another process truncated this branch, or |
668 | * another get_block allocated this branch) re-grab the chain to see if | 668 | * another get_block allocated this branch) re-grab the chain to see if |
@@ -860,7 +860,6 @@ const struct address_space_operations ext2_aops = { | |||
860 | .readpage = ext2_readpage, | 860 | .readpage = ext2_readpage, |
861 | .readpages = ext2_readpages, | 861 | .readpages = ext2_readpages, |
862 | .writepage = ext2_writepage, | 862 | .writepage = ext2_writepage, |
863 | .sync_page = block_sync_page, | ||
864 | .write_begin = ext2_write_begin, | 863 | .write_begin = ext2_write_begin, |
865 | .write_end = ext2_write_end, | 864 | .write_end = ext2_write_end, |
866 | .bmap = ext2_bmap, | 865 | .bmap = ext2_bmap, |
@@ -880,7 +879,6 @@ const struct address_space_operations ext2_nobh_aops = { | |||
880 | .readpage = ext2_readpage, | 879 | .readpage = ext2_readpage, |
881 | .readpages = ext2_readpages, | 880 | .readpages = ext2_readpages, |
882 | .writepage = ext2_nobh_writepage, | 881 | .writepage = ext2_nobh_writepage, |
883 | .sync_page = block_sync_page, | ||
884 | .write_begin = ext2_nobh_write_begin, | 882 | .write_begin = ext2_nobh_write_begin, |
885 | .write_end = nobh_write_end, | 883 | .write_end = nobh_write_end, |
886 | .bmap = ext2_bmap, | 884 | .bmap = ext2_bmap, |
@@ -915,7 +913,7 @@ static inline int all_zeroes(__le32 *p, __le32 *q) | |||
915 | * | 913 | * |
916 | * When we do truncate() we may have to clean the ends of several indirect | 914 | * When we do truncate() we may have to clean the ends of several indirect |
917 | * blocks but leave the blocks themselves alive. Block is partially | 915 | * blocks but leave the blocks themselves alive. Block is partially |
918 | * truncated if some data below the new i_size is refered from it (and | 916 | * truncated if some data below the new i_size is referred from it (and |
919 | * it is on the path to the first completely truncated data block, indeed). | 917 | * it is on the path to the first completely truncated data block, indeed). |
920 | * We have to free the top of that path along with everything to the right | 918 | * We have to free the top of that path along with everything to the right |
921 | * of the path. Since no allocation past the truncation point is possible | 919 | * of the path. Since no allocation past the truncation point is possible |
@@ -992,7 +990,7 @@ no_top: | |||
992 | * @p: array of block numbers | 990 | * @p: array of block numbers |
993 | * @q: points immediately past the end of array | 991 | * @q: points immediately past the end of array |
994 | * | 992 | * |
995 | * We are freeing all blocks refered from that array (numbers are | 993 | * We are freeing all blocks referred from that array (numbers are |
996 | * stored as little-endian 32-bit) and updating @inode->i_blocks | 994 | * stored as little-endian 32-bit) and updating @inode->i_blocks |
997 | * appropriately. | 995 | * appropriately. |
998 | */ | 996 | */ |
@@ -1032,7 +1030,7 @@ static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q) | |||
1032 | * @q: pointer immediately past the end of array | 1030 | * @q: pointer immediately past the end of array |
1033 | * @depth: depth of the branches to free | 1031 | * @depth: depth of the branches to free |
1034 | * | 1032 | * |
1035 | * We are freeing all blocks refered from these branches (numbers are | 1033 | * We are freeing all blocks referred from these branches (numbers are |
1036 | * stored as little-endian 32-bit) and updating @inode->i_blocks | 1034 | * stored as little-endian 32-bit) and updating @inode->i_blocks |
1037 | * appropriately. | 1035 | * appropriately. |
1038 | */ | 1036 | */ |
@@ -1203,7 +1201,7 @@ static int ext2_setsize(struct inode *inode, loff_t newsize) | |||
1203 | inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; | 1201 | inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; |
1204 | if (inode_needs_sync(inode)) { | 1202 | if (inode_needs_sync(inode)) { |
1205 | sync_mapping_buffers(inode->i_mapping); | 1203 | sync_mapping_buffers(inode->i_mapping); |
1206 | ext2_sync_inode (inode); | 1204 | sync_inode_metadata(inode, 1); |
1207 | } else { | 1205 | } else { |
1208 | mark_inode_dirty(inode); | 1206 | mark_inode_dirty(inode); |
1209 | } | 1207 | } |
@@ -1523,15 +1521,6 @@ int ext2_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
1523 | return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); | 1521 | return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); |
1524 | } | 1522 | } |
1525 | 1523 | ||
1526 | int ext2_sync_inode(struct inode *inode) | ||
1527 | { | ||
1528 | struct writeback_control wbc = { | ||
1529 | .sync_mode = WB_SYNC_ALL, | ||
1530 | .nr_to_write = 0, /* sys_fsync did this */ | ||
1531 | }; | ||
1532 | return sync_inode(inode, &wbc); | ||
1533 | } | ||
1534 | |||
1535 | int ext2_setattr(struct dentry *dentry, struct iattr *iattr) | 1524 | int ext2_setattr(struct dentry *dentry, struct iattr *iattr) |
1536 | { | 1525 | { |
1537 | struct inode *inode = dentry->d_inode; | 1526 | struct inode *inode = dentry->d_inode; |
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index e7431309bdca..f81e250ac5c4 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c | |||
@@ -39,7 +39,7 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
39 | if (ret) | 39 | if (ret) |
40 | return ret; | 40 | return ret; |
41 | 41 | ||
42 | if (!is_owner_or_cap(inode)) { | 42 | if (!inode_owner_or_capable(inode)) { |
43 | ret = -EACCES; | 43 | ret = -EACCES; |
44 | goto setflags_out; | 44 | goto setflags_out; |
45 | } | 45 | } |
@@ -89,7 +89,7 @@ setflags_out: | |||
89 | case EXT2_IOC_GETVERSION: | 89 | case EXT2_IOC_GETVERSION: |
90 | return put_user(inode->i_generation, (int __user *) arg); | 90 | return put_user(inode->i_generation, (int __user *) arg); |
91 | case EXT2_IOC_SETVERSION: | 91 | case EXT2_IOC_SETVERSION: |
92 | if (!is_owner_or_cap(inode)) | 92 | if (!inode_owner_or_capable(inode)) |
93 | return -EPERM; | 93 | return -EPERM; |
94 | ret = mnt_want_write(filp->f_path.mnt); | 94 | ret = mnt_want_write(filp->f_path.mnt); |
95 | if (ret) | 95 | if (ret) |
@@ -115,7 +115,7 @@ setflags_out: | |||
115 | if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode)) | 115 | if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode)) |
116 | return -ENOTTY; | 116 | return -ENOTTY; |
117 | 117 | ||
118 | if (!is_owner_or_cap(inode)) | 118 | if (!inode_owner_or_capable(inode)) |
119 | return -EACCES; | 119 | return -EACCES; |
120 | 120 | ||
121 | if (get_user(rsv_window_size, (int __user *)arg)) | 121 | if (get_user(rsv_window_size, (int __user *)arg)) |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 71efb0e9a3f2..ed5c5d496ee9 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -67,7 +67,7 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str | |||
67 | inode = NULL; | 67 | inode = NULL; |
68 | if (ino) { | 68 | if (ino) { |
69 | inode = ext2_iget(dir->i_sb, ino); | 69 | inode = ext2_iget(dir->i_sb, ino); |
70 | if (unlikely(IS_ERR(inode))) { | 70 | if (IS_ERR(inode)) { |
71 | if (PTR_ERR(inode) == -ESTALE) { | 71 | if (PTR_ERR(inode) == -ESTALE) { |
72 | ext2_error(dir->i_sb, __func__, | 72 | ext2_error(dir->i_sb, __func__, |
73 | "deleted inode referenced: %lu", | 73 | "deleted inode referenced: %lu", |
@@ -104,7 +104,7 @@ static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, st | |||
104 | 104 | ||
105 | dquot_initialize(dir); | 105 | dquot_initialize(dir); |
106 | 106 | ||
107 | inode = ext2_new_inode(dir, mode); | 107 | inode = ext2_new_inode(dir, mode, &dentry->d_name); |
108 | if (IS_ERR(inode)) | 108 | if (IS_ERR(inode)) |
109 | return PTR_ERR(inode); | 109 | return PTR_ERR(inode); |
110 | 110 | ||
@@ -133,7 +133,7 @@ static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_ | |||
133 | 133 | ||
134 | dquot_initialize(dir); | 134 | dquot_initialize(dir); |
135 | 135 | ||
136 | inode = ext2_new_inode (dir, mode); | 136 | inode = ext2_new_inode (dir, mode, &dentry->d_name); |
137 | err = PTR_ERR(inode); | 137 | err = PTR_ERR(inode); |
138 | if (!IS_ERR(inode)) { | 138 | if (!IS_ERR(inode)) { |
139 | init_special_inode(inode, inode->i_mode, rdev); | 139 | init_special_inode(inode, inode->i_mode, rdev); |
@@ -159,7 +159,7 @@ static int ext2_symlink (struct inode * dir, struct dentry * dentry, | |||
159 | 159 | ||
160 | dquot_initialize(dir); | 160 | dquot_initialize(dir); |
161 | 161 | ||
162 | inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO); | 162 | inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO, &dentry->d_name); |
163 | err = PTR_ERR(inode); | 163 | err = PTR_ERR(inode); |
164 | if (IS_ERR(inode)) | 164 | if (IS_ERR(inode)) |
165 | goto out; | 165 | goto out; |
@@ -206,7 +206,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, | |||
206 | 206 | ||
207 | inode->i_ctime = CURRENT_TIME_SEC; | 207 | inode->i_ctime = CURRENT_TIME_SEC; |
208 | inode_inc_link_count(inode); | 208 | inode_inc_link_count(inode); |
209 | atomic_inc(&inode->i_count); | 209 | ihold(inode); |
210 | 210 | ||
211 | err = ext2_add_link(dentry, inode); | 211 | err = ext2_add_link(dentry, inode); |
212 | if (!err) { | 212 | if (!err) { |
@@ -230,7 +230,7 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
230 | 230 | ||
231 | inode_inc_link_count(dir); | 231 | inode_inc_link_count(dir); |
232 | 232 | ||
233 | inode = ext2_new_inode (dir, S_IFDIR | mode); | 233 | inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name); |
234 | err = PTR_ERR(inode); | 234 | err = PTR_ERR(inode); |
235 | if (IS_ERR(inode)) | 235 | if (IS_ERR(inode)) |
236 | goto out_dir; | 236 | goto out_dir; |
@@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); | 344 | new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); |
345 | if (!new_de) | 345 | if (!new_de) |
346 | goto out_dir; | 346 | goto out_dir; |
347 | inode_inc_link_count(old_inode); | ||
348 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); | 347 | ext2_set_link(new_dir, new_de, new_page, old_inode, 1); |
349 | new_inode->i_ctime = CURRENT_TIME_SEC; | 348 | new_inode->i_ctime = CURRENT_TIME_SEC; |
350 | if (dir_de) | 349 | if (dir_de) |
@@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
356 | if (new_dir->i_nlink >= EXT2_LINK_MAX) | 355 | if (new_dir->i_nlink >= EXT2_LINK_MAX) |
357 | goto out_dir; | 356 | goto out_dir; |
358 | } | 357 | } |
359 | inode_inc_link_count(old_inode); | ||
360 | err = ext2_add_link(new_dentry, old_inode); | 358 | err = ext2_add_link(new_dentry, old_inode); |
361 | if (err) { | 359 | if (err) |
362 | inode_dec_link_count(old_inode); | ||
363 | goto out_dir; | 360 | goto out_dir; |
364 | } | ||
365 | if (dir_de) | 361 | if (dir_de) |
366 | inode_inc_link_count(new_dir); | 362 | inode_inc_link_count(new_dir); |
367 | } | 363 | } |
@@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
369 | /* | 365 | /* |
370 | * Like most other Unix systems, set the ctime for inodes on a | 366 | * Like most other Unix systems, set the ctime for inodes on a |
371 | * rename. | 367 | * rename. |
372 | * inode_dec_link_count() will mark the inode dirty. | ||
373 | */ | 368 | */ |
374 | old_inode->i_ctime = CURRENT_TIME_SEC; | 369 | old_inode->i_ctime = CURRENT_TIME_SEC; |
370 | mark_inode_dirty(old_inode); | ||
375 | 371 | ||
376 | ext2_delete_entry (old_de, old_page); | 372 | ext2_delete_entry (old_de, old_page); |
377 | inode_dec_link_count(old_inode); | ||
378 | 373 | ||
379 | if (dir_de) { | 374 | if (dir_de) { |
380 | if (old_dir != new_dir) | 375 | if (old_dir != new_dir) |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 1ec602673ea8..1dd62ed35b85 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -43,9 +43,10 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data); | |||
43 | static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf); | 43 | static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf); |
44 | static int ext2_sync_fs(struct super_block *sb, int wait); | 44 | static int ext2_sync_fs(struct super_block *sb, int wait); |
45 | 45 | ||
46 | void ext2_error (struct super_block * sb, const char * function, | 46 | void ext2_error(struct super_block *sb, const char *function, |
47 | const char * fmt, ...) | 47 | const char *fmt, ...) |
48 | { | 48 | { |
49 | struct va_format vaf; | ||
49 | va_list args; | 50 | va_list args; |
50 | struct ext2_sb_info *sbi = EXT2_SB(sb); | 51 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
51 | struct ext2_super_block *es = sbi->s_es; | 52 | struct ext2_super_block *es = sbi->s_es; |
@@ -59,9 +60,13 @@ void ext2_error (struct super_block * sb, const char * function, | |||
59 | } | 60 | } |
60 | 61 | ||
61 | va_start(args, fmt); | 62 | va_start(args, fmt); |
62 | printk(KERN_CRIT "EXT2-fs (%s): error: %s: ", sb->s_id, function); | 63 | |
63 | vprintk(fmt, args); | 64 | vaf.fmt = fmt; |
64 | printk("\n"); | 65 | vaf.va = &args; |
66 | |||
67 | printk(KERN_CRIT "EXT2-fs (%s): error: %s: %pV\n", | ||
68 | sb->s_id, function, &vaf); | ||
69 | |||
65 | va_end(args); | 70 | va_end(args); |
66 | 71 | ||
67 | if (test_opt(sb, ERRORS_PANIC)) | 72 | if (test_opt(sb, ERRORS_PANIC)) |
@@ -76,12 +81,16 @@ void ext2_error (struct super_block * sb, const char * function, | |||
76 | void ext2_msg(struct super_block *sb, const char *prefix, | 81 | void ext2_msg(struct super_block *sb, const char *prefix, |
77 | const char *fmt, ...) | 82 | const char *fmt, ...) |
78 | { | 83 | { |
84 | struct va_format vaf; | ||
79 | va_list args; | 85 | va_list args; |
80 | 86 | ||
81 | va_start(args, fmt); | 87 | va_start(args, fmt); |
82 | printk("%sEXT2-fs (%s): ", prefix, sb->s_id); | 88 | |
83 | vprintk(fmt, args); | 89 | vaf.fmt = fmt; |
84 | printk("\n"); | 90 | vaf.va = &args; |
91 | |||
92 | printk("%sEXT2-fs (%s): %pV\n", prefix, sb->s_id, &vaf); | ||
93 | |||
85 | va_end(args); | 94 | va_end(args); |
86 | } | 95 | } |
87 | 96 | ||
@@ -161,11 +170,18 @@ static struct inode *ext2_alloc_inode(struct super_block *sb) | |||
161 | return &ei->vfs_inode; | 170 | return &ei->vfs_inode; |
162 | } | 171 | } |
163 | 172 | ||
164 | static void ext2_destroy_inode(struct inode *inode) | 173 | static void ext2_i_callback(struct rcu_head *head) |
165 | { | 174 | { |
175 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
176 | INIT_LIST_HEAD(&inode->i_dentry); | ||
166 | kmem_cache_free(ext2_inode_cachep, EXT2_I(inode)); | 177 | kmem_cache_free(ext2_inode_cachep, EXT2_I(inode)); |
167 | } | 178 | } |
168 | 179 | ||
180 | static void ext2_destroy_inode(struct inode *inode) | ||
181 | { | ||
182 | call_rcu(&inode->i_rcu, ext2_i_callback); | ||
183 | } | ||
184 | |||
169 | static void init_once(void *foo) | 185 | static void init_once(void *foo) |
170 | { | 186 | { |
171 | struct ext2_inode_info *ei = (struct ext2_inode_info *) foo; | 187 | struct ext2_inode_info *ei = (struct ext2_inode_info *) foo; |
@@ -747,15 +763,16 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
747 | __le32 features; | 763 | __le32 features; |
748 | int err; | 764 | int err; |
749 | 765 | ||
766 | err = -ENOMEM; | ||
750 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 767 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
751 | if (!sbi) | 768 | if (!sbi) |
752 | return -ENOMEM; | 769 | goto failed_unlock; |
753 | 770 | ||
754 | sbi->s_blockgroup_lock = | 771 | sbi->s_blockgroup_lock = |
755 | kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); | 772 | kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); |
756 | if (!sbi->s_blockgroup_lock) { | 773 | if (!sbi->s_blockgroup_lock) { |
757 | kfree(sbi); | 774 | kfree(sbi); |
758 | return -ENOMEM; | 775 | goto failed_unlock; |
759 | } | 776 | } |
760 | sb->s_fs_info = sbi; | 777 | sb->s_fs_info = sbi; |
761 | sbi->s_sb_block = sb_block; | 778 | sbi->s_sb_block = sb_block; |
@@ -881,7 +898,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
881 | brelse(bh); | 898 | brelse(bh); |
882 | 899 | ||
883 | if (!sb_set_blocksize(sb, blocksize)) { | 900 | if (!sb_set_blocksize(sb, blocksize)) { |
884 | ext2_msg(sb, KERN_ERR, "error: blocksize is too small"); | 901 | ext2_msg(sb, KERN_ERR, |
902 | "error: bad blocksize %d", blocksize); | ||
885 | goto failed_sbi; | 903 | goto failed_sbi; |
886 | } | 904 | } |
887 | 905 | ||
@@ -1107,6 +1125,7 @@ failed_sbi: | |||
1107 | sb->s_fs_info = NULL; | 1125 | sb->s_fs_info = NULL; |
1108 | kfree(sbi->s_blockgroup_lock); | 1126 | kfree(sbi->s_blockgroup_lock); |
1109 | kfree(sbi); | 1127 | kfree(sbi); |
1128 | failed_unlock: | ||
1110 | return ret; | 1129 | return ret; |
1111 | } | 1130 | } |
1112 | 1131 | ||
@@ -1219,9 +1238,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1219 | } | 1238 | } |
1220 | 1239 | ||
1221 | es = sbi->s_es; | 1240 | es = sbi->s_es; |
1222 | if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) != | 1241 | if ((sbi->s_mount_opt ^ old_mount_opt) & EXT2_MOUNT_XIP) { |
1223 | (old_mount_opt & EXT2_MOUNT_XIP)) && | ||
1224 | invalidate_inodes(sb)) { | ||
1225 | ext2_msg(sb, KERN_WARNING, "warning: refusing change of " | 1242 | ext2_msg(sb, KERN_WARNING, "warning: refusing change of " |
1226 | "xip flag with busy inodes while remounting"); | 1243 | "xip flag with busy inodes while remounting"); |
1227 | sbi->s_mount_opt &= ~EXT2_MOUNT_XIP; | 1244 | sbi->s_mount_opt &= ~EXT2_MOUNT_XIP; |
@@ -1356,17 +1373,17 @@ static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf) | |||
1356 | return 0; | 1373 | return 0; |
1357 | } | 1374 | } |
1358 | 1375 | ||
1359 | static int ext2_get_sb(struct file_system_type *fs_type, | 1376 | static struct dentry *ext2_mount(struct file_system_type *fs_type, |
1360 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 1377 | int flags, const char *dev_name, void *data) |
1361 | { | 1378 | { |
1362 | return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super, mnt); | 1379 | return mount_bdev(fs_type, flags, dev_name, data, ext2_fill_super); |
1363 | } | 1380 | } |
1364 | 1381 | ||
1365 | #ifdef CONFIG_QUOTA | 1382 | #ifdef CONFIG_QUOTA |
1366 | 1383 | ||
1367 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | 1384 | /* Read data from quotafile - avoid pagecache and such because we cannot afford |
1368 | * acquiring the locks... As quota files are never truncated and quota code | 1385 | * acquiring the locks... As quota files are never truncated and quota code |
1369 | * itself serializes the operations (and noone else should touch the files) | 1386 | * itself serializes the operations (and no one else should touch the files) |
1370 | * we don't have to be afraid of races */ | 1387 | * we don't have to be afraid of races */ |
1371 | static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, | 1388 | static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, |
1372 | size_t len, loff_t off) | 1389 | size_t len, loff_t off) |
@@ -1473,7 +1490,7 @@ out: | |||
1473 | static struct file_system_type ext2_fs_type = { | 1490 | static struct file_system_type ext2_fs_type = { |
1474 | .owner = THIS_MODULE, | 1491 | .owner = THIS_MODULE, |
1475 | .name = "ext2", | 1492 | .name = "ext2", |
1476 | .get_sb = ext2_get_sb, | 1493 | .mount = ext2_mount, |
1477 | .kill_sb = kill_block_super, | 1494 | .kill_sb = kill_block_super, |
1478 | .fs_flags = FS_REQUIRES_DEV, | 1495 | .fs_flags = FS_REQUIRES_DEV, |
1479 | }; | 1496 | }; |
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 8c29ae15129e..529970617a21 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c | |||
@@ -35,7 +35,7 @@ | |||
35 | * +------------------+ | 35 | * +------------------+ |
36 | * | 36 | * |
37 | * The block header is followed by multiple entry descriptors. These entry | 37 | * The block header is followed by multiple entry descriptors. These entry |
38 | * descriptors are variable in size, and alligned to EXT2_XATTR_PAD | 38 | * descriptors are variable in size, and aligned to EXT2_XATTR_PAD |
39 | * byte boundaries. The entry descriptors are sorted by attribute name, | 39 | * byte boundaries. The entry descriptors are sorted by attribute name, |
40 | * so that two extended attribute blocks can be compared efficiently. | 40 | * so that two extended attribute blocks can be compared efficiently. |
41 | * | 41 | * |
@@ -199,14 +199,6 @@ bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", | |||
199 | goto found; | 199 | goto found; |
200 | entry = next; | 200 | entry = next; |
201 | } | 201 | } |
202 | /* Check the remaining name entries */ | ||
203 | while (!IS_LAST_ENTRY(entry)) { | ||
204 | struct ext2_xattr_entry *next = | ||
205 | EXT2_XATTR_NEXT(entry); | ||
206 | if ((char *)next >= end) | ||
207 | goto bad_block; | ||
208 | entry = next; | ||
209 | } | ||
210 | if (ext2_xattr_cache_insert(bh)) | 202 | if (ext2_xattr_cache_insert(bh)) |
211 | ea_idebug(inode, "cache insert failed"); | 203 | ea_idebug(inode, "cache insert failed"); |
212 | error = -ENODATA; | 204 | error = -ENODATA; |
@@ -355,7 +347,7 @@ static void ext2_xattr_update_super_block(struct super_block *sb) | |||
355 | /* | 347 | /* |
356 | * ext2_xattr_set() | 348 | * ext2_xattr_set() |
357 | * | 349 | * |
358 | * Create, replace or remove an extended attribute for this inode. Buffer | 350 | * Create, replace or remove an extended attribute for this inode. Value |
359 | * is NULL to remove an existing extended attribute, and non-NULL to | 351 | * is NULL to remove an existing extended attribute, and non-NULL to |
360 | * either replace an existing extended attribute, or create a new extended | 352 | * either replace an existing extended attribute, or create a new extended |
361 | * attribute. The flags XATTR_REPLACE and XATTR_CREATE | 353 | * attribute. The flags XATTR_REPLACE and XATTR_CREATE |
@@ -699,7 +691,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, | |||
699 | EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; | 691 | EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; |
700 | inode->i_ctime = CURRENT_TIME_SEC; | 692 | inode->i_ctime = CURRENT_TIME_SEC; |
701 | if (IS_SYNC(inode)) { | 693 | if (IS_SYNC(inode)) { |
702 | error = ext2_sync_inode (inode); | 694 | error = sync_inode_metadata(inode, 1); |
703 | /* In case sync failed due to ENOSPC the inode was actually | 695 | /* In case sync failed due to ENOSPC the inode was actually |
704 | * written (only some dirty data were not) so we just proceed | 696 | * written (only some dirty data were not) so we just proceed |
705 | * as if nothing happened and cleanup the unused block */ | 697 | * as if nothing happened and cleanup the unused block */ |
diff --git a/fs/ext2/xattr.h b/fs/ext2/xattr.h index a1a1c2184616..5e41cccff762 100644 --- a/fs/ext2/xattr.h +++ b/fs/ext2/xattr.h | |||
@@ -116,9 +116,11 @@ exit_ext2_xattr(void) | |||
116 | # endif /* CONFIG_EXT2_FS_XATTR */ | 116 | # endif /* CONFIG_EXT2_FS_XATTR */ |
117 | 117 | ||
118 | #ifdef CONFIG_EXT2_FS_SECURITY | 118 | #ifdef CONFIG_EXT2_FS_SECURITY |
119 | extern int ext2_init_security(struct inode *inode, struct inode *dir); | 119 | extern int ext2_init_security(struct inode *inode, struct inode *dir, |
120 | const struct qstr *qstr); | ||
120 | #else | 121 | #else |
121 | static inline int ext2_init_security(struct inode *inode, struct inode *dir) | 122 | static inline int ext2_init_security(struct inode *inode, struct inode *dir, |
123 | const struct qstr *qstr) | ||
122 | { | 124 | { |
123 | return 0; | 125 | return 0; |
124 | } | 126 | } |
diff --git a/fs/ext2/xattr_security.c b/fs/ext2/xattr_security.c index 3004e15d5da5..5d979b4347b0 100644 --- a/fs/ext2/xattr_security.c +++ b/fs/ext2/xattr_security.c | |||
@@ -47,14 +47,15 @@ ext2_xattr_security_set(struct dentry *dentry, const char *name, | |||
47 | } | 47 | } |
48 | 48 | ||
49 | int | 49 | int |
50 | ext2_init_security(struct inode *inode, struct inode *dir) | 50 | ext2_init_security(struct inode *inode, struct inode *dir, |
51 | const struct qstr *qstr) | ||
51 | { | 52 | { |
52 | int err; | 53 | int err; |
53 | size_t len; | 54 | size_t len; |
54 | void *value; | 55 | void *value; |
55 | char *name; | 56 | char *name; |
56 | 57 | ||
57 | err = security_inode_init_security(inode, dir, &name, &value, &len); | 58 | err = security_inode_init_security(inode, dir, qstr, &name, &value, &len); |
58 | if (err) { | 59 | if (err) { |
59 | if (err == -EOPNOTSUPP) | 60 | if (err == -EOPNOTSUPP) |
60 | return 0; | 61 | return 0; |