list_for_each(pos, &nsm_handles) {
                nsm = list_entry(pos, struct nsm_handle, sm_link);
 
-               if (!nlm_cmp_addr(&nsm->sm_addr, sin))
+               if (hostname && nsm_use_hostnames) {
+                       if (strlen(nsm->sm_name) != hostname_len
+                        || memcmp(nsm->sm_name, hostname, hostname_len))
+                               continue;
+               } else if (!nlm_cmp_addr(&nsm->sm_addr, sin))
                        continue;
                atomic_inc(&nsm->sm_count);
                goto out;
 
        }
 
        memset(&args, 0, sizeof(args));
+       args.mon_name = nsm->sm_name;
        args.addr = nsm->sm_addr.sin_addr.s_addr;
        args.prog = NLM_PROGRAM;
        args.vers = 3;
 static u32 *
 xdr_encode_common(struct rpc_rqst *rqstp, u32 *p, struct nsm_args *argp)
 {
-       char    buffer[20];
+       char    buffer[20], *name;
 
        /*
         * Use the dotted-quad IP address of the remote host as
         * hostname first for whatever remote hostname it receives,
         * so this works alright.
         */
-       sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(argp->addr));
-       if (!(p = xdr_encode_string(p, buffer))
+       if (nsm_use_hostnames) {
+               name = argp->mon_name;
+       } else {
+               sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(argp->addr));
+               name = buffer;
+       }
+       if (!(p = xdr_encode_string(p, name))
         || !(p = xdr_encode_string(p, utsname()->nodename)))
                return ERR_PTR(-EIO);
        *p++ = htonl(argp->prog);
 
 static unsigned long           nlm_grace_period;
 static unsigned long           nlm_timeout = LOCKD_DFLT_TIMEO;
 static int                     nlm_udpport, nlm_tcpport;
+int                            nsm_use_hostnames = 0;
 
 /*
  * Constants needed for the sysctl interface.
                .extra1         = (int *) &nlm_port_min,
                .extra2         = (int *) &nlm_port_max,
        },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "nsm_use_hostnames",
+               .data           = &nsm_use_hostnames,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+       },
        { .ctl_name = 0 }
 };
 
                  &nlm_udpport, 0644);
 module_param_call(nlm_tcpport, param_set_port, param_get_int,
                  &nlm_tcpport, 0644);
+module_param(nsm_use_hostnames, bool, 0644);
 
 /*
  * Initialising and terminating the module.
 
 #endif
 extern int                     nlmsvc_grace_period;
 extern unsigned long           nlmsvc_timeout;
+extern int                     nsm_use_hostnames;
 
 /*
  * Lockd client functions
 
        u32             prog;           /* RPC callback info */
        u32             vers;
        u32             proc;
+
+       char *          mon_name;
 };
 
 /*