From: Alan Cox Date: Fri, 23 Nov 2007 20:19:56 +0000 (-0500) Subject: Linux 2.2.13pre13 X-Git-Tag: 2.2.13pre13 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=a7ed96e0c6ab755fa8337a92d7aad0bd3ed4a8ef;p=history.git Linux 2.2.13pre13 o NFS rename fix (Trond) o TCP sequence guessing fix (Alexey Kuznetsov) o xntp SMP lockup fix (DaveM) --- diff --git a/Makefile b/Makefile index dc9006b8f57d..66b111509124 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 2 SUBLEVEL = 13 -EXTRAVERSION = pre12 +EXTRAVERSION = pre13 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) diff --git a/drivers/net/dmfe.c b/drivers/net/dmfe.c index 7893c16ad789..a0b815bae3a5 100644 --- a/drivers/net/dmfe.c +++ b/drivers/net/dmfe.c @@ -409,8 +409,10 @@ int dmfe_reg_board(struct device *dev) dev = 0; /* NULL device */ } +#ifdef MODULE if (!dm9102_count) printk(KERN_WARNING "dmfe: Can't find DM910X board\n"); +#endif return dm9102_count ? 0 : -ENODEV; } @@ -1221,7 +1223,7 @@ static void parser_ctrl_info(struct dmfe_board_info *db) } if (i >= count) { - printk("Can't found Control Block\n"); + printk("Can't find Control Block\n"); db->phy_addr = 1; } } diff --git a/drivers/net/sktr.h b/drivers/net/sktr.h index fee24be8eaa5..6d888aad2f28 100644 --- a/drivers/net/sktr.h +++ b/drivers/net/sktr.h @@ -645,7 +645,7 @@ typedef struct { * but possibly multiple TPLs for one frame) the length of the TPLs has to be * initialized in the OPL. (OPEN parameter list) */ -#define TPL_NUM 3 /* Number of Transmit Parameter Lists. +#define TPL_NUM 9 /* Number of Transmit Parameter Lists. * !! MUST BE >= 3 !! */ diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 24f5f7ccd9bb..0cebfc35b544 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1080,7 +1080,7 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *old_inode = old_dentry->d_inode; struct inode *new_inode = new_dentry->d_inode; struct dentry *dentry = NULL; - int error, rehash = 0, update = 1; + int error, rehash = 0; dfprintk(VFS, "NFS: rename(%s/%s -> %s/%s, ct=%d)\n", old_dentry->d_parent->d_name.name, old_dentry->d_name.name, @@ -1126,13 +1126,6 @@ new_dentry->d_parent->d_name.name,new_dentry->d_name.name,new_dentry->d_count); } /* - * Check for within-directory rename ... no complications. - */ - if (new_dir == old_dir) - goto do_rename; - /* - * Cross-directory move ... - * * ... prune child dentries and writebacks if needed. */ if (old_dentry->d_count > 1) { @@ -1140,17 +1133,6 @@ new_dentry->d_parent->d_name.name,new_dentry->d_name.name,new_dentry->d_count); shrink_dcache_parent(old_dentry); } - /* - * Now check the use counts ... we can't safely do the - * rename unless we can drop the dentries first. - */ - if (old_dentry->d_count > 1) { -#ifdef NFS_PARANOIA -printk("nfs_rename: old dentry %s/%s busy, d_count=%d\n", -old_dentry->d_parent->d_name.name,old_dentry->d_name.name,old_dentry->d_count); -#endif - goto out; - } if (new_dentry->d_count > 1 && new_inode) { #ifdef NFS_PARANOIA printk("nfs_rename: new dentry %s/%s busy, d_count=%d\n", @@ -1159,41 +1141,28 @@ new_dentry->d_parent->d_name.name,new_dentry->d_name.name,new_dentry->d_count); goto out; } - d_drop(old_dentry); - update = 0; - -do_rename: /* * To prevent any new references to the target during the rename, * we unhash the dentry and free the inode in advance. */ -#ifdef NFS_PARANOIA -if (new_inode && - new_inode->i_count > (S_ISDIR(new_inode->i_mode) ? 1 : new_inode->i_nlink)) -printk("nfs_rename: %s/%s inode busy?? i_count=%d, i_nlink=%d\n", -new_dentry->d_parent->d_name.name, new_dentry->d_name.name, -new_inode->i_count, new_inode->i_nlink); -#endif if (!list_empty(&new_dentry->d_hash)) { d_drop(new_dentry); - rehash = update; + rehash = 1; } - if (new_inode) { + if (new_inode) d_delete(new_dentry); - } nfs_invalidate_dircache(new_dir); nfs_invalidate_dircache(old_dir); error = nfs_proc_rename(NFS_DSERVER(old_dentry), NFS_FH(old_dentry->d_parent), old_dentry->d_name.name, NFS_FH(new_dentry->d_parent), new_dentry->d_name.name); - if (!error && !S_ISDIR(old_inode->i_mode)) { - /* Update the dcache if needed */ - if (rehash) - d_add(new_dentry, NULL); - if (update) - d_move(old_dentry, new_dentry); - } + + /* Update the dcache if needed */ + if (rehash) + d_add(new_dentry, NULL); + if (!error && !S_ISDIR(old_inode->i_mode)) + d_move(old_dentry, new_dentry); out: /* new dentry created? */ diff --git a/kernel/time.c b/kernel/time.c index ba5737144e17..bbd41f2c94fd 100644 --- a/kernel/time.c +++ b/kernel/time.c @@ -247,7 +247,7 @@ int do_adjtimex(struct timex *txc) if (txc->tick < 900000/HZ || txc->tick > 1100000/HZ) return -EINVAL; - write_lock(&xtime_lock); + write_lock_irq(&xtime_lock); result = time_state; /* mostly `TIME_OK' */ /* Save for later - semantics of adjtime is to return old value */ diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index c2c7836598a0..b158ccf8e97d 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -525,7 +525,8 @@ gotit: static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct sk_buff *skb) { - return secure_tcp_sequence_number(sk->saddr, sk->daddr, + return secure_tcp_sequence_number(skb->nh.iph->daddr, + skb->nh.iph->saddr, skb->h.th->dest, skb->h.th->source); }