diff options
author | Steve French <sfrench@us.ibm.com> | 2009-02-21 16:17:43 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2009-03-11 21:36:20 -0400 |
commit | b298f223559e0205244f553ceef8c7df3674da74 (patch) | |
tree | a65cb2f64d1b999b7b573857a8b33bbb83ff97af /fs/cifs/cifssmb.c | |
parent | ebdcc81c71937b30e09110c02a1e8a21fa770b6f (diff) |
[CIFS] Send SMB flush in cifs_fsync
In contrast to the now-obsolete smbfs, cifs does not send SMB_COM_FLUSH
in response to an explicit fsync(2) to guarantee that all volatile data
is written to stable storage on the server side, provided the server
honors the request (which, to my knowledge, is true for Windows and
Samba with 'strict sync' enabled).
This patch modifies the cifs_fsync implementation to restore the
fsync-behavior of smbfs by triggering SMB_COM_FLUSH after sending
outstanding data on the client side to the server.
Signed-off-by: Horst Reiterer <horst.reiterer@gmail.com>
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 939e2f76b959..4c344fe7a152 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -1934,6 +1934,27 @@ CIFSSMBClose(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | |||
1934 | } | 1934 | } |
1935 | 1935 | ||
1936 | int | 1936 | int |
1937 | CIFSSMBFlush(const int xid, struct cifsTconInfo *tcon, int smb_file_id) | ||
1938 | { | ||
1939 | int rc = 0; | ||
1940 | FLUSH_REQ *pSMB = NULL; | ||
1941 | cFYI(1, ("In CIFSSMBFlush")); | ||
1942 | |||
1943 | rc = small_smb_init(SMB_COM_FLUSH, 1, tcon, (void **) &pSMB); | ||
1944 | if (rc) | ||
1945 | return rc; | ||
1946 | |||
1947 | pSMB->FileID = (__u16) smb_file_id; | ||
1948 | pSMB->ByteCount = 0; | ||
1949 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | ||
1950 | cifs_stats_inc(&tcon->num_flushes); | ||
1951 | if (rc) | ||
1952 | cERROR(1, ("Send error in Flush = %d", rc)); | ||
1953 | |||
1954 | return rc; | ||
1955 | } | ||
1956 | |||
1957 | int | ||
1937 | CIFSSMBRename(const int xid, struct cifsTconInfo *tcon, | 1958 | CIFSSMBRename(const int xid, struct cifsTconInfo *tcon, |
1938 | const char *fromName, const char *toName, | 1959 | const char *fromName, const char *toName, |
1939 | const struct nls_table *nls_codepage, int remap) | 1960 | const struct nls_table *nls_codepage, int remap) |