diff options
author | Steve French <sfrench@us.ibm.com> | 2007-07-11 14:30:34 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2007-07-11 14:30:34 -0400 |
commit | 7521a3c566dda7bb09576975324fc0a08a79ad14 (patch) | |
tree | 2ba0405ea1a7f3f187c2434ef86000b1b65f2d01 | |
parent | fb8c4b14d9259ba467241a7aaeb712caedce7ee8 (diff) |
[CIFS] Fix oops in cifs_create when nfsd server exports cifs mount
nfsd is passing null nameidata (probably the only one doing that)
on call to create - cifs was missing one check for this.
Note that running nfsd over a cifs mount requires specifying fsid on
the nfs exports entry and requires mounting cifs with serverino mount
option.
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/CHANGES | 3 | ||||
-rw-r--r-- | fs/cifs/README | 13 | ||||
-rw-r--r-- | fs/cifs/cifsfs.c | 11 | ||||
-rw-r--r-- | fs/cifs/dir.c | 3 | ||||
-rw-r--r-- | fs/cifs/export.c | 15 | ||||
-rw-r--r-- | fs/cifs/file.c | 2 |
6 files changed, 33 insertions, 14 deletions
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index ee276f62bcf4..f92e0ee661ae 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -1,6 +1,7 @@ | |||
1 | Version 1.50 | 1 | Version 1.50 |
2 | ------------ | 2 | ------------ |
3 | Fix NTLMv2 signing | 3 | Fix NTLMv2 signing. NFS server mounted over cifs works (if cifs mount is |
4 | done with "serverino" mount option). | ||
4 | 5 | ||
5 | Version 1.49 | 6 | Version 1.49 |
6 | ------------ | 7 | ------------ |
diff --git a/fs/cifs/README b/fs/cifs/README index eb3efd5a6a81..85f1eb14083e 100644 --- a/fs/cifs/README +++ b/fs/cifs/README | |||
@@ -370,7 +370,7 @@ A partial list of the supported mount options follows: | |||
370 | Note that this does not affect the normal ACL check on the | 370 | Note that this does not affect the normal ACL check on the |
371 | target machine done by the server software (of the server | 371 | target machine done by the server software (of the server |
372 | ACL against the user name provided at mount time). | 372 | ACL against the user name provided at mount time). |
373 | serverino Use servers inode numbers instead of generating automatically | 373 | serverino Use server's inode numbers instead of generating automatically |
374 | incrementing inode numbers on the client. Although this will | 374 | incrementing inode numbers on the client. Although this will |
375 | make it easier to spot hardlinked files (as they will have | 375 | make it easier to spot hardlinked files (as they will have |
376 | the same inode numbers) and inode numbers may be persistent, | 376 | the same inode numbers) and inode numbers may be persistent, |
@@ -378,12 +378,11 @@ A partial list of the supported mount options follows: | |||
378 | are unique if multiple server side mounts are exported under a | 378 | are unique if multiple server side mounts are exported under a |
379 | single share (since inode numbers on the servers might not | 379 | single share (since inode numbers on the servers might not |
380 | be unique if multiple filesystems are mounted under the same | 380 | be unique if multiple filesystems are mounted under the same |
381 | shared higher level directory). Note that this requires that | 381 | shared higher level directory). Note that some older |
382 | the server support the CIFS Unix Extensions as other servers | 382 | (e.g. pre-Windows 2000) do not support returning UniqueIDs |
383 | do not return a unique IndexNumber on SMB FindFirst (most | 383 | or the CIFS Unix Extensions equivalent and for those |
384 | servers return zero as the IndexNumber). Parameter has no | 384 | this mount option will have no effect. Exporting cifs mounts |
385 | effect to Windows servers and others which do not support the | 385 | under nfsd requires this mount option on the cifs mount. |
386 | CIFS Unix Extensions. | ||
387 | noserverino Client generates inode numbers (rather than using the actual one | 386 | noserverino Client generates inode numbers (rather than using the actual one |
388 | from the server) by default. | 387 | from the server) by default. |
389 | setuids If the CIFS Unix extensions are negotiated with the server | 388 | setuids If the CIFS Unix extensions are negotiated with the server |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 17ed7cf750af..40f35f0263ac 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -114,10 +114,6 @@ cifs_read_super(struct super_block *sb, void *data, | |||
114 | 114 | ||
115 | sb->s_magic = CIFS_MAGIC_NUMBER; | 115 | sb->s_magic = CIFS_MAGIC_NUMBER; |
116 | sb->s_op = &cifs_super_ops; | 116 | sb->s_op = &cifs_super_ops; |
117 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
118 | if (experimEnabled != 0) | ||
119 | sb->s_export_op = &cifs_export_ops; | ||
120 | #endif /* EXPERIMENTAL */ | ||
121 | /* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512) | 117 | /* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512) |
122 | sb->s_blocksize = | 118 | sb->s_blocksize = |
123 | cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */ | 119 | cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */ |
@@ -139,6 +135,13 @@ cifs_read_super(struct super_block *sb, void *data, | |||
139 | rc = -ENOMEM; | 135 | rc = -ENOMEM; |
140 | goto out_no_root; | 136 | goto out_no_root; |
141 | } | 137 | } |
138 | |||
139 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
140 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | ||
141 | cFYI(1, ("export ops supported")); | ||
142 | sb->s_export_op = &cifs_export_ops; | ||
143 | } | ||
144 | #endif /* EXPERIMENTAL */ | ||
142 | 145 | ||
143 | return 0; | 146 | return 0; |
144 | 147 | ||
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 38706e8496a3..def89f23fe55 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -264,7 +264,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
264 | direntry->d_op = &cifs_dentry_ops; | 264 | direntry->d_op = &cifs_dentry_ops; |
265 | d_instantiate(direntry, newinode); | 265 | d_instantiate(direntry, newinode); |
266 | } | 266 | } |
267 | if ((nd->flags & LOOKUP_OPEN) == FALSE) { | 267 | if ((nd == NULL /* nfsd case - nfs srv does not set nd */) || |
268 | ((nd->flags & LOOKUP_OPEN) == FALSE)) { | ||
268 | /* mknod case - do not leave file open */ | 269 | /* mknod case - do not leave file open */ |
269 | CIFSSMBClose(xid, pTcon, fileHandle); | 270 | CIFSSMBClose(xid, pTcon, fileHandle); |
270 | } else if (newinode) { | 271 | } else if (newinode) { |
diff --git a/fs/cifs/export.c b/fs/cifs/export.c index 5a08effda0ae..6e66bc19f0ae 100644 --- a/fs/cifs/export.c +++ b/fs/cifs/export.c | |||
@@ -26,15 +26,30 @@ | |||
26 | /* | 26 | /* |
27 | * See Documentation/filesystems/Exporting | 27 | * See Documentation/filesystems/Exporting |
28 | * and examples in fs/exportfs | 28 | * and examples in fs/exportfs |
29 | * | ||
30 | * Since cifs is a network file system, an "fsid" must be included for | ||
31 | * any nfs exports file entries which refer to cifs paths. In addition | ||
32 | * the cifs mount must be mounted with the "serverino" option (ie use stable | ||
33 | * server inode numbers instead of locally generated temporary ones). | ||
34 | * Although cifs inodes do not use generation numbers (have generation number | ||
35 | * of zero) - the inode number alone should be good enough for simple cases | ||
36 | * in which users want to export cifs shares with NFS. The decode and encode | ||
37 | * could be improved by using a new routine which expects 64 bit inode numbers | ||
38 | * instead of the default 32 bit routines in fs/exportfs | ||
39 | * | ||
29 | */ | 40 | */ |
30 | 41 | ||
31 | #include <linux/fs.h> | 42 | #include <linux/fs.h> |
43 | #include "cifsglob.h" | ||
44 | #include "cifs_debug.h" | ||
45 | |||
32 | 46 | ||
33 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 47 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
34 | 48 | ||
35 | static struct dentry *cifs_get_parent(struct dentry *dentry) | 49 | static struct dentry *cifs_get_parent(struct dentry *dentry) |
36 | { | 50 | { |
37 | /* BB need to add code here eventually to enable export via NFSD */ | 51 | /* BB need to add code here eventually to enable export via NFSD */ |
52 | cFYI(1, ("get parent for %p", dentry)); | ||
38 | return ERR_PTR(-EACCES); | 53 | return ERR_PTR(-EACCES); |
39 | } | 54 | } |
40 | 55 | ||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 7d6fb6f3adeb..d83eca4231e7 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -212,7 +212,7 @@ int cifs_open(struct inode *inode, struct file *file) | |||
212 | return -ENOMEM; | 212 | return -ENOMEM; |
213 | } | 213 | } |
214 | 214 | ||
215 | cFYI(1, (" inode = 0x%p file flags are 0x%x for %s", | 215 | cFYI(1, ("inode = 0x%p file flags are 0x%x for %s", |
216 | inode, file->f_flags, full_path)); | 216 | inode, file->f_flags, full_path)); |
217 | desiredAccess = cifs_convert_flags(file->f_flags); | 217 | desiredAccess = cifs_convert_flags(file->f_flags); |
218 | 218 | ||