linux/fs/ecryptfs/super.c
<<
typ3.1submit">Searchv 1div id.1file_contents""
. .11/a>1spa= class="comment">/**1/spa="v. .21/a>1spa= class="comment"> * eCryptfs: Linux filesystem encrypt	  >layer1/spa="v. .31/a>1spa= class="comment"> *1/spa="v. .41/a>1spa= class="comment"> * Copyright (C) 1997-2003 Erez Zadok1/spa="v. .51/a>1spa= class="comment"> * Copyright (C) 2001-2003 St  y Brook University1/spa="v. .61/a>1spa= class="comment"> * Copyright (C) 2004-2006 Internat	  al Business Machines Corp.1/spa="v. .71/a>1spa= class="comment"> *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>1/spa="v. .81/a>1spa= class="comment"> *              Michael C. Thomps  ><mcthomps@us.ibm.com>1/spa="v. .91/a>1spa= class="comment"> *1/spa="v. ion a>1spa= class="comment"> * This program is free software; you ca= redistribute it and/or1/spa="v. 111/a>1spa= class="comment"> * modify it under the terms of the GNU General Public License as1/spa="v. 121/a>1spa= class="comment"> * published by the Free Software Foundat	  ; either versi  >2 of the1/spa="v. 131/a>1spa= class="comment"> * License, or (at your value=) any>later versi  .1/spa="v. 141/a>1spa= class="comment"> *1/spa="v. 151/a>1spa= class="comment"> * This program is distributed in the hope that it will be useful, but1/spa="v. 161/a>1spa= class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of1/spa="v. 171/a>1spa= class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU1/spa="v. 181/a>1spa= class="comment"> * General Public License for more details.1/spa="v. 191/a>1spa= class="comment"> *1/spa="v. 2on a>1spa= class="comment"> * You should have received a copy of the GNU General Public License1/spa="v. 211/a>1spa= class="comment"> * along with this program; if not, write to the Free Software1/spa="v. 221/a>1spa= class="comment"> * Foundat	  , Inc., 59 Temple Place - Suite 330, Bost  , MA1/spa="v. 231/a>1spa= class="comment"> * 02111-1307, USA.1/spa="v. 241/a>1spa= class="comment"> */1/spa="v. 251/a>v. 261/a>#include><linux/fs.h1/a>>v. 271/a>#include><linux/mount.h1/a>>v. 281/a>#include><linux/key.h1/a>>v. 291/a>#include><linux/slab.h1/a>>v. 301/a>#include><linux/seq_file.h1/a>>v. 311/a>#include><linux/file.h1/a>>v. 321/a>#include><linux/crypto.h1/a>>v. 331/a>#include><linux/statfs.h1/a>>v. 341/a>#include><linux/magic.h1/a>>v. 351/a>#include>"ecryptfs_kernel.h1/a>"v. 361/a>v. 371/a>struct.1a href="+code=kmem_cache" class="sref">kmem_cache1/a> *1a href="+code=ecryptfs_inode_info_cache" class="sref">ecryptfs_inode_info_cache1/a>;v. 381/a>v. 391/a>1spa= class="comment">/**1/spa="v. 4on a>1spa= class="comment"> * ecryptfs_alloc_inode - allocate an ecryptfs inode1/spa="v. 411/a>1spa= class="comment"> * @sb: Pointer to the ecryptfs super block1/spa="v. 421/a>1spa= class="comment"> *1/spa="v. 431/a>1spa= class="comment"> * Called to bring a= inode into existence.1/spa="v. 441/a>1spa= class="comment"> *1/spa="v. 451/a>1spa= class="comment"> * Only handle allocat	  , setting up structures should be done in1/spa="v. 461/a>1spa= class="comment"> * ecryptfs_read_inode. This is because the kernel, between now and1/spa="v. 471/a>1spa= class="comment"> * the , will 0 out the private data pointer.1/spa="v. 481/a>1spa= class="comment"> *1/spa="v. 491/a>1spa= class="comment"> * Returns a pointer to a newly allocated inode, NULL otherwise1/spa="v. 5on a>1spa= class="comment"> */1/spa="v. 511/a>static struct.1a href="+code=inode" class="sref">inode1/a> *1a href="+code=ecryptfs_alloc_inode" class="sref">ecryptfs_alloc_inode1/a>(struct.1a href="+code=super_block" class="sref">super_block1/a> *1a href="+code=sb" class="sref">sb1/a>)v. 521/a>{v. 531/a>        struct.1a href="+code=ecryptfs_inode_info" class="sref">ecryptfs_inode_info1/a> *1a href="+code=inode_info" class="sref">inode_info1/a>;v. 541/a>        struct.1a href="+code=inode" class="sref">inode1/a> *1a href="+code=inode" class="sref">inode1/a> =.1a href="+code=NULL" class="sref">NULL1/a>;v. 551/a>v. 561/a>        1a href="+code=inode_info" class="sref">inode_info1/a> =.1a href="+code=kmem_cache_alloc" class="sref">kmem_cache_alloc1/a>(1a href="+code=ecryptfs_inode_info_cache" class="sref">ecryptfs_inode_info_cache1/a>,="+code=kmem_cacGFPTKLRNEL" class="sref">GFPTKLRNEL1/a>);v. 571/a>        if (1a href="+code=unlikely" class="sref">unlikely1/a>(!1a href="+code=inode_info" class="sref">inode_info1/a>))v. 581/a>                goto 1a href="+code=out" class="sref">out1/a>;v. 591/a>        1a href="+code=ecryptfs_init_crypt_stat" class="sref">ecryptfs_init_crypt_stat1/a>(&1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=crypt_stat" class="sref">crypt_stat1/a>);v. 601/a>        1a href="+code=mutex_init" class="sref">mutex_init1/a>(&1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=lower_file_mutex" class="sref">lower_file_mutex1/a>);v. 611/a>        1a href="+code=atomic_set" class="sref">atomic_set1/a>(&1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=lower_file_count" class="sref">lower_file_count1/a>,=0);v. 621/a>        1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=lower_file" class="sref">lower_file1/a> =.1a href="+code=NULL" class="sref">NULL1/a>;v. 631/a>        1a href="+code=inode" class="sref">inode1/a> =.&1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=vfs_inode" class="sref">vfs_inode1/a>;v. 641/a>1a href="+code=out" class="sref">out1/a>:v. 651/a>        return 1a href="+code=inode" class="sref">inode1/a>;v. 661/a>}v. 671/a>v. 681/a>static void 1a href="+code=ecryptfs_i_callback" class="sref">ecryptfs_i_callback1/a>(struct.1a href="+code=rcu_head" class="sref">rcu_head1/a> *1a href="+code=head" class="sref">head1/a>)v. 691/a>{v. 701/a>        struct.1a href="+code=inode" class="sref">inode1/a> *1a href="+code=inode" class="sref">inode1/a> =.1a href="+code=container_of" class="sref">container_of1/a>(1a href="+code=head" class="sref">head1/a>, struct.1a href="+code=inode" class="sref">inode1/a>,="+code=kmem_caci_rcu" class="sref">i_rcu1/a>);v. 711/a>        struct.1a href="+code=ecryptfs_inode_info" class="sref">ecryptfs_inode_info1/a> *1a href="+code=inode_info" class="sref">inode_info1/a>;v. 721/a>        1a href="+code=inode_info" class="sref">inode_info1/a> =.1a href="+code=ecryptfs_inode_to_private" class="sref">ecryptfs_inode_to_private1/a>(1a href="+code=inode" class="sref">inode1/a>);v. 731/a>v. 741/a>        1a href="+code=kmem_cache_free" class="sref">kmem_cache_free1/a>(1a href="+code=ecryptfs_inode_info_cache" class="sref">ecryptfs_inode_info_cache1/a>,="+code=kmem_cacinode_info" class="sref">inode_info1/a>);v. 751/a>}v. 761/a>v. 771/a>1spa= class="comment">/**1/spa="v. 781/a>1spa= class="comment"> * ecryptfs_destroy_inode1/spa="v. 791/a>1spa= class="comment"> * @inode: The ecryptfs inode1/spa="v. 8on a>1spa= class="comment"> *1/spa="v. 811/a>1spa= class="comment"> * This is used during the fi al destruclue= of the inode.  All1/spa="v. 821/a>1spa= class="comment"> * allocat	   of memory related to the inode, including allocated1/spa="v. 831/a>1spa= class="comment"> * memory in the crypt_stat struct, will be released here.1/spa="v. 841/a>1spa= class="comment"> * There should be no chance that this deallocat	   will be missed.1/spa="v. 851/a>1spa= class="comment"> */1/spa="v. 861/a>static void 1a href="+code=ecryptfs_destroy_inode" class="sref">ecryptfs_destroy_inode1/a>(struct.1a href="+code=inode" class="sref">inode1/a> *1a href="+code=inode" class="sref">inode1/a>)v. 871/a>{v. 881/a>        struct.1a href="+code=ecryptfs_inode_info" class="sref">ecryptfs_inode_info1/a> *1a href="+code=inode_info" class="sref">inode_info1/a>;v. 891/a>v. 901/a>        1a href="+code=inode_info" class="sref">inode_info1/a> =.1a href="+code=ecryptfs_inode_to_private" class="sref">ecryptfs_inode_to_private1/a>(1a href="+code=inode" class="sref">inode1/a>);v. 911/a>        1a href="+code=BUG_ON" class="sref">BUG_ON1/a>(1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=lower_file" class="sref">lower_file1/a>);v. 921/a>        1a href="+code=ecryptfs_destroy_crypt_stat" class="sref">ecryptfs_destroy_crypt_stat1/a>(&1a href="+code=inode_info" class="sref">inode_info1/a>->1a href="+code=crypt_stat" class="sref">crypt_stat1/a>);v. 931/a>        1a href="+code=call_rcu" class="sref">call_rcu1/a>(&1a href="+code=inode" class="sref">inode1/a>->1a href="+code=i_rcu" class="sref">i_rcu1/a>,="+code=kmem_cacecryptfs_i_callback" class="sref">ecryptfs_i_callback1/a>);v. 941/a>}v. 951/a>v. 961/a>1spa= class="comment">/**1/spa="v. 971/a>1spa= class="comment"> * ecryptfs_statfs1/spa="v. 981/a>1spa= class="comment"> * @sb: The ecryptfs super block1/spa="v. 991/a>1spa= class="comment"> * @buf: The struct.kstatfs to fill in with stats1/spa="v.100n a>1spa= class="comment"> *1/spa="v.1011/a>1spa= class="comment"> * Get the filesystem statistics. Currently, we let this pass right through1/spa="v.1021/a>1spa= class="comment"> * to the lower filesystem and take no aclue= ourselves.1/spa="v.1031/a>1spa= class="comment"> */1/spa="v.1041/a>static int.1a href="+code=ecryptfs_statfs" class="sref">ecryptfs_statfs1/a>(struct.1a href="+code=dentry" class="sref">dentry1/a> *1a href="+code=dentry" class="sref">dentry1/a>, struct.1a href="+code=kstatfs" class="sref">kstatfs1/a> *1a href="+code=buf" class="sref">buf1/a>)v.1051/a>{v.1061/a>        struct.1a href="+code=dentry" class="sref">dentry1/a> *1a href="+code=lower_dentry" class="sref">lower_dentry1/a> =.1a href="+code=ecryptfs_dentry_to_lower" class="sref">ecryptfs_dentry_to_lower1/a>(1a href="+code=dentry" class="sref">dentry1/a>);v.1071/a>        int.1a href="+code=rc" class="sref">rc1/a>;v.1081/a>v.1091/a>        if (!1a href="+code=lower_dentry" class="sref">lower_dentry1/a>->1a href="+code=d_sb" class="sref">d_sb1/a>->1a href="+code=s_op" class="sref">s_op1/a>->1a href="+code=statfs" class="sref">statfs1/a>)v.1101/a>                return -1a href="+code=ENOSYS" class="sref">ENOSYS1/a>;v.1111/a>v.1121/a>        1a href="+code=rc" class="sref">rc1/a> =.1a href="+code=lower_dentry" class="sref">lower_dentry1/a>->1a href="+code=d_sb" class="sref">d_sb1/a>->1a href="+code=s_op" class="sref">s_op1/a>->1a href="+code=statfs" class="sref">statfs1/a>(1a href="+code=lower_dentry" class="sref">lower_dentry1/a>,="+code=kmem_cacbuf" class="sref">buf1/a>);v.1131/a>        if (1a href="+code=rc" class="sref">rc1/a>)v.1141/a>                return 1a href="+code=rc" class="sref">rc1/a>;v.1151/a>v.1161/a>        1a href="+code=buf" class="sref">buf1/a>->1a href="+code=f_typ3" class="sref">f_typ31/a> =.1a href="+code=ECRYPTFS_SUPER_MAGIC" class="sref">ECRYPTFS_SUPER_MAGIC1/a>;v.1171/a>        1a href="+code=rc" class="sref">rc1/a> =.1a href="+code=ecryptfs_set_f_nam3len" class="sref">ecryptfs_set_f_nam3len1/a>(&1a href="+code=buf" class="sref">buf1/a>->1a href="+code=f_nam3len" class="sref">f_nam3len1/a>,="+code=kmem_cacbuf" class="sref">buf1/a>->1a href="+code=f_nam3len" class="sref">f_nam3len1/a>,v.1181/a>               &1a href="+code=ecryptfs_superblock_to_private" class="sref">ecryptfs_superblock_to_private1/a>(1a href="+code=dentry" class="sref">dentry1/a>->1a href="+code=d_sb" class="sref">d_sb1/a>)->1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>);v.1191/a>v.1201/a>        return 1a href="+code=rc" class="sref">rc1/a>;v.1211/a>}v.1221/a>v.1231/a>1spa= class="comment">/**1/spa="v.1241/a>1spa= class="comment"> * ecryptfs_evict_inode1/spa="v.1251/a>1spa= class="comment"> * @inode - The ecryptfs inode1/spa="v.1261/a>1spa= class="comment"> *1/spa="v.1271/a>1spa= class="comment"> * Called by iput() when the inode reference count reached zero1/spa="v.1281/a>1spa= class="comment"> * and the inode is not hashed anywhere.  Used to clear anything1/spa="v.1291/a>1spa= class="comment"> * that needs to be, before the inode is completely destroyed and put1/spa="v.13on a>1spa= class="comment"> * on the inode free list. We use this to drop out reference to the1/spa="v.1311/a>1spa= class="comment"> * lower inode.1/spa="v.1321/a>1spa= class="comment"> */1/spa="v.1331/a>static void 1a href="+code=ecryptfs_evict_inode" class="sref">ecryptfs_evict_inode1/a>(struct.1a href="+code=inode" class="sref">inode1/a> *1a href="+code=inode" class="sref">inode1/a>)v.1341/a>{v.1351/a>        1a href="+code=truncate_inode_pages" class="sref">truncate_inode_pages1/a>(&1a href="+code=inode" class="sref">inode1/a>->1a href="+code=i_data" class="sref">i_data1/a>,=0);v.1361/a>        1a href="+code=clear_inode" class="sref">clear_inode1/a>(1a href="+code=inode" class="sref">inode1/a>);v.1371/a>        1a href="+code=iput" class="sref">iput1/a>(1a href="+code=ecryptfs_inode_to_lower" class="sref">ecryptfs_inode_to_lower1/a>(1a href="+code=inode" class="sref">inode1/a>));v.1381/a>}v.1391/a>v.14on a>1spa= class="comment">/**1/spa="v.1411/a>1spa= class="comment"> * ecryptfs_show_value=s1/spa="v.1421/a>1spa= class="comment"> *1/spa="v.1431/a>1spa= class="comment"> * Prints the mount value=s for a given superblock.1/spa="v.1441/a>1spa= class="comment"> * Returns zero; does not fail.1/spa="v.1451/a>1spa= class="comment"> */1/spa="v.1461/a>static int.1a href="+code=ecryptfs_show_value=s" class="sref">ecryptfs_show_value=s1/a>(struct.1a href="+code=seq_file" class="sref">seq_file1/a> *1a href="+code=m" class="sref">m1/a>, struct.1a href="+code=dentry" class="sref">dentry1/a> *1a href="+code=root" class="sref">root1/a>)v.1471/a>{v.1481/a>        struct.1a href="+code=super_block" class="sref">super_block1/a> *1a href="+code=sb" class="sref">sb1/a> =.1a href="+code=root" class="sref">root1/a>->1a href="+code=d_sb" class="sref">d_sb1/a>;v.1491/a>        struct.1a href="+code=ecryptfs_mount_crypt_stat" class="sref">ecryptfs_mount_crypt_stat1/a> *1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a> =v.1501/a>                &1a href="+code=ecryptfs_superblock_to_private" class="sref">ecryptfs_superblock_to_private1/a>(1a href="+code=sb" class="sref">sb1/a>)->1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>;v.1511/a>        struct.1a href="+code=ecryptfs_global_auth_tok" class="sref">ecryptfs_global_auth_tok1/a> *1a href="+code=walker" class="sref">walker1/a>;v.1521/a>v.1531/a>        1a href="+code=mutex_lock" class="sref">mutex_lock1/a>(&1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_auth_tok_list_mutex" class="sref">global_auth_tok_list_mutex1/a>);v.1541/a>        1a href="+code=list_for_each_entry" class="sref">list_for_each_entry1/a>(1a href="+code=walker" class="sref">walker1/a>,v.1551/a>                            &1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_auth_tok_list" class="sref">global_auth_tok_list1/a>,v.1561/a>                            1a href="+code=mount_crypt_stat_list" class="sref">mount_crypt_stat_list1/a>) {v.1571/a>                if (1a href="+code=walker" class="sref">walker1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_AUTH_TOK_FNEK" class="sref">ECRYPTFS_AUTH_TOK_FNEK1/a>)v.1581/a>                        1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_fnek_sig=%s"walker1/a>->1a href="+code=sig" class="sref">sig1/a>);v.1591/a>                elsev.1601/a>                        1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_sig=%s"walker1/a>->1a href="+code=sig" class="sref">sig1/a>);v.1611/a>        }v.1621/a>        1a href="+code=mutex_unlock" class="sref">mutex_unlock1/a>(&1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_auth_tok_list_mutex" class="sref">global_auth_tok_list_mutex1/a>);v.1631/a>v.1641/a>        1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_cipher=%s".1651/a>                1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_default_cipher_nam3" class="sref">global_default_cipher_nam31/a>);v.1661/a>v.1671/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_default_cipher_key_siz3" class="sref">global_default_cipher_key_siz31/a>)v.1681/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_key_bytes=%zd".1691/a>                           1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=global_default_cipher_key_siz3" class="sref">global_default_cipher_key_siz31/a>);v.1701/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED" class="sref">ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED1/a>)v.1711/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_passthrough".1721/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_XATTR_METADATA_ENABLED" class="sref">ECRYPTFS_XATTR_METADATA_ENABLED1/a>)v.1731/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_xattr_metadata".1741/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_ENCRYPTED_VIEW_ENABLED" class="sref">ECRYPTFS_ENCRYPTED_VIEW_ENABLED1/a>)v.1751/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_encrypted_view".1761/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_UNLINK_SIGS" class="sref">ECRYPTFS_UNLINK_SIGS1/a>)v.1771/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_unlink_sigs".1781/a>        if (1a href="+code=mount_crypt_stat" class="sref">mount_crypt_stat1/a>->1a href="+code=flags" class="sref">flags1/a> &.1a href="+code=ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY" class="sref">ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY1/a>)v.1791/a>                1a href="+code=seq_printf" class="sref">seq_printf1/a>(1a href="+code=m" class="sref">m1/a>, 1spa= class="string">",ecryptfs_mount_auth_tok_only".18on a>v.1811/a>        return 0;v.1821/a>}v.1831/a>v.1841/a>const struct.1a href="+code=super_operalue=s" class="sref">super_operalue=s1/a> 1a href="+code=ecryptfs_sops" class="sref">ecryptfs_sops1/a> =.{v.1851/a>        .1a href="+code=alloc_inode" class="sref">alloc_inode1/a> =.1a href="+code=ecryptfs_alloc_inode" class="sref">ecryptfs_alloc_inode1/a>,v.1861/a>        .1a href="+code=destroy_inode" class="sref">destroy_inode1/a> =.1a href="+code=ecryptfs_destroy_inode" class="sref">ecryptfs_destroy_inode1/a>,v.1871/a>        .1a href="+code=statfs" class="sref">statfs1/a> =.1a href="+code=ecryptfs_statfs" class="sref">ecryptfs_statfs1/a>,v.1881/a>        .1a href="+code=remount_fs" class="sref">remount_fs1/a> =.1a href="+code=NULL" class="sref">NULL1/a>,v.1891/a>        .1a href="+code=evict_inode" class="sref">evict_inode1/a> =.1a href="+code=ecryptfs_evict_inode" class="sref">ecryptfs_evict_inode1/a>,v.1901/a>        .1a href="+code=show_value=s" class="sref">show_value=s1/a> =.1a href="+code=ecryptfs_show_value=s" class="sref">ecryptfs_show_value=s1/a>v.1911/a>};v.1921/a>
lxr.linux.no kindly hosted by Redpill Linpro AS1/a>,=provider of Linux consulting a=d operalue=s services since 1995.