diff options
author | Steve French <sfrench@us.ibm.com> | 2005-11-18 20:25:31 -0800 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2005-11-18 20:25:31 -0800 |
commit | 86c96b4bb70dac67d6815e09a0949427d439b280 (patch) | |
tree | f36ac16583ea9f935fcbed006a8edd99cf83852f /fs/cifs/dir.c | |
parent | c119b87d596cdd99ac20095ae2ae90b525418605 (diff) | |
download | linux-3.10-86c96b4bb70dac67d6815e09a0949427d439b280.tar.gz linux-3.10-86c96b4bb70dac67d6815e09a0949427d439b280.tar.bz2 linux-3.10-86c96b4bb70dac67d6815e09a0949427d439b280.zip |
[CIFS] Fix mknod of block and chardev over SFU mounts
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/dir.c')
-rw-r--r-- | fs/cifs/dir.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 8dfe717a332..16b21522e8f 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -292,7 +292,8 @@ cifs_create_out: return rc; } -int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t device_number) +int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, + dev_t device_number) { int rc = -EPERM; int xid; @@ -368,7 +369,34 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev if(!rc) { /* BB Do not bother to decode buf since no - local inode yet to put timestamps in */ + local inode yet to put timestamps in, + but we can reuse it safely */ + int bytes_written; + struct win_dev *pdev; + pdev = (struct win_dev *)buf; + if(S_ISCHR(mode)) { + memcpy(pdev->type, "IntxCHR", 8); + pdev->major = + cpu_to_le64(MAJOR(device_number)); + pdev->minor = + cpu_to_le64(MINOR(device_number)); + rc = CIFSSMBWrite(xid, pTcon, + fileHandle, + sizeof(struct win_dev), + 0, &bytes_written, (char *)pdev, + NULL, 0); + } else if(S_ISBLK(mode)) { + memcpy(pdev->type, "IntxBLK", 8); + pdev->major = + cpu_to_le64(MAJOR(device_number)); + pdev->minor = + cpu_to_le64(MINOR(device_number)); + rc = CIFSSMBWrite(xid, pTcon, + fileHandle, + sizeof(struct win_dev), + 0, &bytes_written, (char *)pdev, + NULL, 0); + } /* else if(S_ISFIFO */ CIFSSMBClose(xid, pTcon, fileHandle); d_drop(direntry); } |