Browse Source

Merge tag 'nfsd-4.7-3' of git://linux-nfs.org/~bfields/linux

Pull lockd/locks fixes from Bruce Fields:
 "One fix for lockd soft lookups in an error path, and one fix for file
  leases on overlayfs"

* tag 'nfsd-4.7-3' of git://linux-nfs.org/~bfields/linux:
  locks: use file_inode()
  lockd: unregister notifier blocks if the service fails to come up completely
Linus Torvalds 9 năm trước cách đây
mục cha
commit
2728c57fda
2 tập tin đã thay đổi với 11 bổ sung4 xóa
  1. 10 3
      fs/lockd/svc.c
  2. 1 1
      fs/locks.c

+ 10 - 3
fs/lockd/svc.c

@@ -335,12 +335,17 @@ static struct notifier_block lockd_inet6addr_notifier = {
 };
 };
 #endif
 #endif
 
 
-static void lockd_svc_exit_thread(void)
+static void lockd_unregister_notifiers(void)
 {
 {
 	unregister_inetaddr_notifier(&lockd_inetaddr_notifier);
 	unregister_inetaddr_notifier(&lockd_inetaddr_notifier);
 #if IS_ENABLED(CONFIG_IPV6)
 #if IS_ENABLED(CONFIG_IPV6)
 	unregister_inet6addr_notifier(&lockd_inet6addr_notifier);
 	unregister_inet6addr_notifier(&lockd_inet6addr_notifier);
 #endif
 #endif
+}
+
+static void lockd_svc_exit_thread(void)
+{
+	lockd_unregister_notifiers();
 	svc_exit_thread(nlmsvc_rqst);
 	svc_exit_thread(nlmsvc_rqst);
 }
 }
 
 
@@ -462,7 +467,7 @@ int lockd_up(struct net *net)
 	 * Note: svc_serv structures have an initial use count of 1,
 	 * Note: svc_serv structures have an initial use count of 1,
 	 * so we exit through here on both success and failure.
 	 * so we exit through here on both success and failure.
 	 */
 	 */
-err_net:
+err_put:
 	svc_destroy(serv);
 	svc_destroy(serv);
 err_create:
 err_create:
 	mutex_unlock(&nlmsvc_mutex);
 	mutex_unlock(&nlmsvc_mutex);
@@ -470,7 +475,9 @@ err_create:
 
 
 err_start:
 err_start:
 	lockd_down_net(serv, net);
 	lockd_down_net(serv, net);
-	goto err_net;
+err_net:
+	lockd_unregister_notifiers();
+	goto err_put;
 }
 }
 EXPORT_SYMBOL_GPL(lockd_up);
 EXPORT_SYMBOL_GPL(lockd_up);
 
 

+ 1 - 1
fs/locks.c

@@ -1628,7 +1628,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr
 {
 {
 	struct file_lock *fl, *my_fl = NULL, *lease;
 	struct file_lock *fl, *my_fl = NULL, *lease;
 	struct dentry *dentry = filp->f_path.dentry;
 	struct dentry *dentry = filp->f_path.dentry;
-	struct inode *inode = dentry->d_inode;
+	struct inode *inode = file_inode(filp);
 	struct file_lock_context *ctx;
 	struct file_lock_context *ctx;
 	bool is_deleg = (*flp)->fl_flags & FL_DELEG;
 	bool is_deleg = (*flp)->fl_flags & FL_DELEG;
 	int error;
 	int error;