[SSI] openssi/kernel/fs dcache.c, 1.7, 1.8 exec.c, 1.11, 1.12 inode.c, 1.11, 1.12 locks.c, 1.7, 1.8 namei.c, 1.12, 1.13 namespace.c, 1.23, 1.24
Roger Tsang <[email protected]>
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/fs
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv16224/kernel/fs
Modified Files:
Tag: OPENSSI-FC
dcache.c exec.c inode.c locks.c namei.c namespace.c
Log Message:
Bug fixes and enhancements. See ChangeLog.
Index: inode.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/inode.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- inode.c 10 Oct 2008 08:10:32 -0000 1.11
+++ inode.c 27 Oct 2009 03:18:30 -0000 1.12
@@ -1294,11 +1294,20 @@
struct list_head *act_head;
LIST_HEAD(tofree_head);
int idx;
+#ifdef CFS_CLIST_LLIST
+ extern int cfs_get_cnode_idx(dev_t);
+ extern void cfs_free_cnode_idx(int);
+
+ idx = cfs_get_cnode_idx(sb->s_ssidev);
+#else
extern int cfs_get_cnode_idx(void);
idx = cfs_get_cnode_idx();
+#endif
/* We have to be protected against other CPUs */
+#ifndef CFS_CLIST_LLIST
lock_kernel(); /* This lock is for cfs code */
+#endif
spin_lock(&inode_lock); /* This lock is for inodes code */
list_for_each(act_head, &inode_in_use) {
@@ -1330,7 +1339,11 @@
spin_unlock(&inode_lock);
(*do_inodes)(&tofree_head, arg, idx);
+#ifdef CFS_CLIST_LLIST
+ cfs_free_cnode_idx(idx);
+#else
unlock_kernel();
+#endif
}
#endif /* CONFIG_CFS */
Index: dcache.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/dcache.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- dcache.c 7 Aug 2007 03:06:13 -0000 1.7
+++ dcache.c 27 Oct 2009 03:18:30 -0000 1.8
@@ -352,29 +352,6 @@
}
/*
- * Delete all dentries associated with this inode.
- * WARNING: you must own a reference to inode.
- */
-void d_purge_aliases(struct inode *inode)
-{
- struct list_head *tmp, *head = &inode->i_dentry;
-restart:
- spin_lock(&dcache_lock);
- tmp = head;
- while ((tmp = tmp->next) != head) {
- struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
- if (!(dentry->d_flags & DCACHE_UNHASHED)) {
- __dget_locked(dentry);
- spin_unlock(&dcache_lock);
- d_drop(dentry);
- dput(dentry);
- goto restart;
- }
- }
- spin_unlock(&dcache_lock);
-}
-
-/*
* Throw away a dentry - free the inode, dput the parent.
* This requires that the LRU list has already been
* removed.
@@ -1808,7 +1785,6 @@
EXPORT_SYMBOL(d_move);
EXPORT_SYMBOL(d_path);
EXPORT_SYMBOL(d_prune_aliases);
-EXPORT_SYMBOL(d_purge_aliases);
EXPORT_SYMBOL(d_rehash);
EXPORT_SYMBOL(d_splice_alias);
EXPORT_SYMBOL(d_validate);
Index: namespace.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/namespace.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- namespace.c 24 Mar 2009 04:26:29 -0000 1.23
+++ namespace.c 27 Oct 2009 03:18:30 -0000 1.24
@@ -179,7 +179,6 @@
continue;
#ifdef CFS_VFSMOUNT_RACE_FIX
old_devname = mnt->mnt_devname;
- mb();
mnt->mnt_devname = newname;
#else
if (mnt->mnt_devname)
Index: exec.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/exec.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- exec.c 3 Feb 2009 06:18:13 -0000 1.11
+++ exec.c 27 Oct 2009 03:18:30 -0000 1.12
@@ -746,6 +746,7 @@
ptrace = leader->ptrace;
#ifdef CONFIG_VPROC
parent = GET_PPID_TASK(leader);
+ get_task_struct(parent); /* temp GET_PPID_TASK(leader) */
#else
parent = leader->parent;
#endif
@@ -808,7 +809,11 @@
#ifdef CONFIG_VPROC
do_notify_parent(leader, SIGCHLD, 0, 0);
#ifdef VPROC_RELEASE__REFCNT_RACE_FIX
+#ifdef TASK_HOLD_VPROC
+ put_task_struct(parent); /* temp GET_PPID_TASK(leader) */
+#else
VPROC_RELE(parent->p_vproc, "temp de_thread(parent of leader)");
+#endif
#ifdef VPROC_HOLD_ZERO_GET_TASK
VPROC_RELE(vl, "de_thread(leader)");
#endif
@@ -1220,12 +1225,129 @@
return ssi_do_execve(filename, argv, envp, regs, 1);
}
-int ssi_do_execve(char * filename,
+#ifdef CONFIG_LDLVL
+static inline int
+__ssi_do_execve(char * filename,
char __user *__user *argv,
char __user *__user *envp,
- struct pt_regs * regs,
- int remote_okay)
+ struct pt_regs * regs)
+{
+#ifdef REXEC_LOADTABLE_FAST
+ unsigned int start;
+ clusternode_t node;
+static DEFINE_SPINLOCK(execve_ll_sem); /* for rexec_loadtable[0] */
+
+ if (!is_loadlevelable(current, filename))
+ return -EPERM;
+
+ down_read(&rexec_loadtable_sem);
+
+ if (!rexec_loadtable[1]) {
+ /* empty set */
+ up_read(&rexec_loadtable_sem);
+ return -EAGAIN;
+ }
+
+ spin_lock(&execve_ll_sem);
+
+ start = rexec_loadtable[0] & (~0U >> NODESHIFT);
+ node = rexec_loadtable[start];
+
+ /* round-robin "start" element in rexec_loadtable[] array */
+ if (++start > NSC_MAX_NODE_VALUE || !rexec_loadtable[start])
+ start = 1;
+
+ rexec_loadtable[0] = start | (node << NODESHIFT);
+ spin_unlock(&execve_ll_sem);
+
+ up_read(&rexec_loadtable_sem);
+
+#ifdef DEBUG_LDLVL
+ printk(KERN_DEBUG "%s: pid %d chose node %d\n",
+ __FUNCTION__, current->pid, node);
+#endif
+
+ node |= (1 << NODESHIFT); /* rexec_ll */
+ return dvp_rexecve((clusternode_t) node, filename, argv, envp, regs);
+#else /* !REXEC_LOADTABLE_FAST */
+ unsigned int start, end, i;
+#ifdef REXEC_LOADTABLE_RACE_FIX
+static DECLARE_MUTEX(execve_ll_sem); /* for rexec_loadtable[0] */
+#endif
+
+ if (!is_loadlevelable(current, filename))
+ return -EPERM;
+
+
+#ifdef REXEC_LOADTABLE_RACE_FIX
+ down_read(&rexec_loadtable_sem);
+ down(&execve_ll_sem);
+ start = rexec_loadtable[0] ? : 1;
+#else
+ start = rexec_loadtable[0]; /* SSI_XXX: initially 0 */
+#endif /* !REXEC_LOADTABLE_RACE_FIX */
+ end = NSC_MAX_NODE_VALUE;
+#ifdef DEBUG_LDLVL
+ printk(KERN_DEBUG "%s: pid %d start %d file %s\n",
+ __FUNCTION__, current->pid, start, filename);
+#endif
+
+ for (i = start; i <= end; i++) {
+ if (i == this_node)
+ continue;
+#ifdef REXEC_LOADTABLE_RACE_FIX
+ if (rexec_loadtable[i]) {
+ /* round-robin "start" node */
+ rexec_loadtable[0] = (i+1 > NSC_MAX_NODE_VALUE) ? 1 : i+1;
+ up(&execve_ll_sem);
+
+ /* exec_balance() will reset rexec_loadtable[i] */
+ up_read(&rexec_loadtable_sem);
+#else /* !REXEC_LOADTABLE_RACE_FIX */
+ if (rexec_loadtable[i] > 0) {
+ if (i+1 > NSC_MAX_NODE_VALUE)
+ rexec_loadtable[0] = 1;
+ else
+ rexec_loadtable[0] = i + 1;
+ /* SSI_XXX: temporarily disables loadleveling
+ * since rexec_loadtable[] is not immediately
+ * updated by exec_balance()
+ */
+ if (rexec_loadtable[i])
+ rexec_loadtable[i]--;
+#endif /* !REXEC_LOADTABLE_RACE_FIX */
+#ifdef DEBUG_LDLVL
+ printk(KERN_DEBUG "%s: pid %d chose node %d\n",
+ __FUNCTION__, current->pid, i);
+#endif
+ i |= (1 << NODESHIFT); /* node */
+
+ return dvp_rexecve((clusternode_t) i, filename, argv, envp, regs);
+ }
+#ifdef REXEC_LOADTABLE_RACE_FIX
+ /* Ensure we traverse entire rexec_loadtable[] array. */
+ if (i == NSC_MAX_NODE_VALUE && start > 1) {
+#else
+ if (i == NSC_MAX_NODE_VALUE &&
+ (i - start) < NSC_MAX_NODE_VALUE) {
#endif
+ i = 0;
+ end = start - 1;
+ }
+ }
+ up(&execve_ll_sem);
+ up_read(&rexec_loadtable_sem);
+ return -EAGAIN;
+#endif /* !REXEC_LOADTABLE_FAST */
+}
+#endif /* CONFIG_LDLVL */
+
+int ssi_do_execve(char *filename,
+ char __user *__user *argv,
+ char __user *__user *envp,
+ struct pt_regs *regs,
+ int remote_okay)
+#endif /* CONFIG_SSI */
{
struct linux_binprm *bprm;
struct file *file;
@@ -1234,48 +1356,16 @@
#ifdef CONFIG_SSI
#ifdef CONFIG_LDLVL
+ /* First reset pvp_loadlevel */
(void) is_loadlevelable(current, filename);
- if (loadlevel_on && remote_okay) {
- if (!current->execnode) {
- int i;
- clusternode_t node = 0;
- int error;
- int start = rexec_loadtable[0];
- int end = NSC_MAX_NODE_VALUE;
- for (i = start; i <= end; i++){
- if (rexec_loadtable[i] > 0 && i != this_node &&
- is_loadlevelable(current,filename)){
- node = i;
- node |= (1 << NODESHIFT);
- if (i+1 > NSC_MAX_NODE_VALUE)
- rexec_loadtable[0] = 1;
- else
- rexec_loadtable[0] = i + 1;
- if (rexec_loadtable[i])
- rexec_loadtable[i]--;
- error = dvp_rexecve(node,
- filename, argv,
- envp, regs);
- if (!error)
- return error;
- else
- break;
- }
- else {
- if (i == NSC_MAX_NODE_VALUE) {
- if ((i - start) <
- NSC_MAX_NODE_VALUE){
- i = 0;
- end = start - 1;
- }
- }
- }
- }
- }
+ if (remote_okay && !current->execnode && atomic_read(&loadlevel_on)) {
+ retval = __ssi_do_execve(filename, argv, envp, regs);
+ if (!retval)
+ goto out_ret;
}
-#endif
-#endif
+#endif /* CONFIG_LDLVL */
+#endif /* CONFIG_SSI */
retval = -ENOMEM;
bprm = kmalloc(sizeof(*bprm), GFP_KERNEL);
Index: locks.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/locks.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- locks.c 3 Feb 2009 06:18:13 -0000 1.7
+++ locks.c 27 Oct 2009 03:18:30 -0000 1.8
@@ -699,6 +699,9 @@
*/
static int flock_lock_file(struct file *filp, struct file_lock *new_fl)
{
+#ifdef KERNEL2616_53
+ struct file_lock *new_fl2 = NULL;
+#endif
struct file_lock **before;
struct inode * inode = filp->f_dentry->d_inode;
int error = 0;
@@ -724,6 +727,11 @@
if (new_fl->fl_type == F_UNLCK)
return 0;
+#ifdef KERNEL2616_53
+ new_fl2 = locks_alloc_lock();
+ if (new_fl2 == NULL)
+ goto out;
+#endif
/*
* If a higher-priority process was blocked on the old file lock,
* give it the opportunity to lock the file.
@@ -746,11 +754,21 @@
}
goto out;
}
+#ifdef KERNEL2616_53
+ locks_copy_lock(new_fl2, new_fl);
+ locks_insert_lock(&inode->i_flock, new_fl2);
+ new_fl2 = NULL;
+#else
locks_insert_lock(&inode->i_flock, new_fl);
+#endif
error = 0;
out:
unlock_kernel();
+#ifdef KERNEL2616_53
+ if (new_fl2)
+ locks_free_lock(new_fl2);
+#endif
return error;
}
Index: namei.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/fs/namei.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- namei.c 22 Feb 2009 04:15:37 -0000 1.12
+++ namei.c 27 Oct 2009 03:18:30 -0000 1.13
@@ -666,8 +666,13 @@
* small and for now I'd prefer to have fast path as straight as possible.
* It _is_ time-critical.
*/
+#ifdef SSI_LOOKUP_DENTRY_HASH
+int do_lookup(struct nameidata *nd, struct qstr *name,
+ struct path *path)
+#else
static int do_lookup(struct nameidata *nd, struct qstr *name,
struct path *path)
+#endif
{
struct vfsmount *mnt = nd->mnt;
struct dentry *dentry = __d_lookup(nd->dentry, name);
------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference