mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
cifs: reinstate original behavior when uid=/gid= options are specified
This patch fixes the regression reported here:
http://bugzilla.kernel.org/show_bug.cgi?id=13861
commit 4ae1507f6d
changed the default
behavior when the uid= or gid= option was specified for a mount. The
existing behavior was to always clobber the ownership information
provided by the server when these options were specified. The above
commit changed this behavior so that these options simply provided
defaults when the server did not provide this information (unless
"forceuid" or "forcegid" were specified)
This patch reverts this change so that the default behavior is restored.
It also adds "noforceuid" and "noforcegid" options to make it so that
ownership information from the server is preserved, even when the mount
has uid= or gid= options specified.
It also adds a couple of printk notices that pop up when forceuid or
forcegid options are specified without a uid= or gid= option.
Reported-by: Tom Chiverton <bugzilla.kernel.org@falkensweb.com>
Reviewed-by: Shirish Pargaonkar <shirishp@us.ibm.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
5bd9052d79
commit
9b9d6b2434
@ -803,6 +803,10 @@ cifs_parse_mount_options(char *options, const char *devname,
|
||||
char *data;
|
||||
unsigned int temp_len, i, j;
|
||||
char separator[2];
|
||||
short int override_uid = -1;
|
||||
short int override_gid = -1;
|
||||
bool uid_specified = false;
|
||||
bool gid_specified = false;
|
||||
|
||||
separator[0] = ',';
|
||||
separator[1] = 0;
|
||||
@ -1093,18 +1097,20 @@ cifs_parse_mount_options(char *options, const char *devname,
|
||||
"too long.\n");
|
||||
return 1;
|
||||
}
|
||||
} else if (strnicmp(data, "uid", 3) == 0) {
|
||||
if (value && *value)
|
||||
vol->linux_uid =
|
||||
simple_strtoul(value, &value, 0);
|
||||
} else if (strnicmp(data, "forceuid", 8) == 0) {
|
||||
vol->override_uid = 1;
|
||||
} else if (strnicmp(data, "gid", 3) == 0) {
|
||||
if (value && *value)
|
||||
vol->linux_gid =
|
||||
simple_strtoul(value, &value, 0);
|
||||
} else if (strnicmp(data, "forcegid", 8) == 0) {
|
||||
vol->override_gid = 1;
|
||||
} else if (!strnicmp(data, "uid", 3) && value && *value) {
|
||||
vol->linux_uid = simple_strtoul(value, &value, 0);
|
||||
uid_specified = true;
|
||||
} else if (!strnicmp(data, "forceuid", 8)) {
|
||||
override_uid = 1;
|
||||
} else if (!strnicmp(data, "noforceuid", 10)) {
|
||||
override_uid = 0;
|
||||
} else if (!strnicmp(data, "gid", 3) && value && *value) {
|
||||
vol->linux_gid = simple_strtoul(value, &value, 0);
|
||||
gid_specified = true;
|
||||
} else if (!strnicmp(data, "forcegid", 8)) {
|
||||
override_gid = 1;
|
||||
} else if (!strnicmp(data, "noforcegid", 10)) {
|
||||
override_gid = 0;
|
||||
} else if (strnicmp(data, "file_mode", 4) == 0) {
|
||||
if (value && *value) {
|
||||
vol->file_mode =
|
||||
@ -1355,6 +1361,18 @@ cifs_parse_mount_options(char *options, const char *devname,
|
||||
if (vol->UNCip == NULL)
|
||||
vol->UNCip = &vol->UNC[2];
|
||||
|
||||
if (uid_specified)
|
||||
vol->override_uid = override_uid;
|
||||
else if (override_uid == 1)
|
||||
printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
|
||||
"specified with no uid= option.\n");
|
||||
|
||||
if (gid_specified)
|
||||
vol->override_gid = override_gid;
|
||||
else if (override_gid == 1)
|
||||
printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
|
||||
"specified with no gid= option.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user