Merge branch 'nfs-for-2.6.32'
This commit is contained in:
@ -85,6 +85,11 @@ static void expkey_request(struct cache_detail *cd,
|
||||
(*bpp)[-1] = '\n';
|
||||
}
|
||||
|
||||
static int expkey_upcall(struct cache_detail *cd, struct cache_head *h)
|
||||
{
|
||||
return sunrpc_cache_pipe_upcall(cd, h, expkey_request);
|
||||
}
|
||||
|
||||
static struct svc_expkey *svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old);
|
||||
static struct svc_expkey *svc_expkey_lookup(struct svc_expkey *);
|
||||
static struct cache_detail svc_expkey_cache;
|
||||
@ -259,7 +264,7 @@ static struct cache_detail svc_expkey_cache = {
|
||||
.hash_table = expkey_table,
|
||||
.name = "nfsd.fh",
|
||||
.cache_put = expkey_put,
|
||||
.cache_request = expkey_request,
|
||||
.cache_upcall = expkey_upcall,
|
||||
.cache_parse = expkey_parse,
|
||||
.cache_show = expkey_show,
|
||||
.match = expkey_match,
|
||||
@ -355,6 +360,11 @@ static void svc_export_request(struct cache_detail *cd,
|
||||
(*bpp)[-1] = '\n';
|
||||
}
|
||||
|
||||
static int svc_export_upcall(struct cache_detail *cd, struct cache_head *h)
|
||||
{
|
||||
return sunrpc_cache_pipe_upcall(cd, h, svc_export_request);
|
||||
}
|
||||
|
||||
static struct svc_export *svc_export_update(struct svc_export *new,
|
||||
struct svc_export *old);
|
||||
static struct svc_export *svc_export_lookup(struct svc_export *);
|
||||
@ -724,7 +734,7 @@ struct cache_detail svc_export_cache = {
|
||||
.hash_table = export_table,
|
||||
.name = "nfsd.export",
|
||||
.cache_put = svc_export_put,
|
||||
.cache_request = svc_export_request,
|
||||
.cache_upcall = svc_export_upcall,
|
||||
.cache_parse = svc_export_parse,
|
||||
.cache_show = svc_export_show,
|
||||
.match = svc_export_match,
|
||||
|
@ -145,6 +145,12 @@ idtoname_request(struct cache_detail *cd, struct cache_head *ch, char **bpp,
|
||||
(*bpp)[-1] = '\n';
|
||||
}
|
||||
|
||||
static int
|
||||
idtoname_upcall(struct cache_detail *cd, struct cache_head *ch)
|
||||
{
|
||||
return sunrpc_cache_pipe_upcall(cd, ch, idtoname_request);
|
||||
}
|
||||
|
||||
static int
|
||||
idtoname_match(struct cache_head *ca, struct cache_head *cb)
|
||||
{
|
||||
@ -175,10 +181,10 @@ idtoname_show(struct seq_file *m, struct cache_detail *cd, struct cache_head *h)
|
||||
}
|
||||
|
||||
static void
|
||||
warn_no_idmapd(struct cache_detail *detail)
|
||||
warn_no_idmapd(struct cache_detail *detail, int has_died)
|
||||
{
|
||||
printk("nfsd: nfsv4 idmapping failing: has idmapd %s?\n",
|
||||
detail->last_close? "died" : "not been started");
|
||||
has_died ? "died" : "not been started");
|
||||
}
|
||||
|
||||
|
||||
@ -192,7 +198,7 @@ static struct cache_detail idtoname_cache = {
|
||||
.hash_table = idtoname_table,
|
||||
.name = "nfs4.idtoname",
|
||||
.cache_put = ent_put,
|
||||
.cache_request = idtoname_request,
|
||||
.cache_upcall = idtoname_upcall,
|
||||
.cache_parse = idtoname_parse,
|
||||
.cache_show = idtoname_show,
|
||||
.warn_no_listener = warn_no_idmapd,
|
||||
@ -324,6 +330,12 @@ nametoid_request(struct cache_detail *cd, struct cache_head *ch, char **bpp,
|
||||
(*bpp)[-1] = '\n';
|
||||
}
|
||||
|
||||
static int
|
||||
nametoid_upcall(struct cache_detail *cd, struct cache_head *ch)
|
||||
{
|
||||
return sunrpc_cache_pipe_upcall(cd, ch, nametoid_request);
|
||||
}
|
||||
|
||||
static int
|
||||
nametoid_match(struct cache_head *ca, struct cache_head *cb)
|
||||
{
|
||||
@ -363,7 +375,7 @@ static struct cache_detail nametoid_cache = {
|
||||
.hash_table = nametoid_table,
|
||||
.name = "nfs4.nametoid",
|
||||
.cache_put = ent_put,
|
||||
.cache_request = nametoid_request,
|
||||
.cache_upcall = nametoid_upcall,
|
||||
.cache_parse = nametoid_parse,
|
||||
.cache_show = nametoid_show,
|
||||
.warn_no_listener = warn_no_idmapd,
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <linux/nfsd/xdr.h>
|
||||
#include <linux/nfsd/syscall.h>
|
||||
#include <linux/lockd/lockd.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <net/ipv6.h>
|
||||
@ -490,22 +491,18 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
|
||||
*
|
||||
* Input:
|
||||
* buf: '\n'-terminated C string containing a
|
||||
* presentation format IPv4 address
|
||||
* presentation format IP address
|
||||
* size: length of C string in @buf
|
||||
* Output:
|
||||
* On success: returns zero if all specified locks were released;
|
||||
* returns one if one or more locks were not released
|
||||
* On error: return code is negative errno value
|
||||
*
|
||||
* Note: Only AF_INET client addresses are passed in
|
||||
*/
|
||||
static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
|
||||
{
|
||||
struct sockaddr_in sin = {
|
||||
.sin_family = AF_INET,
|
||||
};
|
||||
int b1, b2, b3, b4;
|
||||
char c;
|
||||
struct sockaddr_storage address;
|
||||
struct sockaddr *sap = (struct sockaddr *)&address;
|
||||
size_t salen = sizeof(address);
|
||||
char *fo_path;
|
||||
|
||||
/* sanity check */
|
||||
@ -519,14 +516,10 @@ static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
|
||||
if (qword_get(&buf, fo_path, size) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* get ipv4 address */
|
||||
if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
|
||||
if (rpc_pton(fo_path, size, sap, salen) == 0)
|
||||
return -EINVAL;
|
||||
if (b1 > 255 || b2 > 255 || b3 > 255 || b4 > 255)
|
||||
return -EINVAL;
|
||||
sin.sin_addr.s_addr = htonl((b1 << 24) | (b2 << 16) | (b3 << 8) | b4);
|
||||
|
||||
return nlmsvc_unlock_all_by_ip((struct sockaddr *)&sin);
|
||||
return nlmsvc_unlock_all_by_ip(sap);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user