[SSI] openssi/kernel/cluster/ssi/cfs cfs_ipcshm.c, 1.21, 1.22 cfs_mnthooks.c, 1.24, 1.25 cfs_server.c, 1.17, 1.18 cfs_subr.c, 1.28, 1.29 cfs_svc.c, 1.19, 1.20 cfsproc.c, 1.35, 1.36 cfstok.c, 1.22, 1.23 dir.c, 1.29, 1.30 file.c, 1.25, 1.26 inode.c, 1.62, 1.63 pagelist.c, 1.14, 1.15 proc.c, 1.22, 1.23 read.c, 1.22, 1.23 svrcfs.c, 1.26, 1.27 vfs.c, 1.32, 1.33 write.c, 1.39, 1.40
Roger Tsang <[email protected]>
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv1388/cluster/ssi/cfs
Modified Files:
Tag: OPENSSI-FC
cfs_ipcshm.c cfs_mnthooks.c cfs_server.c cfs_subr.c cfs_svc.c
cfsproc.c cfstok.c dir.c file.c inode.c pagelist.c proc.c
read.c svrcfs.c vfs.c write.c
Log Message:
Multiple bug fixes. See ChangeLog.
Index: cfs_ipcshm.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_ipcshm.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- cfs_ipcshm.c 24 Feb 2009 01:51:47 -0000 1.21
+++ cfs_ipcshm.c 17 Dec 2009 06:43:50 -0000 1.22
@@ -271,8 +271,8 @@
cfs_shm_mount(struct super_block *csb, struct cfsmountargs *argp, int silent)
{
cfs_mntinfo_t *mip;
+ struct inode *inode;
struct dentry *root;
- int error;
csb->s_op = &cfs_sops;
csb->s_mnt_op = &cfs_mnt_ops;
@@ -282,10 +282,12 @@
csb->s_dev = argp->dev;
/* Create the root cnode. */
- root = d_alloc_root(cfs_fhget(csb, &(argp->root)));
- error = -ENOMEM;
- if (!root)
- return error;
+ inode = cfs_fhget(csb, &(argp->root));
+ root = d_alloc_root(inode);
+ if (!root) {
+ iput(inode);
+ return -ENOMEM;
+ }
mip = sbtocmi(csb);
mip->mi_server = argp->server;
Index: cfs_server.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_server.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- cfs_server.c 27 Oct 2009 03:18:29 -0000 1.17
+++ cfs_server.c 17 Dec 2009 06:43:50 -0000 1.18
@@ -676,11 +676,14 @@
buf->error = -EINVAL; /* only used if we fail.. */
if (reclen > buf->count)
return -EINVAL;
+
dirent = buf->previous;
if (dirent)
put_kernel(small_offset, &dirent->d_off);
+
dirent = buf->current_dir;
buf->previous = dirent;
+
put_kernel(ino, &dirent->d_ino);
put_kernel(reclen, &dirent->d_reclen);
memcpy(dirent->d_name, name, namlen);
@@ -694,16 +697,15 @@
int
cfs_rb_delayedunlinks(struct super_block *sb)
{
- struct svrcfstok *dhp = NULL;
cfhandle_t fh;
- void *dir_buf = NULL;
- int error = 0;
- char *buf;
+ struct getdents_callback buffer;
struct dentry *droot, *ddir = NULL;
struct inode *dir;
struct file *filp = NULL;
- int file_opened = 0;
- struct getdents_callback buffer;
+ struct svrcfstok *dhp = NULL;
+ int error = 0;
+ void *dir_buf = NULL;
+ char *buf;
SSI_ASSERT(sb != NULL);
@@ -731,19 +733,23 @@
ddir = NULL;
goto done;
}
+
up(&(droot->d_inode->i_sem));
+
dir = ddir->d_inode;
/* No directory means nothing to clean-up, no error */
if (dir == NULL)
goto done;
- error = -ENOTDIR;
- if (!S_ISDIR(dir->i_mode))
+ if (!S_ISDIR(dir->i_mode)) {
+ error = -ENOTDIR;
goto done;
- error = -EINVAL;
- if (!dir->i_fop)
+ }
+ if (!dir->i_fop) {
+ error = -EINVAL;
goto done;
+ }
/*
* Open the directory ...
@@ -751,16 +757,17 @@
filp = dentry_open(dget(ddir), NULL, FMODE_READ);
if (IS_ERR(filp)) {
error = PTR_ERR(filp);
+ filp = NULL;
goto done;
}
- file_opened = 1;
- error = -EINVAL;
- if (!filp->f_op->readdir)
+ if (!filp->f_op->readdir) {
+ error = -EINVAL;
goto done;
-
+ }
error = cfs_fh_compose(&fh, sb->s_ssidev, ddir);
SSI_ASSERT(error == 0);
+
dhp = svrtok_lookup(&fh, ddir, sb);
SSI_ASSERT(dhp);
@@ -771,11 +778,6 @@
goto done;
}
- buffer.current_dir = (struct linux_dirent *) dir_buf;
- buffer.previous = NULL;
- buffer.count = DIRBLKS;
- buffer.error = 0;
-
/*
* Read the directory entries. This silly loop is necessary because
* readdir() is not guaranteed to fill up the entire buffer, but
@@ -784,6 +786,11 @@
while (1) {
int len;
+ buffer.current_dir = (struct linux_dirent *) dir_buf;
+ buffer.previous = NULL;
+ buffer.count = DIRBLKS;
+ buffer.error = 0;
+
error = vfs_readdir(filp, kern_filldir, &buffer);
if (error < 0)
break;
@@ -813,22 +820,29 @@
*/
if (strcmp(dp->d_name, ".") == 0 ||
strcmp(dp->d_name, "..") == 0) {
- buf += dp->d_reclen;
- len -= dp->d_reclen;
- continue;
+ goto skip;
}
down(&dir->i_sem);
+
pdp = lookup_one_len(dp->d_name, ddir, strlen(dp->d_name));
if (IS_ERR(pdp)) {
up(&dir->i_sem);
error = PTR_ERR((void *)pdp);
break;
}
+ up(&dir->i_sem);
error = cfs_fh_compose(&fh, sb->s_ssidev, pdp);
SSI_ASSERT(error == 0);
+
+#ifdef RCU_CFSTOK_TABLE
+ thp = hfind(&fh);
+#else
thp = svrtok_lookup(&fh, NULL, NULL);
+#endif
+
+ down(&dir->i_sem);
/*
* Check link count, if a delay unlink file is found
@@ -836,7 +850,8 @@
* This handles a case in which after a crash the
* state of the filesystem is not what is expected.
*/
- if ((pdp->d_inode->i_nlink > 1) && !S_ISDIR(pdp->d_inode->i_mode)) {
+ if (unlikely((pdp->d_inode->i_nlink > 1) &&
+ !S_ISDIR(pdp->d_inode->i_mode))) {
if (thp) {
HASH_RELE(thp);
thp = NULL;
@@ -885,24 +900,21 @@
}
}
+ dput(pdp);
+skip:
buf += dp->d_reclen;
len -= dp->d_reclen;
- dput(pdp);
}
- buffer.current_dir = (struct linux_dirent *) dir_buf;
- buffer.previous = NULL;
- buffer.count = DIRBLKS;
- buffer.error = 0;
}
done:
- if (file_opened)
- fput(filp);
if (dir_buf)
kfree(dir_buf);
- if (ddir)
- dput(ddir);
if (dhp)
HASH_RELE(dhp);
+ if (filp)
+ fput(filp);
+ if (ddir)
+ dput(ddir);
return error;
}
@@ -914,7 +926,6 @@
char *buf;
struct inode *dir;
struct file *filp = NULL;
- int file_opened = 0;
struct getdents_callback buffer;
SSI_ASSERT(ddir != NULL);
@@ -924,9 +935,10 @@
dir = ddir->d_inode;
- error = -EINVAL;
- if (!dir->i_fop)
+ if (!dir->i_fop) {
+ error = -EINVAL;
goto done;
+ }
/*
* Open the directory ...
@@ -934,12 +946,13 @@
filp = dentry_open(dget(ddir), NULL, FMODE_READ);
if (IS_ERR(filp)) {
error = PTR_ERR(filp);
+ filp = NULL;
goto done;
}
- file_opened = 1;
- error = -EINVAL;
- if (!filp->f_op->readdir)
+ if (!filp->f_op->readdir) {
+ error = -EINVAL;
goto done;
+ }
/* allocate buffer for block of dirent entries */
dir_buf = kmalloc(DIRBLKS, GFP_KERNEL);
@@ -948,11 +961,6 @@
goto done;
}
- buffer.current_dir = (struct linux_dirent *) dir_buf;
- buffer.previous = NULL;
- buffer.count = DIRBLKS;
- buffer.error = 0;
-
/*
* Read the directory entries. This silly loop is necessary because
* readdir() is not guaranteed to fill up the entire buffer, but
@@ -961,6 +969,11 @@
while (1) {
int len;
+ buffer.current_dir = (struct linux_dirent *) dir_buf;
+ buffer.previous = NULL;
+ buffer.count = DIRBLKS;
+ buffer.error = 0;
+
error = vfs_readdir(filp, kern_filldir, &buffer);
if (error < 0)
break;
@@ -994,16 +1007,12 @@
buf += dp->d_reclen;
len -= dp->d_reclen;
}
- buffer.current_dir = (struct linux_dirent *) dir_buf;
- buffer.previous = NULL;
- buffer.count = DIRBLKS;
- buffer.error = 0;
}
done:
- if (file_opened)
- fput(filp);
if (dir_buf)
kfree(dir_buf);
+ if (filp)
+ fput(filp);
if (error) {
#ifdef DEBUG
printf("cfs_isdirempty: VOP_READDIR failed errno %d\n",error);
Index: inode.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/inode.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -d -r1.62 -r1.63
--- inode.c 2 Nov 2009 03:44:37 -0000 1.62
+++ inode.c 17 Dec 2009 06:43:50 -0000 1.63
@@ -276,21 +276,10 @@
put_rpccred(cred);
#endif /* SSI_CFS_EXNFS */
- /* SSI_CFS_XXX: livelock over I_LOCK
- * Bug ? very hard to reproduce if ever.
- *
- * icssvr_daemon:
- * ...
- * cfs_tokmsg (for RETURN)
- * clifhtoip
- * ilookup
- * ifind_fast
- * find_inode_fast
- * __wait_on_freeing_inode
- */
-
/* Send tokens back since inode is going away */
- /* SSI_XXX: Fake i_count because inode is going away */
+ /*
+ * process_msgs() needs positive i_count.
+ */
atomic_inc(&inode->i_count);
error = cfstok_giveback(inode);
atomic_dec(&inode->i_count);
Index: cfs_svc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_svc.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- cfs_svc.c 27 Oct 2009 03:18:29 -0000 1.19
+++ cfs_svc.c 17 Dec 2009 06:43:50 -0000 1.20
@@ -76,24 +76,28 @@
void
cfs_nodedown_thread(void *arg)
{
- extern clusternode_t root_fs_node, clms_master_node;
clusternode_t node = (clusternode_t)arg;
struct super_block *sb;
+ struct vfsmount *rootmnt;
cfs_mntinfo_t *mip; /* CFS mount information. */
+ extern clusternode_t root_fs_node, clms_master_node;
+
INCR_MEMPRIO(); /* avoid blocking for memory */
- sb = current->fs->rootmnt->mnt_sb;
+ read_lock(¤t->fs->lock);
+ rootmnt = mntget(current->fs->rootmnt);
+ read_unlock(¤t->fs->lock);
+
+ sb = rootmnt->mnt_sb;
mip = sbtocmi(sb);
- if (!CFS_SB_HARD_MIP(mip)) {
+ if (!CFS_SB_HARD_MIP(mip))
goto out;
- }
/* We only remount down mounts */
- if (CFS_SB_UP_MIP(mip)) {
+ if (CFS_SB_UP_MIP(mip))
goto out;
- }
/* See if we need to do a root failover. */
if (node == root_fs_node && clms_master_node == this_node) {
@@ -106,9 +110,7 @@
root_fs_node = this_node;
/* Failover root here */
- lock_kernel();
cfs_root_failover(sb);
- unlock_kernel();
#ifdef NOTYET_DISABLED
clms_set_key_service_ready(CLUSTER_ROOT_SERVICE);
@@ -132,6 +134,7 @@
#endif
out:
+ mntput(rootmnt);
exit_daemon_thread();
}
@@ -383,25 +386,47 @@
void
cfs_root_failover(struct super_block *cfssb)
{
+ exec_userproc_arg_t *euap;
+ cfs_mntinfo_t *mip;
+ struct super_block *sb;
struct vfsmount *root;
+ const char *arg1 = "failover";
int err;
- const char *arg1 = NULL;
+
+ extern struct semaphore root_fs_sem;
extern char *root_dev_name, *root_fs;
- cfs_mntinfo_t *mip;
- struct super_block *sb;
- exec_userproc_arg_t *euap;
+ extern struct file_system_type *root_fs_type;
+ extern struct block_device *root_bdev;
+
+ down(&root_fs_sem);
if (root_fs == NULL)
panic("cfs_root_failover: no cfs_setroot performed");
- /* SSI_XXX: Mount the PFS, must get fstype and dev pre-loaded into the
- * kernel from the ramdisk.
- * Pass MS_REMOUNT, so that get_sb_bdev() doesn't insert this
+ BUG_ON(root_fs_type == NULL);
+ BUG_ON(root_dev_name == NULL);
+ BUG_ON(root_bdev == NULL);
+
+ /* Pass MS_REMOUNT, so that get_sb_bdev() doesn't insert this
* super-block onto the global list.
*/
- root = do_kern_mount(root_fs, MS_RDONLY|MS_REMOUNT, NULL, cfssb->s_mnt_info);
+ /* Root failover remount without traversing the device name */
+ /*
+ * ->get_sb needs lock_kernel().
+ */
+ lock_kernel();
+#if 0
+ root = do_kern_mount(root_fs, MS_RDONLY | MS_REMOUNT,
+ NULL, cfssb->s_mnt_info);
+#else
+ SSI_ASSERT(!(cfssb->s_flags & MS_CFS));
+ root = do_kern_mount(root_fs, cfssb->s_flags | MS_RDONLY | MS_REMOUNT,
+ NULL, cfssb->s_mnt_info);
+#endif
+ unlock_kernel();
if (IS_ERR(root)) {
err = PTR_ERR(root);
+ up(&root_fs_sem);
goto out;
}
@@ -419,44 +444,71 @@
#endif
if (IS_ERR(euap)) {
err = PTR_ERR(euap);
+ up(&root_fs_sem);
goto out;
}
err = sys_wait4(-1, NULL, __WALL, NULL);
kfree(euap); /* clean up spawn_failover_user_proc() */
- if (err < 0)
+ if (err < 0) {
+ up(&root_fs_sem);
goto out;
+ }
/* err = 0; */ /* clear pid */
- /* Remount PFS from RDONLY to read/write */
+ /*
+ * Remount PFS from RDONLY to read/write
+ */
sb = root->mnt_sb;
down_write(&sb->s_umount);
+ /*
+ * ->remount_fs needs lock_kernel().
+ */
+ lock_kernel();
+#if 0
err = do_remount_sb(sb, 0, NULL, 0);
- up_write(&sb->s_umount);
- if (err < 0)
+#else
+ err = do_remount_sb(sb, cfssb->s_flags, cfssb->s_mnt_info, 0);
+#endif
+ unlock_kernel();
+ if (err < 0) {
+ up_write(&sb->s_umount);
+ up(&root_fs_sem);
goto out;
+ }
- mip = sbtocmi(cfssb);
/* Don't need vfsmount anymore */
atomic_inc(&sb->s_active);
mntput(root);
+ /* vfsp->vfs_dev = vfs_dev */
+
+ /* Should we copy final PFS flags to the CFS SB? */
+ if (cfssb->s_flags != (sb->s_flags & ~(MS_REMOUNT|MS_CFS))) {
+ printk(KERN_NOTICE "%s: csb flags: %#lx sb flags: %#lx\n",
+ __FUNCTION__, cfssb->s_flags, sb->s_flags);
+#ifdef SSI_NOTYET
+ lock_super(cfssb);
+ cfssb->s_flags = (sb->s_flags & ~(MS_REMOUNT|MS_CFS));
+ unlock_super(cfssb);
+#endif
+ }
+ sb->s_flags |= MS_CFS; /* Mark as CFS stacked */
+ up_write(&sb->s_umount);
+
/* do_kern_mount() didn't set device */
mnt_fix_devname(cfssb, root_dev_name);
+ up(&root_fs_sem);
/* Now we have the Physical super-block set-up, lets really link
* this guy up and set the CFS mount(s) back to UP.
*/
- /* SSI_XXX */
+ mip = sbtocmi(cfssb);
/* mip->mi_mount_flags = mnt_flags */
mip->mi_server = this_node;
- /* vfsp->vfs_dev = vfs_dev */
- sb->s_flags |= MS_CFS; /* Mark as CFS stacked */
mip->mi_pfs_sb = sb;
- /* SSI_XXX: Should we copy final PFS flags to the CFS SB? */
-
err = cfs_send_rb(this_node, cfssb->s_ssidev);
/* SSI_XXX: Attach orphans here? */
@@ -464,7 +516,6 @@
if (!err)
err = cfs_send_rb_up(this_node, cfssb->s_ssidev);
- /* SSI_XXX: Don't need this? */
/* up_write(&sb->s_umount); */
if (err)
Index: write.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/write.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- write.c 2 Nov 2009 03:44:37 -0000 1.39
+++ write.c 17 Dec 2009 06:43:50 -0000 1.40
@@ -160,6 +160,7 @@
if (p && (p->pagevec != &p->page_array[0]))
kfree(p->pagevec);
#endif
+ iput(p->inode);
mempool_free(p, cfs_wdata_mempool);
}
@@ -176,6 +177,7 @@
static __inline__ void cfs_commit_free(struct cfs_write_data *p)
{
+ iput(p->inode);
mempool_free(p, cfs_commit_mempool);
}
@@ -248,10 +250,11 @@
if (!wdata)
return -ENOMEM;
+ atomic_inc(&inode->i_count);
wdata->inode = inode;
- wdata->count = (loff_t) wsize;
- wdata->pagevec = &page;
wdata->stable = CFS_FILE_SYNC;
+ wdata->pagevec = &page; /* override existing ->pagevec */
+ wdata->count = (loff_t) wsize;
wdata->pgbase = offset;
#endif /* CFS_PAGEVEC */
@@ -352,6 +355,7 @@
#ifdef KERNEL2616_53
end_page_writeback(page);
#endif
+ wdata->pagevec = NULL; /* don't kfree page */
cfs_writedata_free(wdata);
#endif /* CFS_PAGEVEC */
@@ -1431,7 +1435,10 @@
if (offset)
BUG();
- data->inode = inode = req->wb_inode;
+ inode = req->wb_inode;
+
+ atomic_inc(&inode->i_count);
+ data->inode = inode;
#ifdef CFS_PAGEVEC
#ifdef CFS_ASYNC_LOCAL_SYNC
/* Set the initial flags for the task. */
@@ -1974,6 +1981,7 @@
len = 0;
#endif
+ atomic_inc(&inode->i_count);
data->inode = inode;
#ifdef CFS_COMMIT_FILE_RANGE
data->offset = start;
Index: file.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/file.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- file.c 2 Nov 2009 03:44:37 -0000 1.25
+++ file.c 17 Dec 2009 06:43:50 -0000 1.26
@@ -956,6 +956,8 @@
#endif
#ifdef CFS_MIRROR_LOCK_WAIT
#ifdef CFS_FLOCK
+#ifdef SKIP
+ /* SSI: this is status of do_vfs_lock() server-side. */
if (!status ||
status == -EINTR || status == -ERESTARTSYS) {
/* If we were signalled we still need to ensure that
@@ -964,14 +966,14 @@
* ensure that locks_remove_posix() cleans it out when
* the process exits.
*/
+#endif /* SKIP */
+ if (!status) {
sigset_t old_blocked;
- if (!status)
- ssi_block_signals(current, &old_blocked);
+ ssi_block_signals(current, &old_blocked);
(void) do_vfs_lock(filp, fl);
- if (!status)
- ssi_unblock_signals(current, &old_blocked);
+ ssi_unblock_signals(current, &old_blocked);
}
#else
if (!status && posix_lock_file_wait(filp, fl) < 0)
Index: pagelist.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/pagelist.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- pagelist.c 27 Oct 2009 03:18:29 -0000 1.14
+++ pagelist.c 17 Dec 2009 06:43:50 -0000 1.15
@@ -50,6 +50,7 @@
static inline void
cfs_page_free(struct cfs_page *p)
{
+ iput(p->wb_inode);
kmem_cache_free(cfs_page_cachep, p);
}
@@ -97,6 +98,9 @@
#ifdef CFS_NO_INTR_SKIP
if (signalled() && (server->flags & CFS_MOUNT_INTR))
return ERR_PTR(-ERESTARTSYS);
+#else
+ if (signalled() && (itocmi(inode)->mi_flags & MI_INTR))
+ return ERR_PTR(-ERESTARTSYS);
#endif
yield();
}
@@ -104,6 +108,8 @@
/* Initialize the request struct. Initially, we assume a
* long write-back delay. This will be adjusted in
* update_cfs_request below if the region is not locked. */
+ atomic_inc(&inode->i_count);
+ req->wb_inode = inode;
req->wb_page = page;
atomic_set(&req->wb_complete, 0);
req->wb_index = page->index;
@@ -111,7 +117,6 @@
req->wb_offset = offset;
req->wb_pgbase = offset;
req->wb_bytes = count;
- req->wb_inode = inode;
atomic_set(&req->wb_count, 1);
return req;
Index: dir.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/dir.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- dir.c 2 Nov 2009 03:44:37 -0000 1.29
+++ dir.c 17 Dec 2009 06:43:50 -0000 1.30
@@ -950,17 +950,19 @@
dfprintk(VFS, "CFS: lookup(%s/%s)\n",
dentry->d_parent->d_name.name, dentry->d_name.name);
- res = ERR_PTR(-ENAMETOOLONG);
- if (dentry->d_name.len > (CFS_MAXPATHLEN -1))
+ if (dentry->d_name.len > (CFS_MAXPATHLEN -1)) {
+ res = ERR_PTR(-ENAMETOOLONG);
goto out;
+ }
- res = ERR_PTR(-ENOMEM);
dentry->d_op = &cfs_dentry_operations;
/* TODO: allocate from kmem_cache */
dcd = (cfs_dcached_t *) kzmalloc(sizeof(cfs_dcached_t), GFP_KERNEL);
- if (!dcd)
+ if (!dcd) {
+ res = ERR_PTR(-ENOMEM);
goto out;
+ }
result = cfstok_req(dir, CFSTOK_ATTR, CFSTOK_READ,
CFSTOK_HOLD|CFSTOK_BLOCK, NON_RANGE, NULL);
Index: cfstok.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfstok.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- cfstok.c 27 Oct 2009 03:18:29 -0000 1.22
+++ cfstok.c 17 Dec 2009 06:43:50 -0000 1.23
@@ -236,6 +236,7 @@
obj.word1 = (long)ip;
obj.word2 = CFSTOK_MHOLD;
obj.obj_pp = &cliparam;
+
mhtok_init(&obj, &(itoc(ip)->c_mhold));
for(which = 1; which <= CFSTOK_NTOKS; which++) {
@@ -270,6 +271,7 @@
obj.word1 = (long)ip;
obj.word2 = CFSTOK_MHOLD;
obj.obj_pp = &cliparam;
+
mhtok_destroy(&obj, &(itoc(ip)->c_mhold));
for (which = 1; which <= CFSTOK_NTOKS; which++) {
@@ -1197,11 +1199,12 @@
reqfail_count = 0;
}
#endif
- CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
agent = this_node;
obj.word1 = (long)ip;
obj.word2 = (long)which;
obj.obj_pp = &cliparam;
+
+ CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
#ifdef SSI_RANGE_TOKENS
if (BITVAL(which) & CFSTOK_RANGE) {
tok_reqfail_range(&obj, ITORTCB(ip, which), oldmode, newmode, agent,
@@ -1257,11 +1260,12 @@
{
object_t obj;
- if (lock)
- CFSTOK_XLOCK( itoc(ip));
obj.word1 = (long)ip;
obj.word2 = type;
obj.obj_pp = &cliparam;
+
+ if (lock)
+ CFSTOK_XLOCK( itoc(ip));
#ifdef SSI_RANGE_TOKENS
if (BITVAL(type) & CFSTOK_RANGE) {
tok_install_range(&obj, ITORTCB(ip, type),
@@ -1297,6 +1301,10 @@
{
object_t obj;
+ obj.word1 = (long)ip;
+ obj.word2 = (long)which;
+ obj.obj_pp = &cliparam;
+
/*
* SSI_XXX:
* you have to check for HOLDREQ's made before and
@@ -1304,9 +1312,6 @@
*/
CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
- obj.word1 = (long)ip;
- obj.word2 = (long)which;
- obj.obj_pp = &cliparam;
#ifdef SSI_RANGE_TOKENS
if (BITVAL(which) & CFSTOK_RANGE) {
tok_grant_range(&obj, ITORTCB(ip, which), oldmode, newmode,
@@ -1332,7 +1337,7 @@
struct inode *ip)
{
hold_list_t *list;
- agent_t agent;
+ /* agent_t agent; */
int which;
int ret;
object_t obj;
@@ -1380,6 +1385,9 @@
goto done;
#endif /* SSI_XXX */
+ obj.word1 = (long)ip;
+ obj.obj_pp = &cliparam;
+
/* Send back tokens in reverse order so MTIME is kept until
* all the pages have been flushed
*/
@@ -1392,10 +1400,9 @@
SSI_ASSERT(*list == NULL);
#endif
- agent = this_node;
- obj.word1 = (long)ip;
+ /* agent = this_node; */
obj.word2 = (long)which;
- obj.obj_pp = &cliparam;
+
#ifdef SSI_RANGE_TOKENS
if (BITVAL(which) & CFSTOK_RANGE)
ret = tok_giveback_range(&obj, ITORTCB(ip, which),
@@ -1452,10 +1459,9 @@
void
cfstok_hold_obj(object_t *objp)
{
- struct inode *ip;
+ struct inode *ip = (struct inode *)objp->word1;
- ip = (struct inode *)objp->word1;
- SSI_ASSERT(atomic_read(&ip->i_count));
+ /* BUG_ON(!atomic_read(&ip->i_count)); */
atomic_inc(&ip->i_count);
}
@@ -1497,11 +1503,13 @@
/* Get needed stuff out of object_t */
ip = (struct inode *)objp->word1;
+ type = (int)objp->word2;
+
cp = itoc(ip);
- mip = ctomi(cp);
- server = mip->mi_server;
fhp = ctofh(cp);
- type = (int)objp->word2;
+
+ mip = itocmi(ip);
+ server = mip->mi_server;
#ifdef SSI_CFS_FULLTIMES
size = NOSIZE;
@@ -1610,7 +1618,7 @@
}
#ifdef CFS_EXPORT_OPS
- memcpy(&ctargs.cta_fhandle, fhp, CFS_FH_LEN(fhp));
+ COPY_CFS_FH(&ctargs.cta_fhandle, fhp);
#else
ctargs.cta_fhandle = *fhp;
#endif
@@ -1662,7 +1670,7 @@
printk(KERN_WARNING "cfstok_send: nsc_rcall error %d\n", error);
#endif
- iput(ip);
+ iput(ip); /* undo HOLDOBJ() */
return error;
}
@@ -2012,6 +2020,9 @@
count = hlist_count(hlistp);
#endif
+ obj.word1 = (long)ip;
+ obj.obj_pp = &cliparam;
+
CFSTOK_XLOCK( itoc(ip));/* exclusive lock token info in cfs inode*/
#ifdef SVRHOLD_LIST_LINUX_LIST
@@ -2027,9 +2038,7 @@
SSI_ASSERT(item->hl_op == INSTALL);
SSI_ASSERT(item->hl_type != CFSTOK_MHOLD);
- obj.word1 = (long)ip;
obj.word2 = item->hl_type;
- obj.obj_pp = &cliparam;
#ifdef SSI_RANGE_TOKENS
if (BITVAL(item->hl_type) & CFSTOK_RANGE) {
@@ -2063,13 +2072,14 @@
int which;
object_t obj;
+ obj.word1 = (long)ip;
+ obj.obj_pp = &cliparam;
+
CFSTOK_XLOCK(itoc(ip));
/* Skip MHOLD token for since it is never waited for */
for (which = 1; which <= CFSTOK_NTOKS; which++) {
- obj.word1 = (long)ip;
obj.word2 = (long)which;
- obj.obj_pp = &cliparam;
#ifdef SSI_RANGE_TOKENS
if (BITVAL(which) & CFSTOK_RANGE) {
@@ -2381,10 +2391,12 @@
return 0;
#endif
- CFSTOK_XLOCK(ct);
obj.word1 = (long)ctoi(ct);
obj.word2 = (long)TOK_BAD;
obj.obj_pp = &cliparam;
+
+ CFSTOK_XLOCK(ct);
+
#ifdef CFS_FASTPATH
/* Do fast path rebuild processing. */
if (do_haves)
@@ -2439,6 +2451,7 @@
obj.word1 = (long)ip;
obj.word2 = (long)which;
obj.obj_pp = &cliparam;
+
CFSTOK_XLOCK(cp);
tok_svrquery(&obj, ITOTCB(ip, which), oldmode, newmode, node);
CFSTOK_XRELE(cp);
@@ -2450,13 +2463,16 @@
range_off_t start, range_off_t len)
{
struct inode *ip;
- int type;
+ int mode, type, ret;
object_t obj;
- int ret;
ip = (struct inode *)objp->word1;
type = (int)objp->word2;
+ obj.word1 = (long)ip;
+ obj.word2 = (long)type;
+ obj.obj_pp = &cliparam;
+
switch (type) {
case CFSTOK_MTIME:
SSI_ASSERT(oldmode == CFSTOK_RDWR || oldmode == CFSTOK_SU);
@@ -2476,16 +2492,11 @@
if ((itoc(ip)->c_wmapcnt + itoc(ip)->c_wopncnt) == 0 &&
itoc(ip)->c_fastpath.fast_hold_count == 0 &&
itoc(ip)->c_resv == itoc(ip)->c_resv_ret) {
- int mode;
-
-
if (oldmode == CFSTOK_RDWR)
mode = CFSTOK_SR;
else
mode = TOK_NOMODE;
- obj.word1 = (long)ip;
- obj.word2 = (long)type;
- obj.obj_pp = &cliparam;
+
ret = tok_giveback(&obj, ITOTCB(ip, type), mode,
this_node);
if (ret) {
@@ -2512,15 +2523,11 @@
if ( S_ISREG(ip->i_mode) &&
(itoc(ip)->c_rmapcnt + itoc(ip)->c_ropncnt) == 0 &&
itoc(ip)->c_fastpath.fast_hold_count == 0) {
- int mode;
-
if (oldmode == CFSTOK_RDWR)
mode = CFSTOK_SR;
else
mode = TOK_NOMODE;
- obj.word1 = (long)ip;
- obj.word2 = (long)type;
- obj.obj_pp = &cliparam;
+
ret = tok_giveback(&obj, ITOTCB(ip, type), mode,
this_node);
if (ret) {
@@ -2541,10 +2548,6 @@
* fast_hold_count before sending it back.
*/
if ((itoc(ip)->c_wmapcnt + itoc(ip)->c_rmapcnt) == 0) {
-
- obj.word1 = (long)ip;
- obj.word2 = (long)type;
- obj.obj_pp = &cliparam;
ret = tok_giveback(&obj, ITOTCB(ip, type), TOK_NOMODE,
this_node);
SSI_ASSERT(ret);
@@ -2589,9 +2592,10 @@
SSI_ASSERT(ip != NULL);
- CFSTOK_XLOCK(cp);
obj.word1 = (long)ip;
obj.obj_pp = &cliparam;
+
+ CFSTOK_XLOCK(cp);
for (which = 1 ; which <= CFSTOK_NTOKS; which++) {
/* Count token waits. */
obj.word2 = (long)which;
Index: cfsproc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfsproc.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- cfsproc.c 18 Nov 2009 06:15:56 -0000 1.35
+++ cfsproc.c 17 Dec 2009 06:43:50 -0000 1.36
@@ -1550,7 +1550,10 @@
struct vfsmount *mnt;
int ret;
+ read_lock(¤t->fs->lock);
mnt = mntget(current->fs->rootmnt);
+ read_unlock(¤t->fs->lock);
+
ret = __cfs_root_is_ready(mnt->mnt_sb);
mntput(mnt);
@@ -1584,8 +1587,8 @@
*/
if (!__cfs_root_is_ready(sb)) {
res->rmi_status = -ECFS_TRYAGAIN;
- mntput(mnt);
dput(root_dentry);
+ mntput(mnt);
return;
}
@@ -1637,8 +1640,8 @@
&res->rmi_mntargs.root.cdrok_res_toks);
res->rmi_status = 0;
- mntput(mnt);
dput(root_dentry);
+ mntput(mnt);
}
void
Index: cfs_mnthooks.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_mnthooks.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- cfs_mnthooks.c 24 Mar 2009 04:26:28 -0000 1.24
+++ cfs_mnthooks.c 17 Dec 2009 06:43:50 -0000 1.25
@@ -179,6 +179,7 @@
int silent)
{
cfs_mntinfo_t *mip;
+ struct inode *inode;
struct dentry *root;
int error = 0;
int mhold;
@@ -201,8 +202,10 @@
memcpy(csb->s_mnt_info, argp->pfs_data.pfs_data_val, PAGE_SIZE);
}
/* Create the root cnode. */
- root = d_alloc_root(cfs_fhget(csb, &(argp->root)));
+ inode = cfs_fhget(csb, &(argp->root));
+ root = d_alloc_root(inode);
if (!root) {
+ iput(inode);
free_page(((unsigned long)csb->s_mnt_info));
csb->s_mnt_info = NULL;
error = -ENOMEM;
@@ -677,17 +680,21 @@
cfs_mount_root(char *path, clusternode_t server)
{
struct cfsrootinfo rmi;
- struct cfs_mount_data *data_page;
- long status;
- int my_node = this_node;
+ struct cfs_mount_data *data_page = NULL;
nsc_handle_t *th;
+ int status = -ENOMEM;
+ int my_node = this_node;
char ssidev_buffer[9];
+#if 0
rmi.rmi_mntargs.dir_name = NULL;
rmi.rmi_mntargs.root.cdrok_res_toks = NULL;
rmi.rmi_mntargs.pfs_data.pfs_data_val = NULL;
data_page = NULL;
status = -ENOMEM;
+#else
+ memset(&rmi, 0, sizeof(rmi));
+#endif
if (!(rmi.rmi_mntargs.dir_name = kmalloc(CFS_MAXPATHLEN + 1, GFP_KERNEL)))
goto out;
@@ -765,6 +772,7 @@
struct cfsmountargs *cmap;
int p_len;
+ *type = NULL;
*payload = NULL;
/* Ignore local only vfsmount */
@@ -791,6 +799,7 @@
*payload = kmalloc(*payload_len, GFP_KERNEL);
if (*payload == NULL) {
kfree(*type);
+ *type = NULL;
return -ENOMEM;
}
Index: proc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/proc.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- proc.c 2 Nov 2009 03:44:37 -0000 1.22
+++ proc.c 17 Dec 2009 06:43:50 -0000 1.23
@@ -504,7 +504,7 @@
#error no longer supported
#endif
if (CFS_AT_SERVER(data->inode)) {
- struct kvec *vec; /* SSI_XXX: belongs in cfs_read_data struct? */
+ struct kvec *vec;
MAP_CFS_PAGEVEC(data, vec, vlen);
status = cfsd_read(itoc(data->inode)->c_hp, data->offset,
@@ -652,7 +652,7 @@
#error no longer supported
#endif
if (CFS_AT_SERVER(data->inode)) {
- struct kvec *vec; /* SSI_XXX: belongs in cfs_write_data struct? */
+ struct kvec *vec;
MAP_CFS_PAGEVEC(data, vec, vlen);
status = cfsd_write(itoc(data->inode)->c_hp, data->offset,
@@ -739,6 +739,7 @@
}
} else {
struct cfswriteres *res_p = NULL;
+ struct cfswriteargs args;
int rval;
args.cwa_fhandle = *itocfh(inode);
Index: svrcfs.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/svrcfs.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- svrcfs.c 17 Dec 2009 05:39:28 -0000 1.26
+++ svrcfs.c 17 Dec 2009 06:43:50 -0000 1.27
@@ -100,6 +100,13 @@
extern tok_param_t svrparam;
+#define DEFINE_SVROBJ(name, type) \
+ object_t name = { \
+ .word1 = (long)hp, \
+ .word2 = type, \
+ .obj_pp = &svrparam, \
+ }
+
#if defined(DEBUG)
char *
svrcfstok_dspfile(object_t *objp, char *buffer)
@@ -246,6 +253,7 @@
return hp;
}
+#ifdef DEBUG
static int
hash_hold_and_check(svrcfstok_t *hp)
{
@@ -262,6 +270,7 @@
return (h != NULL);
}
+#endif /* DEBUG */
#endif
/*
@@ -829,7 +838,11 @@
* can not fail.
*/
/* Find existing hash structure */
+#ifdef RCU_CFSTOK_TABLE
+ hp = hfind(fhp);
+#else
hp = svrtok_lookup(fhp, NULL, NULL);
+#endif
/* SSI_XXX: At the moment, it is possible
for this to fail if it is a GIVEBACK on
a down filesystem. */
@@ -934,13 +947,10 @@
cfspol_server(hp, agent, hints, mask, NULL);
if (op == HINT) {
int seq;
- object_t obj;
+ DEFINE_SVROBJ(obj, 0);
seq = tokseq_getseq(cfs_tsp, agent, "cfs_tokmsg",
"HINTDONE");
- obj.word1 = (long)hp;
- obj.word2 = 0;
- obj.obj_pp = &svrparam;
svrcfstok_hold_obj(&obj);
dprintk("SVR S hintdone %s %d id 0x%x seq 0x%x\n",
@@ -1034,19 +1044,23 @@
object_t *objp,
agent_t agent)
{
+ (void) objp;
+
return agent;
}
void
svrcfstok_hold_obj(object_t *objp)
{
- struct svrcfstok *hp = (struct svrcfstok *)objp->word1;
-
+#ifdef DEBUG
#ifdef RCU_CFSTOK_TABLE
- BUG_ON(!hash_hold_and_check(hp));
+ BUG_ON(!hash_hold_and_check((struct svrcfstok *) objp->word1));
#else
- HASH_HOLD(hp);
+#error not supported
#endif
+#else
+ HASH_HOLD((struct svrcfstok *) objp->word1);
+#endif /* !DEBUG */
}
/*
@@ -1094,7 +1108,7 @@
start, len,
cfspol_getsvrflgs(hp), 0, 0,
0, this_node, &fattr);
- HASH_RELE(hp);
+ HASH_RELE(hp); /* undo HOLDOBJ() */
return 0;
}
#ifdef CFS_EXPORT_OPS
@@ -1137,7 +1151,7 @@
printk(KERN_WARNING "svrcfstok_send: nsc_rcall error %d\n", error);
#endif
- HASH_RELE(hp);
+ HASH_RELE(hp); /* undo HOLDOBJ() */
return 0;
}
#endif /* __KERNEL__ */
@@ -1156,13 +1170,10 @@
range_off_t len)
{
int ret;
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
if (type == CFSTOK_MHOLD) {
mhsvrtok_getinstall(&obj, &hp->sct_mhold, agent);
ret = TRUE; /* Can't fail */
@@ -1208,14 +1219,10 @@
range_off_t start,
range_off_t len)
{
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
-
#ifdef CFSTOK_RANGE
if (BITVAL(type) & CFSTOK_RANGE)
svrtok_sendinstall_range(&obj, SCTTORTCB(hp, type), mode,
@@ -1249,12 +1256,10 @@
range_off_t start,
range_off_t len)
{
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
+
#ifdef CFSTOK_RANGE
if (BITVAL(type) & CFSTOK_RANGE)
svrtok_request_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1288,13 +1293,10 @@
range_off_t len)
{
int ret;
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
#ifdef CFSTOK_RANGE
if (BITVAL(type) & CFSTOK_RANGE)
ret = svrtok_return_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1331,13 +1333,10 @@
range_off_t len)
{
int ret;
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
#ifdef CFSTOK_RANGE
if (BITVAL(type) & CFSTOK_RANGE)
ret = svrtok_giveback_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1383,7 +1382,7 @@
range_off_t len)
{
int ret;
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
#ifdef DEBUG
if (revfail_find && ++revfail_count == revfail_find) {
@@ -1391,10 +1390,9 @@
revfail_count = 0;
}
#endif
+
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
+
#ifdef CFSTOK_RANGE
if (BITVAL(type) & CFSTOK_RANGE)
ret = svrtok_revfail_range(&obj, SCTTORTCB(hp, type), oldmode,
@@ -1426,17 +1424,14 @@
agent_t agent)
{
int ret;
- object_t obj;
void *cookie;
+ DEFINE_SVROBJ(obj, type);
#ifdef CFSTOK_RANGE
SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
#endif
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
ret = svrtok_queryreq(&obj, SCTTOTCB(hp, type), mode, agent, &cookie);
@@ -1898,15 +1893,12 @@
void *query_cookie;
struct svrqret info;
struct nodeent nodeent;
- object_t obj;
+ DEFINE_SVROBJ(obj, type);
SSI_ASSERT(LOCK_LOCKOWNED(&hp->sct_tcblock));
SSI_ASSERT(!(modep && type == CFSTOK_MHOLD));
NSC_NODELIST_INIT(nodelist);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
if (modep)
*modep = TOK_BAD;
@@ -2385,15 +2377,17 @@
rcu_read_unlock();
} /* end of for (hash = 0; hash < HASHSIZ ; hash++) */
+ obj.obj_pp = &svrparam;
count = 0;
while ((hpp = (struct svrcfstok **)ics_chunk_get_entry(icp, count))) {
int ret;
hp = *hpp;
+#else
+ obj.obj_pp = &svrparam;
#endif
obj.word1 = (long)hp;
obj.word2 = CFSTOK_MHOLD;
- obj.obj_pp = &svrparam;
LOCK_LOCK(&hp->sct_tcblock);
@@ -2709,17 +2703,15 @@
int newmode,
agent_t node)
{
- object_t obj;
int ret;
+ DEFINE_SVROBJ(obj, type);
#ifdef CFSTOK_RANGE
SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
#endif
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
+
ret = svrtok_queryret(&obj, SCTTOTCB(hp, type),
oldmode, newmode, node);
@@ -2745,17 +2737,15 @@
int newmode,
agent_t node)
{
- object_t obj;
int ret;
+ DEFINE_SVROBJ(obj, type);
#ifdef CFSTOK_RANGE
SSI_ASSERT(!(BITVAL(type) & CFSTOK_RANGE));
#endif
LOCK_LOCK(&hp->sct_tcblock);
- obj.word1 = (long)hp;
- obj.word2 = type;
- obj.obj_pp = &svrparam;
+
ret = svrtok_queryfail(&obj, SCTTOTCB(hp, type),
oldmode, newmode, node);
@@ -2910,15 +2900,12 @@
svrtok_dorelse(struct svrcfstok *hp, int forced)
{
int i;
- object_t obj;
+ DEFINE_SVROBJ(obj, CFSTOK_MHOLD);
#ifdef RCU_CFSTOK_TABLE
extern void svrtok_dorelse_dealloc(struct rcu_head *);
#endif
/* Tell token code to free any auxillary data structures */
- obj.word1 = (long)hp;
- obj.word2 = CFSTOK_MHOLD;
- obj.obj_pp = &svrparam;
mhsvrtok_destroy(&obj, &(hp->sct_mhold), forced);
for (i = 1; i <= CFSTOK_NTOKS; i++) {
Index: read.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/read.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- read.c 2 Nov 2009 03:44:37 -0000 1.22
+++ read.c 17 Dec 2009 06:43:50 -0000 1.23
@@ -111,6 +111,7 @@
if (p && (p->pagevec != &p->page_array[0]))
kfree(p->pagevec);
#endif
+ iput(p->inode);
mempool_free(p, cfs_rdata_mempool);
}
@@ -160,9 +161,10 @@
if (!rdata)
return -ENOMEM;
- rdata->flags = (IS_SWAPFILE(inode)? CFS_RPC_SWAPFLAGS : 0);
+ atomic_inc(&inode->i_count);
rdata->inode = inode;
- rdata->pagevec = &page;
+ rdata->flags = (IS_SWAPFILE(inode)? CFS_RPC_SWAPFLAGS : 0);
+ rdata->pagevec = &page; /* override existing ->pagevec */
rdata->pgbase = 0UL;
rdata->count = rsize;
#endif /* CFS_PAGEVEC */
@@ -279,7 +281,10 @@
kunmap(page);
#endif
unlock_page(page);
+#ifdef CFS_PAGEVEC
+ rdata->pagevec = NULL; /* don't kfree page */
cfs_readdata_free(rdata);
+#endif
return result;
}
@@ -341,6 +346,7 @@
if (offset || req->wb_offset)
BUG();
#endif
+ atomic_inc(&req->wb_inode->i_count);
data->inode = req->wb_inode;
data->count = count; /* nbytes */
/* Don't delete this keep for reference */
Index: cfs_subr.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/cfs_subr.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- cfs_subr.c 2 Nov 2009 03:44:37 -0000 1.28
+++ cfs_subr.c 17 Dec 2009 06:43:50 -0000 1.29
@@ -1124,101 +1124,102 @@
int sleep_flag)
#endif
{
+#ifdef SKIP
int error = 0; /* Error code. */
+#endif
cfs_mntinfo_t *mip; /* Pointer to allocated SB info. */
SSI_ASSERT(sb != NULL);
SSI_ASSERT(sb->s_fs_info == NULL);
- /* Allocate memory. */
+
mip = kzmalloc(sizeof(struct cfs_sb_info), GFP_KERNEL);
if (mip == NULL)
- error = -ENOMEM;
- else {
- /* Back pointer to SB. */
- mip->mi_sb = sb;
- /* Filesystem state. */
- mip->mi_sb_state = MI_SB_STATE_UP;
- /* Initialize kernel data structures. */
+ return -ENOMEM;
+
+ /*
+ * Initialize kernel data structures.
+ */
+ mip->mi_sb = sb;
#ifdef SKIP
- INIT_ATOMIC_INT(&mip->mi_refct, 0);
- INIT_ATOMIC_INT(&mip->mi_cnodect, 0);
+ strncpy(mip->mi_pfs_fsname,
+ (fsnamep != NULL ? fsnamep : ""),
+ sizeof(mip->mi_pfs_fsname));
#endif
- INIT_COND_LOCK(&mip->mi_cond_lock);
- INIT_ATOMIC_INT(&mip->mi_sb_fsop_threads, 0);
- INIT_INTR_CONDITION(&mip->mi_sb_state_cond);
- INIT_INTR_CONDITION(&mip->mi_sb_down_cond);
-#ifdef SSI_CFS_SKIP
- INIT_ATOMIC_INT(&mip->mi_svrcfstoks, 0);
+#ifdef THESE_NOT_HERE_ANYMORE
+ /* Fire up the writeback cache */
+ mip->mi_flags
+ = cfs_sb_convert_mount_flags(mount_flags);
+ mip->mi_mount_flags = mount_flags;
#endif
-#ifdef SSI_NOTUSED
- INIT_LIST_HEAD(&mip->lru_read);
- INIT_LIST_HEAD(&mip->lru_dirty);
- INIT_LIST_HEAD(&mip->lru_commit);
- INIT_LIST_HEAD(&mip->lru_busy);
+#ifdef SKIP
+ INIT_ATOMIC_INT(&mip->mi_refct, 0);
+ INIT_ATOMIC_INT(&mip->mi_cnodect, 0);
+ /* Get mountpoint pathname. */
+ error = cfs_sb_path_alloc(&mip->mi_mntpt, mntptp,
+ mntpt_user, sleep_flag);
#endif
- INIT_LIST_HEAD(&mip->dirty_down);
-#ifdef CFS_COMMIT_DOWN
- INIT_LIST_HEAD(&mip->commit_down);
+ INIT_COND_LOCK(&mip->mi_cond_lock);
+ /* Filesystem state. */
+ mip->mi_sb_state = MI_SB_STATE_UP;
+ INIT_ATOMIC_INT(&mip->mi_sb_fsop_threads, 0);
+ INIT_INTR_CONDITION(&mip->mi_sb_state_cond);
+ INIT_INTR_CONDITION(&mip->mi_sb_down_cond);
+#ifdef SSI_CFS_SKIP
+ INIT_ATOMIC_INT(&mip->mi_svrcfstoks, 0);
+#endif
+#ifdef CFS_BDI
+ mip->backing_dev_info.ra_pages = mip->rpages * CFS_MAX_READAHEAD;
#endif
- INIT_LIST_HEAD(&mip->read_down);
#ifdef KERNEL2616_53
- mip->rsize = CFS_MAX_FILE_IO_SIZE;
- mip->rpages = (mip->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
- mip->wsize = CFS_MAX_FILE_IO_SIZE;
- mip->wpages = (mip->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+ mip->rsize = CFS_MAX_FILE_IO_SIZE;
+ mip->rpages = (mip->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+ mip->wsize = CFS_MAX_FILE_IO_SIZE;
+ mip->wpages = (mip->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
#else
- mip->rpages = CFS_READ_MAXIOV;
- mip->rsize = mip->rpages << PAGE_CACHE_SHIFT;
- mip->wpages = CFS_WRITE_MAXIOV;
- mip->wsize = mip->wpages << PAGE_CACHE_SHIFT;
-#endif
-#ifdef CFS_BDI
- mip->backing_dev_info.ra_pages = mip->rpages * CFS_MAX_READAHEAD;
+ mip->rpages = CFS_READ_MAXIOV;
+ mip->rsize = mip->rpages << PAGE_CACHE_SHIFT;
+ mip->wpages = CFS_WRITE_MAXIOV;
+ mip->wsize = mip->wpages << PAGE_CACHE_SHIFT;
#endif
#if defined(CFS_ZAP_CACHES) && defined(CFS_FILE_RW_NOLOCK)
#ifdef SKIP
- if (sb->s_flags & MS_NOATTRCACHE) {
- mip->acregmin = mip->acregmax = 0;
- mip->acdirmin = mip->acdirmax = 0;
- sb->s_flags |= MS_SYNCHRONOUS;
- } else {
+ if (sb->s_flags & MS_NOATTRCACHE) {
+ mip->acregmin = mip->acregmax = 0;
+ mip->acdirmin = mip->acdirmax = 0;
+ sb->s_flags |= MS_SYNCHRONOUS;
+ } else {
#endif
- mip->acregmin = 3*HZ;
- mip->acregmax = 60*HZ;
- mip->acdirmin = 30*HZ;
- mip->acdirmax = 60*HZ;
+ mip->acregmin = 3*HZ;
+ mip->acregmax = 60*HZ;
+ mip->acdirmin = 30*HZ;
+ mip->acdirmax = 60*HZ;
#ifdef SKIP
- }
+ }
#endif
#endif /* CFS_ZAP_CACHES && CFS_FILE_RW_NOLOCK */
-#ifdef THESE_NOT_HERE_ANYMORE
- /* Fire up the writeback cache */
- mip->mi_mount_flags = mount_flags;
- mip->mi_flags
- = cfs_sb_convert_mount_flags(mount_flags);
+ INIT_LIST_HEAD(&mip->dirty_down);
+#ifdef CFS_COMMIT_DOWN
+ INIT_LIST_HEAD(&mip->commit_down);
#endif
-#ifdef SKIP
- strncpy(mip->mi_pfs_fsname,
- (fsnamep != NULL ? fsnamep : ""),
- sizeof(mip->mi_pfs_fsname));
+ INIT_LIST_HEAD(&mip->read_down);
+#ifdef SSI_NOTUSED
+ INIT_LIST_HEAD(&mip->lru_read);
+ INIT_LIST_HEAD(&mip->lru_dirty);
+ INIT_LIST_HEAD(&mip->lru_commit);
+ INIT_LIST_HEAD(&mip->lru_busy);
#endif
- }
#ifdef SKIP
- /* Get mountpoint pathname. */
- if (!error)
- error = cfs_sb_path_alloc(&mip->mi_mntpt, mntptp,
- mntpt_user, sleep_flag);
-#endif
/* Free memory on error. */
if (error && mip != NULL) {
sb->s_fs_info = mip;
cfs_sb_mi_free(sb);
- mip = NULL;
+ return error;
}
+#endif
/* Return pointer to caller. */
sb->s_fs_info = mip;
- return error;
+ return 0;
} /* end cfs_sb_mi_alloc() */
void
@@ -1621,10 +1622,8 @@
if (retval < 0)
goto out2;
- lock_kernel(); /* for fill_super() in get_sb() */
retval = cfs_do_remount((char*)dev_page, sb, (char*)type_page,
flags, (void*)sb->s_mnt_info);
- unlock_kernel();
if (retval == 0)
mnt_fix_devname(sb, (char*)dev_page);
@@ -1679,24 +1678,31 @@
/* This shouldn't be set, but I'm clearing anyway just in case */
flags &= ~MS_CFS;
+ /*
+ * ->get_sb needs lock_kernel().
+ */
+ lock_kernel();
#if 0
sb = get_sb_bdev**DIFFERENT**(fstype, flags | MS_REMOUNT, name, data);
#else
sb = fstype->get_sb(fstype, flags | MS_REMOUNT, name, data);
#endif
+ unlock_kernel();
if (IS_ERR(sb)) {
err = PTR_ERR(sb);
goto fs_out;
}
+ /* sb->s_dev = sb_dev */
+ sb->s_flags |= MS_CFS; /* Mark as CFS stacked */
+ up_write(&sb->s_umount);
+
/* Now we have the Physical super-block set-up, lets really link
* this guy up and set the CFS mount(s) back to UP.
*/
/* SSI_XXX */
/* mip->mi_mount_flags = mnt_flags */
mip->mi_server = this_node;
- /* sb->s_dev = sb_dev */
- sb->s_flags |= MS_CFS; /* Mark as CFS stacked */
mip->mi_pfs_sb = sb;
/* SSI_XXX: Should we copy final PFS flags to the CFS SB? */
@@ -1708,12 +1714,12 @@
if (!err)
err = cfs_send_rb_up(this_node, cfssb->s_ssidev);
- up_write(&sb->s_umount);
+ /* up_write(&sb->s_umount); */
if (err)
cfs_remount_cleanup(cfssb, sb);
-fs_out:
+fs_out:
put_filesystem(fstype);
return err;
}
Index: vfs.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/vfs.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- vfs.c 27 Oct 2009 03:18:29 -0000 1.32
+++ vfs.c 17 Dec 2009 06:43:50 -0000 1.33
@@ -96,10 +96,12 @@
}
down(&(dparent->d_inode->i_sem));
+
/* Lookup the name, but don't follow links */
dentry = lookup_hash(name, dparent);
if (IS_ERR(dentry)) {
err = PTR_ERR(dentry);
+ dentry = NULL;
goto out;
}
/*
@@ -120,7 +122,7 @@
err = 0;
out:
- if (!IS_ERR(dentry))
+ if (dentry)
dput(dentry);
up(&(dparent->d_inode->i_sem));
nolockout:
@@ -153,9 +155,11 @@
down(&(dparent->d_inode->i_sem));
locked = TRUE;
}
+
dentry = lookup_hash(name, dparent);
if (IS_ERR(dentry)) {
err = PTR_ERR(dentry);
+ dentry = NULL;
goto out;
}
/*
@@ -178,7 +182,7 @@
*hpp = makehp(dhp->sct_sb, dev, dentry);
out:
- if (!IS_ERR(dentry))
+ if (dentry)
dput(dentry);
if (locked)
up(&(dparent->d_inode->i_sem));
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev