]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/cifs/file.c
Merge tag 'locks-v3.20-1' of git://git.samba.org/jlayton/linux
[karo-tx-linux.git] / fs / cifs / file.c
index 74f12877493ac6c3f87792192b8aa8c1190f3c05..c1a86764bbf7b8519c6629007fa3de8bfa54e3eb 100644 (file)
@@ -1113,11 +1113,6 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
        return rc;
 }
 
-/* copied from fs/locks.c with a name change */
-#define cifs_for_each_lock(inode, lockp) \
-       for (lockp = &inode->i_flock; *lockp != NULL; \
-            lockp = &(*lockp)->fl_next)
-
 struct lock_to_push {
        struct list_head llist;
        __u64 offset;
@@ -1132,8 +1127,9 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
 {
        struct inode *inode = cfile->dentry->d_inode;
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
-       struct file_lock *flock, **before;
-       unsigned int count = 0, i = 0;
+       struct file_lock *flock;
+       struct file_lock_context *flctx = inode->i_flctx;
+       unsigned int i;
        int rc = 0, xid, type;
        struct list_head locks_to_send, *el;
        struct lock_to_push *lck, *tmp;
@@ -1141,21 +1137,17 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
 
        xid = get_xid();
 
-       spin_lock(&inode->i_lock);
-       cifs_for_each_lock(inode, before) {
-               if ((*before)->fl_flags & FL_POSIX)
-                       count++;
-       }
-       spin_unlock(&inode->i_lock);
+       if (!flctx)
+               goto out;
 
        INIT_LIST_HEAD(&locks_to_send);
 
        /*
-        * Allocating count locks is enough because no FL_POSIX locks can be
-        * added to the list while we are holding cinode->lock_sem that
+        * Allocating flc_posix_cnt locks is enough because no FL_POSIX locks
+        * can be added to the list while we are holding cinode->lock_sem that
         * protects locking operations of this inode.
         */
-       for (; i < count; i++) {
+       for (i = 0; i < flctx->flc_posix_cnt; i++) {
                lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL);
                if (!lck) {
                        rc = -ENOMEM;
@@ -1165,11 +1157,8 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
        }
 
        el = locks_to_send.next;
-       spin_lock(&inode->i_lock);
-       cifs_for_each_lock(inode, before) {
-               flock = *before;
-               if ((flock->fl_flags & FL_POSIX) == 0)
-                       continue;
+       spin_lock(&flctx->flc_lock);
+       list_for_each_entry(flock, &flctx->flc_posix, fl_list) {
                if (el == &locks_to_send) {
                        /*
                         * The list ended. We don't have enough allocated
@@ -1189,9 +1178,8 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile)
                lck->length = length;
                lck->type = type;
                lck->offset = flock->fl_start;
-               el = el->next;
        }
-       spin_unlock(&inode->i_lock);
+       spin_unlock(&flctx->flc_lock);
 
        list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
                int stored_rc;