Commit da68991d authored by Trond Myklebust's avatar Trond Myklebust Committed by Linus Torvalds

[PATCH] NFS: fix problem of ESTALE errors on NFSv2 symlinks

NFSv2: Fix another bad filehandle cast.
NFSv2: The symlink operation does not return a valid filehandle.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c8030e55
...@@ -1377,9 +1377,6 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type, ...@@ -1377,9 +1377,6 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
/* Zero out the NFS state stuff */ /* Zero out the NFS state stuff */
init_nfsv4_state(server); init_nfsv4_state(server);
root = &server->fh;
nfs_copy_fh(root, (struct nfs_fh *) &data->root);
if (data->version != NFS_MOUNT_VERSION) { if (data->version != NFS_MOUNT_VERSION) {
printk("nfs warning: mount version %s than kernel\n", printk("nfs warning: mount version %s than kernel\n",
data->version < NFS_MOUNT_VERSION ? "older" : "newer"); data->version < NFS_MOUNT_VERSION ? "older" : "newer");
...@@ -1389,18 +1386,25 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type, ...@@ -1389,18 +1386,25 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
data->bsize = 0; data->bsize = 0;
if (data->version < 4) { if (data->version < 4) {
data->flags &= ~NFS_MOUNT_VER3; data->flags &= ~NFS_MOUNT_VER3;
root->size = NFS2_FHSIZE; data->root.size = NFS2_FHSIZE;
memcpy(root->data, data->old_root.data, NFS2_FHSIZE); memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
} }
if (data->version < 5) if (data->version < 5)
data->flags &= ~NFS_MOUNT_SECFLAVOUR; data->flags &= ~NFS_MOUNT_SECFLAVOUR;
} }
root = &server->fh;
if (data->flags & NFS_MOUNT_VER3)
root->size = data->root.size;
else
root->size = NFS2_FHSIZE;
if (root->size > sizeof(root->data)) { if (root->size > sizeof(root->data)) {
printk("nfs_get_sb: invalid root filehandle\n"); printk("nfs_get_sb: invalid root filehandle\n");
kfree(server); kfree(server);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
memcpy(root->data, data->root.data, root->size);
/* We now require that the mount process passes the remote address */ /* We now require that the mount process passes the remote address */
memcpy(&server->addr, &data->addr, sizeof(server->addr)); memcpy(&server->addr, &data->addr, sizeof(server->addr));
if (server->addr.sin_addr.s_addr == INADDR_ANY) { if (server->addr.sin_addr.s_addr == INADDR_ANY) {
......
...@@ -391,6 +391,7 @@ nfs_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path, ...@@ -391,6 +391,7 @@ nfs_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
return -ENAMETOOLONG; return -ENAMETOOLONG;
dprintk("NFS call symlink %s -> %s\n", name->name, path->name); dprintk("NFS call symlink %s -> %s\n", name->name, path->name);
fattr->valid = 0; fattr->valid = 0;
fhandle->size = 0;
status = rpc_call(NFS_CLIENT(dir), NFSPROC_SYMLINK, &arg, NULL, 0); status = rpc_call(NFS_CLIENT(dir), NFSPROC_SYMLINK, &arg, NULL, 0);
dprintk("NFS reply symlink: %d\n", status); dprintk("NFS reply symlink: %d\n", status);
return status; return status;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment