[TCP]: Verify the presence of RETRANS bit when leaving FRTO
[safe/jmp/linux-2.6] / fs / 9p / vfs_super.c
index d4d71a9..7bdf8b3 100644 (file)
@@ -8,9 +8,8 @@
  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
  *
  *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  */
 
 #include <linux/kernel.h>
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
 #include <linux/file.h>
 #include <linux/stat.h>
 #include <linux/string.h>
-#include <linux/smp_lock.h>
 #include <linux/inet.h>
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/mount.h>
 #include <linux/idr.h>
+#include <linux/sched.h>
 
 #include "debug.h"
 #include "v9fs.h"
@@ -47,7 +45,7 @@
 #include "fid.h"
 
 static void v9fs_clear_inode(struct inode *);
-static struct super_operations v9fs_super_ops;
+static const struct super_operations v9fs_super_ops;
 
 /**
  * v9fs_clear_inode - release an inode
@@ -91,7 +89,7 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
        sb->s_op = &v9fs_super_ops;
 
        sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC |
-           MS_NODIRATIME | MS_NOATIME;
+           MS_NOATIME;
 }
 
 /**
@@ -100,12 +98,13 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
  * @flags: mount flags
  * @dev_name: device name that was mounted
  * @data: mount options
+ * @mnt: mountpoint record to be instantiated
  *
  */
 
-static struct super_block *v9fs_get_sb(struct file_system_type
-                                      *fs_type, int flags,
-                                      const char *dev_name, void *data)
+static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
+                      const char *dev_name, void *data,
+                      struct vfsmount *mnt)
 {
        struct super_block *sb = NULL;
        struct v9fs_fcall *fcall = NULL;
@@ -122,19 +121,21 @@ static struct super_block *v9fs_get_sb(struct file_system_type
 
        dprintk(DEBUG_VFS, " \n");
 
-       v9ses = kmalloc(sizeof(struct v9fs_session_info), GFP_KERNEL);
+       v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL);
        if (!v9ses)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
-       memset(v9ses, 0, sizeof(struct v9fs_session_info));
        if ((newfid = v9fs_session_init(v9ses, dev_name, data)) < 0) {
                dprintk(DEBUG_ERROR, "problem initiating session\n");
-               kfree(v9ses);
-               return ERR_PTR(newfid);
+               retval = newfid;
+               goto out_free_session;
        }
 
        sb = sget(fs_type, NULL, v9fs_set_super, v9ses);
-
+       if (IS_ERR(sb)) {
+               retval = PTR_ERR(sb);
+               goto out_close_session;
+       }
        v9fs_fill_super(sb, v9ses, flags);
 
        inode = v9fs_get_inode(sb, S_IFDIR | mode);
@@ -147,7 +148,6 @@ static struct super_block *v9fs_get_sb(struct file_system_type
        inode->i_gid = gid;
 
        root = d_alloc_root(inode);
-
        if (!root) {
                retval = -ENOMEM;
                goto put_back_sb;
@@ -159,15 +159,20 @@ static struct super_block *v9fs_get_sb(struct file_system_type
        if (stat_result < 0) {
                dprintk(DEBUG_ERROR, "stat error\n");
                v9fs_t_clunk(v9ses, newfid);
-               v9fs_put_idpool(newfid, &v9ses->fidpool);
        } else {
                /* Setup the Root Inode */
-               root_fid = v9fs_fid_create(root, v9ses, newfid, 0);
+               root_fid = v9fs_fid_create(v9ses, newfid);
                if (root_fid == NULL) {
                        retval = -ENOMEM;
                        goto put_back_sb;
                }
 
+               retval = v9fs_fid_insert(root_fid, root);
+               if (retval < 0) {
+                       kfree(fcall);
+                       goto put_back_sb;
+               }
+
                root_fid->qid = fcall->params.rstat.stat.qid;
                root->d_inode->i_ino =
                    v9fs_qid2ino(&fcall->params.rstat.stat.qid);
@@ -181,13 +186,19 @@ static struct super_block *v9fs_get_sb(struct file_system_type
                goto put_back_sb;
        }
 
-       return sb;
+       return simple_set_mnt(mnt, sb);
+
+out_close_session:
+       v9fs_session_close(v9ses);
+out_free_session:
+       kfree(v9ses);
+       return retval;
 
 put_back_sb:
        /* deactivate_super calls v9fs_kill_super which will frees the rest */
        up_write(&sb->s_umount);
        deactivate_super(sb);
-       return ERR_PTR(retval);
+       return retval;
 }
 
 /**
@@ -244,14 +255,15 @@ static int v9fs_show_options(struct seq_file *m, struct vfsmount *mnt)
 }
 
 static void
-v9fs_umount_begin(struct super_block *sb)
+v9fs_umount_begin(struct vfsmount *vfsmnt, int flags)
 {
-       struct v9fs_session_info *v9ses = sb->s_fs_info;
+       struct v9fs_session_info *v9ses = vfsmnt->mnt_sb->s_fs_info;
 
-       v9fs_session_cancel(v9ses);
+       if (flags & MNT_FORCE)
+               v9fs_session_cancel(v9ses);
 }
 
-static struct super_operations v9fs_super_ops = {
+static const struct super_operations v9fs_super_ops = {
        .statfs = simple_statfs,
        .clear_inode = v9fs_clear_inode,
        .show_options = v9fs_show_options,
@@ -259,7 +271,7 @@ static struct super_operations v9fs_super_ops = {
 };
 
 struct file_system_type v9fs_fs_type = {
-       .name = "9P",
+       .name = "9p",
        .get_sb = v9fs_get_sb,
        .kill_sb = v9fs_kill_super,
        .owner = THIS_MODULE,