[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