The patch titled

     v9fs: readlink extended mode check

has been added to the -mm tree.  Its filename is

     v9fs-readlink-extended-mode-check.patch

Patches currently in -mm which might be from [EMAIL PROTECTED] are

v9fs-documentation-makefiles-configuration.patch
v9fs-documentation-makefiles-configuration-add-fd-based-transport-to-makefile-docs.patch
v9fs-vfs-file-dentry-and-directory-operations.patch
v9fs-vfs-inode-operations.patch
v9fs-vfs-superblock-operations-and-glue.patch
v9fs-vfs-superblock-operations-and-glue-add-fd-based-transport-to-mount-options.patch
v9fs-9p-protocol-implementation.patch
v9fs-transport-modules.patch
v9fs-transport-modules-add-fd-based-transport-module.patch
v9fs-debug-and-support-routines.patch
v9fs-change-error-magic-numbers-to-defined-constants.patch
v9fs-clean-up-vfs_inode-and-setattr-functions.patch
v9fs-fix-support-for-special-files-devices-named-pipes-etc.patch
v9fs-readlink-extended-mode-check.patch
v9fs-fix-handling-of-malformed-9p-messages.patch
v9fs-fix-a-problem-with-named-pipe-transport.patch
v9fs-use-standard-kernel-byteswapping.patch
v9fs-adjust-follow_link-and-put_link-to.patch
v9fs-fix-plan9port-example-in-v9fs.patch
v9fs-remove-sparse-bitwise-warnings.patch



From: Eric Van Hensbergen <[EMAIL PROTECTED]>

LANL reported some issues with random crashes during mount of legacy protocol
servers (9P2000 versus 9P2000.u) -- crash was always happening in readlink
(which should never happen in legacy mode).  Added some sanity conditionals to
the get_inode code which should prevent the errors LANL was seeing.  Code
tested benign through regression.

Signed-off-by: Eric Van Hensbergen <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 fs/9p/vfs_inode.c |   35 ++++++++++++++++++++++++++++++-----
 1 files changed, 30 insertions(+), 5 deletions(-)

diff -puN fs/9p/vfs_inode.c~v9fs-readlink-extended-mode-check fs/9p/vfs_inode.c
--- devel/fs/9p/vfs_inode.c~v9fs-readlink-extended-mode-check   2005-08-29 
22:21:17.000000000 -0700
+++ devel-akpm/fs/9p/vfs_inode.c        2005-08-29 22:21:17.000000000 -0700
@@ -44,6 +44,7 @@
 #include "fid.h"
 
 static struct inode_operations v9fs_dir_inode_operations;
+static struct inode_operations v9fs_dir_inode_operations_ext;
 static struct inode_operations v9fs_file_inode_operations;
 static struct inode_operations v9fs_symlink_inode_operations;
 
@@ -232,6 +233,7 @@ v9fs_mistat2unix(struct v9fs_stat *mista
 struct inode *v9fs_get_inode(struct super_block *sb, int mode)
 {
        struct inode *inode = NULL;
+       struct v9fs_session_info *v9ses = sb->s_fs_info;
 
        dprintk(DEBUG_VFS, "super block: %p mode: %o\n", sb, mode);
 
@@ -250,6 +252,10 @@ struct inode *v9fs_get_inode(struct supe
                case S_IFBLK:
                case S_IFCHR:
                case S_IFSOCK:
+                       if(!v9ses->extended) {
+                               dprintk(DEBUG_ERROR, "special files without 
extended mode\n");
+                               return ERR_PTR(-EINVAL);
+                       }
                        init_special_inode(inode, inode->i_mode,
                                           inode->i_rdev);
                        break;
@@ -257,14 +263,21 @@ struct inode *v9fs_get_inode(struct supe
                        inode->i_op = &v9fs_file_inode_operations;
                        inode->i_fop = &v9fs_file_operations;
                        break;
+               case S_IFLNK:
+                       if(!v9ses->extended) {
+                               dprintk(DEBUG_ERROR, "extended modes used w/o 
9P2000.u\n");
+                               return ERR_PTR(-EINVAL);
+                       }
+                       inode->i_op = &v9fs_symlink_inode_operations;
+                       break;
                case S_IFDIR:
                        inode->i_nlink++;
-                       inode->i_op = &v9fs_dir_inode_operations;
+                       if(v9ses->extended)
+                               inode->i_op = &v9fs_dir_inode_operations_ext;
+                       else
+                               inode->i_op = &v9fs_dir_inode_operations;
                        inode->i_fop = &v9fs_dir_operations;
                        break;
-               case S_IFLNK:
-                       inode->i_op = &v9fs_symlink_inode_operations;
-                       break;
                default:
                        dprintk(DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n",
                                mode, mode & S_IFMT);
@@ -1284,7 +1297,7 @@ v9fs_vfs_mknod(struct inode *dir, struct
        return retval;
 }
 
-static struct inode_operations v9fs_dir_inode_operations = {
+static struct inode_operations v9fs_dir_inode_operations_ext = {
        .create = v9fs_vfs_create,
        .lookup = v9fs_vfs_lookup,
        .symlink = v9fs_vfs_symlink,
@@ -1299,6 +1312,18 @@ static struct inode_operations v9fs_dir_
        .setattr = v9fs_vfs_setattr,
 };
 
+static struct inode_operations v9fs_dir_inode_operations = {
+       .create = v9fs_vfs_create,
+       .lookup = v9fs_vfs_lookup,
+       .unlink = v9fs_vfs_unlink,
+       .mkdir = v9fs_vfs_mkdir,
+       .rmdir = v9fs_vfs_rmdir,
+       .mknod = v9fs_vfs_mknod,
+       .rename = v9fs_vfs_rename,
+       .getattr = v9fs_vfs_getattr,
+       .setattr = v9fs_vfs_setattr,
+};
+
 static struct inode_operations v9fs_file_inode_operations = {
        .getattr = v9fs_vfs_getattr,
        .setattr = v9fs_vfs_setattr,
_
-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to