code = -ENOENT;
goto out;
}
- ObtainSharedLock(&avc->lock, 810);
- UpgradeSToWLock(&avc->lock, 811);
+ ObtainWriteLock(&avc->lock, 811);
ObtainReadLock(&tdc->lock);
/*
* Make sure that the data in the cache is current. There are two
&& (tdc->dflags & DFFetching)
&& hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
ReleaseReadLock(&tdc->lock);
- ReleaseSharedLock(&avc->lock);
+ ReleaseWriteLock(&avc->lock);
afs_osi_Sleep(&tdc->validPos);
- ObtainSharedLock(&avc->lock, 812);
+ ObtainWriteLock(&avc->lock, 812);
ObtainReadLock(&tdc->lock);
}
if (!(avc->f.states & CStatd)
|| !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
ReleaseReadLock(&tdc->lock);
- ReleaseSharedLock(&avc->lock);
+ ReleaseWriteLock(&avc->lock);
afs_PutDCache(tdc);
goto tagain;
}
if (!dirpos)
break;
- code = afs_dir_GetVerifiedBlob(tdc, dirpos, &de);
+ code = afs_dir_GetVerifiedBlob(tdc, dirpos, &entry);
if (code) {
afs_warn("Corrupt directory (inode %lx, dirpos %d)",
(unsigned long)&tdc->f.inode, dirpos);
goto out;
}
+ de = (struct DirEntry *)entry.data;
ino = afs_calc_inum (avc->f.fid.Cell, avc->f.fid.Fid.Volume,
ntohl(de->fid.vnode));
len = strlen(de->name);
static int
#if defined(FOP_FSYNC_TAKES_DENTRY)
afs_linux_fsync(struct file *fp, struct dentry *dp, int datasync)
+#elif defined(FOP_FSYNC_TAKES_RANGE)
+afs_linux_fsync(struct file *fp, loff_t start, loff_t end, int datasync)
#else
afs_linux_fsync(struct file *fp, int datasync)
#endif
struct inode *ip = FILE_INODE(fp);
cred_t *credp = crref();
+#if defined(FOP_FSYNC_TAKES_RANGE)
+ mutex_lock(&ip->i_mutex);
+#endif
AFS_GLOCK();
code = afs_fsync(VTOAFS(ip), credp);
AFS_GUNLOCK();
+#if defined(FOP_FSYNC_TAKES_RANGE)
+ mutex_unlock(&ip->i_mutex);
+#endif
crfree(credp);
return afs_convert_code(code);