#ifdef AFS_LINUX24_ENV
if ((code == 0 || flp->fl_type == F_UNLCK) &&
(cmd == F_SETLK || cmd == F_SETLKW)) {
-#ifdef AFS_LINUX26_ENV
+#ifdef POSIX_LOCK_FILE_WAIT_ARG
+ code = posix_lock_file(fp, flp, 0);
+#else
flp->fl_flags &=~ FL_SLEEP;
code = posix_lock_file(fp, flp);
-#else
- code = posix_lock_file(fp, flp, 0);
#endif
if (code && flp->fl_type != F_UNLCK) {
struct AFS_FLOCK flock2;
* afs_StoreAllSegments() with AFS_LASTSTORE
*/
static int
+#if defined(FOP_FLUSH_TAKES_FL_OWNER_T)
+afs_linux_flush(struct file *fp, fl_owner_t id)
+#else
afs_linux_flush(struct file *fp)
+#endif
{
struct vrequest treq;
- struct vcache *vcp = VTOAFS(FILE_INODE(fp));
- cred_t *credp = crref();
+ struct vcache *vcp;
+ cred_t *credp;
int code;
AFS_GLOCK();
+ if (fp->f_flags | O_RDONLY) { /* readers dont flush */
+ AFS_GUNLOCK();
+ return 0;
+ }
+
+ credp = crref();
+ vcp = VTOAFS(FILE_INODE(fp));
+
code = afs_InitReq(&treq, credp);
if (code)
goto out;
ObtainSharedLock(&vcp->lock, 535);
- if (vcp->execsOrWriters > 0) {
+ if ((vcp->execsOrWriters > 0) && (file_count(fp) == 1)) {
UpgradeSToWLock(&vcp->lock, 536);
code = afs_StoreAllSegments(vcp, &treq, AFS_SYNC | AFS_LASTSTORE);
ConvertWToSLock(&vcp->lock);
.mmap = afs_linux_mmap,
.open = afs_linux_open,
.flush = afs_linux_flush,
-#ifdef AFS_LINUX26_ENV
+#if defined(AFS_LINUX26_ENV) && defined(STRUCT_FILE_OPERATIONS_HAS_SENDFILE)
.sendfile = generic_file_sendfile,
#endif
+#if defined(AFS_LINUX26_ENV) && defined(STRUCT_FILE_OPERATIONS_HAS_SPLICE)
+ .splice_write = generic_file_splice_write,
+ .splice_read = generic_file_splice_read,
+#endif
.release = afs_linux_release,
.fsync = afs_linux_fsync,
.lock = afs_linux_lock,
AFS_GLOCK();
(void) afs_InactiveVCache(vcp, NULL);
AFS_GUNLOCK();
+#ifdef DCACHE_NFSFS_RENAMED
+#ifdef AFS_LINUX26_ENV
+ spin_lock(&dp->d_lock);
+#endif
+ dp->d_flags &= ~DCACHE_NFSFS_RENAMED;
+#ifdef AFS_LINUX26_ENV
+ spin_unlock(&dp->d_lock);
+#endif
+#endif
iput(ip);
}
afs_getattr(vcp, &vattr, credp);
afs_fill_inode(ip, &vattr);
+ insert_inode_hash(ip);
dp->d_op = &afs_dentry_operations;
dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion);
d_instantiate(dp, ip);
ip = AFSTOV(vcp);
afs_getattr(vcp, &vattr, credp);
afs_fill_inode(ip, &vattr);
+ if (hlist_unhashed(&ip->i_hash))
+ insert_inode_hash(ip);
}
dp->d_op = &afs_dentry_operations;
dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion);
}
tvc->uncred = credp;
tvc->states |= CUnlinked;
+#ifdef DCACHE_NFSFS_RENAMED
+#ifdef AFS_LINUX26_ENV
+ spin_lock(&dp->d_lock);
+#endif
+ dp->d_flags |= DCACHE_NFSFS_RENAMED;
+#ifdef AFS_LINUX26_ENV
+ spin_unlock(&dp->d_lock);
+#endif
+#endif
} else {
osi_FreeSmallSpace(__name);
}
#endif
}
- /* insert_inode_hash(ip); -- this would make iget() work (if we used it) */
}