diff options
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/dir.c | 19 | ||||
-rw-r--r-- | fs/ext2/namei.c | 11 | ||||
-rw-r--r-- | fs/ext2/super.c | 25 | ||||
-rw-r--r-- | fs/ext2/xattr.c | 10 |
4 files changed, 35 insertions, 30 deletions
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index 2709b34206ab..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 | ||
@@ -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/namei.c b/fs/ext2/namei.c index 368d7049ac89..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", |
@@ -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 e0c6380ff992..7731695e65d9 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 | ||
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index f84700be3274..c2e4dce984d2 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c | |||
@@ -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 |