[Samba] strange locks

Matthew Hannigan
Tue, 29 Oct 2002 07:18:49 -0000

Hi,
I added these lines to smb.conf:

        kernel op locks = false
        op locks = false
        strict locking = true

so I could see some locks from the unix level.
It worked sorta, I see the locks for big files
(but not the locks I was expecting), but for little
files it shows nothing:

# ./lock_list /opt/testsambashare/mattest.doc
# ./lock_list /opt/testsambashare/contents.doc
0 22086 W 2147483539        1
0 22086 W 2147483559        1
0 22086 W 2147483599        1
(the output is l_sysid, l_pid, l_start, l_len of struct flock)

(lock_list.c source given below)

The only difference I can see is that the contents.doc is
much bigger:

# ls -l /opt/testsambashare
total 5210
-rwxrw-r--   1 matt     other    1460736 Oct 29 15:24 contents.doc
-rw-r--r--   1 matt     other    1176738 Oct 29 15:23 contents.txt
-rwxrw-r--   1 matt     other       2168 Oct 29 16:19 mattest.doc
-rwxrw-r--   1 matt     other         54 Oct 29 16:52 ~$attest.doc
-rwxrw-r--   1 matt     other         54 Oct 29 16:47 ~$ntents.doc


Why is there 3 1 byte locks at some position
way beyond the end of the file?

This is Samba 2.2.6 on Solaris 2.6.

Regards,
Matt




Here's the source.  NOTE: you will have to change it for
Linux as Linux doesn't have l_sysid in struct flock.




#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int
main (int argc, char **argv)
{
        char c;
        int fd;
        int debug = 1;

        struct flock lck;

        lck.l_whence = 0;
        lck.l_start = 0L;
        lck.l_len = 0L;

        if (-1 == (fd = open(argv[1], O_RDONLY)))
        {
                perror(argv[1]);
                exit(1);
        }
        do {
                lck.l_type = F_WRLCK;
                if(-1 == fcntl(fd, F_GETLK, &lck))
                {
                        perror("fcntl getlk");
                        exit(1);
                };
                if (lck.l_type != F_UNLCK) {
                        printf("%d %d %c %8ld %8ld\n", lck.l_sysid,
lck.l_pid,
                                (lck.l_type == F_WRLCK) ? 'W' :
'R', lck.l_start, lck.l_len);
                        /* If this lock goes to the end of the address space, no
                        * need to look further, so break out. */
                        if (lck.l_len == 0) {
                                break;
                        }
                        else {
                                /* else, look for new lock after the one just
found. */
                                lck.l_start += lck.l_len;
                                lck.l_len = 0;
                                /* printf("looking at start %d len
%d\n", lck.l_start, lck.l_len); */
                        }
                }
        } while (lck.l_type != F_UNLCK);
}