EXPORT_SYMBOL(locks_init_lock);
 
-static void locks_copy_private(struct file_lock *new, struct file_lock *fl)
-{
-       if (fl->fl_ops) {
-               if (fl->fl_ops->fl_copy_lock)
-                       fl->fl_ops->fl_copy_lock(new, fl);
-               new->fl_ops = fl->fl_ops;
-       }
-
-       if (fl->fl_lmops) {
-               if (fl->fl_lmops->lm_get_owner)
-                       fl->fl_lmops->lm_get_owner(new, fl);
-               new->fl_lmops = fl->fl_lmops;
-       }
-}
-
 /*
  * Initialize a new lock from an existing file_lock structure.
  */
        new->fl_type = fl->fl_type;
        new->fl_start = fl->fl_start;
        new->fl_end = fl->fl_end;
+       new->fl_lmops = fl->fl_lmops;
        new->fl_ops = NULL;
-       new->fl_lmops = NULL;
+
+       if (fl->fl_lmops) {
+               if (fl->fl_lmops->lm_get_owner)
+                       fl->fl_lmops->lm_get_owner(new, fl);
+       }
 }
 EXPORT_SYMBOL(locks_copy_conflock);
 
        WARN_ON_ONCE(new->fl_ops);
 
        locks_copy_conflock(new, fl);
+
        new->fl_file = fl->fl_file;
        new->fl_ops = fl->fl_ops;
-       new->fl_lmops = fl->fl_lmops;
 
-       locks_copy_private(new, fl);
+       if (fl->fl_ops) {
+               if (fl->fl_ops->fl_copy_lock)
+                       fl->fl_ops->fl_copy_lock(new, fl);
+       }
 }
 
 EXPORT_SYMBOL(locks_copy_lock);
        if (file_lock.fl_type != F_UNLCK) {
                error = posix_lock_to_flock(&flock, &file_lock);
                if (error)
-                       goto out;
+                       goto rel_priv;
        }
        error = -EFAULT;
        if (!copy_to_user(l, &flock, sizeof(flock)))
                error = 0;
+rel_priv:
+       locks_release_private(&file_lock);
 out:
        return error;
 }
        error = -EFAULT;
        if (!copy_to_user(l, &flock, sizeof(flock)))
                error = 0;
-  
+
+       locks_release_private(&file_lock);
 out:
        return error;
 }