I merged the first 5 of this series, but wanted to understand what behavior this changes first (it is probably ok). With current userspace code - what changes would a user see with this? On Sun, Jun 20, 2010 at 4:10 PM, Jeff Layton <jlayton@xxxxxxxxxx> wrote: > Right now, there's no clear separation between the uid that owns the > credentials used to do the mount and the overriding owner of the files > on that mount. > > Add a separate cred_uid field that is set to the real uid > of the mount user. Unlike the linux_uid, the uid= option does not > override this parameter. The parm is sent to cifs.upcall, which can then > preferentially use the creduid= parm instead of the uid= parm for > finding credentials. > > This is not the only way to solve this. We could try to do all of this > in kernel instead by having a module parameter that affects what gets > passed in the uid= field of the upcall. That said, we have a lot more > flexibility to change things in userspace so I think it probably makes > sense to do it this way. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/cifs/cifs_spnego.c | 3 +++ > fs/cifs/cifsglob.h | 3 ++- > fs/cifs/connect.c | 7 +++++-- > 3 files changed, 10 insertions(+), 3 deletions(-) > > diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c > index 379bd7d..6effccf 100644 > --- a/fs/cifs/cifs_spnego.c > +++ b/fs/cifs/cifs_spnego.c > @@ -144,6 +144,9 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) > sprintf(dp, ";uid=0x%x", sesInfo->linux_uid); > > dp = description + strlen(description); > + sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid); > + > + dp = description + strlen(description); > sprintf(dp, ";user=%s", sesInfo->userName); > > dp = description + strlen(description); > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h > index 415703b..e15d7a5 100644 > --- a/fs/cifs/cifsglob.h > +++ b/fs/cifs/cifsglob.h > @@ -209,7 +209,8 @@ struct cifsSesInfo { > char *serverNOS; /* name of network operating system of server */ > char *serverDomain; /* security realm of server */ > int Suid; /* remote smb uid */ > - uid_t linux_uid; /* local Linux uid */ > + uid_t linux_uid; /* overriding owner of files on the mount */ > + uid_t cred_uid; /* owner of credentials */ > int capabilities; > char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for > TCP names - will ipv6 and sctp addresses fit? */ > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index 58e0217..920d94e 100644 > --- a/fs/cifs/connect.c > +++ b/fs/cifs/connect.c > @@ -66,6 +66,7 @@ struct smb_vol { > char *iocharset; /* local code page for mapping to and from Unicode */ > char source_rfc1001_name[16]; /* netbios name of client */ > char target_rfc1001_name[16]; /* netbios name of server for Win9x/ME */ > + uid_t cred_uid; > uid_t linux_uid; > gid_t linux_gid; > mode_t file_mode; > @@ -830,7 +831,8 @@ cifs_parse_mount_options(char *options, const char *devname, > /* null target name indicates to use *SMBSERVR default called name > if we end up sending RFC1001 session initialize */ > vol->target_rfc1001_name[0] = 0; > - vol->linux_uid = current_uid(); /* use current_euid() instead? */ > + vol->cred_uid = current_uid(); > + vol->linux_uid = current_uid(); > vol->linux_gid = current_gid(); > > /* default to only allowing write access to owner of the mount */ > @@ -1647,7 +1649,7 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol) > list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { > switch (server->secType) { > case Kerberos: > - if (vol->linux_uid != ses->linux_uid) > + if (vol->cred_uid != ses->cred_uid) > continue; > break; > default: > @@ -1764,6 +1766,7 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) > if (ses->domainName) > strcpy(ses->domainName, volume_info->domainname); > } > + ses->cred_uid = volume_info->cred_uid; > ses->linux_uid = volume_info->linux_uid; > ses->overrideSecFlg = volume_info->secFlg; > > -- > 1.6.6.1 > > -- Thanks, Steve -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html