Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * Squashfs - a compressed read only filesystem for Linux
  3  *
  4  * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
  5  * Phillip Lougher <phillip@lougher.demon.co.uk>
  6  *
  7  * This program is free software; you can redistribute it and/or
  8  * modify it under the terms of the GNU General Public License
  9  * as published by the Free Software Foundation; either version 2,
 10  * or (at your option) any later version.
 11  *
 12  * This program is distributed in the hope that it will be useful,
 13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15  * GNU General Public License for more details.
 16  *
 17  * You should have received a copy of the GNU General Public License
 18  * along with this program; if not, write to the Free Software
 19  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 20  *
 21  * id.c
 22  */
 23 
 24 /*
 25  * This file implements code to handle uids and gids.
 26  *
 27  * For space efficiency regular files store uid and gid indexes, which are
 28  * converted to 32-bit uids/gids using an id look up table.  This table is
 29  * stored compressed into metadata blocks.  A second index table is used to
 30  * locate these.  This second index table for speed of access (and because it
 31  * is small) is read at mount time and cached in memory.
 32  */
 33 
 34 #include <linux/fs.h>
 35 #include <linux/vfs.h>
 36 #include <linux/slab.h>
 37 #include <linux/zlib.h>
 38 
 39 #include "squashfs_fs.h"
 40 #include "squashfs_fs_sb.h"
 41 #include "squashfs_fs_i.h"
 42 #include "squashfs.h"
 43 
 44 /*
 45  * Map uid/gid index into real 32-bit uid/gid using the id look up table
 46  */
 47 int squashfs_get_id(struct super_block *sb, unsigned int index,
 48                                         unsigned int *id)
 49 {
 50         struct squashfs_sb_info *msblk = sb->s_fs_info;
 51         int block = SQUASHFS_ID_BLOCK(index);
 52         int offset = SQUASHFS_ID_BLOCK_OFFSET(index);
 53         u64 start_block = le64_to_cpu(msblk->id_table[block]);
 54         __le32 disk_id;
 55         int err;
 56 
 57         err = squashfs_read_metadata(sb, &disk_id, &start_block, &offset,
 58                                                         sizeof(disk_id));
 59         if (err < 0)
 60                 return err;
 61 
 62         *id = le32_to_cpu(disk_id);
 63         return 0;
 64 }
 65 
 66 
 67 /*
 68  * Read uncompressed id lookup table indexes from disk into memory
 69  */
 70 __le64 *squashfs_read_id_index_table(struct super_block *sb,
 71                         u64 id_table_start, unsigned short no_ids)
 72 {
 73         unsigned int length = SQUASHFS_ID_BLOCK_BYTES(no_ids);
 74         __le64 *id_table;
 75         int err;
 76 
 77         TRACE("In read_id_index_table, length %d\n", length);
 78 
 79         /* Allocate id lookup table indexes */
 80         id_table = kmalloc(length, GFP_KERNEL);
 81         if (id_table == NULL) {
 82                 ERROR("Failed to allocate id index table\n");
 83                 return ERR_PTR(-ENOMEM);
 84         }
 85 
 86         err = squashfs_read_table(sb, id_table, id_table_start, length);
 87         if (err < 0) {
 88                 ERROR("unable to read id index table\n");
 89                 kfree(id_table);
 90                 return ERR_PTR(err);
 91         }
 92 
 93         return id_table;
 94 }
 95 
  This page was automatically generated by the LXR engine.