diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-20 19:13:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-20 19:13:58 -0500 |
commit | 8ebbfb49574818f07a25bc119b1bbdf1c2853a39 (patch) | |
tree | e7b1ea6c6a3ea522654c685f2f0c9f41466fdcf9 | |
parent | 39e255dab5a993cbebb35598015da1d4a0eb3727 (diff) | |
parent | 847c9db5cb50841589b8ebd3da0769b1b02fb3b2 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Assorted fixes, sat in -next for a week or so...
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
ocfs2: deal with wraparounds of i_nlink in ocfs2_rename()
vfs: fix compat_sys_stat() handling of overflows in st_nlink
quota: Fix deadlock with suspend and quotas
vfs: Provide function to get superblock and wait for it to thaw
vfs: fix panic in __d_lookup() with high dentry hashtable counts
autofs4 - fix lockdep splat in autofs
vfs: fix d_inode_lookup() dentry ref leak
-rw-r--r-- | fs/autofs4/expire.c | 2 | ||||
-rw-r--r-- | fs/compat.c | 56 | ||||
-rw-r--r-- | fs/dcache.c | 8 | ||||
-rw-r--r-- | fs/inode.c | 8 | ||||
-rw-r--r-- | fs/namei.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/namei.c | 2 | ||||
-rw-r--r-- | fs/quota/quota.c | 24 | ||||
-rw-r--r-- | fs/super.c | 22 | ||||
-rw-r--r-- | include/linux/fs.h | 1 | ||||
-rw-r--r-- | kernel/pid.c | 4 | ||||
-rw-r--r-- | mm/page_alloc.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 5 |
12 files changed, 89 insertions, 48 deletions
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 450f529a4eae..1feb68ecef95 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -124,6 +124,7 @@ start: | |||
124 | /* Negative dentry - try next */ | 124 | /* Negative dentry - try next */ |
125 | if (!simple_positive(q)) { | 125 | if (!simple_positive(q)) { |
126 | spin_unlock(&p->d_lock); | 126 | spin_unlock(&p->d_lock); |
127 | lock_set_subclass(&q->d_lock.dep_map, 0, _RET_IP_); | ||
127 | p = q; | 128 | p = q; |
128 | goto again; | 129 | goto again; |
129 | } | 130 | } |
@@ -186,6 +187,7 @@ again: | |||
186 | /* Negative dentry - try next */ | 187 | /* Negative dentry - try next */ |
187 | if (!simple_positive(ret)) { | 188 | if (!simple_positive(ret)) { |
188 | spin_unlock(&p->d_lock); | 189 | spin_unlock(&p->d_lock); |
190 | lock_set_subclass(&ret->d_lock.dep_map, 0, _RET_IP_); | ||
189 | p = ret; | 191 | p = ret; |
190 | goto again; | 192 | goto again; |
191 | } | 193 | } |
diff --git a/fs/compat.c b/fs/compat.c index fa9d721ecfee..07880bae28a9 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -131,41 +131,35 @@ asmlinkage long compat_sys_utimes(const char __user *filename, struct compat_tim | |||
131 | 131 | ||
132 | static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) | 132 | static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) |
133 | { | 133 | { |
134 | compat_ino_t ino = stat->ino; | 134 | struct compat_stat tmp; |
135 | typeof(ubuf->st_uid) uid = 0; | ||
136 | typeof(ubuf->st_gid) gid = 0; | ||
137 | int err; | ||
138 | 135 | ||
139 | SET_UID(uid, stat->uid); | 136 | if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) |
140 | SET_GID(gid, stat->gid); | 137 | return -EOVERFLOW; |
141 | 138 | ||
142 | if ((u64) stat->size > MAX_NON_LFS || | 139 | memset(&tmp, 0, sizeof(tmp)); |
143 | !old_valid_dev(stat->dev) || | 140 | tmp.st_dev = old_encode_dev(stat->dev); |
144 | !old_valid_dev(stat->rdev)) | 141 | tmp.st_ino = stat->ino; |
142 | if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) | ||
145 | return -EOVERFLOW; | 143 | return -EOVERFLOW; |
146 | if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino) | 144 | tmp.st_mode = stat->mode; |
145 | tmp.st_nlink = stat->nlink; | ||
146 | if (tmp.st_nlink != stat->nlink) | ||
147 | return -EOVERFLOW; | 147 | return -EOVERFLOW; |
148 | 148 | SET_UID(tmp.st_uid, stat->uid); | |
149 | if (clear_user(ubuf, sizeof(*ubuf))) | 149 | SET_GID(tmp.st_gid, stat->gid); |
150 | return -EFAULT; | 150 | tmp.st_rdev = old_encode_dev(stat->rdev); |
151 | 151 | if ((u64) stat->size > MAX_NON_LFS) | |
152 | err = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev); | 152 | return -EOVERFLOW; |
153 | err |= __put_user(ino, &ubuf->st_ino); | 153 | tmp.st_size = stat->size; |
154 | err |= __put_user(stat->mode, &ubuf->st_mode); | 154 | tmp.st_atime = stat->atime.tv_sec; |
155 | err |= __put_user(stat->nlink, &ubuf->st_nlink); | 155 | tmp.st_atime_nsec = stat->atime.tv_nsec; |
156 | err |= __put_user(uid, &ubuf->st_uid); | 156 | tmp.st_mtime = stat->mtime.tv_sec; |
157 | err |= __put_user(gid, &ubuf->st_gid); | 157 | tmp.st_mtime_nsec = stat->mtime.tv_nsec; |
158 | err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev); | 158 | tmp.st_ctime = stat->ctime.tv_sec; |
159 | err |= __put_user(stat->size, &ubuf->st_size); | 159 | tmp.st_ctime_nsec = stat->ctime.tv_nsec; |
160 | err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime); | 160 | tmp.st_blocks = stat->blocks; |
161 | err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec); | 161 | tmp.st_blksize = stat->blksize; |
162 | err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime); | 162 | return copy_to_user(ubuf, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
163 | err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec); | ||
164 | err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime); | ||
165 | err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec); | ||
166 | err |= __put_user(stat->blksize, &ubuf->st_blksize); | ||
167 | err |= __put_user(stat->blocks, &ubuf->st_blocks); | ||
168 | return err; | ||
169 | } | 163 | } |
170 | 164 | ||
171 | asmlinkage long compat_sys_newstat(const char __user * filename, | 165 | asmlinkage long compat_sys_newstat(const char __user * filename, |
diff --git a/fs/dcache.c b/fs/dcache.c index 16a53cc2cc02..fe19ac13f75f 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -2968,7 +2968,7 @@ __setup("dhash_entries=", set_dhash_entries); | |||
2968 | 2968 | ||
2969 | static void __init dcache_init_early(void) | 2969 | static void __init dcache_init_early(void) |
2970 | { | 2970 | { |
2971 | int loop; | 2971 | unsigned int loop; |
2972 | 2972 | ||
2973 | /* If hashes are distributed across NUMA nodes, defer | 2973 | /* If hashes are distributed across NUMA nodes, defer |
2974 | * hash allocation until vmalloc space is available. | 2974 | * hash allocation until vmalloc space is available. |
@@ -2986,13 +2986,13 @@ static void __init dcache_init_early(void) | |||
2986 | &d_hash_mask, | 2986 | &d_hash_mask, |
2987 | 0); | 2987 | 0); |
2988 | 2988 | ||
2989 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 2989 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
2990 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); | 2990 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
2991 | } | 2991 | } |
2992 | 2992 | ||
2993 | static void __init dcache_init(void) | 2993 | static void __init dcache_init(void) |
2994 | { | 2994 | { |
2995 | int loop; | 2995 | unsigned int loop; |
2996 | 2996 | ||
2997 | /* | 2997 | /* |
2998 | * A constructor could be added for stable state like the lists, | 2998 | * A constructor could be added for stable state like the lists, |
@@ -3016,7 +3016,7 @@ static void __init dcache_init(void) | |||
3016 | &d_hash_mask, | 3016 | &d_hash_mask, |
3017 | 0); | 3017 | 0); |
3018 | 3018 | ||
3019 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 3019 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
3020 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); | 3020 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
3021 | } | 3021 | } |
3022 | 3022 | ||
diff --git a/fs/inode.c b/fs/inode.c index fb10d86ffad7..d3ebdbe723d0 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1651,7 +1651,7 @@ __setup("ihash_entries=", set_ihash_entries); | |||
1651 | */ | 1651 | */ |
1652 | void __init inode_init_early(void) | 1652 | void __init inode_init_early(void) |
1653 | { | 1653 | { |
1654 | int loop; | 1654 | unsigned int loop; |
1655 | 1655 | ||
1656 | /* If hashes are distributed across NUMA nodes, defer | 1656 | /* If hashes are distributed across NUMA nodes, defer |
1657 | * hash allocation until vmalloc space is available. | 1657 | * hash allocation until vmalloc space is available. |
@@ -1669,13 +1669,13 @@ void __init inode_init_early(void) | |||
1669 | &i_hash_mask, | 1669 | &i_hash_mask, |
1670 | 0); | 1670 | 0); |
1671 | 1671 | ||
1672 | for (loop = 0; loop < (1 << i_hash_shift); loop++) | 1672 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |
1673 | INIT_HLIST_HEAD(&inode_hashtable[loop]); | 1673 | INIT_HLIST_HEAD(&inode_hashtable[loop]); |
1674 | } | 1674 | } |
1675 | 1675 | ||
1676 | void __init inode_init(void) | 1676 | void __init inode_init(void) |
1677 | { | 1677 | { |
1678 | int loop; | 1678 | unsigned int loop; |
1679 | 1679 | ||
1680 | /* inode slab cache */ | 1680 | /* inode slab cache */ |
1681 | inode_cachep = kmem_cache_create("inode_cache", | 1681 | inode_cachep = kmem_cache_create("inode_cache", |
@@ -1699,7 +1699,7 @@ void __init inode_init(void) | |||
1699 | &i_hash_mask, | 1699 | &i_hash_mask, |
1700 | 0); | 1700 | 0); |
1701 | 1701 | ||
1702 | for (loop = 0; loop < (1 << i_hash_shift); loop++) | 1702 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |
1703 | INIT_HLIST_HEAD(&inode_hashtable[loop]); | 1703 | INIT_HLIST_HEAD(&inode_hashtable[loop]); |
1704 | } | 1704 | } |
1705 | 1705 | ||
diff --git a/fs/namei.c b/fs/namei.c index 208c6aa4a989..a780ea515c47 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1095,8 +1095,10 @@ static struct dentry *d_inode_lookup(struct dentry *parent, struct dentry *dentr | |||
1095 | struct dentry *old; | 1095 | struct dentry *old; |
1096 | 1096 | ||
1097 | /* Don't create child dentry for a dead directory. */ | 1097 | /* Don't create child dentry for a dead directory. */ |
1098 | if (unlikely(IS_DEADDIR(inode))) | 1098 | if (unlikely(IS_DEADDIR(inode))) { |
1099 | dput(dentry); | ||
1099 | return ERR_PTR(-ENOENT); | 1100 | return ERR_PTR(-ENOENT); |
1101 | } | ||
1100 | 1102 | ||
1101 | old = inode->i_op->lookup(inode, dentry, nd); | 1103 | old = inode->i_op->lookup(inode, dentry, nd); |
1102 | if (unlikely(old)) { | 1104 | if (unlikely(old)) { |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index be244692550d..a9856e3eaaf0 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -1053,7 +1053,7 @@ static int ocfs2_rename(struct inode *old_dir, | |||
1053 | handle_t *handle = NULL; | 1053 | handle_t *handle = NULL; |
1054 | struct buffer_head *old_dir_bh = NULL; | 1054 | struct buffer_head *old_dir_bh = NULL; |
1055 | struct buffer_head *new_dir_bh = NULL; | 1055 | struct buffer_head *new_dir_bh = NULL; |
1056 | nlink_t old_dir_nlink = old_dir->i_nlink; | 1056 | u32 old_dir_nlink = old_dir->i_nlink; |
1057 | struct ocfs2_dinode *old_di; | 1057 | struct ocfs2_dinode *old_di; |
1058 | struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, }; | 1058 | struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, }; |
1059 | struct ocfs2_dir_lookup_result target_lookup_res = { NULL, }; | 1059 | struct ocfs2_dir_lookup_result target_lookup_res = { NULL, }; |
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 7898cd688a00..fc2c4388d126 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
@@ -292,11 +292,26 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
292 | } | 292 | } |
293 | } | 293 | } |
294 | 294 | ||
295 | /* Return 1 if 'cmd' will block on frozen filesystem */ | ||
296 | static int quotactl_cmd_write(int cmd) | ||
297 | { | ||
298 | switch (cmd) { | ||
299 | case Q_GETFMT: | ||
300 | case Q_GETINFO: | ||
301 | case Q_SYNC: | ||
302 | case Q_XGETQSTAT: | ||
303 | case Q_XGETQUOTA: | ||
304 | case Q_XQUOTASYNC: | ||
305 | return 0; | ||
306 | } | ||
307 | return 1; | ||
308 | } | ||
309 | |||
295 | /* | 310 | /* |
296 | * look up a superblock on which quota ops will be performed | 311 | * look up a superblock on which quota ops will be performed |
297 | * - use the name of a block device to find the superblock thereon | 312 | * - use the name of a block device to find the superblock thereon |
298 | */ | 313 | */ |
299 | static struct super_block *quotactl_block(const char __user *special) | 314 | static struct super_block *quotactl_block(const char __user *special, int cmd) |
300 | { | 315 | { |
301 | #ifdef CONFIG_BLOCK | 316 | #ifdef CONFIG_BLOCK |
302 | struct block_device *bdev; | 317 | struct block_device *bdev; |
@@ -309,7 +324,10 @@ static struct super_block *quotactl_block(const char __user *special) | |||
309 | putname(tmp); | 324 | putname(tmp); |
310 | if (IS_ERR(bdev)) | 325 | if (IS_ERR(bdev)) |
311 | return ERR_CAST(bdev); | 326 | return ERR_CAST(bdev); |
312 | sb = get_super(bdev); | 327 | if (quotactl_cmd_write(cmd)) |
328 | sb = get_super_thawed(bdev); | ||
329 | else | ||
330 | sb = get_super(bdev); | ||
313 | bdput(bdev); | 331 | bdput(bdev); |
314 | if (!sb) | 332 | if (!sb) |
315 | return ERR_PTR(-ENODEV); | 333 | return ERR_PTR(-ENODEV); |
@@ -361,7 +379,7 @@ SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, | |||
361 | pathp = &path; | 379 | pathp = &path; |
362 | } | 380 | } |
363 | 381 | ||
364 | sb = quotactl_block(special); | 382 | sb = quotactl_block(special, cmds); |
365 | if (IS_ERR(sb)) { | 383 | if (IS_ERR(sb)) { |
366 | ret = PTR_ERR(sb); | 384 | ret = PTR_ERR(sb); |
367 | goto out; | 385 | goto out; |
diff --git a/fs/super.c b/fs/super.c index 6015c02296b7..6277ec6cb60a 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -634,6 +634,28 @@ rescan: | |||
634 | EXPORT_SYMBOL(get_super); | 634 | EXPORT_SYMBOL(get_super); |
635 | 635 | ||
636 | /** | 636 | /** |
637 | * get_super_thawed - get thawed superblock of a device | ||
638 | * @bdev: device to get the superblock for | ||
639 | * | ||
640 | * Scans the superblock list and finds the superblock of the file system | ||
641 | * mounted on the device. The superblock is returned once it is thawed | ||
642 | * (or immediately if it was not frozen). %NULL is returned if no match | ||
643 | * is found. | ||
644 | */ | ||
645 | struct super_block *get_super_thawed(struct block_device *bdev) | ||
646 | { | ||
647 | while (1) { | ||
648 | struct super_block *s = get_super(bdev); | ||
649 | if (!s || s->s_frozen == SB_UNFROZEN) | ||
650 | return s; | ||
651 | up_read(&s->s_umount); | ||
652 | vfs_check_frozen(s, SB_FREEZE_WRITE); | ||
653 | put_super(s); | ||
654 | } | ||
655 | } | ||
656 | EXPORT_SYMBOL(get_super_thawed); | ||
657 | |||
658 | /** | ||
637 | * get_active_super - get an active reference to the superblock of a device | 659 | * get_active_super - get an active reference to the superblock of a device |
638 | * @bdev: device to get the superblock for | 660 | * @bdev: device to get the superblock for |
639 | * | 661 | * |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 386da09f229d..69cd5bb640f5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -2496,6 +2496,7 @@ extern void get_filesystem(struct file_system_type *fs); | |||
2496 | extern void put_filesystem(struct file_system_type *fs); | 2496 | extern void put_filesystem(struct file_system_type *fs); |
2497 | extern struct file_system_type *get_fs_type(const char *name); | 2497 | extern struct file_system_type *get_fs_type(const char *name); |
2498 | extern struct super_block *get_super(struct block_device *); | 2498 | extern struct super_block *get_super(struct block_device *); |
2499 | extern struct super_block *get_super_thawed(struct block_device *); | ||
2499 | extern struct super_block *get_active_super(struct block_device *bdev); | 2500 | extern struct super_block *get_active_super(struct block_device *bdev); |
2500 | extern void drop_super(struct super_block *sb); | 2501 | extern void drop_super(struct super_block *sb); |
2501 | extern void iterate_supers(void (*)(struct super_block *, void *), void *); | 2502 | extern void iterate_supers(void (*)(struct super_block *, void *), void *); |
diff --git a/kernel/pid.c b/kernel/pid.c index ce8e00deaccb..9f08dfabaf13 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
@@ -543,12 +543,12 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns) | |||
543 | */ | 543 | */ |
544 | void __init pidhash_init(void) | 544 | void __init pidhash_init(void) |
545 | { | 545 | { |
546 | int i, pidhash_size; | 546 | unsigned int i, pidhash_size; |
547 | 547 | ||
548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, | 548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, |
549 | HASH_EARLY | HASH_SMALL, | 549 | HASH_EARLY | HASH_SMALL, |
550 | &pidhash_shift, NULL, 4096); | 550 | &pidhash_shift, NULL, 4096); |
551 | pidhash_size = 1 << pidhash_shift; | 551 | pidhash_size = 1U << pidhash_shift; |
552 | 552 | ||
553 | for (i = 0; i < pidhash_size; i++) | 553 | for (i = 0; i < pidhash_size; i++) |
554 | INIT_HLIST_HEAD(&pid_hash[i]); | 554 | INIT_HLIST_HEAD(&pid_hash[i]); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d2186ecb36f7..a13ded1938f0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5236,6 +5236,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
5236 | max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4; | 5236 | max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4; |
5237 | do_div(max, bucketsize); | 5237 | do_div(max, bucketsize); |
5238 | } | 5238 | } |
5239 | max = min(max, 0x80000000ULL); | ||
5239 | 5240 | ||
5240 | if (numentries > max) | 5241 | if (numentries > max) |
5241 | numentries = max; | 5242 | numentries = max; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 37755ccc0e96..22ef5f9fd2ff 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -3240,7 +3240,8 @@ void __init tcp_init(void) | |||
3240 | { | 3240 | { |
3241 | struct sk_buff *skb = NULL; | 3241 | struct sk_buff *skb = NULL; |
3242 | unsigned long limit; | 3242 | unsigned long limit; |
3243 | int i, max_share, cnt; | 3243 | int max_share, cnt; |
3244 | unsigned int i; | ||
3244 | unsigned long jiffy = jiffies; | 3245 | unsigned long jiffy = jiffies; |
3245 | 3246 | ||
3246 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); | 3247 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); |
@@ -3283,7 +3284,7 @@ void __init tcp_init(void) | |||
3283 | &tcp_hashinfo.bhash_size, | 3284 | &tcp_hashinfo.bhash_size, |
3284 | NULL, | 3285 | NULL, |
3285 | 64 * 1024); | 3286 | 64 * 1024); |
3286 | tcp_hashinfo.bhash_size = 1 << tcp_hashinfo.bhash_size; | 3287 | tcp_hashinfo.bhash_size = 1U << tcp_hashinfo.bhash_size; |
3287 | for (i = 0; i < tcp_hashinfo.bhash_size; i++) { | 3288 | for (i = 0; i < tcp_hashinfo.bhash_size; i++) { |
3288 | spin_lock_init(&tcp_hashinfo.bhash[i].lock); | 3289 | spin_lock_init(&tcp_hashinfo.bhash[i].lock); |
3289 | INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain); | 3290 | INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain); |