ext_attr.c revision 126a291c768b523bc228b276d3bea82675a86d09
103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)/* 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * ext_attr.c --- extended attribute blocks 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Copyright (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Copyright (C) 2002 Theodore Ts'o. 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * %Begin-Header% 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Public 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * License. 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * %End-Header% 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) */ 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <stdio.h> 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if HAVE_UNISTD_H 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <unistd.h> 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <string.h> 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <time.h> 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ext2_fs.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ext2_ext_attr.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ext2fs.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierrcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errcode_t retval; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci retval = io_channel_read_blk(fs->io, block, 1, buf); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (retval) 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return retval; 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef WORDS_BIGENDIAN 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ext2fs_swap_ext_attr(buf, buf, fs->blocksize, 1); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierrcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block, void *inbuf) 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci errcode_t retval; 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char *write_buf; 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) char *buf = NULL; 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 45#ifdef WORDS_BIGENDIAN 46 retval = ext2fs_get_mem(fs->blocksize, &buf); 47 if (retval) 48 return retval; 49 write_buf = buf; 50 ext2fs_swap_ext_attr(buf, inbuf, fs->blocksize, 1); 51#else 52 write_buf = (char *) inbuf; 53#endif 54 retval = io_channel_write_blk(fs->io, block, 1, write_buf); 55 if (buf) 56 ext2fs_free_mem(&buf); 57 if (!retval) 58 ext2fs_mark_changed(fs); 59 return retval; 60} 61 62/* 63 * This function adjusts the reference count of the EA block. 64 */ 65errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk, 66 char *block_buf, int adjust, 67 __u32 *newcount) 68{ 69 errcode_t retval; 70 struct ext2_ext_attr_header *header; 71 char *buf = 0; 72 73 if ((blk >= fs->super->s_blocks_count) || 74 (blk < fs->super->s_first_data_block)) 75 return EXT2_ET_BAD_EA_BLOCK_NUM; 76 77 if (!block_buf) { 78 retval = ext2fs_get_mem(fs->blocksize, &buf); 79 if (retval) 80 return retval; 81 block_buf = buf; 82 } 83 84 retval = ext2fs_read_ext_attr(fs, blk, block_buf); 85 if (retval) 86 goto errout; 87 88 header = (struct ext2_ext_attr_header *) block_buf; 89 header->h_refcount += adjust; 90 if (newcount) 91 *newcount = header->h_refcount; 92 93 retval = ext2fs_write_ext_attr(fs, blk, block_buf); 94 if (retval) 95 goto errout; 96 97errout: 98 if (buf) 99 ext2fs_free_mem(&buf); 100 return retval; 101} 102