Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7245c2c authored by Steve French's avatar Steve French
Browse files

[CIFS] Add compat with SFU (part 1)


This should help the case of creating fifos and other special files to
servers which do not support the Unix extensions.

Signed-off-by: default avatarSteve French <(sfrench@us.ibm.com)>

Thanks to Martin Koeppe for his suggestions and good analysis
parent 4887c618
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#define CIFS_MOUNT_NO_XATTR  0x10 /* if set - disable xattr support */
#define CIFS_MOUNT_MAP_SPECIAL_CHR 0x20 /* remap illegal chars in filenames */
#define CIFS_MOUNT_POSIX_PATHS 0x40 /* Negotiate posix pathnames if possible. */
#define CIFS_MOUNT_UNX_EMUL    0x80 /* Network compat with SFUnix emulation */

struct cifs_sb_info {
	struct cifsTconInfo *tcon;	/* primary mount */
+7 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ struct smb_vol {
	unsigned direct_io:1;
	unsigned remap:1;   /* set to remap seven reserved chars in filenames */
	unsigned posix_paths:1;   /* unset to not ask for posix pathnames. */
	unsigned sfu_emul:1;
	unsigned int rsize;
	unsigned int wsize;
	unsigned int sockopt;
@@ -1027,6 +1028,10 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
			vol->remap = 1;
		} else if (strnicmp(data, "nomapchars", 10) == 0) {
			vol->remap = 0;
                } else if (strnicmp(data, "sfu", 3) == 0) {
                        vol->sfu_emul = 1;
                } else if (strnicmp(data, "nosfu", 5) == 0) {
                        vol->sfu_emul = 0;
		} else if (strnicmp(data, "posixpaths", 10) == 0) {
			vol->posix_paths = 1;
		} else if (strnicmp(data, "noposixpaths", 12) == 0) {
@@ -1687,6 +1692,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
			cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
		if(volume_info.no_xattr)
			cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
		if(volume_info.sfu_emul)
			cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;

		if(volume_info.direct_io) {
			cERROR(1,("mounting share using direct i/o"));
+11 −1
Original line number Diff line number Diff line
@@ -209,7 +209,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
						CIFS_MOUNT_MAP_SPECIAL_CHR);
			}
		else {
			/* BB implement via Windows security descriptors */
			/* BB implement mode setting via Windows security descriptors */
			/* eg CIFSSMBWinSetPerms(xid,pTcon,full_path,mode,-1,-1,local_nls);*/
			/* could set r/o dos attribute if mode & 0222 == 0 */
		}
@@ -326,6 +326,16 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev
			if(rc == 0)
				d_instantiate(direntry, newinode);
		}
	} else {
		if((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && 
			(special_file(mode))) {

			cFYI(1,("sfu compat create special file"));
			/*	Attributes = cpu_to_le32(ATTR_SYSTEM); 
				rc = CIFSSMBOpen(xid, pTcon, full_path, disposition, ...); */

			/* add code here to set EAs */
		}
	}

	kfree(full_path);