- 2.6.17 port work build breaks, but the patch set is relativly stable
[linux-flexiantxendom0-3.2.10.git] / fs / 9p / vfs_file.c
index de3a129..1a8e460 100644 (file)
@@ -7,9 +7,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
@@ -69,29 +68,36 @@ int v9fs_file_open(struct inode *inode, struct file *file)
 
        fid = v9fs_get_idpool(&v9ses->fidpool);
        if (fid < 0) {
-                       eprintk(KERN_WARNING, "newfid fails!\n");
-                       return -ENOSPC;
+               eprintk(KERN_WARNING, "newfid fails!\n");
+               return -ENOSPC;
+       }
+
+       err = v9fs_t_walk(v9ses, vfid->fid, fid, NULL, &fcall);
+       if (err < 0) {
+               dprintk(DEBUG_ERROR, "rewalk didn't work\n");
+               if (fcall && fcall->id == RWALK)
+                       goto clunk_fid;
+               else {
+                       v9fs_put_idpool(fid, &v9ses->fidpool);
+                       goto free_fcall;
                }
+       }
+       kfree(fcall);
 
-       err = v9fs_t_walk(v9ses, vfid->fid, fid, NULL, NULL);
+       /* TODO: do special things for O_EXCL, O_NOFOLLOW, O_SYNC */
+       /* translate open mode appropriately */
+       omode = v9fs_uflags2omode(file->f_flags);
+       err = v9fs_t_open(v9ses, fid, omode, &fcall);
        if (err < 0) {
-                       dprintk(DEBUG_ERROR, "rewalk didn't work\n");
-               goto put_fid;
+               PRINT_FCALL_ERROR("open failed", fcall);
+               goto clunk_fid;
        }
 
        vfid = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL);
        if (vfid == NULL) {
                dprintk(DEBUG_ERROR, "out of memory\n");
+               err = -ENOMEM;
                goto clunk_fid;
-               }
-
-               /* TODO: do special things for O_EXCL, O_NOFOLLOW, O_SYNC */
-               /* translate open mode appropriately */
-       omode = v9fs_uflags2omode(file->f_flags);
-       err = v9fs_t_open(v9ses, fid, omode, &fcall);
-       if (err < 0) {
-               PRINT_FCALL_ERROR("open failed", fcall);
-               goto destroy_vfid;
        }
 
        file->private_data = vfid;
@@ -106,15 +112,11 @@ int v9fs_file_open(struct inode *inode, struct file *file)
 
        return 0;
 
-destroy_vfid:
-       v9fs_fid_destroy(vfid);
-
 clunk_fid:
        v9fs_t_clunk(v9ses, fid);
 
-put_fid:
-       v9fs_put_idpool(fid, &v9ses->fidpool);
-               kfree(fcall);
+free_fcall:
+       kfree(fcall);
 
        return err;
 }
@@ -269,7 +271,7 @@ v9fs_file_write(struct file *filp, const char __user * data,
        return total;
 }
 
-struct file_operations v9fs_file_operations = {
+const struct file_operations v9fs_file_operations = {
        .llseek = generic_file_llseek,
        .read = v9fs_file_read,
        .write = v9fs_file_write,