linux/fs/nfs/namespace.c
<<
val.12/spa v3 .12/formv3 .12a val.1 href="../linux+v3.760"/fs/nfs/namespace.c"> val.12img src="../.static/gfx/right.png" alt=">>"> v2/spa v3 v2spa class="lxr_search"> val ="+search" method="post" onsubmit="return do_search(this);"> val.12input typ2=vhidden" name="navtarget" n> 2=v"> val.12input typ2=vtext" name="search" id="search"> val.12butttiotyp2=vsubmit">Search val.1Prefs3 .12/a> v2/spa v3al.1 12/divv3al.1 12form ac> ="ajax+*" method="post" onsubmit="return false;"> v2input typ2=vhidden" name="ajax_lookup" id="ajax_lookup" n> 2=v"> al.1 12/formv3 al.1 12div class="headingbotttm">3 2div id="file_contents"v
1 112/a>2spa  class="comment">/*2/spa v31 122/a>2spa  class="comment"> * linux/fs/nfs/namespace.c2/spa v31 132/a>2spa  class="comment"> *2/spa v31 142/a>2spa  class="comment"> * Copyright (C) 2005 Trond Myklebust <Trond.Myklebust@netapp.com>2/spa v31 152/a>2spa  class="comment"> * - Modified by David Howells <dhowells@redhat.com>2/spa v31 162/a>2spa  class="comment"> *2/spa v31 172/a>2spa  class="comment"> * NFS namespace2/spa v31 182/a>2spa  class="comment"> */2/spa v31 192/a> 1 0"
	a>#include <linux/module.h
	a>> 1 11
	a>#include <linux/dcache.h
	a>> 1 12
	a>#include <linux/gfp.h
	a>> 1 13
	a>#include <linux/mount.h
	a>> 1 14
	a>#include <linux/namei.h
	a>> 1 15
	a>#include <linux/nfs_fs.h
	a>> 1 16
	a>#include <linux/string.h
	a>> 1 17
	a>#include <linux/sunrpc/clnt.h
	a>> 1 18
	a>#include <linux/vfs.h
	a>> 1 19
	a>#include <linux/sunrpc/gss_api.h
	a>> 1 2"
	a>#include "internal.h
	a>" 1 212/a> 1 22
	a>#define12a href="+code=NFSDBG_FACILITY" class="sref">NFSDBG_FACILITY
	a>         2a href="+code=NFSDBG_VFS" class="sref">NFSDBG_VFS2/a> 1 232/a> 1 24
	a>static void 2a href="+code=nfs_expire_auttmounts" class="sref">nfs_expire_auttmounts
	a>(struct 2a href="+code=work_struct" class="sref">work_struct
	a> *2a href="+code=work" class="sref">work
	a>); 1 252/a> 1 26
	a>static 2a href="+code=LIST_HEAD" class="sref">LIST_HEAD
	a>(2a href="+code=nfs_auttmount_list" class="sref">nfs_auttmount_list
	a>); 1 27
	a>static 2a href="+code=DECLARE_DELAYED_WORK" class="sref">DECLARE_DELAYED_WORK
	a>(2a href="+code=nfs_auttmount_task" class="sref">nfs_auttmount_task
	a>, 2a href="+code=nfs_expire_auttmounts" class="sref">nfs_expire_auttmounts
	a>); 1 28
	a>int 2a href="+code=nfs_mountpoint_expiry_timeout" class="sref">nfs_mountpoint_expiry_timeout
	a> = 500 * 2a href="+code=HZ" class="sref">HZ
	a>; 1 292/a> 1 302/a>2spa  class="comment">/*2/spa v31 312/a>2spa  class="comment"> * nfs_path - reconstruct the path given a  arbitrary dentry2/spa v31 322/a>2spa  class="comment"> * @base - used to return pointer to the end of devname part of path2/spa v31 332/a>2spa  class="comment"> * @dentry - pointer to dentry2/spa v31 342/a>2spa  class="comment"> * @buffer - result buffer2/spa v31 352/a>2spa  class="comment"> * @buflen - length of buffer2/spa v31 362/a>2spa  class="comment"> * @flags -   >
  s (see below)2/spa v31 372/a>2spa  class="comment"> *2/spa v31 382/a>2spa  class="comment"> * Helper func>
   for constructing the server pathname2/spa v31 392/a>2spa  class="comment"> * by arbitrary hashed dentry.2/spa v31 402/a>2spa  class="comment"> *2/spa v31 412/a>2spa  class="comment"> * This is mainly for use i  figuring out the path tiothe2/spa v31 422/a>2spa  class="comment"> * server side when auttmounting oiotop of a  existing parti>
  2/spa v31 432/a>2spa  class="comment"> * and i  generating /proc/mounts and friends.2/spa v31 442/a>2spa  class="comment"> *2/spa v31 452/a>2spa  class="comment"> * Supported flags:2/spa v31 462/a>2spa  class="comment"> * NFS_PATH_CANONICAL: ensureothereois exactly one1slash after2/spa v31 472/a>2spa  class="comment"> *                     the original device (export) name2/spa v31 482/a>2spa  class="comment"> *                     (if unset, the original name is returned verbatim)2/spa v31 492/a>2spa  class="comment"> */2/spa v31 502/a>char *2a href="+code=nfs_path" class="sref">nfs_path2/a>(char **2a href="+code=p" class="sref">p
	a>, struct 2a href="+code=dentry" class="sref">dentry2/a> *2a href="+code=dentry" class="sref">dentry2/a>, char *2a href="+code=buffer" class="sref">buffer2/a>, 2a href="+code=ssize_t" class="sref">ssize_t2/a> 2a href="+code=buflen" class="sref">buflen2/a>,31 51
	a>               unsigned 2a href="+code=flags" class="sref">flags
	a>)31 522/a>{31 53
	a>        char *2a href="+code=end" class="sref">end
	a>; 1 54
	a>        int 2a href="+code=namelen" class="sref">namelen
	a>; 1 55
	a>        unsigned 2a href="+code=seq" class="sref">seq
	a>; 1 56
	a>        const char *2a href="+code=base" class="sref">base
	a>; 1 572/a> 1 582/a>2a href="+code=rename_retry" class="sref">rename_retry2/a>: 1 59
	a>        2a href="+code=end" class="sref">end
	a> = 2a href="+code=buffer" class="sref">buffer2/a>+2a href="+code=buflen" class="sref">buflen2/a>; 1 60
	a>        *--2a href="+code=end" class="sref">end
	a> = 2spa  class="string">'\0'2/spa v; 1 61
	a>        2a href="+code=buflen" class="sref">buflen2/a>--; 1 622/a> 1 63
	a>        2a href="+code=seq" class="sref">seq
	a> = 2a href="+code=read_seqbegin" class="sref">read_seqbegin2/a>(&2a href="+code=rename_lock" class="sref">rename_lock
	a>); 1 64
	a>        2a href="+code=rcu_read_lock" class="sref">rcu_read_lock2/a>(); 1 65
	a>        while (1) {31 66
	a>                2a href="+code=spin_lock" class="sref">spin_lock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1 67
	a>                if (2a href="+code=IS_ROOT" class="sref">IS_ROOT
	a>(2a href="+code=dentry" class="sref">dentry2/a>))31 68
	a>                        break; 1 69
	a>                2a href="+code=namelen" class="sref">namelen
	a> = 2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_name" class="sref">d_name2/a>.2a href="+code=len" class="sref">len2/a>; 1 70
	a>                2a href="+code=buflen" class="sref">buflen2/a> -= 2a href="+code=namelen" class="sref">namelen
	a> + 1; 1 71
	a>                if (2a href="+code=buflen" class="sref">buflen2/a> < 0)31 72
	a>                        goto 2a href="+code=Elong_unlock" class="sref">Elong_unlock2/a>; 1 73
	a>                2a href="+code=end" class="sref">end
	a> -= 2a href="+code=namelen" class="sref">namelen
	a>; 1 74
	a>                2a href="+code=memcpy" class="sref">memcpy
	a>(2a href="+code=end" class="sref">end
	a>, 2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_name" class="sref">d_name2/a>.2a href="+code=name" class="sref">name2/a>, 2a href="+code=namelen" class="sref">namelen
	a>); 1 75
	a>                *--2a href="+code=end" class="sref">end
	a> = 2spa  class="string">'/'2/spa v; 1 76
	a>                2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1 77
	a>                2a href="+code=dentry" class="sref">dentry2/a> = 2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_parent" class="sref">d_parent
	a>; 1 78
	a>        } 1 79
	a>        if (2a href="+code=read_seqretry" class="sref">read_seqretry2/a>(&2a href="+code=rename_lock" class="sref">rename_lock
	a>, 2a href="+code=seq" class="sref">seq
	a>)) {31 80
	a>                2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1 81
	a>                2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1 82
	a>                goto 2a href="+code=rename_retry" class="sref">rename_retry2/a>; 1 83
	a>        } 1 84
	a>        if ((2a href="+code=flags" class="sref">flags
	a> & 2a href="+code=NFS_PATH_CANONICAL" class="sref">NFS_PATH_CANONICAL
	a>) && *2a href="+code=end" class="sref">end
	a> != 2spa  class="string">'/'2/spa v) {31 85
	a>                if (--2a href="+code=buflen" class="sref">buflen2/a> < 0) {31 86
	a>                        2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1 87
	a>                        2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1 88
	a>                        goto 2a href="+code=Elong" class="sref">Elong2/a>; 1 89
	a>                } 1 90
	a>                *--2a href="+code=end" class="sref">end
	a> = 2spa  class="string">'/'2/spa v; 1 91
	a>        } 1 92
	a>        *2a href="+code=p" class="sref">p
	a> = 2a href="+code=end" class="sref">end
	a>; 1 93
	a>        2a href="+code=base" class="sref">base
	a> = 2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_fsdata" class="sref">d_fsdata
	a>; 1 94
	a>        if (!2a href="+code=base" class="sref">base
	a>) {31 95
	a>                2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1 96
	a>                2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1 97
	a>                2a href="+code=WARN_ON" class="sref">WARN_ON2/a>(1); 1 98
	a>                return 2a href="+code=end" class="sref">end
	a>; 1 99
	a>        } 1100
	a>        2a href="+code=namelen" class="sref">namelen
	a> = 2a href="+code=strlen" class="sref">strlen
	a>(2a href="+code=base" class="sref">base
	a>); 1101
	a>        if (2a href="+code=flags" class="sref">flags
	a> & 2a href="+code=NFS_PATH_CANONICAL" class="sref">NFS_PATH_CANONICAL
	a>) {31102
	a>                2spa  class="comment">/* Strip off excess1slashes i  base string */2/spa v31103
	a>                while (2a href="+code=namelen" class="sref">namelen
	a> > 0 && 2a href="+code=base" class="sref">base
	a>[2a href="+code=namelen" class="sref">namelen
	a> - 1] == 2spa  class="string">'/'2/spa v)31104
	a>                        2a href="+code=namelen" class="sref">namelen
	a>--; 1105
	a>        } 1106
	a>        2a href="+code=buflen" class="sref">buflen2/a> -= 2a href="+code=namelen" class="sref">namelen
	a>; 1107
	a>        if (2a href="+code=buflen" class="sref">buflen2/a> < 0) {31108
	a>                2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1109
	a>                2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1110
	a>                goto 2a href="+code=Elong" class="sref">Elong2/a>; 1111
	a>        } 1112
	a>        2a href="+code=end" class="sref">end
	a> -= 2a href="+code=namelen" class="sref">namelen
	a>; 1113
	a>        2a href="+code=memcpy" class="sref">memcpy
	a>(2a href="+code=end" class="sref">end
	a>, 2a href="+code=base" class="sref">base
	a>, 2a href="+code=namelen" class="sref">namelen
	a>); 1114
	a>        2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1115
	a>        2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1116
	a>        return 2a href="+code=end" class="sref">end
	a>; 1117
	a>2a href="+code=Elong_unlock" class="sref">Elong_unlock2/a>: 1118
	a>        2a href="+code=spin_unlock" class="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_lock" class="sref">d_lock
	a>); 1119
	a>        2a href="+code=rcu_read_unlock" class="sref">rcu_read_unlock2/a>(); 1120
	a>        if (2a href="+code=read_seqretry" class="sref">read_seqretry2/a>(&2a href="+code=rename_lock" class="sref">rename_lock
	a>, 2a href="+code=seq" class="sref">seq
	a>)) 1121
	a>                goto 2a href="+code=rename_retry" class="sref">rename_retry2/a>; 1122
	a>2a href="+code=Elong" class="sref">Elong2/a>: 1123
	a>        return 2a href="+code=ERR_PTR" class="sref">ERR_PTR2/a>(-2a href="+code=ENAMETOOLONG" class="sref">ENAMETOOLONG
	a>); 1124
	a>} 11252/a>2a href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPL
	a>(2a href="+code=nfs_path" class="sref">nfs_path2/a>); 1126
	a> 11272/a>2spa  class="comment">/*2/spa v311282/a>2spa  class="comment"> * nfs_d_auttmount - Handle crossing a mountpoint tiothe server2/spa v311292/a>2spa  class="comment"> * @path - The mountpoint2/spa v311302/a>2spa  class="comment"> *2/spa v311312/a>2spa  class="comment"> * When we encounter a mountpoint tiothe server, we want to set up2/spa v311322/a>2spa  class="comment"> * a mountpoint tiothe client too, to prevent inode numbers from2/spa v311332/a>2spa  class="comment"> * colliding, and to allow "df" to work properly.2/spa v311342/a>2spa  class="comment"> * On NFSv4, we also want to allow for the fact that different2/spa v311352/a>2spa  class="comment"> * filesystems may be migrated to different servers i  a failover2/spa v311362/a>2spa  class="comment"> * situa>
  , and that different filesystems may want to use2/spa v311372/a>2spa  class="comment"> * different security flavours.2/spa v311382/a>2spa  class="comment"> */2/spa v311392/a>struct 2a href="+code=vfsmount" class="sref">vfsmount
	a> *2a href="+code=nfs_d_auttmount" class="sref">nfs_d_auttmount
	a>(struct 2a href="+code=path" class="sref">path2/a> *2a href="+code=path" class="sref">path2/a>) 11402/a>{31141
	a>        struct 2a href="+code=vfsmount" class="sref">vfsmount
	a> *2a href="+code=mnt" class="sref">mnt
	a>; 1142
	a>        struct 2a href="+code=nfs_server" class="sref">nfs_server2/a> *2a href="+code=server" class="sref">server2/a> = 2a href="+code=NFS_SERVER" class="sref">NFS_SERVER
	a>(2a href="+code=path" class="sref">path2/a>->2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_inode" class="sref">d_inode2/a>); 1143
	a>        struct 2a href="+code=nfs_fh" class="sref">nfs_fh2/a> *2a href="+code=fh" class="sref">fh2/a> = 2a href="+code=NULL" class="sref">NULL
	a>; 1144
	a>        struct 2a href="+code=nfs_fattr" class="sref">nfs_fattr2/a> *2a href="+code=fattr" class="sref">fattr2/a> = 2a href="+code=NULL" class="sref">NULL
	a>; 11452/a> 1146
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="string">"--> nfs_d_auttmount()\n"11472/a> 1148
	a>        2a href="+code=mnt" class="sref">mnt
	a> = 2a href="+code=ERR_PTR" class="sref">ERR_PTR2/a>(-2a href="+code=ESTALE" class="sref">ESTALE2/a>); 1149
	a>        if (2a href="+code=IS_ROOT" class="sref">IS_ROOT
	a>(2a href="+code=path" class="sref">path2/a>->2a href="+code=dentry" class="sref">dentry2/a>)) 1150
	a>                goto 2a href="+code=out_nofree" class="sref">out_nofree
	a>; 11512/a> 1152
	a>        2a href="+code=mnt" class="sref">mnt
	a> = 2a href="+code=ERR_PTR" class="sref">ERR_PTR2/a>(-2a href="+code=ENOMEM" class="sref">ENOMEM2/a>); 1153
	a>        2a href="+code=fh" class="sref">fh2/a> = 2a href="+code=nfs_alloc_fhandle" class="sref">nfs_alloc_fhandle2/a>(); 1154
	a>        2a href="+code=fattr" class="sref">fattr2/a> = 2a href="+code=nfs_alloc_fattr" class="sref">nfs_alloc_fattr2/a>(); 1155
	a>        if (2a href="+code=fh" class="sref">fh2/a> == 2a href="+code=NULL" class="sref">NULL
	a> || 2a href="+code=fattr" class="sref">fattr2/a> == 2a href="+code=NULL" class="sref">NULL
	a>) 1156
	a>                goto 2a href="+code=out" class="sref">out
	a>; 11572/a> 1158
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="string">"%s: enter\n"__func__2/a>); 11592/a> 1160
	a>        2a href="+code=mnt" class="sref">mnt
	a> = 2a href="+code=server" class="sref">server2/a>->2a href="+code=nfs_client" class="sref">nfs_client2/a>->2a href="+code=rpc_ops" class="sref">rpc_ops2/a>->2a href="+code=submount" class="sref">submount
	a>(2a href="+code=server" class="sref">server2/a>, 2a href="+code=path" class="sref">path2/a>->2a href="+code=dentry" class="sref">dentry2/a>, 2a href="+code=fh" class="sref">fh2/a>, 2a href="+code=fattr" class="sref">fattr2/a>); 1161
	a>        if (2a href="+code=IS_ERR" class="sref">IS_ERR
	a>(2a href="+code=mnt" class="sref">mnt
	a>)) 1162
	a>                goto 2a href="+code=out" class="sref">out
	a>; 11632/a> 1164
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="string">"%s: done, success\n"__func__2/a>); 1165
	a>        2a href="+code=mntget" class="sref">mntget
	a>(2a href="+code=mnt" class="sref">mnt
	a>); 2spa  class="comment">/* prevent immediate expira>
   */2/spa v31166
	a>        2a href="+code=mnt_set_expiry" class="sref">mnt_set_expiry
	a>(2a href="+code=mnt" class="sref">mnt
	a>, &2a href="+code=nfs_auttmount_list" class="sref">nfs_auttmount_list
	a>); 1167
	a>        2a href="+code=schedule_delayed_work" class="sref">schedule_delayed_work2/a>(&2a href="+code=nfs_auttmount_task" class="sref">nfs_auttmount_task
	a>, 2a href="+code=nfs_mountpoint_expiry_timeout" class="sref">nfs_mountpoint_expiry_timeout
	a>); 1168
	a> 1169
	a>2a href="+code=out" class="sref">out
	a>: 1170
	a>        2a href="+code=nfs_free_fattr" class="sref">nfs_free_fattr
	a>(2a href="+code=fattr" class="sref">fattr2/a>); 1171
	a>        2a href="+code=nfs_free_fhandle" class="sref">nfs_free_fhandle
	a>(2a href="+code=fh" class="sref">fh2/a>); 1172
	a>2a href="+code=out_nofree" class="sref">out_nofree
	a>: 1173
	a>        if (2a href="+code=IS_ERR" class="sref">IS_ERR
	a>(2a href="+code=mnt" class="sref">mnt
	a>)) 1174
	a>                2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="string">"<-- %s(): error %ld\n"__func__2/a>, 2a href="+code=PTR_ERR" class="sref">PTR_ERR
	a>(2a href="+code=mnt" class="sref">mnt
	a>)); 1175
	a>        else 1176
	a>                2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="string">"<-- %s() = %p\n"__func__2/a>, 2a href="+code=mnt" class="sref">mnt
	a>); 1177
	a>        return 2a href="+code=mnt" class="sref">mnt
	a>; 1178
	a>} 11792/a> 1180
	a>static int 1181
	a>2a href="+code=nfs_namespace_getattr" class="sref">nfs_namespace_getattr
	a>(struct 2a href="+code=vfsmount" class="sref">vfsmount
	a> *2a href="+code=mnt" class="sref">mnt
	a>, struct 2a href="+code=dentry" class="sref">dentry2/a> *2a href="+code=dentry" class="sref">dentry2/a>, struct 2a href="+code=kstat" class="sref">kstat2/a> *2a href="+code=stat" class="sref">stat2/a>) 11822/a>{31183
	a>        if (2a href="+code=NFS_FH" class="sref">NFS_FH
	a>(2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_inode" class="sref">d_inode2/a>)->2a href="+code=size" class="sref">size
	a> != 0)31184
	a>                return 2a href="+code=nfs_getattr" class="sref">nfs_getattr
	a>(2a href="+code=mnt" class="sref">mnt
	a>, 2a href="+code=dentry" class="sref">dentry2/a>, 2a href="+code=stat" class="sref">stat2/a>); 1185
	a>        2a href="+code=generic_fillattr" class="sref">generic_fillattr
	a>(2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_inode" class="sref">d_inode2/a>, 2a href="+code=stat" class="sref">stat2/a>); 1186
	a>        return 0; 1187
	a>} 1188
	a> 1189
	a>static int 1190
	a>2a href="+code=nfs_namespace_setattr" class="sref">nfs_namespace_setattr
	a>(struct 2a href="+code=dentry" class="sref">dentry2/a> *2a href="+code=dentry" class="sref">dentry2/a>, struct 2a href="+code=iattr" class="sref">iattr2/a> *2a href="+code=attr" class="sref">attr2/a>) 1191
	a>{31192
	a>        if (2a href="+code=NFS_FH" class="sref">NFS_FH
	a>(2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_inode" class="sref">d_inode2/a>)->2a href="+code=size" class="sref">size
	a> != 0)31193
	a>                return 2a href="+code=nfs_setattr" class="sref">nfs_setattr
	a>(2a href="+code=dentry" class="sref">dentry2/a>, 2a href="+code=attr" class="sref">attr2/a>); 1194
	a>        return -2a href="+code=EACCES" class="sref">EACCES
	a>; 1195
	a>} 1196
	a> 1197
	a>const struct 2a href="+code=inode_opera>
  s" class="sref">inode_opera>
  s
	a> 2a href="+code=nfs_mountpoint_inode_opera>
  s" class="sref">nfs_mountpoint_inode_opera>
  s
	a> = {31198
	a>        .2a href="+code=getattr" class="sref">getattr
	a>        = 2a href="+code=nfs_getattr" class="sref">nfs_getattr
	a>,31199
	a>        .2a href="+code=setattr" class="sref">setattr
	a>        = 2a href="+code=nfs_setattr" class="sref">nfs_setattr
	a>,31200
	a>}; 12012/a> 1202
	a>const struct 2a href="+code=inode_opera>
  s" class="sref">inode_opera>
  s
	a> 2a href="+code=nfs_referral_inode_opera>
  s" class="sref">nfs_referral_inode_opera>
  s
	a> = {31203
	a>        .2a href="+code=getattr" class="sref">getattr
	a>        = 2a href="+code=nfs_namespace_getattr" class="sref">nfs_namespace_getattr
	a>,31204
	a>        .2a href="+code=setattr" class="sref">setattr
	a>        = 2a href="+code=nfs_namespace_setattr" class="sref">nfs_namespace_setattr
	a>,31205
	a>}; 1206
	a> 1207
	a>static void 2a href="+code=nfs_expire_auttmounts" class="sref">nfs_expire_auttmounts
	a>(struct 2a href="+code=work_struct" class="sref">work_struct
	a> *2a href="+code=work" class="sref">work
	a>) 1208
	a>{31209
	a>        struct 2a href="+code=list_head" class="sref">list_head
	a> *2a href="+code=list" class="sref">list
	a> = &2a href="+code=nfs_auttmount_list" class="sref">nfs_auttmount_list
	a>; 1210
	a> 1211
	a>        2a href="+code=mark_mounts_for_expiry" class="sref">mark_mounts_for_expiry
	a>(2a href="+code=list" class="sref">list
	a>); 1212
	a>        if (!2a href="+code=list_empty" class="sref">list_empty
	a>(2a href="+code=list" class="sref">list
	a>)) 1213
	a>                2a href="+code=schedule_delayed_work" class="sref">schedule_delayed_work2/a>(&2a href="+code=nfs_auttmount_task" class="sref">nfs_auttmount_task
	a>, 2a href="+code=nfs_mountpoint_expiry_timeout" class="sref">nfs_mountpoint_expiry_timeout
	a>); 1214
	a>} 12152/a> 1216
	a>void 2a href="+code=nfs_release_auttmount_timer" class="sref">nfs_release_auttmount_timer2/a>(void) 1217
	a>{31218
	a>        if (2a href="+code=list_empty" class="sref">list_empty
	a>(&2a href="+code=nfs_auttmount_list" class="sref">nfs_auttmount_list
	a>)) 1219
	a>                2a href="+code=cancel_delayed_work" class="sref">cancel_delayed_work2/a>(&2a href="+code=nfs_auttmount_task" class="sref">nfs_auttmount_task
	a>); 1220
	a>} 12212/a> 12222/a>2spa  class="comment">/*2/spa v311342/ant immediate expira>
   */2/spa v311392/a>struct 2a href="+code=vfsmount" class="sref">vfsmount
o_cl en_2a href="+code=nfs_d_autto_cl en_2a href">nfs_expire_auttmounts
	n  struct 2a href="+code=nfs_server" class="sref">nfs_server2/a> *2a href="+code=servernfs_namespace_setattr
	a>,31 86
	aaaaaaaaaaaaaaaaaaaame="L56">1 56
	a>        codev" id	a>(2a href="+codv" idrvernfs_namespace_setattr
	a>,31 87
	aaaaaaaaaaaaaaaaaaaafs_expire_auttmounts
	n  scl en_2a href="+code=nfs_d_autcl en_2a href">class="sref">vfsmoa hr>->2a href="+codoa hr>-&ge=work" class="sref">work
	a>) 1208
	a>{31193
	a>             e=v_kern_2a href="+code=nfs_de=v_kern_2a hrsref">cancel_delayed_work2/a>xodv_/a>typief="+code=nfs_d_autxodv_/a>typi"sref"0mnt" class="sref">mv" id	a>(2a href="+codv" idrvernme="L211">1211
	aa hr>->2a href="+codoa hr>-&ge=wor">nfs_auttmount_task
	a>); 1220
	a>} 12212/a> 11322/*a>2spa  class="comment">/*2/spa v311332/a>_autto_e=submou -tiothe spa  class="wspa nfs_d_auttm>
  , and  ba  daref"spa  class="comment">/*2/spa v311342/a>@ode=de -td_pare directoref"spa  class="comment">/*2/spa v311352/a>@f  cl>
  " clasv4, wnew rooe dde=dentspa  class="comment">/*2/spa v311362/a>@code= clode=ibutesv4, wnew rooe =d_inodspa  class="comment">/*2/spa v311372/a>@t_tht"> *r -tio"comment"> *rrent fi"wspa per4, m_auttss="commodspa  class="comment">/*2/spa v311382/aodspa  class="comment">/*2/spa v311292/ant immediate expira>
   */2/spa v311392/a>struct 2a href="+code=vfsmount" class="sref">vfsmount
o_s2/a>->2a href="+codount
o_s2/a>-&gef">nfs_namespace_setattr
	a>(struct 2a href="+code=dentry" class="sref">dentry2/a> *2a href="+code=dentry" class="sref">dentry2/an  struct 2a href="+code=nfs_fh" class="sref">nfs_fh2/a> *2a href="+codnfs_namespace_setattr
	a>,3nfs_fattr2/a> *2a href="+code=fattnme="L211">1211
	de=rt_tht"> *r_gt;2a href="+codde=rt_tht"> *r_gs="sref">inode_operat_tht"> *r2/a>, 2a href="+_tht"> *re=work" class="sref">work
	a>) 11822/a>{31143
	a>        scl en_2a href="+code=nfs_d_autcl en_2a href">ce="L211">1211
	aa hr>->2a href="+codoa hr>-&ge=worral_inode_opera>
  s
	a> = {31204
	a>ba> *2a href="+cobe=worra class="sref">NFS_FH
	a>(2a href="+code=dentry" class="sref">dentry2>ba> *2a href="+cy2>b+codnfs_namespace_setattr
	a>,31204
	a          2a href="+code=dentry" class="sref">dentry2/a> = 2a href="+code=dentrynfs_namespace_setattr
	a>,31204
	aa>        2a href="+code=fh" class="sref"s_fh2/a> *2a href="+codnfs_namespace_setattr
	a>,31204
	aa>        2a href="+code=fattr" class="sref">faattr2/a> *2a href="+code=fattnfs_namespace_setattr
	a>,31204
	at_tht"> *r2/a>, 2a href="+_tht"> *re=wor" class="sref">fat_tht"> *r2/a>, 2a href="+_tht"> *re=wonfs_namespace_setattr
	a>,31205
	a>}; (struct 2a href="+code=vfsmount" class="sref">vfsmount
	a> *2a href="+code=mnt" class="sref">mnt
	a> = 2a href="+code=ERR_PTR" class="sref">ERR_PTR2/a>(-2a href="+code=ENOMEM" class="sref">ENOMEM2/a>); 1 56
	a>        copagd	a>(2a href="+cpagdode=mnt(6">1 5) = %p\n"(2a href="+c;list_GFP_US= 2a href="+code=GFP_US= OMEM" class="sref">ENOMEM2/a>); 1 56
	a>        codev" id	a>(2a href="+codv" idrver class="sref">ENOMEM2/a>); 11632/a> 1154
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="so_s2/a>-&got;--> nfs_d_auttmount()\n"12152/a> 1146
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class2/a>-&g_autonass="st/ss="st;<-- %s() = %p\n"12152/a> 1 87
	a>              try2/a> = 2a href="+code=dentry" class="sref">dentry2/a>->2a href="+code=d_parent" " class="sref">dentry2" id	a>(2a href="+co_" idrvere="L204">1204
	a" id	a>(2a href="+c" idrvernfs_namespace_setattr
	a>,31 87
	a>              try2/a> = 2a href="+code=dentry" class="sref">dentry2" id	a>(2a href="+co_" idrvere="L204">1204
	a" id	a>(2a href="+c" idrveruttmount()\n"1149
	a>  pagd	a>(2a href="+cpagdode=mn class="sref">fattr2/a> == 2a href="+code=NULL" class="sref">NULL
	a>) 1150
	a>              a> == 2a href=""+code=out" class="sref">out
	a>; 1211
	dev" id	a>(2a href="+codv" idrver"sref">setattr
	a>    dev" id	a>(2a href="+c    dev" id" class="sref">list_tattr
	a>(2a href="+code=dentry" class="sref">depagd	a>(2a href="+cpagdode=class="sref">__funAGE_SIZE	a>(2a href="+cnAGE_SIZErveruttmount()\n"vfsmount
	a> *2a href="+code=mntnfs_namespace_getattr
	a>(struct 2a href="+code=vfsmount" cl)6
	a>        codev" id	a>(2a href="+codv" idrver class="sref">ENOMEM2/a>); 1173
	a>        if (2a href="+code=IS_ERR" class="sref">Idev" id	a>(2a href="+codv" idrverf">nfs_auttmount_list
	a>)) 1150
	a>           handlpagd	a>(2a href="+chandlpagd" cl class="sref">ENOMEM2/a>); 1165
	a> t
	a> *2a href="+code=mnt" class="sref">ount
o_cl en_2a href="+code=nfs_d_autto_cl en_2a href">nlass="sref">fattFS_SBa> == 2a href="+FS_SB" class="sref">list_tattr
	a>(2a href="+code=dentry" class="sref">dentry2>ba> *2a href="+cy2>b+cod)mnt" class="sref">mv" id	a>(2a href="+codv" idrvernm>cancel_delayed_workaa hr>->2a href="+codoa hr>-&ge=wor">nfs_auttmount_task
	a>); out_nofree
	a>: 1167
	handlpagd	a>(2a href="+chandlpagd" cl((unsigned ode=)6
	a>        copagd	a>(2a href="+cpagdode=r">nfs_auttmount_task
	a>); out_nofree
	a>: 1119
	a>        2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="suot;%s: done, success\n"__func__2/a>); 1210
	a> 1171
	          2a href="+code=dprintk" class="sref">dprintk
	a>(2spa  class="so_s2/a>-&gotng">"<-- %s() = %p\n"nc__2/a>, 2a href="+code=mnt" class="sref">mnt
	a>); 1177
	a>        return 2a href="+code=mnt" class="sref">mnt
	a>; 1220
	a>} ERR_>11252/a>2a href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GP
o_s2/a>->2a href="+codount
o_s2/a>-&gef">mnt" class="sref">mnt
	a>); 12152/a> 11392/a>struct 2a href="+code=vfsmount" class="sref">vfsmounts2/a>->2a href="+codounts2/a>-&gef">nfs_namespace_setattr
	n  struct 2a href="+code=nfs_server" class="sref">nfs_server2/a> *2a href="+code=servernnt" class="sref">mnt
	a>, struct 2a href="+code=dentry" class="sref">dentry2/a> *2a href="+code=dentry"ine" name="L215">12152/a> 1 87
	aaaaaaaclass="sref">dentry2/an  struct 2a href="+code=nfs_fh" class="sref">nfs_fh2/a> *2a href="+codnafs_expire_auttmounts
	n  struct 2a href="+code=nfs_fattr" class="sref">nfs_fattr2/a> *2a href="+code=fatt">nfs_auttmount_list
	a>)) 1208
	a>{3 *2a href="+er2ode=mnt" class="sref">mnt
	a>; , struct 2a href="+code=dentry" class="sref">de/a>->2a href="+codd_parent" " class="sref">dentgetf/a>->2a href="+codegetf/a>-&g" class="sref">list_tattr
	a>(2a href="+code=dentrymnt" class="sref">mnt
	a>); 12212/a> 11322/* Look ithe sagainrentget itslode=ibutesvant immediate expira>
   */2/spa v31153
	er2/a> *2a href="+er2ode=mnt" class="sref">mnt
	a> = 2a href="+code=server" class="sref">server2/a>->2a href="+code=nfs_client" class="sref">nfs_client2/a>->2a href="+code=rpc_ops" class="sref">rpc_oplookupgt;2a href="+colookup" class="sref">list_/a>->2a href="+codd_parent" " class="sref">dentry2/a>->2a href="+code=d_inode" cs="sref">spin_unlock2/a>(&2a href="+code=dentry" class="sref">dentry2" id	a>(2a href="+co_" idrver" class="sref">dentry2/a>, 2a href="+code=fh" class="sref">fh2/a>, 2a href="+code=fattr" class="sref">fattr2/a>); 1154
	a>  a> == 2a href="a>  " class="sref">list_/a>->2a href="+codd_parent" r" class="sref">fattr2/a>); 1173
	a>  er2/a> *2a href="+er2ode=me" class="sref">size
	a> != 0)31123
	a>        return 2a href="+code=ERR_PTR" 173">1173
	a>  er2/a> *2a href="+er2ode=r" class="sref">fattr2/a>); 11572/a> 1193
	a>                r
o_s2/a>->2a href="+codount
o_s2/a>-&gef">nss="sref">list_tattr
	a>(2a href="+code=dentry" class="sref">dentry2/a>, 2a href="+code=fh" class="sref">fh2/a>, 2a href="+code=fattss="sref">rename_lot
	a> = 2a href="+code=server" class="sref">serve>->2a href="+code=client" class="sref">nfs_clienclrt_th2a href="+code=clrt_th" class="sref">nfs_clienau_t"> *r2/a>, 2a href="+__t"> *re=wor" class="sref">fattr2/a>); 1220
	a>} EXPORT_SYMBOL_GPs2/a>->2a href="+codounts2/a>-&gef">r" class="sref">fattr2/a>); >LXR 32">unitentry" thisent"eri>113al migrprevbytclass="srmailto:lxa@c#Lux.nocolxa@c#Lux.norvere
> lxa.c#Lux.no kindly hos filbytclass="srhttp://www.redpill-c#Lpro.nocoRedpill L#Lpro ASntry" provider"cfwL#Luxame="ulg_aut="cosref">nfs_ be micesvsinceclas5.