Commit be652445 authored by Steve French's avatar Steve French

[CIFS] Add new nostrictsync cifs mount option to avoid slow SMB flush

If this mount option is set, when an application does an
fsync call then the cifs client does not send an SMB Flush
to the server (to force the server to write all dirty data
for this file immediately to disk), although cifs still sends
all dirty (cached) file data to the server and waits for the
server to respond to the write write.  Since SMB Flush can be
very slow, and some servers may be reliable enough (to risk
delaying slightly flushing the data to disk on the server),
turning on this option may be useful to improve performance for
applications that fsync too much, at a small risk of server
crash.  If this mount option is not set, by default cifs will
send an SMB flush request (and wait for a response) on every
fsync call.
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 10e70afa
...@@ -8,7 +8,9 @@ user's smb session. This fix allows cifs to mount multiple times to the ...@@ -8,7 +8,9 @@ user's smb session. This fix allows cifs to mount multiple times to the
same server with different userids without risking invalidating earlier same server with different userids without risking invalidating earlier
established security contexts. fsync now sends SMB Flush operation established security contexts. fsync now sends SMB Flush operation
to better ensure that we wait for server to write all of the data to to better ensure that we wait for server to write all of the data to
server disk (not just write it over the network). server disk (not just write it over the network). Add new mount
parameter to allow user to disable sending the (slow) SMB flush on
fsync if desired (fsync still flushes all cached write data to the server).
Version 1.56 Version 1.56
------------ ------------
......
...@@ -472,6 +472,19 @@ A partial list of the supported mount options follows: ...@@ -472,6 +472,19 @@ A partial list of the supported mount options follows:
even if the cifs server would support posix advisory locks. even if the cifs server would support posix advisory locks.
"forcemand" is accepted as a shorter form of this mount "forcemand" is accepted as a shorter form of this mount
option. option.
nostrictsync If this mount option is set, when an application does an
fsync call then the cifs client does not send an SMB Flush
to the server (to force the server to write all dirty data
for this file immediately to disk), although cifs still sends
all dirty (cached) file data to the server and waits for the
server to respond to the write. Since SMB Flush can be
very slow, and some servers may be reliable enough (to risk
delaying slightly flushing the data to disk on the server),
turning on this option may be useful to improve performance for
applications that fsync too much, at a small risk of server
crash. If this mount option is not set, by default cifs will
send an SMB flush request (and wait for a response) on every
fsync call.
nodfs Disable DFS (global name space support) even if the nodfs Disable DFS (global name space support) even if the
server claims to support it. This can help work around server claims to support it. This can help work around
a problem with parsing of DFS paths with Samba server a problem with parsing of DFS paths with Samba server
...@@ -692,13 +705,14 @@ require this helper. Note that NTLMv2 security (which does not require the ...@@ -692,13 +705,14 @@ require this helper. Note that NTLMv2 security (which does not require the
cifs.upcall helper program), instead of using Kerberos, is sufficient for cifs.upcall helper program), instead of using Kerberos, is sufficient for
some use cases. some use cases.
Enabling DFS support (used to access shares transparently in an MS-DFS DFS support allows transparent redirection to shares in an MS-DFS name space.
global name space) requires that CONFIG_CIFS_EXPERIMENTAL be enabled. In In addition, DFS support for target shares which are specified as UNC
addition, DFS support for target shares which are specified as UNC
names which begin with host names (rather than IP addresses) requires names which begin with host names (rather than IP addresses) requires
a user space helper (such as cifs.upcall) to be present in order to a user space helper (such as cifs.upcall) to be present in order to
translate host names to ip address, and the user space helper must also translate host names to ip address, and the user space helper must also
be configured in the file /etc/request-key.conf be configured in the file /etc/request-key.conf. Samba, Windows servers and
many NAS appliances support DFS as a way of constructing a global name
space to ease network configuration and improve reliability.
To use cifs Kerberos and DFS support, the Linux keyutils package should be To use cifs Kerberos and DFS support, the Linux keyutils package should be
installed and something like the following lines should be added to the installed and something like the following lines should be added to the
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define CIFS_MOUNT_OVERR_GID 0x800 /* override gid returned from server */ #define CIFS_MOUNT_OVERR_GID 0x800 /* override gid returned from server */
#define CIFS_MOUNT_DYNPERM 0x1000 /* allow in-memory only mode setting */ #define CIFS_MOUNT_DYNPERM 0x1000 /* allow in-memory only mode setting */
#define CIFS_MOUNT_NOPOSIXBRL 0x2000 /* mandatory not posix byte range lock */ #define CIFS_MOUNT_NOPOSIXBRL 0x2000 /* mandatory not posix byte range lock */
#define CIFS_MOUNT_NO_SSYNC 0x4000 /* don't do slow SMBflush on every sync*/
struct cifs_sb_info { struct cifs_sb_info {
struct cifsTconInfo *tcon; /* primary mount */ struct cifsTconInfo *tcon; /* primary mount */
......
...@@ -95,6 +95,7 @@ struct smb_vol { ...@@ -95,6 +95,7 @@ struct smb_vol {
bool local_lease:1; /* check leases only on local system, not remote */ bool local_lease:1; /* check leases only on local system, not remote */
bool noblocksnd:1; bool noblocksnd:1;
bool noautotune:1; bool noautotune:1;
bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
unsigned int rsize; unsigned int rsize;
unsigned int wsize; unsigned int wsize;
unsigned int sockopt; unsigned int sockopt;
...@@ -1274,6 +1275,10 @@ cifs_parse_mount_options(char *options, const char *devname, ...@@ -1274,6 +1275,10 @@ cifs_parse_mount_options(char *options, const char *devname,
vol->intr = 0; vol->intr = 0;
} else if (strnicmp(data, "intr", 4) == 0) { } else if (strnicmp(data, "intr", 4) == 0) {
vol->intr = 1; vol->intr = 1;
} else if (strnicmp(data, "nostrictsync", 12) == 0) {
vol->nostrictsync = 1;
} else if (strnicmp(data, "strictsync", 10) == 0) {
vol->nostrictsync = 0;
} else if (strnicmp(data, "serverino", 7) == 0) { } else if (strnicmp(data, "serverino", 7) == 0) {
vol->server_ino = 1; vol->server_ino = 1;
} else if (strnicmp(data, "noserverino", 9) == 0) { } else if (strnicmp(data, "noserverino", 9) == 0) {
...@@ -2160,6 +2165,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info, ...@@ -2160,6 +2165,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info,
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL; cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
if (pvolume_info->nobrl) if (pvolume_info->nobrl)
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL; cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
if (pvolume_info->nostrictsync)
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_SSYNC;
if (pvolume_info->mand_lock) if (pvolume_info->mand_lock)
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL; cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
if (pvolume_info->cifs_acl) if (pvolume_info->cifs_acl)
......
...@@ -1538,7 +1538,8 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync) ...@@ -1538,7 +1538,8 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
rc = CIFS_I(inode)->write_behind_rc; rc = CIFS_I(inode)->write_behind_rc;
CIFS_I(inode)->write_behind_rc = 0; CIFS_I(inode)->write_behind_rc = 0;
tcon = CIFS_SB(inode->i_sb)->tcon; tcon = CIFS_SB(inode->i_sb)->tcon;
if (!rc && tcon && smbfile) if (!rc && tcon && smbfile &&
!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_SSYNC))
rc = CIFSSMBFlush(xid, tcon, smbfile->netfid); rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment