smbfs mounted file, tail -f STILL does not work
Urban Widmark
urban at svenskatest.se
Sun Nov 19 15:56:21 GMT 2000
On Sat, 18 Nov 2000, root wrote:
> No, "ping -t 127.0.0.1" loops internally (just like ping on linux). It IS
> continuously appending to the file. I am not re-executing the ping command
Didn't read the -t. Yes, I can see this problem.
Running 'ping -t' and simultaneously a little program that does stat() and
dumps some interesting info gives:
(edited)
size: 457
atime: 974651104 mtime: 974651104 ctime: 974649966
size: 508
atime: 974651104 mtime: 974651104 ctime: 974649966
[here the ping was terminated]
size: 559
atime: 974651114 mtime: 974651114 ctime: 974649966
Notice how the mtime and atime does not change until after the ping is
terminated. smbfs looks at the mtime only when deciding if it has recent
info or not.
Below is a patch vs 2.2.18-pre22 (21 is fine too) that changes this to
also look at size changes, and removes the code that forces all open() to
be read-write (I'm not sure why that is done ...)
Please test and report.
/Urban
diff -urN -X exclude linux-2.2.18-pre22-orig/fs/smbfs/inode.c linux-2.2.18-pre22-smbfs/fs/smbfs/inode.c
--- linux-2.2.18-pre22-orig/fs/smbfs/inode.c Sun Nov 19 15:26:19 2000
+++ linux-2.2.18-pre22-smbfs/fs/smbfs/inode.c Sun Nov 19 16:46:26 2000
@@ -242,6 +242,7 @@
{
struct inode *inode = dentry->d_inode;
time_t last_time;
+ off_t size;
int error = 0;
DEBUG1("\n");
@@ -250,8 +251,7 @@
* If this is a file opened with write permissions,
* the inode will be up-to-date.
*/
- if (S_ISREG(inode->i_mode) && smb_is_open(inode))
- {
+ if (S_ISREG(inode->i_mode) && smb_is_open(inode)) {
if (inode->u.smbfs_i.access != SMB_O_RDONLY)
goto out;
}
@@ -259,8 +259,7 @@
/*
* Check whether we've recently refreshed the inode.
*/
- if (time_before(jiffies, inode->u.smbfs_i.oldmtime + HZ/10))
- {
+ if (time_before(jiffies, inode->u.smbfs_i.oldmtime + HZ/10)) {
VERBOSE("up-to-date, jiffies=%lu, oldtime=%lu\n",
jiffies, inode->u.smbfs_i.oldmtime);
goto out;
@@ -268,15 +267,17 @@
/*
* Save the last modified time, then refresh the inode.
- * (Note: a size change should have a different mtime.)
+ * (Note: a size change does not necessarily get a different mtime,
+ * although it certainly should.)
*/
last_time = inode->i_mtime;
+ size = inode->i_size;
error = smb_refresh_inode(dentry);
- if (error || inode->i_mtime != last_time)
- {
- VERBOSE("%s/%s changed, old=%ld, new=%ld\n",
+ if (error || inode->i_mtime != last_time || inode->i_size != size) {
+ VERBOSE("%s/%s changed, mtime=%ld/%ld, size=%ld/%ld\n",
DENTRY_PATH(dentry),
- (long) last_time, (long) inode->i_mtime);
+ (long) last_time, (long) inode->i_mtime,
+ last_size, inode->i_size);
if (!S_ISDIR(inode->i_mode))
invalidate_inode_pages(inode);
}
diff -urN -X exclude linux-2.2.18-pre22-orig/fs/smbfs/proc.c linux-2.2.18-pre22-smbfs/fs/smbfs/proc.c
--- linux-2.2.18-pre22-orig/fs/smbfs/proc.c Sun Nov 19 15:26:19 2000
+++ linux-2.2.18-pre22-smbfs/fs/smbfs/proc.c Sun Nov 19 16:39:27 2000
@@ -28,6 +28,8 @@
config option. */
#define SMBFS_POSIX_UNLINK 1
+/* #define SMB_FORCE_READWRITE 1 */
+
#include "smb_debug.h"
#define SMB_VWV(packet) ((packet) + SMB_HEADER_LEN)
@@ -843,7 +845,7 @@
mode = read_write;
if (!(ino->i_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
mode = read_only;
-#if 0
+#ifndef SMB_FORCE_READWRITE
/* FIXME: why is this code not in? below we fix it so that a caller
wanting RO doesn't get RW. smb_revalidate_inode does some
optimization based on access mode. tail -f needs it to be correct. */
@@ -883,8 +885,10 @@
/* smb_vwv2 has mtime */
/* smb_vwv4 has size */
ino->u.smbfs_i.access = (WVAL(server->packet, smb_vwv6) & SMB_ACCMASK);
+#ifdef SMB_FORCE_READWRITE
if (!(wish & (O_WRONLY | O_RDWR)))
ino->u.smbfs_i.access = SMB_O_RDONLY;
+#endif
ino->u.smbfs_i.open = server->generation;
out:
More information about the samba
mailing list