~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/sunrpc/rpc_pipe.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * net/sunrpc/rpc_pipe.c
  4  *
  5  * Userland/kernel interface for rpcauth_gss.
  6  * Code shamelessly plagiarized from fs/nfsd/nfsctl.c
  7  * and fs/sysfs/inode.c
  8  *
  9  * Copyright (c) 2002, Trond Myklebust <trond.myklebust@fys.uio.no>
 10  *
 11  */
 12 #include <linux/module.h>
 13 #include <linux/slab.h>
 14 #include <linux/string.h>
 15 #include <linux/pagemap.h>
 16 #include <linux/mount.h>
 17 #include <linux/fs_context.h>
 18 #include <linux/namei.h>
 19 #include <linux/fsnotify.h>
 20 #include <linux/kernel.h>
 21 #include <linux/rcupdate.h>
 22 #include <linux/utsname.h>
 23 
 24 #include <asm/ioctls.h>
 25 #include <linux/poll.h>
 26 #include <linux/wait.h>
 27 #include <linux/seq_file.h>
 28 
 29 #include <linux/sunrpc/clnt.h>
 30 #include <linux/workqueue.h>
 31 #include <linux/sunrpc/rpc_pipe_fs.h>
 32 #include <linux/sunrpc/cache.h>
 33 #include <linux/nsproxy.h>
 34 #include <linux/notifier.h>
 35 
 36 #include "netns.h"
 37 #include "sunrpc.h"
 38 
 39 #define RPCDBG_FACILITY RPCDBG_DEBUG
 40 
 41 #define NET_NAME(net)   ((net == &init_net) ? " (init_net)" : "")
 42 
 43 static struct file_system_type rpc_pipe_fs_type;
 44 static const struct rpc_pipe_ops gssd_dummy_pipe_ops;
 45 
 46 static struct kmem_cache *rpc_inode_cachep __read_mostly;
 47 
 48 #define RPC_UPCALL_TIMEOUT (30*HZ)
 49 
 50 static BLOCKING_NOTIFIER_HEAD(rpc_pipefs_notifier_list);
 51 
 52 int rpc_pipefs_notifier_register(struct notifier_block *nb)
 53 {
 54         return blocking_notifier_chain_register(&rpc_pipefs_notifier_list, nb);
 55 }
 56 EXPORT_SYMBOL_GPL(rpc_pipefs_notifier_register);
 57 
 58 void rpc_pipefs_notifier_unregister(struct notifier_block *nb)
 59 {
 60         blocking_notifier_chain_unregister(&rpc_pipefs_notifier_list, nb);
 61 }
 62 EXPORT_SYMBOL_GPL(rpc_pipefs_notifier_unregister);
 63 
 64 static void rpc_purge_list(wait_queue_head_t *waitq, struct list_head *head,
 65                 void (*destroy_msg)(struct rpc_pipe_msg *), int err)
 66 {
 67         struct rpc_pipe_msg *msg;
 68 
 69         if (list_empty(head))
 70                 return;
 71         do {
 72                 msg = list_entry(head->next, struct rpc_pipe_msg, list);
 73                 list_del_init(&msg->list);
 74                 msg->errno = err;
 75                 destroy_msg(msg);
 76         } while (!list_empty(head));
 77 
 78         if (waitq)
 79                 wake_up(waitq);
 80 }
 81 
 82 static void
 83 rpc_timeout_upcall_queue(struct work_struct *work)
 84 {
 85         LIST_HEAD(free_list);
 86         struct rpc_pipe *pipe =
 87                 container_of(work, struct rpc_pipe, queue_timeout.work);
 88         void (*destroy_msg)(struct rpc_pipe_msg *);
 89         struct dentry *dentry;
 90 
 91         spin_lock(&pipe->lock);
 92         destroy_msg = pipe->ops->destroy_msg;
 93         if (pipe->nreaders == 0) {
 94                 list_splice_init(&pipe->pipe, &free_list);
 95                 pipe->pipelen = 0;
 96         }
 97         dentry = dget(pipe->dentry);
 98         spin_unlock(&pipe->lock);
 99         rpc_purge_list(dentry ? &RPC_I(d_inode(dentry))->waitq : NULL,
100                         &free_list, destroy_msg, -ETIMEDOUT);
101         dput(dentry);
102 }
103 
104 ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg,
105                                 char __user *dst, size_t buflen)
106 {
107         char *data = (char *)msg->data + msg->copied;
108         size_t mlen = min(msg->len - msg->copied, buflen);
109         unsigned long left;
110 
111         left = copy_to_user(dst, data, mlen);
112         if (left == mlen) {
113                 msg->errno = -EFAULT;
114                 return -EFAULT;
115         }
116 
117         mlen -= left;
118         msg->copied += mlen;
119         msg->errno = 0;
120         return mlen;
121 }
122 EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall);
123 
124 /**
125  * rpc_queue_upcall - queue an upcall message to userspace
126  * @pipe: upcall pipe on which to queue given message
127  * @msg: message to queue
128  *
129  * Call with an @inode created by rpc_mkpipe() to queue an upcall.
130  * A userspace process may then later read the upcall by performing a
131  * read on an open file for this inode.  It is up to the caller to
132  * initialize the fields of @msg (other than @msg->list) appropriately.
133  */
134 int
135 rpc_queue_upcall(struct rpc_pipe *pipe, struct rpc_pipe_msg *msg)
136 {
137         int res = -EPIPE;
138         struct dentry *dentry;
139 
140         spin_lock(&pipe->lock);
141         if (pipe->nreaders) {
142                 list_add_tail(&msg->list, &pipe->pipe);
143                 pipe->pipelen += msg->len;
144                 res = 0;
145         } else if (pipe->flags & RPC_PIPE_WAIT_FOR_OPEN) {
146                 if (list_empty(&pipe->pipe))
147                         queue_delayed_work(rpciod_workqueue,
148                                         &pipe->queue_timeout,
149                                         RPC_UPCALL_TIMEOUT);
150                 list_add_tail(&msg->list, &pipe->pipe);
151                 pipe->pipelen += msg->len;
152                 res = 0;
153         }
154         dentry = dget(pipe->dentry);
155         spin_unlock(&pipe->lock);
156         if (dentry) {
157                 wake_up(&RPC_I(d_inode(dentry))->waitq);
158                 dput(dentry);
159         }
160         return res;
161 }
162 EXPORT_SYMBOL_GPL(rpc_queue_upcall);
163 
164 static inline void
165 rpc_inode_setowner(struct inode *inode, void *private)
166 {
167         RPC_I(inode)->private = private;
168 }
169 
170 static void
171 rpc_close_pipes(struct inode *inode)
172 {
173         struct rpc_pipe *pipe = RPC_I(inode)->pipe;
174         int need_release;
175         LIST_HEAD(free_list);
176 
177         inode_lock(inode);
178         spin_lock(&pipe->lock);
179         need_release = pipe->nreaders != 0 || pipe->nwriters != 0;
180         pipe->nreaders = 0;
181         list_splice_init(&pipe->in_upcall, &free_list);
182         list_splice_init(&pipe->pipe, &free_list);
183         pipe->pipelen = 0;
184         pipe->dentry = NULL;
185         spin_unlock(&pipe->lock);
186         rpc_purge_list(&RPC_I(inode)->waitq, &free_list, pipe->ops->destroy_msg, -EPIPE);
187         pipe->nwriters = 0;
188         if (need_release && pipe->ops->release_pipe)
189                 pipe->ops->release_pipe(inode);
190         cancel_delayed_work_sync(&pipe->queue_timeout);
191         rpc_inode_setowner(inode, NULL);
192         RPC_I(inode)->pipe = NULL;
193         inode_unlock(inode);
194 }
195 
196 static struct inode *
197 rpc_alloc_inode(struct super_block *sb)
198 {
199         struct rpc_inode *rpci;
200         rpci = alloc_inode_sb(sb, rpc_inode_cachep, GFP_KERNEL);
201         if (!rpci)
202                 return NULL;
203         return &rpci->vfs_inode;
204 }
205 
206 static void
207 rpc_free_inode(struct inode *inode)
208 {
209         kmem_cache_free(rpc_inode_cachep, RPC_I(inode));
210 }
211 
212 static int
213 rpc_pipe_open(struct inode *inode, struct file *filp)
214 {
215         struct rpc_pipe *pipe;
216         int first_open;
217         int res = -ENXIO;
218 
219         inode_lock(inode);
220         pipe = RPC_I(inode)->pipe;
221         if (pipe == NULL)
222                 goto out;
223         first_open = pipe->nreaders == 0 && pipe->nwriters == 0;
224         if (first_open && pipe->ops->open_pipe) {
225                 res = pipe->ops->open_pipe(inode);
226                 if (res)
227                         goto out;
228         }
229         if (filp->f_mode & FMODE_READ)
230                 pipe->nreaders++;
231         if (filp->f_mode & FMODE_WRITE)
232                 pipe->nwriters++;
233         res = 0;
234 out:
235         inode_unlock(inode);
236         return res;
237 }
238 
239 static int
240 rpc_pipe_release(struct inode *inode, struct file *filp)
241 {
242         struct rpc_pipe *pipe;
243         struct rpc_pipe_msg *msg;
244         int last_close;
245 
246         inode_lock(inode);
247         pipe = RPC_I(inode)->pipe;
248         if (pipe == NULL)
249                 goto out;
250         msg = filp->private_data;
251         if (msg != NULL) {
252                 spin_lock(&pipe->lock);
253                 msg->errno = -EAGAIN;
254                 list_del_init(&msg->list);
255                 spin_unlock(&pipe->lock);
256                 pipe->ops->destroy_msg(msg);
257         }
258         if (filp->f_mode & FMODE_WRITE)
259                 pipe->nwriters --;
260         if (filp->f_mode & FMODE_READ) {
261                 pipe->nreaders --;
262                 if (pipe->nreaders == 0) {
263                         LIST_HEAD(free_list);
264                         spin_lock(&pipe->lock);
265                         list_splice_init(&pipe->pipe, &free_list);
266                         pipe->pipelen = 0;
267                         spin_unlock(&pipe->lock);
268                         rpc_purge_list(&RPC_I(inode)->waitq, &free_list,
269                                         pipe->ops->destroy_msg, -EAGAIN);
270                 }
271         }
272         last_close = pipe->nwriters == 0 && pipe->nreaders == 0;
273         if (last_close && pipe->ops->release_pipe)
274                 pipe->ops->release_pipe(inode);
275 out:
276         inode_unlock(inode);
277         return 0;
278 }
279 
280 static ssize_t
281 rpc_pipe_read(struct file *filp, char __user *buf, size_t len, loff_t *offset)
282 {
283         struct inode *inode = file_inode(filp);
284         struct rpc_pipe *pipe;
285         struct rpc_pipe_msg *msg;
286         int res = 0;
287 
288         inode_lock(inode);
289         pipe = RPC_I(inode)->pipe;
290         if (pipe == NULL) {
291                 res = -EPIPE;
292                 goto out_unlock;
293         }
294         msg = filp->private_data;
295         if (msg == NULL) {
296                 spin_lock(&pipe->lock);
297                 if (!list_empty(&pipe->pipe)) {
298                         msg = list_entry(pipe->pipe.next,
299                                         struct rpc_pipe_msg,
300                                         list);
301                         list_move(&msg->list, &pipe->in_upcall);
302                         pipe->pipelen -= msg->len;
303                         filp->private_data = msg;
304                         msg->copied = 0;
305                 }
306                 spin_unlock(&pipe->lock);
307                 if (msg == NULL)
308                         goto out_unlock;
309         }
310         /* NOTE: it is up to the callback to update msg->copied */
311         res = pipe->ops->upcall(filp, msg, buf, len);
312         if (res < 0 || msg->len == msg->copied) {
313                 filp->private_data = NULL;
314                 spin_lock(&pipe->lock);
315                 list_del_init(&msg->list);
316                 spin_unlock(&pipe->lock);
317                 pipe->ops->destroy_msg(msg);
318         }
319 out_unlock:
320         inode_unlock(inode);
321         return res;
322 }
323 
324 static ssize_t
325 rpc_pipe_write(struct file *filp, const char __user *buf, size_t len, loff_t *offset)
326 {
327         struct inode *inode = file_inode(filp);
328         int res;
329 
330         inode_lock(inode);
331         res = -EPIPE;
332         if (RPC_I(inode)->pipe != NULL)
333                 res = RPC_I(inode)->pipe->ops->downcall(filp, buf, len);
334         inode_unlock(inode);
335         return res;
336 }
337 
338 static __poll_t
339 rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)
340 {
341         struct inode *inode = file_inode(filp);
342         struct rpc_inode *rpci = RPC_I(inode);
343         __poll_t mask = EPOLLOUT | EPOLLWRNORM;
344 
345         poll_wait(filp, &rpci->waitq, wait);
346 
347         inode_lock(inode);
348         if (rpci->pipe == NULL)
349                 mask |= EPOLLERR | EPOLLHUP;
350         else if (filp->private_data || !list_empty(&rpci->pipe->pipe))
351                 mask |= EPOLLIN | EPOLLRDNORM;
352         inode_unlock(inode);
353         return mask;
354 }
355 
356 static long
357 rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
358 {
359         struct inode *inode = file_inode(filp);
360         struct rpc_pipe *pipe;
361         int len;
362 
363         switch (cmd) {
364         case FIONREAD:
365                 inode_lock(inode);
366                 pipe = RPC_I(inode)->pipe;
367                 if (pipe == NULL) {
368                         inode_unlock(inode);
369                         return -EPIPE;
370                 }
371                 spin_lock(&pipe->lock);
372                 len = pipe->pipelen;
373                 if (filp->private_data) {
374                         struct rpc_pipe_msg *msg;
375                         msg = filp->private_data;
376                         len += msg->len - msg->copied;
377                 }
378                 spin_unlock(&pipe->lock);
379                 inode_unlock(inode);
380                 return put_user(len, (int __user *)arg);
381         default:
382                 return -EINVAL;
383         }
384 }
385 
386 static const struct file_operations rpc_pipe_fops = {
387         .owner          = THIS_MODULE,
388         .llseek         = no_llseek,
389         .read           = rpc_pipe_read,
390         .write          = rpc_pipe_write,
391         .poll           = rpc_pipe_poll,
392         .unlocked_ioctl = rpc_pipe_ioctl,
393         .open           = rpc_pipe_open,
394         .release        = rpc_pipe_release,
395 };
396 
397 static int
398 rpc_show_info(struct seq_file *m, void *v)
399 {
400         struct rpc_clnt *clnt = m->private;
401 
402         rcu_read_lock();
403         seq_printf(m, "RPC server: %s\n",
404                         rcu_dereference(clnt->cl_xprt)->servername);
405         seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_program->name,
406                         clnt->cl_prog, clnt->cl_vers);
407         seq_printf(m, "address: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR));
408         seq_printf(m, "protocol: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_PROTO));
409         seq_printf(m, "port: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_PORT));
410         rcu_read_unlock();
411         return 0;
412 }
413 
414 static int
415 rpc_info_open(struct inode *inode, struct file *file)
416 {
417         struct rpc_clnt *clnt = NULL;
418         int ret = single_open(file, rpc_show_info, NULL);
419 
420         if (!ret) {
421                 struct seq_file *m = file->private_data;
422 
423                 spin_lock(&file->f_path.dentry->d_lock);
424                 if (!d_unhashed(file->f_path.dentry))
425                         clnt = RPC_I(inode)->private;
426                 if (clnt != NULL && refcount_inc_not_zero(&clnt->cl_count)) {
427                         spin_unlock(&file->f_path.dentry->d_lock);
428                         m->private = clnt;
429                 } else {
430                         spin_unlock(&file->f_path.dentry->d_lock);
431                         single_release(inode, file);
432                         ret = -EINVAL;
433                 }
434         }
435         return ret;
436 }
437 
438 static int
439 rpc_info_release(struct inode *inode, struct file *file)
440 {
441         struct seq_file *m = file->private_data;
442         struct rpc_clnt *clnt = (struct rpc_clnt *)m->private;
443 
444         if (clnt)
445                 rpc_release_client(clnt);
446         return single_release(inode, file);
447 }
448 
449 static const struct file_operations rpc_info_operations = {
450         .owner          = THIS_MODULE,
451         .open           = rpc_info_open,
452         .read           = seq_read,
453         .llseek         = seq_lseek,
454         .release        = rpc_info_release,
455 };
456 
457 
458 /*
459  * Description of fs contents.
460  */
461 struct rpc_filelist {
462         const char *name;
463         const struct file_operations *i_fop;
464         umode_t mode;
465 };
466 
467 static struct inode *
468 rpc_get_inode(struct super_block *sb, umode_t mode)
469 {
470         struct inode *inode = new_inode(sb);
471         if (!inode)
472                 return NULL;
473         inode->i_ino = get_next_ino();
474         inode->i_mode = mode;
475         simple_inode_init_ts(inode);
476         switch (mode & S_IFMT) {
477         case S_IFDIR:
478                 inode->i_fop = &simple_dir_operations;
479                 inode->i_op = &simple_dir_inode_operations;
480                 inc_nlink(inode);
481                 break;
482         default:
483                 break;
484         }
485         return inode;
486 }
487 
488 static int __rpc_create_common(struct inode *dir, struct dentry *dentry,
489                                umode_t mode,
490                                const struct file_operations *i_fop,
491                                void *private)
492 {
493         struct inode *inode;
494 
495         d_drop(dentry);
496         inode = rpc_get_inode(dir->i_sb, mode);
497         if (!inode)
498                 goto out_err;
499         inode->i_ino = iunique(dir->i_sb, 100);
500         if (i_fop)
501                 inode->i_fop = i_fop;
502         if (private)
503                 rpc_inode_setowner(inode, private);
504         d_add(dentry, inode);
505         return 0;
506 out_err:
507         printk(KERN_WARNING "%s: %s failed to allocate inode for dentry %pd\n",
508                         __FILE__, __func__, dentry);
509         dput(dentry);
510         return -ENOMEM;
511 }
512 
513 static int __rpc_create(struct inode *dir, struct dentry *dentry,
514                         umode_t mode,
515                         const struct file_operations *i_fop,
516                         void *private)
517 {
518         int err;
519 
520         err = __rpc_create_common(dir, dentry, S_IFREG | mode, i_fop, private);
521         if (err)
522                 return err;
523         fsnotify_create(dir, dentry);
524         return 0;
525 }
526 
527 static int __rpc_mkdir(struct inode *dir, struct dentry *dentry,
528                        umode_t mode,
529                        const struct file_operations *i_fop,
530                        void *private)
531 {
532         int err;
533 
534         err = __rpc_create_common(dir, dentry, S_IFDIR | mode, i_fop, private);
535         if (err)
536                 return err;
537         inc_nlink(dir);
538         fsnotify_mkdir(dir, dentry);
539         return 0;
540 }
541 
542 static void
543 init_pipe(struct rpc_pipe *pipe)
544 {
545         pipe->nreaders = 0;
546         pipe->nwriters = 0;
547         INIT_LIST_HEAD(&pipe->in_upcall);
548         INIT_LIST_HEAD(&pipe->in_downcall);
549         INIT_LIST_HEAD(&pipe->pipe);
550         pipe->pipelen = 0;
551         INIT_DELAYED_WORK(&pipe->queue_timeout,
552                             rpc_timeout_upcall_queue);
553         pipe->ops = NULL;
554         spin_lock_init(&pipe->lock);
555         pipe->dentry = NULL;
556 }
557 
558 void rpc_destroy_pipe_data(struct rpc_pipe *pipe)
559 {
560         kfree(pipe);
561 }
562 EXPORT_SYMBOL_GPL(rpc_destroy_pipe_data);
563 
564 struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags)
565 {
566         struct rpc_pipe *pipe;
567 
568         pipe = kzalloc(sizeof(struct rpc_pipe), GFP_KERNEL);
569         if (!pipe)
570                 return ERR_PTR(-ENOMEM);
571         init_pipe(pipe);
572         pipe->ops = ops;
573         pipe->flags = flags;
574         return pipe;
575 }
576 EXPORT_SYMBOL_GPL(rpc_mkpipe_data);
577 
578 static int __rpc_mkpipe_dentry(struct inode *dir, struct dentry *dentry,
579                                umode_t mode,
580                                const struct file_operations *i_fop,
581                                void *private,
582                                struct rpc_pipe *pipe)
583 {
584         struct rpc_inode *rpci;
585         int err;
586 
587         err = __rpc_create_common(dir, dentry, S_IFIFO | mode, i_fop, private);
588         if (err)
589                 return err;
590         rpci = RPC_I(d_inode(dentry));
591         rpci->private = private;
592         rpci->pipe = pipe;
593         fsnotify_create(dir, dentry);
594         return 0;
595 }
596 
597 static int __rpc_rmdir(struct inode *dir, struct dentry *dentry)
598 {
599         int ret;
600 
601         dget(dentry);
602         ret = simple_rmdir(dir, dentry);
603         d_drop(dentry);
604         if (!ret)
605                 fsnotify_rmdir(dir, dentry);
606         dput(dentry);
607         return ret;
608 }
609 
610 static int __rpc_unlink(struct inode *dir, struct dentry *dentry)
611 {
612         int ret;
613 
614         dget(dentry);
615         ret = simple_unlink(dir, dentry);
616         d_drop(dentry);
617         if (!ret)
618                 fsnotify_unlink(dir, dentry);
619         dput(dentry);
620         return ret;
621 }
622 
623 static int __rpc_rmpipe(struct inode *dir, struct dentry *dentry)
624 {
625         struct inode *inode = d_inode(dentry);
626 
627         rpc_close_pipes(inode);
628         return __rpc_unlink(dir, dentry);
629 }
630 
631 static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent,
632                                           const char *name)
633 {
634         struct qstr q = QSTR_INIT(name, strlen(name));
635         struct dentry *dentry = d_hash_and_lookup(parent, &q);
636         if (!dentry) {
637                 dentry = d_alloc(parent, &q);
638                 if (!dentry)
639                         return ERR_PTR(-ENOMEM);
640         }
641         if (d_really_is_negative(dentry))
642                 return dentry;
643         dput(dentry);
644         return ERR_PTR(-EEXIST);
645 }
646 
647 /*
648  * FIXME: This probably has races.
649  */
650 static void __rpc_depopulate(struct dentry *parent,
651                              const struct rpc_filelist *files,
652                              int start, int eof)
653 {
654         struct inode *dir = d_inode(parent);
655         struct dentry *dentry;
656         struct qstr name;
657         int i;
658 
659         for (i = start; i < eof; i++) {
660                 name.name = files[i].name;
661                 name.len = strlen(files[i].name);
662                 dentry = d_hash_and_lookup(parent, &name);
663 
664                 if (dentry == NULL)
665                         continue;
666                 if (d_really_is_negative(dentry))
667                         goto next;
668                 switch (d_inode(dentry)->i_mode & S_IFMT) {
669                         default:
670                                 BUG();
671                         case S_IFREG:
672                                 __rpc_unlink(dir, dentry);
673                                 break;
674                         case S_IFDIR:
675                                 __rpc_rmdir(dir, dentry);
676                 }
677 next:
678                 dput(dentry);
679         }
680 }
681 
682 static void rpc_depopulate(struct dentry *parent,
683                            const struct rpc_filelist *files,
684                            int start, int eof)
685 {
686         struct inode *dir = d_inode(parent);
687 
688         inode_lock_nested(dir, I_MUTEX_CHILD);
689         __rpc_depopulate(parent, files, start, eof);
690         inode_unlock(dir);
691 }
692 
693 static int rpc_populate(struct dentry *parent,
694                         const struct rpc_filelist *files,
695                         int start, int eof,
696                         void *private)
697 {
698         struct inode *dir = d_inode(parent);
699         struct dentry *dentry;
700         int i, err;
701 
702         inode_lock(dir);
703         for (i = start; i < eof; i++) {
704                 dentry = __rpc_lookup_create_exclusive(parent, files[i].name);
705                 err = PTR_ERR(dentry);
706                 if (IS_ERR(dentry))
707                         goto out_bad;
708                 switch (files[i].mode & S_IFMT) {
709                         default:
710                                 BUG();
711                         case S_IFREG:
712                                 err = __rpc_create(dir, dentry,
713                                                 files[i].mode,
714                                                 files[i].i_fop,
715                                                 private);
716                                 break;
717                         case S_IFDIR:
718                                 err = __rpc_mkdir(dir, dentry,
719                                                 files[i].mode,
720                                                 NULL,
721                                                 private);
722                 }
723                 if (err != 0)
724                         goto out_bad;
725         }
726         inode_unlock(dir);
727         return 0;
728 out_bad:
729         __rpc_depopulate(parent, files, start, eof);
730         inode_unlock(dir);
731         printk(KERN_WARNING "%s: %s failed to populate directory %pd\n",
732                         __FILE__, __func__, parent);
733         return err;
734 }
735 
736 static struct dentry *rpc_mkdir_populate(struct dentry *parent,
737                 const char *name, umode_t mode, void *private,
738                 int (*populate)(struct dentry *, void *), void *args_populate)
739 {
740         struct dentry *dentry;
741         struct inode *dir = d_inode(parent);
742         int error;
743 
744         inode_lock_nested(dir, I_MUTEX_PARENT);
745         dentry = __rpc_lookup_create_exclusive(parent, name);
746         if (IS_ERR(dentry))
747                 goto out;
748         error = __rpc_mkdir(dir, dentry, mode, NULL, private);
749         if (error != 0)
750                 goto out_err;
751         if (populate != NULL) {
752                 error = populate(dentry, args_populate);
753                 if (error)
754                         goto err_rmdir;
755         }
756 out:
757         inode_unlock(dir);
758         return dentry;
759 err_rmdir:
760         __rpc_rmdir(dir, dentry);
761 out_err:
762         dentry = ERR_PTR(error);
763         goto out;
764 }
765 
766 static int rpc_rmdir_depopulate(struct dentry *dentry,
767                 void (*depopulate)(struct dentry *))
768 {
769         struct dentry *parent;
770         struct inode *dir;
771         int error;
772 
773         parent = dget_parent(dentry);
774         dir = d_inode(parent);
775         inode_lock_nested(dir, I_MUTEX_PARENT);
776         if (depopulate != NULL)
777                 depopulate(dentry);
778         error = __rpc_rmdir(dir, dentry);
779         inode_unlock(dir);
780         dput(parent);
781         return error;
782 }
783 
784 /**
785  * rpc_mkpipe_dentry - make an rpc_pipefs file for kernel<->userspace
786  *                     communication
787  * @parent: dentry of directory to create new "pipe" in
788  * @name: name of pipe
789  * @private: private data to associate with the pipe, for the caller's use
790  * @pipe: &rpc_pipe containing input parameters
791  *
792  * Data is made available for userspace to read by calls to
793  * rpc_queue_upcall().  The actual reads will result in calls to
794  * @ops->upcall, which will be called with the file pointer,
795  * message, and userspace buffer to copy to.
796  *
797  * Writes can come at any time, and do not necessarily have to be
798  * responses to upcalls.  They will result in calls to @msg->downcall.
799  *
800  * The @private argument passed here will be available to all these methods
801  * from the file pointer, via RPC_I(file_inode(file))->private.
802  */
803 struct dentry *rpc_mkpipe_dentry(struct dentry *parent, const char *name,
804                                  void *private, struct rpc_pipe *pipe)
805 {
806         struct dentry *dentry;
807         struct inode *dir = d_inode(parent);
808         umode_t umode = S_IFIFO | 0600;
809         int err;
810 
811         if (pipe->ops->upcall == NULL)
812                 umode &= ~0444;
813         if (pipe->ops->downcall == NULL)
814                 umode &= ~0222;
815 
816         inode_lock_nested(dir, I_MUTEX_PARENT);
817         dentry = __rpc_lookup_create_exclusive(parent, name);
818         if (IS_ERR(dentry))
819                 goto out;
820         err = __rpc_mkpipe_dentry(dir, dentry, umode, &rpc_pipe_fops,
821                                   private, pipe);
822         if (err)
823                 goto out_err;
824 out:
825         inode_unlock(dir);
826         return dentry;
827 out_err:
828         dentry = ERR_PTR(err);
829         printk(KERN_WARNING "%s: %s() failed to create pipe %pd/%s (errno = %d)\n",
830                         __FILE__, __func__, parent, name,
831                         err);
832         goto out;
833 }
834 EXPORT_SYMBOL_GPL(rpc_mkpipe_dentry);
835 
836 /**
837  * rpc_unlink - remove a pipe
838  * @dentry: dentry for the pipe, as returned from rpc_mkpipe
839  *
840  * After this call, lookups will no longer find the pipe, and any
841  * attempts to read or write using preexisting opens of the pipe will
842  * return -EPIPE.
843  */
844 int
845 rpc_unlink(struct dentry *dentry)
846 {
847         struct dentry *parent;
848         struct inode *dir;
849         int error = 0;
850 
851         parent = dget_parent(dentry);
852         dir = d_inode(parent);
853         inode_lock_nested(dir, I_MUTEX_PARENT);
854         error = __rpc_rmpipe(dir, dentry);
855         inode_unlock(dir);
856         dput(parent);
857         return error;
858 }
859 EXPORT_SYMBOL_GPL(rpc_unlink);
860 
861 /**
862  * rpc_init_pipe_dir_head - initialise a struct rpc_pipe_dir_head
863  * @pdh: pointer to struct rpc_pipe_dir_head
864  */
865 void rpc_init_pipe_dir_head(struct rpc_pipe_dir_head *pdh)
866 {
867         INIT_LIST_HEAD(&pdh->pdh_entries);
868         pdh->pdh_dentry = NULL;
869 }
870 EXPORT_SYMBOL_GPL(rpc_init_pipe_dir_head);
871 
872 /**
873  * rpc_init_pipe_dir_object - initialise a struct rpc_pipe_dir_object
874  * @pdo: pointer to struct rpc_pipe_dir_object
875  * @pdo_ops: pointer to const struct rpc_pipe_dir_object_ops
876  * @pdo_data: pointer to caller-defined data
877  */
878 void rpc_init_pipe_dir_object(struct rpc_pipe_dir_object *pdo,
879                 const struct rpc_pipe_dir_object_ops *pdo_ops,
880                 void *pdo_data)
881 {
882         INIT_LIST_HEAD(&pdo->pdo_head);
883         pdo->pdo_ops = pdo_ops;
884         pdo->pdo_data = pdo_data;
885 }
886 EXPORT_SYMBOL_GPL(rpc_init_pipe_dir_object);
887 
888 static int
889 rpc_add_pipe_dir_object_locked(struct net *net,
890                 struct rpc_pipe_dir_head *pdh,
891                 struct rpc_pipe_dir_object *pdo)
892 {
893         int ret = 0;
894 
895         if (pdh->pdh_dentry)
896                 ret = pdo->pdo_ops->create(pdh->pdh_dentry, pdo);
897         if (ret == 0)
898                 list_add_tail(&pdo->pdo_head, &pdh->pdh_entries);
899         return ret;
900 }
901 
902 static void
903 rpc_remove_pipe_dir_object_locked(struct net *net,
904                 struct rpc_pipe_dir_head *pdh,
905                 struct rpc_pipe_dir_object *pdo)
906 {
907         if (pdh->pdh_dentry)
908                 pdo->pdo_ops->destroy(pdh->pdh_dentry, pdo);
909         list_del_init(&pdo->pdo_head);
910 }
911 
912 /**
913  * rpc_add_pipe_dir_object - associate a rpc_pipe_dir_object to a directory
914  * @net: pointer to struct net
915  * @pdh: pointer to struct rpc_pipe_dir_head
916  * @pdo: pointer to struct rpc_pipe_dir_object
917  *
918  */
919 int
920 rpc_add_pipe_dir_object(struct net *net,
921                 struct rpc_pipe_dir_head *pdh,
922                 struct rpc_pipe_dir_object *pdo)
923 {
924         int ret = 0;
925 
926         if (list_empty(&pdo->pdo_head)) {
927                 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
928 
929                 mutex_lock(&sn->pipefs_sb_lock);
930                 ret = rpc_add_pipe_dir_object_locked(net, pdh, pdo);
931                 mutex_unlock(&sn->pipefs_sb_lock);
932         }
933         return ret;
934 }
935 EXPORT_SYMBOL_GPL(rpc_add_pipe_dir_object);
936 
937 /**
938  * rpc_remove_pipe_dir_object - remove a rpc_pipe_dir_object from a directory
939  * @net: pointer to struct net
940  * @pdh: pointer to struct rpc_pipe_dir_head
941  * @pdo: pointer to struct rpc_pipe_dir_object
942  *
943  */
944 void
945 rpc_remove_pipe_dir_object(struct net *net,
946                 struct rpc_pipe_dir_head *pdh,
947                 struct rpc_pipe_dir_object *pdo)
948 {
949         if (!list_empty(&pdo->pdo_head)) {
950                 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
951 
952                 mutex_lock(&sn->pipefs_sb_lock);
953                 rpc_remove_pipe_dir_object_locked(net, pdh, pdo);
954                 mutex_unlock(&sn->pipefs_sb_lock);
955         }
956 }
957 EXPORT_SYMBOL_GPL(rpc_remove_pipe_dir_object);
958 
959 /**
960  * rpc_find_or_alloc_pipe_dir_object
961  * @net: pointer to struct net
962  * @pdh: pointer to struct rpc_pipe_dir_head
963  * @match: match struct rpc_pipe_dir_object to data
964  * @alloc: allocate a new struct rpc_pipe_dir_object
965  * @data: user defined data for match() and alloc()
966  *
967  */
968 struct rpc_pipe_dir_object *
969 rpc_find_or_alloc_pipe_dir_object(struct net *net,
970                 struct rpc_pipe_dir_head *pdh,
971                 int (*match)(struct rpc_pipe_dir_object *, void *),
972                 struct rpc_pipe_dir_object *(*alloc)(void *),
973                 void *data)
974 {
975         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
976         struct rpc_pipe_dir_object *pdo;
977 
978         mutex_lock(&sn->pipefs_sb_lock);
979         list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) {
980                 if (!match(pdo, data))
981                         continue;
982                 goto out;
983         }
984         pdo = alloc(data);
985         if (!pdo)
986                 goto out;
987         rpc_add_pipe_dir_object_locked(net, pdh, pdo);
988 out:
989         mutex_unlock(&sn->pipefs_sb_lock);
990         return pdo;
991 }
992 EXPORT_SYMBOL_GPL(rpc_find_or_alloc_pipe_dir_object);
993 
994 static void
995 rpc_create_pipe_dir_objects(struct rpc_pipe_dir_head *pdh)
996 {
997         struct rpc_pipe_dir_object *pdo;
998         struct dentry *dir = pdh->pdh_dentry;
999 
1000         list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head)
1001                 pdo->pdo_ops->create(dir, pdo);
1002 }
1003 
1004 static void
1005 rpc_destroy_pipe_dir_objects(struct rpc_pipe_dir_head *pdh)
1006 {
1007         struct rpc_pipe_dir_object *pdo;
1008         struct dentry *dir = pdh->pdh_dentry;
1009 
1010         list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head)
1011                 pdo->pdo_ops->destroy(dir, pdo);
1012 }
1013 
1014 enum {
1015         RPCAUTH_info,
1016         RPCAUTH_EOF
1017 };
1018 
1019 static const struct rpc_filelist authfiles[] = {
1020         [RPCAUTH_info] = {
1021                 .name = "info",
1022                 .i_fop = &rpc_info_operations,
1023                 .mode = S_IFREG | 0400,
1024         },
1025 };
1026 
1027 static int rpc_clntdir_populate(struct dentry *dentry, void *private)
1028 {
1029         return rpc_populate(dentry,
1030                             authfiles, RPCAUTH_info, RPCAUTH_EOF,
1031                             private);
1032 }
1033 
1034 static void rpc_clntdir_depopulate(struct dentry *dentry)
1035 {
1036         rpc_depopulate(dentry, authfiles, RPCAUTH_info, RPCAUTH_EOF);
1037 }
1038 
1039 /**
1040  * rpc_create_client_dir - Create a new rpc_client directory in rpc_pipefs
1041  * @dentry: the parent of new directory
1042  * @name: the name of new directory
1043  * @rpc_client: rpc client to associate with this directory
1044  *
1045  * This creates a directory at the given @path associated with
1046  * @rpc_clnt, which will contain a file named "info" with some basic
1047  * information about the client, together with any "pipes" that may
1048  * later be created using rpc_mkpipe().
1049  */
1050 struct dentry *rpc_create_client_dir(struct dentry *dentry,
1051                                    const char *name,
1052                                    struct rpc_clnt *rpc_client)
1053 {
1054         struct dentry *ret;
1055 
1056         ret = rpc_mkdir_populate(dentry, name, 0555, NULL,
1057                                  rpc_clntdir_populate, rpc_client);
1058         if (!IS_ERR(ret)) {
1059                 rpc_client->cl_pipedir_objects.pdh_dentry = ret;
1060                 rpc_create_pipe_dir_objects(&rpc_client->cl_pipedir_objects);
1061         }
1062         return ret;
1063 }
1064 
1065 /**
1066  * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir()
1067  * @rpc_client: rpc_client for the pipe
1068  */
1069 int rpc_remove_client_dir(struct rpc_clnt *rpc_client)
1070 {
1071         struct dentry *dentry = rpc_client->cl_pipedir_objects.pdh_dentry;
1072 
1073         if (dentry == NULL)
1074                 return 0;
1075         rpc_destroy_pipe_dir_objects(&rpc_client->cl_pipedir_objects);
1076         rpc_client->cl_pipedir_objects.pdh_dentry = NULL;
1077         return rpc_rmdir_depopulate(dentry, rpc_clntdir_depopulate);
1078 }
1079 
1080 static const struct rpc_filelist cache_pipefs_files[3] = {
1081         [0] = {
1082                 .name = "channel",
1083                 .i_fop = &cache_file_operations_pipefs,
1084                 .mode = S_IFREG | 0600,
1085         },
1086         [1] = {
1087                 .name = "content",
1088                 .i_fop = &content_file_operations_pipefs,
1089                 .mode = S_IFREG | 0400,
1090         },
1091         [2] = {
1092                 .name = "flush",
1093                 .i_fop = &cache_flush_operations_pipefs,
1094                 .mode = S_IFREG | 0600,
1095         },
1096 };
1097 
1098 static int rpc_cachedir_populate(struct dentry *dentry, void *private)
1099 {
1100         return rpc_populate(dentry,
1101                             cache_pipefs_files, 0, 3,
1102                             private);
1103 }
1104 
1105 static void rpc_cachedir_depopulate(struct dentry *dentry)
1106 {
1107         rpc_depopulate(dentry, cache_pipefs_files, 0, 3);
1108 }
1109 
1110 struct dentry *rpc_create_cache_dir(struct dentry *parent, const char *name,
1111                                     umode_t umode, struct cache_detail *cd)
1112 {
1113         return rpc_mkdir_populate(parent, name, umode, NULL,
1114                         rpc_cachedir_populate, cd);
1115 }
1116 
1117 void rpc_remove_cache_dir(struct dentry *dentry)
1118 {
1119         rpc_rmdir_depopulate(dentry, rpc_cachedir_depopulate);
1120 }
1121 
1122 /*
1123  * populate the filesystem
1124  */
1125 static const struct super_operations s_ops = {
1126         .alloc_inode    = rpc_alloc_inode,
1127         .free_inode     = rpc_free_inode,
1128         .statfs         = simple_statfs,
1129 };
1130 
1131 #define RPCAUTH_GSSMAGIC 0x67596969
1132 
1133 /*
1134  * We have a single directory with 1 node in it.
1135  */
1136 enum {
1137         RPCAUTH_lockd,
1138         RPCAUTH_mount,
1139         RPCAUTH_nfs,
1140         RPCAUTH_portmap,
1141         RPCAUTH_statd,
1142         RPCAUTH_nfsd4_cb,
1143         RPCAUTH_cache,
1144         RPCAUTH_nfsd,
1145         RPCAUTH_gssd,
1146         RPCAUTH_RootEOF
1147 };
1148 
1149 static const struct rpc_filelist files[] = {
1150         [RPCAUTH_lockd] = {
1151                 .name = "lockd",
1152                 .mode = S_IFDIR | 0555,
1153         },
1154         [RPCAUTH_mount] = {
1155                 .name = "mount",
1156                 .mode = S_IFDIR | 0555,
1157         },
1158         [RPCAUTH_nfs] = {
1159                 .name = "nfs",
1160                 .mode = S_IFDIR | 0555,
1161         },
1162         [RPCAUTH_portmap] = {
1163                 .name = "portmap",
1164                 .mode = S_IFDIR | 0555,
1165         },
1166         [RPCAUTH_statd] = {
1167                 .name = "statd",
1168                 .mode = S_IFDIR | 0555,
1169         },
1170         [RPCAUTH_nfsd4_cb] = {
1171                 .name = "nfsd4_cb",
1172                 .mode = S_IFDIR | 0555,
1173         },
1174         [RPCAUTH_cache] = {
1175                 .name = "cache",
1176                 .mode = S_IFDIR | 0555,
1177         },
1178         [RPCAUTH_nfsd] = {
1179                 .name = "nfsd",
1180                 .mode = S_IFDIR | 0555,
1181         },
1182         [RPCAUTH_gssd] = {
1183                 .name = "gssd",
1184                 .mode = S_IFDIR | 0555,
1185         },
1186 };
1187 
1188 /*
1189  * This call can be used only in RPC pipefs mount notification hooks.
1190  */
1191 struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
1192                                const unsigned char *dir_name)
1193 {
1194         struct qstr dir = QSTR_INIT(dir_name, strlen(dir_name));
1195         return d_hash_and_lookup(sb->s_root, &dir);
1196 }
1197 EXPORT_SYMBOL_GPL(rpc_d_lookup_sb);
1198 
1199 int rpc_pipefs_init_net(struct net *net)
1200 {
1201         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1202 
1203         sn->gssd_dummy = rpc_mkpipe_data(&gssd_dummy_pipe_ops, 0);
1204         if (IS_ERR(sn->gssd_dummy))
1205                 return PTR_ERR(sn->gssd_dummy);
1206 
1207         mutex_init(&sn->pipefs_sb_lock);
1208         sn->pipe_version = -1;
1209         return 0;
1210 }
1211 
1212 void rpc_pipefs_exit_net(struct net *net)
1213 {
1214         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1215 
1216         rpc_destroy_pipe_data(sn->gssd_dummy);
1217 }
1218 
1219 /*
1220  * This call will be used for per network namespace operations calls.
1221  * Note: Function will be returned with pipefs_sb_lock taken if superblock was
1222  * found. This lock have to be released by rpc_put_sb_net() when all operations
1223  * will be completed.
1224  */
1225 struct super_block *rpc_get_sb_net(const struct net *net)
1226 {
1227         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1228 
1229         mutex_lock(&sn->pipefs_sb_lock);
1230         if (sn->pipefs_sb)
1231                 return sn->pipefs_sb;
1232         mutex_unlock(&sn->pipefs_sb_lock);
1233         return NULL;
1234 }
1235 EXPORT_SYMBOL_GPL(rpc_get_sb_net);
1236 
1237 void rpc_put_sb_net(const struct net *net)
1238 {
1239         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1240 
1241         WARN_ON(sn->pipefs_sb == NULL);
1242         mutex_unlock(&sn->pipefs_sb_lock);
1243 }
1244 EXPORT_SYMBOL_GPL(rpc_put_sb_net);
1245 
1246 static const struct rpc_filelist gssd_dummy_clnt_dir[] = {
1247         [0] = {
1248                 .name = "clntXX",
1249                 .mode = S_IFDIR | 0555,
1250         },
1251 };
1252 
1253 static ssize_t
1254 dummy_downcall(struct file *filp, const char __user *src, size_t len)
1255 {
1256         return -EINVAL;
1257 }
1258 
1259 static const struct rpc_pipe_ops gssd_dummy_pipe_ops = {
1260         .upcall         = rpc_pipe_generic_upcall,
1261         .downcall       = dummy_downcall,
1262 };
1263 
1264 /*
1265  * Here we present a bogus "info" file to keep rpc.gssd happy. We don't expect
1266  * that it will ever use this info to handle an upcall, but rpc.gssd expects
1267  * that this file will be there and have a certain format.
1268  */
1269 static int
1270 rpc_dummy_info_show(struct seq_file *m, void *v)
1271 {
1272         seq_printf(m, "RPC server: %s\n", utsname()->nodename);
1273         seq_printf(m, "service: foo (1) version 0\n");
1274         seq_printf(m, "address: 127.0.0.1\n");
1275         seq_printf(m, "protocol: tcp\n");
1276         seq_printf(m, "port: 0\n");
1277         return 0;
1278 }
1279 DEFINE_SHOW_ATTRIBUTE(rpc_dummy_info);
1280 
1281 static const struct rpc_filelist gssd_dummy_info_file[] = {
1282         [0] = {
1283                 .name = "info",
1284                 .i_fop = &rpc_dummy_info_fops,
1285                 .mode = S_IFREG | 0400,
1286         },
1287 };
1288 
1289 /**
1290  * rpc_gssd_dummy_populate - create a dummy gssd pipe
1291  * @root:       root of the rpc_pipefs filesystem
1292  * @pipe_data:  pipe data created when netns is initialized
1293  *
1294  * Create a dummy set of directories and a pipe that gssd can hold open to
1295  * indicate that it is up and running.
1296  */
1297 static struct dentry *
1298 rpc_gssd_dummy_populate(struct dentry *root, struct rpc_pipe *pipe_data)
1299 {
1300         int ret = 0;
1301         struct dentry *gssd_dentry;
1302         struct dentry *clnt_dentry = NULL;
1303         struct dentry *pipe_dentry = NULL;
1304         struct qstr q = QSTR_INIT(files[RPCAUTH_gssd].name,
1305                                   strlen(files[RPCAUTH_gssd].name));
1306 
1307         /* We should never get this far if "gssd" doesn't exist */
1308         gssd_dentry = d_hash_and_lookup(root, &q);
1309         if (!gssd_dentry)
1310                 return ERR_PTR(-ENOENT);
1311 
1312         ret = rpc_populate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1, NULL);
1313         if (ret) {
1314                 pipe_dentry = ERR_PTR(ret);
1315                 goto out;
1316         }
1317 
1318         q.name = gssd_dummy_clnt_dir[0].name;
1319         q.len = strlen(gssd_dummy_clnt_dir[0].name);
1320         clnt_dentry = d_hash_and_lookup(gssd_dentry, &q);
1321         if (!clnt_dentry) {
1322                 __rpc_depopulate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1);
1323                 pipe_dentry = ERR_PTR(-ENOENT);
1324                 goto out;
1325         }
1326 
1327         ret = rpc_populate(clnt_dentry, gssd_dummy_info_file, 0, 1, NULL);
1328         if (ret) {
1329                 __rpc_depopulate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1);
1330                 pipe_dentry = ERR_PTR(ret);
1331                 goto out;
1332         }
1333 
1334         pipe_dentry = rpc_mkpipe_dentry(clnt_dentry, "gssd", NULL, pipe_data);
1335         if (IS_ERR(pipe_dentry)) {
1336                 __rpc_depopulate(clnt_dentry, gssd_dummy_info_file, 0, 1);
1337                 __rpc_depopulate(gssd_dentry, gssd_dummy_clnt_dir, 0, 1);
1338         }
1339 out:
1340         dput(clnt_dentry);
1341         dput(gssd_dentry);
1342         return pipe_dentry;
1343 }
1344 
1345 static void
1346 rpc_gssd_dummy_depopulate(struct dentry *pipe_dentry)
1347 {
1348         struct dentry *clnt_dir = pipe_dentry->d_parent;
1349         struct dentry *gssd_dir = clnt_dir->d_parent;
1350 
1351         dget(pipe_dentry);
1352         __rpc_rmpipe(d_inode(clnt_dir), pipe_dentry);
1353         __rpc_depopulate(clnt_dir, gssd_dummy_info_file, 0, 1);
1354         __rpc_depopulate(gssd_dir, gssd_dummy_clnt_dir, 0, 1);
1355         dput(pipe_dentry);
1356 }
1357 
1358 static int
1359 rpc_fill_super(struct super_block *sb, struct fs_context *fc)
1360 {
1361         struct inode *inode;
1362         struct dentry *root, *gssd_dentry;
1363         struct net *net = sb->s_fs_info;
1364         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1365         int err;
1366 
1367         sb->s_blocksize = PAGE_SIZE;
1368         sb->s_blocksize_bits = PAGE_SHIFT;
1369         sb->s_magic = RPCAUTH_GSSMAGIC;
1370         sb->s_op = &s_ops;
1371         sb->s_d_op = &simple_dentry_operations;
1372         sb->s_time_gran = 1;
1373 
1374         inode = rpc_get_inode(sb, S_IFDIR | 0555);
1375         sb->s_root = root = d_make_root(inode);
1376         if (!root)
1377                 return -ENOMEM;
1378         if (rpc_populate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF, NULL))
1379                 return -ENOMEM;
1380 
1381         gssd_dentry = rpc_gssd_dummy_populate(root, sn->gssd_dummy);
1382         if (IS_ERR(gssd_dentry)) {
1383                 __rpc_depopulate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF);
1384                 return PTR_ERR(gssd_dentry);
1385         }
1386 
1387         dprintk("RPC:       sending pipefs MOUNT notification for net %x%s\n",
1388                 net->ns.inum, NET_NAME(net));
1389         mutex_lock(&sn->pipefs_sb_lock);
1390         sn->pipefs_sb = sb;
1391         err = blocking_notifier_call_chain(&rpc_pipefs_notifier_list,
1392                                            RPC_PIPEFS_MOUNT,
1393                                            sb);
1394         if (err)
1395                 goto err_depopulate;
1396         mutex_unlock(&sn->pipefs_sb_lock);
1397         return 0;
1398 
1399 err_depopulate:
1400         rpc_gssd_dummy_depopulate(gssd_dentry);
1401         blocking_notifier_call_chain(&rpc_pipefs_notifier_list,
1402                                            RPC_PIPEFS_UMOUNT,
1403                                            sb);
1404         sn->pipefs_sb = NULL;
1405         __rpc_depopulate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF);
1406         mutex_unlock(&sn->pipefs_sb_lock);
1407         return err;
1408 }
1409 
1410 bool
1411 gssd_running(struct net *net)
1412 {
1413         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1414         struct rpc_pipe *pipe = sn->gssd_dummy;
1415 
1416         return pipe->nreaders || pipe->nwriters;
1417 }
1418 EXPORT_SYMBOL_GPL(gssd_running);
1419 
1420 static int rpc_fs_get_tree(struct fs_context *fc)
1421 {
1422         return get_tree_keyed(fc, rpc_fill_super, get_net(fc->net_ns));
1423 }
1424 
1425 static void rpc_fs_free_fc(struct fs_context *fc)
1426 {
1427         if (fc->s_fs_info)
1428                 put_net(fc->s_fs_info);
1429 }
1430 
1431 static const struct fs_context_operations rpc_fs_context_ops = {
1432         .free           = rpc_fs_free_fc,
1433         .get_tree       = rpc_fs_get_tree,
1434 };
1435 
1436 static int rpc_init_fs_context(struct fs_context *fc)
1437 {
1438         put_user_ns(fc->user_ns);
1439         fc->user_ns = get_user_ns(fc->net_ns->user_ns);
1440         fc->ops = &rpc_fs_context_ops;
1441         return 0;
1442 }
1443 
1444 static void rpc_kill_sb(struct super_block *sb)
1445 {
1446         struct net *net = sb->s_fs_info;
1447         struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
1448 
1449         mutex_lock(&sn->pipefs_sb_lock);
1450         if (sn->pipefs_sb != sb) {
1451                 mutex_unlock(&sn->pipefs_sb_lock);
1452                 goto out;
1453         }
1454         sn->pipefs_sb = NULL;
1455         dprintk("RPC:       sending pipefs UMOUNT notification for net %x%s\n",
1456                 net->ns.inum, NET_NAME(net));
1457         blocking_notifier_call_chain(&rpc_pipefs_notifier_list,
1458                                            RPC_PIPEFS_UMOUNT,
1459                                            sb);
1460         mutex_unlock(&sn->pipefs_sb_lock);
1461 out:
1462         kill_litter_super(sb);
1463         put_net(net);
1464 }
1465 
1466 static struct file_system_type rpc_pipe_fs_type = {
1467         .owner          = THIS_MODULE,
1468         .name           = "rpc_pipefs",
1469         .init_fs_context = rpc_init_fs_context,
1470         .kill_sb        = rpc_kill_sb,
1471 };
1472 MODULE_ALIAS_FS("rpc_pipefs");
1473 MODULE_ALIAS("rpc_pipefs");
1474 
1475 static void
1476 init_once(void *foo)
1477 {
1478         struct rpc_inode *rpci = (struct rpc_inode *) foo;
1479 
1480         inode_init_once(&rpci->vfs_inode);
1481         rpci->private = NULL;
1482         rpci->pipe = NULL;
1483         init_waitqueue_head(&rpci->waitq);
1484 }
1485 
1486 int register_rpc_pipefs(void)
1487 {
1488         int err;
1489 
1490         rpc_inode_cachep = kmem_cache_create("rpc_inode_cache",
1491                                 sizeof(struct rpc_inode),
1492                                 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
1493                                                 SLAB_ACCOUNT),
1494                                 init_once);
1495         if (!rpc_inode_cachep)
1496                 return -ENOMEM;
1497         err = rpc_clients_notifier_register();
1498         if (err)
1499                 goto err_notifier;
1500         err = register_filesystem(&rpc_pipe_fs_type);
1501         if (err)
1502                 goto err_register;
1503         return 0;
1504 
1505 err_register:
1506         rpc_clients_notifier_unregister();
1507 err_notifier:
1508         kmem_cache_destroy(rpc_inode_cachep);
1509         return err;
1510 }
1511 
1512 void unregister_rpc_pipefs(void)
1513 {
1514         rpc_clients_notifier_unregister();
1515         unregister_filesystem(&rpc_pipe_fs_type);
1516         kmem_cache_destroy(rpc_inode_cachep);
1517 }
1518 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php