Merge tag 'soc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[cascardo/linux.git] / fs / lockd / svcsubs.c
index d12ff4e..665ef5a 100644 (file)
@@ -164,12 +164,15 @@ nlm_traverse_locks(struct nlm_host *host, struct nlm_file *file,
 {
        struct inode     *inode = nlmsvc_file_inode(file);
        struct file_lock *fl;
+       struct file_lock_context *flctx = inode->i_flctx;
        struct nlm_host  *lockhost;
 
+       if (!flctx || list_empty_careful(&flctx->flc_posix))
+               return 0;
 again:
        file->f_locks = 0;
-       spin_lock(&inode->i_lock);
-       for (fl = inode->i_flock; fl; fl = fl->fl_next) {
+       spin_lock(&flctx->flc_lock);
+       list_for_each_entry(fl, &flctx->flc_posix, fl_list) {
                if (fl->fl_lmops != &nlmsvc_lock_operations)
                        continue;
 
@@ -180,7 +183,7 @@ again:
                if (match(lockhost, host)) {
                        struct file_lock lock = *fl;
 
-                       spin_unlock(&inode->i_lock);
+                       spin_unlock(&flctx->flc_lock);
                        lock.fl_type  = F_UNLCK;
                        lock.fl_start = 0;
                        lock.fl_end   = OFFSET_MAX;
@@ -192,7 +195,7 @@ again:
                        goto again;
                }
        }
-       spin_unlock(&inode->i_lock);
+       spin_unlock(&flctx->flc_lock);
 
        return 0;
 }
@@ -223,18 +226,21 @@ nlm_file_inuse(struct nlm_file *file)
 {
        struct inode     *inode = nlmsvc_file_inode(file);
        struct file_lock *fl;
+       struct file_lock_context *flctx = inode->i_flctx;
 
        if (file->f_count || !list_empty(&file->f_blocks) || file->f_shares)
                return 1;
 
-       spin_lock(&inode->i_lock);
-       for (fl = inode->i_flock; fl; fl = fl->fl_next) {
-               if (fl->fl_lmops == &nlmsvc_lock_operations) {
-                       spin_unlock(&inode->i_lock);
-                       return 1;
+       if (flctx && !list_empty_careful(&flctx->flc_posix)) {
+               spin_lock(&flctx->flc_lock);
+               list_for_each_entry(fl, &flctx->flc_posix, fl_list) {
+                       if (fl->fl_lmops == &nlmsvc_lock_operations) {
+                               spin_unlock(&flctx->flc_lock);
+                               return 1;
+                       }
                }
+               spin_unlock(&flctx->flc_lock);
        }
-       spin_unlock(&inode->i_lock);
        file->f_locks = 0;
        return 0;
 }