Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 294389
b: refs/heads/master
c: eee1732
h: refs/heads/master
i:
  294387: 1f75053
v: v3
  • Loading branch information
Stanislav Kinsbursky authored and Trond Myklebust committed Jan 31, 2012
1 parent 06cc534 commit da16d67
Show file tree
Hide file tree
Showing 8 changed files with 117 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4929d1d33fdbe8385cdd49ccd23563e9ff247ff8
refs/heads/master: eee17325f1dfbe004f1475743bab9e3d050d00f5
4 changes: 2 additions & 2 deletions trunk/fs/nfs/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@

#define NFSDBG_FACILITY NFSDBG_CLIENT

static DEFINE_SPINLOCK(nfs_client_lock);
static LIST_HEAD(nfs_client_list);
DEFINE_SPINLOCK(nfs_client_lock);
LIST_HEAD(nfs_client_list);
static LIST_HEAD(nfs_volume_list);
static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq);
#ifdef CONFIG_NFS_V4
Expand Down
75 changes: 75 additions & 0 deletions trunk/fs/nfs/idmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ int nfs_map_gid_to_group(const struct nfs_server *server, __u32 gid, char *buf,
#include <linux/nfs_fs.h>

#include "nfs4_fs.h"
#include "internal.h"

#define IDMAP_HASH_SZ 128

Expand Down Expand Up @@ -530,6 +531,80 @@ nfs_idmap_delete(struct nfs_client *clp)
kfree(idmap);
}

static int __rpc_pipefs_event(struct nfs_client *clp, unsigned long event,
struct super_block *sb)
{
int err = 0;

switch (event) {
case RPC_PIPEFS_MOUNT:
BUG_ON(clp->cl_rpcclient->cl_dentry == NULL);
err = __nfs_idmap_register(clp->cl_rpcclient->cl_dentry,
clp->cl_idmap,
clp->cl_idmap->idmap_pipe);
break;
case RPC_PIPEFS_UMOUNT:
if (clp->cl_idmap->idmap_pipe) {
struct dentry *parent;

parent = clp->cl_idmap->idmap_pipe->dentry->d_parent;
__nfs_idmap_unregister(clp->cl_idmap->idmap_pipe);
/*
* Note: This is a dirty hack. SUNRPC hook has been
* called already but simple_rmdir() call for the
* directory returned with error because of idmap pipe
* inside. Thus now we have to remove this directory
* here.
*/
if (rpc_rmdir(parent))
printk(KERN_ERR "%s: failed to remove clnt dir!\n", __func__);
}
break;
default:
printk(KERN_ERR "%s: unknown event: %ld\n", __func__, event);
return -ENOTSUPP;
}
return err;
}

static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event,
void *ptr)
{
struct super_block *sb = ptr;
struct nfs_client *clp;
int error = 0;

spin_lock(&nfs_client_lock);
list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
if (clp->net != sb->s_fs_info)
continue;
if (clp->rpc_ops != &nfs_v4_clientops)
continue;
error = __rpc_pipefs_event(clp, event, sb);
if (error)
break;
}
spin_unlock(&nfs_client_lock);
return error;
}

#define PIPEFS_NFS_PRIO 1

static struct notifier_block nfs_idmap_block = {
.notifier_call = rpc_pipefs_event,
.priority = SUNRPC_PIPEFS_NFS_PRIO,
};

int nfs_idmap_init(void)
{
return rpc_pipefs_notifier_register(&nfs_idmap_block);
}

void nfs_idmap_quit(void)
{
rpc_pipefs_notifier_unregister(&nfs_idmap_block);
}

/*
* Helper routines for manipulating the hashtable
*/
Expand Down
4 changes: 4 additions & 0 deletions trunk/fs/nfs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ static inline void nfs_fs_proc_exit(void)
{
}
#endif
#ifdef CONFIG_NFS_V4
extern spinlock_t nfs_client_lock;
extern struct list_head nfs_client_list;
#endif

/* nfs4namespace.c */
#ifdef CONFIG_NFS_V4
Expand Down
21 changes: 11 additions & 10 deletions trunk/include/linux/nfs_idmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,31 +69,32 @@ struct nfs_server;
struct nfs_fattr;
struct nfs4_string;

#ifdef CONFIG_NFS_USE_NEW_IDMAPPER

#ifdef CONFIG_NFS_V4
int nfs_idmap_init(void);
void nfs_idmap_quit(void);

static inline int nfs_idmap_new(struct nfs_client *clp)
#else
static inline int nfs_idmap_init(void)
{
return 0;
}

static inline void nfs_idmap_delete(struct nfs_client *clp)
{
}
static inline void nfs_idmap_quit(void)
{}
#endif

#else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */
#ifdef CONFIG_NFS_USE_NEW_IDMAPPER

static inline int nfs_idmap_init(void)
static inline int nfs_idmap_new(struct nfs_client *clp)
{
return 0;
}

static inline void nfs_idmap_quit(void)
static inline void nfs_idmap_delete(struct nfs_client *clp)
{
}

#else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */

int nfs_idmap_new(struct nfs_client *);
void nfs_idmap_delete(struct nfs_client *);

Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/sunrpc/rpc_pipe_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ RPC_I(struct inode *inode)
return container_of(inode, struct rpc_inode, vfs_inode);
}

enum {
SUNRPC_PIPEFS_NFS_PRIO,
SUNRPC_PIPEFS_RPC_PRIO,
};

extern int rpc_pipefs_notifier_register(struct notifier_block *);
extern void rpc_pipefs_notifier_unregister(struct notifier_block *);

Expand Down Expand Up @@ -78,6 +83,8 @@ extern struct dentry *rpc_create_cache_dir(struct dentry *,
struct cache_detail *);
extern void rpc_remove_cache_dir(struct dentry *);

extern int rpc_rmdir(struct dentry *dentry);

struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags);
void rpc_destroy_pipe_data(struct rpc_pipe *pipe);
extern struct dentry *rpc_mkpipe_dentry(struct dentry *, const char *, void *,
Expand Down
1 change: 1 addition & 0 deletions trunk/net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event,

static struct notifier_block rpc_clients_block = {
.notifier_call = rpc_pipefs_event,
.priority = SUNRPC_PIPEFS_RPC_PRIO,
};

int rpc_clients_notifier_register(void)
Expand Down
16 changes: 16 additions & 0 deletions trunk/net/sunrpc/rpc_pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,22 @@ static int __rpc_rmdir(struct inode *dir, struct dentry *dentry)
return ret;
}

int rpc_rmdir(struct dentry *dentry)
{
struct dentry *parent;
struct inode *dir;
int error;

parent = dget_parent(dentry);
dir = parent->d_inode;
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
error = __rpc_rmdir(dir, dentry);
mutex_unlock(&dir->i_mutex);
dput(parent);
return error;
}
EXPORT_SYMBOL_GPL(rpc_rmdir);

static int __rpc_unlink(struct inode *dir, struct dentry *dentry)
{
int ret;
Expand Down

0 comments on commit da16d67

Please sign in to comment.