linux/fs/smbfs/symlink.c
<<
>>
Prefs
   1/*
   2 *  symlink.c
   3 *
   4 *  Copyright (C) 2002 by John Newbigin
   5 *
   6 *  Please add a note about your changes to smbfs in the ChangeLog file.
   7 */
   8
   9#include <linux/kernel.h>
  10#include <linux/errno.h>
  11#include <linux/fcntl.h>
  12#include <linux/stat.h>
  13#include <linux/mm.h>
  14#include <linux/slab.h>
  15#include <linux/pagemap.h>
  16#include <linux/net.h>
  17#include <linux/namei.h>
  18
  19#include <asm/uaccess.h>
  20#include <asm/system.h>
  21
  22#include <linux/smbno.h>
  23#include <linux/smb_fs.h>
  24
  25#include "smb_debug.h"
  26#include "proto.h"
  27
  28int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname)
  29{
  30        DEBUG1("create symlink %s -> %s/%s\n", oldname, DENTRY_PATH(dentry));
  31
  32        return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname);
  33}
  34
  35static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd)
  36{
  37        char *link = __getname();
  38        DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry));
  39
  40        if (!link) {
  41                link = ERR_PTR(-ENOMEM);
  42        } else {
  43                int len = smb_proc_read_link(server_from_dentry(dentry),
  44                                                dentry, link, PATH_MAX - 1);
  45                if (len < 0) {
  46                        __putname(link);
  47                        link = ERR_PTR(len);
  48                } else {
  49                        link[len] = 0;
  50                }
  51        }
  52        nd_set_link(nd, link);
  53        return NULL;
  54}
  55
  56static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
  57{
  58        char *s = nd_get_link(nd);
  59        if (!IS_ERR(s))
  60                __putname(s);
  61}
  62
  63const struct inode_operations smb_link_inode_operations =
  64{
  65        .readlink       = generic_readlink,
  66        .follow_link    = smb_follow_link,
  67        .put_link       = smb_put_link,
  68};
  69