[Devel] Тесты по CIFS
Pavel Shilovsky
=?iso-8859-1?q?piastry_=CE=C1_etersoft=2Eru?=
Пн Янв 5 16:44:36 MSK 2009
Следующий тест
def testMy(self):
slave = self.slaves[0]
slave.mark(self.id())
slave.mountL(self.shares[0], self.mountOptions[0])
file = slave.openL("%s/%s" % (self.shares[0],
self.config.get('filename','test')), os.O_RDWR, 0644)
file.setLock(Lock(LockRange(0, 500), LockType.LOCKREAD))
file.close()
slave.umount(self.shares[0])
Сборка cifs - текущая + патч:
diff --git a/sources/2.6.27/file.c b/sources/2.6.27/file.c
index c0de377..f48ecfc 100644
--- a/sources/2.6.27/file.c
+++ b/sources/2.6.27/file.c
@@ -98,7 +98,7 @@ static inline int cifs_get_disposition(unsigned int flags)
static inline int cifs_get_share_flags(unsigned int flags)
{
- return ((~(flags>>21))&7);
+ return ((~(flags>>20))&7);
}
/* all arguments to this function must be checked for validity in caller */
@@ -490,7 +490,7 @@ int cifs_close(struct inode *inode, struct file *file)
struct cifsTconInfo *pTcon;
struct cifsFileInfo *pSMBFile =
(struct cifsFileInfo *)file->private_data;
-
+ printk("closing %d\n", pSMBFile->pid);
xid = GetXid();
cifs_sb = CIFS_SB(inode->i_sb);
@@ -779,6 +779,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock
*pfLock)
(struct cifsFileInfo *)file->private_data;
if (numLock) {
+ printk("locking %d\n", fid->pid);
rc = CIFSSMBLock(xid, pTcon, netfid, length,
pfLock->fl_start,
0, numLock, lockType, wait_flag);
@@ -791,6 +792,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock
*pfLock)
} else if (numUnlock) {
/* For each stored lock that this unlock overlaps
completely, unlock it. */
+ printk("unlocking %d\n", fid->pid);
int stored_rc = 0;
struct cifsLockInfo *li, *tmp;
Были получены очень интересные результаты
Jan 5 16:36:35 tartarus kernel: locking 16499
Jan 5 16:36:35 tartarus kernel: unlocking 16499
Jan 5 16:36:35 tartarus kernel: closing 16499
То есть при закрытии файла каким-то образом сначала происходит снятие
блокировки. Это непонятно. Функция cifs_lock больше нигде не используется,
получается, что её вызывает VFS.
[piastry на tartarus 2.6.27]$ grep cifs_lock *
cifsfs.c: .lock = cifs_lock,
cifsfs.c: .lock = cifs_lock,
cifsfs.h:extern int cifs_lock(struct file *, int, struct file_lock *);
file.c:int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
в каталоге расположения драйвера.
--
Best regards,
Pavel Shilovsky.
Подробная информация о списке рассылки devel