2005-04-17 02:20:36 +04:00
/*
* linux / fs / hpfs / ea . c
*
* Mikulas Patocka ( mikulas @ artax . karlin . mff . cuni . cz ) , 1998 - 1999
*
* handling extended attributes
*/
# include "hpfs_fn.h"
/* Remove external extended attributes. ano specifies whether a is a
direct sector where eas starts or an anode */
void hpfs_ea_ext_remove ( struct super_block * s , secno a , int ano , unsigned len )
{
unsigned pos = 0 ;
while ( pos < len ) {
char ex [ 4 + 255 + 1 + 8 ] ;
struct extended_attribute * ea = ( struct extended_attribute * ) ex ;
if ( pos + 4 > len ) {
hpfs_error ( s , " EAs don't end correctly, %s %08x, len %08x " ,
ano ? " anode " : " sectors " , a , len ) ;
return ;
}
if ( hpfs_ea_read ( s , a , ano , pos , 4 , ex ) ) return ;
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) ) {
2011-05-08 22:44:32 +04:00
if ( ea_valuelen ( ea ) ! = 8 ) {
2012-04-06 21:21:09 +04:00
hpfs_error ( s , " ea_indirect(ea) set while ea->valuelen!=8, %s %08x, pos %08x " ,
2005-04-17 02:20:36 +04:00
ano ? " anode " : " sectors " , a , pos ) ;
return ;
}
if ( hpfs_ea_read ( s , a , ano , pos + 4 , ea - > namelen + 9 , ex + 4 ) )
return ;
2012-04-06 21:21:09 +04:00
hpfs_ea_remove ( s , ea_sec ( ea ) , ea_in_anode ( ea ) , ea_len ( ea ) ) ;
2005-04-17 02:20:36 +04:00
}
2011-05-08 22:44:32 +04:00
pos + = ea - > namelen + ea_valuelen ( ea ) + 5 ;
2005-04-17 02:20:36 +04:00
}
if ( ! ano ) hpfs_free_sectors ( s , a , ( len + 511 ) > > 9 ) ;
else {
struct buffer_head * bh ;
struct anode * anode ;
if ( ( anode = hpfs_map_anode ( s , a , & bh ) ) ) {
hpfs_remove_btree ( s , & anode - > btree ) ;
brelse ( bh ) ;
hpfs_free_sectors ( s , a , 1 ) ;
}
}
}
static char * get_indirect_ea ( struct super_block * s , int ano , secno a , int size )
{
char * ret ;
if ( ! ( ret = kmalloc ( size + 1 , GFP_NOFS ) ) ) {
2014-06-07 01:36:36 +04:00
pr_err ( " out of memory for EA \n " ) ;
2005-04-17 02:20:36 +04:00
return NULL ;
}
if ( hpfs_ea_read ( s , a , ano , 0 , size , ret ) ) {
kfree ( ret ) ;
return NULL ;
}
ret [ size ] = 0 ;
return ret ;
}
2010-02-01 01:09:29 +03:00
static void set_indirect_ea ( struct super_block * s , int ano , secno a ,
const char * data , int size )
2005-04-17 02:20:36 +04:00
{
hpfs_ea_write ( s , a , ano , 0 , size , data ) ;
}
/* Read an extended attribute named 'key' into the provided buffer */
int hpfs_read_ea ( struct super_block * s , struct fnode * fnode , char * key ,
char * buf , int size )
{
unsigned pos ;
int ano , len ;
secno a ;
2011-05-08 22:44:38 +04:00
char ex [ 4 + 255 + 1 + 8 ] ;
2005-04-17 02:20:36 +04:00
struct extended_attribute * ea ;
struct extended_attribute * ea_end = fnode_end_ea ( fnode ) ;
for ( ea = fnode_ea ( fnode ) ; ea < ea_end ; ea = next_ea ( ea ) )
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) )
2005-04-17 02:20:36 +04:00
goto indirect ;
2011-05-08 22:44:32 +04:00
if ( ea_valuelen ( ea ) > = size )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
2011-05-08 22:44:32 +04:00
memcpy ( buf , ea_data ( ea ) , ea_valuelen ( ea ) ) ;
buf [ ea_valuelen ( ea ) ] = 0 ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2011-05-08 22:44:26 +04:00
a = le32_to_cpu ( fnode - > ea_secno ) ;
len = le32_to_cpu ( fnode - > ea_size_l ) ;
2012-04-06 22:30:07 +04:00
ano = fnode_in_anode ( fnode ) ;
2005-04-17 02:20:36 +04:00
pos = 0 ;
while ( pos < len ) {
ea = ( struct extended_attribute * ) ex ;
if ( pos + 4 > len ) {
hpfs_error ( s , " EAs don't end correctly, %s %08x, len %08x " ,
ano ? " anode " : " sectors " , a , len ) ;
return - EIO ;
}
if ( hpfs_ea_read ( s , a , ano , pos , 4 , ex ) ) return - EIO ;
2012-04-06 21:21:09 +04:00
if ( hpfs_ea_read ( s , a , ano , pos + 4 , ea - > namelen + 1 + ( ea_indirect ( ea ) ? 8 : 0 ) , ex + 4 ) )
2005-04-17 02:20:36 +04:00
return - EIO ;
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) )
2005-04-17 02:20:36 +04:00
goto indirect ;
2011-05-08 22:44:32 +04:00
if ( ea_valuelen ( ea ) > = size )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
2011-05-08 22:44:32 +04:00
if ( hpfs_ea_read ( s , a , ano , pos + 4 + ea - > namelen + 1 , ea_valuelen ( ea ) , buf ) )
2005-04-17 02:20:36 +04:00
return - EIO ;
2011-05-08 22:44:32 +04:00
buf [ ea_valuelen ( ea ) ] = 0 ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2011-05-08 22:44:32 +04:00
pos + = ea - > namelen + ea_valuelen ( ea ) + 5 ;
2005-04-17 02:20:36 +04:00
}
return - ENOENT ;
indirect :
if ( ea_len ( ea ) > = size )
return - EINVAL ;
2012-04-06 21:21:09 +04:00
if ( hpfs_ea_read ( s , ea_sec ( ea ) , ea_in_anode ( ea ) , 0 , ea_len ( ea ) , buf ) )
2005-04-17 02:20:36 +04:00
return - EIO ;
buf [ ea_len ( ea ) ] = 0 ;
return 0 ;
}
/* Read an extended attribute named 'key' */
char * hpfs_get_ea ( struct super_block * s , struct fnode * fnode , char * key , int * size )
{
char * ret ;
unsigned pos ;
int ano , len ;
secno a ;
struct extended_attribute * ea ;
struct extended_attribute * ea_end = fnode_end_ea ( fnode ) ;
for ( ea = fnode_ea ( fnode ) ; ea < ea_end ; ea = next_ea ( ea ) )
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) )
return get_indirect_ea ( s , ea_in_anode ( ea ) , ea_sec ( ea ) , * size = ea_len ( ea ) ) ;
2011-05-08 22:44:32 +04:00
if ( ! ( ret = kmalloc ( ( * size = ea_valuelen ( ea ) ) + 1 , GFP_NOFS ) ) ) {
2014-06-07 01:36:36 +04:00
pr_err ( " out of memory for EA \n " ) ;
2005-04-17 02:20:36 +04:00
return NULL ;
}
2011-05-08 22:44:32 +04:00
memcpy ( ret , ea_data ( ea ) , ea_valuelen ( ea ) ) ;
ret [ ea_valuelen ( ea ) ] = 0 ;
2005-04-17 02:20:36 +04:00
return ret ;
}
2011-05-08 22:44:26 +04:00
a = le32_to_cpu ( fnode - > ea_secno ) ;
len = le32_to_cpu ( fnode - > ea_size_l ) ;
2012-04-06 22:30:07 +04:00
ano = fnode_in_anode ( fnode ) ;
2005-04-17 02:20:36 +04:00
pos = 0 ;
while ( pos < len ) {
char ex [ 4 + 255 + 1 + 8 ] ;
ea = ( struct extended_attribute * ) ex ;
if ( pos + 4 > len ) {
hpfs_error ( s , " EAs don't end correctly, %s %08x, len %08x " ,
ano ? " anode " : " sectors " , a , len ) ;
return NULL ;
}
if ( hpfs_ea_read ( s , a , ano , pos , 4 , ex ) ) return NULL ;
2012-04-06 21:21:09 +04:00
if ( hpfs_ea_read ( s , a , ano , pos + 4 , ea - > namelen + 1 + ( ea_indirect ( ea ) ? 8 : 0 ) , ex + 4 ) )
2005-04-17 02:20:36 +04:00
return NULL ;
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) )
return get_indirect_ea ( s , ea_in_anode ( ea ) , ea_sec ( ea ) , * size = ea_len ( ea ) ) ;
2011-05-08 22:44:32 +04:00
if ( ! ( ret = kmalloc ( ( * size = ea_valuelen ( ea ) ) + 1 , GFP_NOFS ) ) ) {
2014-06-07 01:36:36 +04:00
pr_err ( " out of memory for EA \n " ) ;
2005-04-17 02:20:36 +04:00
return NULL ;
}
2011-05-08 22:44:32 +04:00
if ( hpfs_ea_read ( s , a , ano , pos + 4 + ea - > namelen + 1 , ea_valuelen ( ea ) , ret ) ) {
2005-04-17 02:20:36 +04:00
kfree ( ret ) ;
return NULL ;
}
2011-05-08 22:44:32 +04:00
ret [ ea_valuelen ( ea ) ] = 0 ;
2005-04-17 02:20:36 +04:00
return ret ;
}
2011-05-08 22:44:32 +04:00
pos + = ea - > namelen + ea_valuelen ( ea ) + 5 ;
2005-04-17 02:20:36 +04:00
}
return NULL ;
}
/*
* Update or create extended attribute ' key ' with value ' data ' . Note that
* when this ea exists , it MUST have the same size as size of data .
* This driver can ' t change sizes of eas ( ' cause I just don ' t need it ) .
*/
2010-02-01 01:09:29 +03:00
void hpfs_set_ea ( struct inode * inode , struct fnode * fnode , const char * key ,
const char * data , int size )
2005-04-17 02:20:36 +04:00
{
fnode_secno fno = inode - > i_ino ;
struct super_block * s = inode - > i_sb ;
unsigned pos ;
int ano , len ;
secno a ;
unsigned char h [ 4 ] ;
struct extended_attribute * ea ;
struct extended_attribute * ea_end = fnode_end_ea ( fnode ) ;
for ( ea = fnode_ea ( fnode ) ; ea < ea_end ; ea = next_ea ( ea ) )
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) ) {
2005-04-17 02:20:36 +04:00
if ( ea_len ( ea ) = = size )
2012-04-06 21:21:09 +04:00
set_indirect_ea ( s , ea_in_anode ( ea ) , ea_sec ( ea ) , data , size ) ;
2011-05-08 22:44:32 +04:00
} else if ( ea_valuelen ( ea ) = = size ) {
2005-04-17 02:20:36 +04:00
memcpy ( ea_data ( ea ) , data , size ) ;
}
return ;
}
2011-05-08 22:44:26 +04:00
a = le32_to_cpu ( fnode - > ea_secno ) ;
len = le32_to_cpu ( fnode - > ea_size_l ) ;
2012-04-06 22:30:07 +04:00
ano = fnode_in_anode ( fnode ) ;
2005-04-17 02:20:36 +04:00
pos = 0 ;
while ( pos < len ) {
char ex [ 4 + 255 + 1 + 8 ] ;
ea = ( struct extended_attribute * ) ex ;
if ( pos + 4 > len ) {
hpfs_error ( s , " EAs don't end correctly, %s %08x, len %08x " ,
ano ? " anode " : " sectors " , a , len ) ;
return ;
}
if ( hpfs_ea_read ( s , a , ano , pos , 4 , ex ) ) return ;
2012-04-06 21:21:09 +04:00
if ( hpfs_ea_read ( s , a , ano , pos + 4 , ea - > namelen + 1 + ( ea_indirect ( ea ) ? 8 : 0 ) , ex + 4 ) )
2005-04-17 02:20:36 +04:00
return ;
if ( ! strcmp ( ea - > name , key ) ) {
2012-04-06 21:21:09 +04:00
if ( ea_indirect ( ea ) ) {
2005-04-17 02:20:36 +04:00
if ( ea_len ( ea ) = = size )
2012-04-06 21:21:09 +04:00
set_indirect_ea ( s , ea_in_anode ( ea ) , ea_sec ( ea ) , data , size ) ;
2005-04-17 02:20:36 +04:00
}
else {
2011-05-08 22:44:32 +04:00
if ( ea_valuelen ( ea ) = = size )
2005-04-17 02:20:36 +04:00
hpfs_ea_write ( s , a , ano , pos + 4 + ea - > namelen + 1 , size , data ) ;
}
return ;
}
2011-05-08 22:44:32 +04:00
pos + = ea - > namelen + ea_valuelen ( ea ) + 5 ;
2005-04-17 02:20:36 +04:00
}
2011-05-08 22:44:26 +04:00
if ( ! le16_to_cpu ( fnode - > ea_offs ) ) {
/*if (le16_to_cpu(fnode->ea_size_s)) {
2005-04-17 02:20:36 +04:00
hpfs_error ( s , " fnode %08x: ea_size_s == %03x, ea_offs == 0 " ,
2011-05-08 22:44:26 +04:00
inode - > i_ino , le16_to_cpu ( fnode - > ea_size_s ) ) ;
2005-04-17 02:20:36 +04:00
return ;
} */
2011-05-08 22:44:26 +04:00
fnode - > ea_offs = cpu_to_le16 ( 0xc4 ) ;
2005-04-17 02:20:36 +04:00
}
2011-05-08 22:44:26 +04:00
if ( le16_to_cpu ( fnode - > ea_offs ) < 0xc4 | | le16_to_cpu ( fnode - > ea_offs ) + le16_to_cpu ( fnode - > acl_size_s ) + le16_to_cpu ( fnode - > ea_size_s ) > 0x200 ) {
[PATCH] hpfs: fix printk format warnings
Fix hpfs printk warnings:
fs/hpfs/dir.c:87: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'long unsigned int'
fs/hpfs/dir.c:147: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'long int'
fs/hpfs/dir.c:148: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'long int'
fs/hpfs/dnode.c:537: warning: format '%08x' expects type 'unsigned int', but argument 5 has type 'long unsigned int'
fs/hpfs/dnode.c:854: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'loff_t'
fs/hpfs/ea.c:247: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'long unsigned int'
fs/hpfs/inode.c:254: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'long unsigned int'
fs/hpfs/map.c:129: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'ino_t'
fs/hpfs/map.c:135: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'ino_t'
fs/hpfs/map.c:140: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'ino_t'
fs/hpfs/map.c:147: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'ino_t'
fs/hpfs/map.c:154: warning: format '%08x' expects type 'unsigned int', but argument 3 has type 'ino_t'
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-07 07:37:05 +03:00
hpfs_error ( s , " fnode %08lx: ea_offs == %03x, ea_size_s == %03x " ,
( unsigned long ) inode - > i_ino ,
2012-04-13 09:24:37 +04:00
le16_to_cpu ( fnode - > ea_offs ) , le16_to_cpu ( fnode - > ea_size_s ) ) ;
2005-04-17 02:20:36 +04:00
return ;
}
2011-05-08 22:44:26 +04:00
if ( ( le16_to_cpu ( fnode - > ea_size_s ) | | ! le32_to_cpu ( fnode - > ea_size_l ) ) & &
le16_to_cpu ( fnode - > ea_offs ) + le16_to_cpu ( fnode - > acl_size_s ) + le16_to_cpu ( fnode - > ea_size_s ) + strlen ( key ) + size + 5 < = 0x200 ) {
2005-04-17 02:20:36 +04:00
ea = fnode_end_ea ( fnode ) ;
* ( char * ) ea = 0 ;
ea - > namelen = strlen ( key ) ;
2011-05-08 22:44:32 +04:00
ea - > valuelen_lo = size ;
ea - > valuelen_hi = size > > 8 ;
2005-04-17 02:20:36 +04:00
strcpy ( ea - > name , key ) ;
memcpy ( ea_data ( ea ) , data , size ) ;
2011-05-08 22:44:26 +04:00
fnode - > ea_size_s = cpu_to_le16 ( le16_to_cpu ( fnode - > ea_size_s ) + strlen ( key ) + size + 5 ) ;
2005-04-17 02:20:36 +04:00
goto ret ;
}
/* Most the code here is 99.9993422% unused. I hope there are no bugs.
But what . . HPFS . IFS has also bugs in ea management . */
2011-05-08 22:44:26 +04:00
if ( le16_to_cpu ( fnode - > ea_size_s ) & & ! le32_to_cpu ( fnode - > ea_size_l ) ) {
2005-04-17 02:20:36 +04:00
secno n ;
struct buffer_head * bh ;
char * data ;
2011-05-08 22:43:06 +04:00
if ( ! ( n = hpfs_alloc_sector ( s , fno , 1 , 0 ) ) ) return ;
2005-04-17 02:20:36 +04:00
if ( ! ( data = hpfs_get_sector ( s , n , & bh ) ) ) {
hpfs_free_sectors ( s , n , 1 ) ;
return ;
}
2011-05-08 22:44:26 +04:00
memcpy ( data , fnode_ea ( fnode ) , le16_to_cpu ( fnode - > ea_size_s ) ) ;
fnode - > ea_size_l = cpu_to_le32 ( le16_to_cpu ( fnode - > ea_size_s ) ) ;
fnode - > ea_size_s = cpu_to_le16 ( 0 ) ;
fnode - > ea_secno = cpu_to_le32 ( n ) ;
2012-04-06 22:30:07 +04:00
fnode - > flags & = ~ FNODE_anode ;
2005-04-17 02:20:36 +04:00
mark_buffer_dirty ( bh ) ;
brelse ( bh ) ;
}
2011-05-08 22:44:26 +04:00
pos = le32_to_cpu ( fnode - > ea_size_l ) + 5 + strlen ( key ) + size ;
len = ( le32_to_cpu ( fnode - > ea_size_l ) + 511 ) > > 9 ;
2005-04-17 02:20:36 +04:00
if ( pos > = 30000 ) goto bail ;
while ( ( ( pos + 511 ) > > 9 ) > len ) {
if ( ! len ) {
2011-05-08 22:44:26 +04:00
secno q = hpfs_alloc_sector ( s , fno , 1 , 0 ) ;
if ( ! q ) goto bail ;
fnode - > ea_secno = cpu_to_le32 ( q ) ;
2012-04-06 22:30:07 +04:00
fnode - > flags & = ~ FNODE_anode ;
2005-04-17 02:20:36 +04:00
len + + ;
2012-04-06 22:30:07 +04:00
} else if ( ! fnode_in_anode ( fnode ) ) {
2011-05-08 22:44:26 +04:00
if ( hpfs_alloc_if_possible ( s , le32_to_cpu ( fnode - > ea_secno ) + len ) ) {
2005-04-17 02:20:36 +04:00
len + + ;
} else {
/* Aargh... don't know how to create ea anodes :-( */
/*struct buffer_head *bh;
struct anode * anode ;
anode_secno a_s ;
if ( ! ( anode = hpfs_alloc_anode ( s , fno , & a_s , & bh ) ) )
goto bail ;
2011-05-08 22:44:26 +04:00
anode - > up = cpu_to_le32 ( fno ) ;
2005-04-17 02:20:36 +04:00
anode - > btree . fnode_parent = 1 ;
anode - > btree . n_free_nodes - - ;
anode - > btree . n_used_nodes + + ;
2011-05-08 22:44:26 +04:00
anode - > btree . first_free = cpu_to_le16 ( le16_to_cpu ( anode - > btree . first_free ) + 12 ) ;
anode - > u . external [ 0 ] . disk_secno = cpu_to_le32 ( le32_to_cpu ( fnode - > ea_secno ) ) ;
anode - > u . external [ 0 ] . file_secno = cpu_to_le32 ( 0 ) ;
anode - > u . external [ 0 ] . length = cpu_to_le32 ( len ) ;
2005-04-17 02:20:36 +04:00
mark_buffer_dirty ( bh ) ;
brelse ( bh ) ;
2012-04-06 22:30:07 +04:00
fnode - > flags | = FNODE_anode ;
2011-05-08 22:44:26 +04:00
fnode - > ea_secno = cpu_to_le32 ( a_s ) ; */
2005-04-17 02:20:36 +04:00
secno new_sec ;
int i ;
2011-05-08 22:43:06 +04:00
if ( ! ( new_sec = hpfs_alloc_sector ( s , fno , 1 , 1 - ( ( pos + 511 ) > > 9 ) ) ) )
2005-04-17 02:20:36 +04:00
goto bail ;
for ( i = 0 ; i < len ; i + + ) {
struct buffer_head * bh1 , * bh2 ;
void * b1 , * b2 ;
2011-05-08 22:44:26 +04:00
if ( ! ( b1 = hpfs_map_sector ( s , le32_to_cpu ( fnode - > ea_secno ) + i , & bh1 , len - i - 1 ) ) ) {
2005-04-17 02:20:36 +04:00
hpfs_free_sectors ( s , new_sec , ( pos + 511 ) > > 9 ) ;
goto bail ;
}
if ( ! ( b2 = hpfs_get_sector ( s , new_sec + i , & bh2 ) ) ) {
brelse ( bh1 ) ;
hpfs_free_sectors ( s , new_sec , ( pos + 511 ) > > 9 ) ;
goto bail ;
}
memcpy ( b2 , b1 , 512 ) ;
brelse ( bh1 ) ;
mark_buffer_dirty ( bh2 ) ;
brelse ( bh2 ) ;
}
2011-05-08 22:44:26 +04:00
hpfs_free_sectors ( s , le32_to_cpu ( fnode - > ea_secno ) , len ) ;
fnode - > ea_secno = cpu_to_le32 ( new_sec ) ;
2005-04-17 02:20:36 +04:00
len = ( pos + 511 ) > > 9 ;
}
}
2012-04-06 22:30:07 +04:00
if ( fnode_in_anode ( fnode ) ) {
2011-05-08 22:44:26 +04:00
if ( hpfs_add_sector_to_btree ( s , le32_to_cpu ( fnode - > ea_secno ) ,
2005-04-17 02:20:36 +04:00
0 , len ) ! = - 1 ) {
len + + ;
} else {
goto bail ;
}
}
}
h [ 0 ] = 0 ;
h [ 1 ] = strlen ( key ) ;
h [ 2 ] = size & 0xff ;
h [ 3 ] = size > > 8 ;
2012-04-06 22:30:07 +04:00
if ( hpfs_ea_write ( s , le32_to_cpu ( fnode - > ea_secno ) , fnode_in_anode ( fnode ) , le32_to_cpu ( fnode - > ea_size_l ) , 4 , h ) ) goto bail ;
if ( hpfs_ea_write ( s , le32_to_cpu ( fnode - > ea_secno ) , fnode_in_anode ( fnode ) , le32_to_cpu ( fnode - > ea_size_l ) + 4 , h [ 1 ] + 1 , key ) ) goto bail ;
if ( hpfs_ea_write ( s , le32_to_cpu ( fnode - > ea_secno ) , fnode_in_anode ( fnode ) , le32_to_cpu ( fnode - > ea_size_l ) + 5 + h [ 1 ] , size , data ) ) goto bail ;
2011-05-08 22:44:26 +04:00
fnode - > ea_size_l = cpu_to_le32 ( pos ) ;
2005-04-17 02:20:36 +04:00
ret :
hpfs_i ( inode ) - > i_ea_size + = 5 + strlen ( key ) + size ;
return ;
bail :
2011-05-08 22:44:26 +04:00
if ( le32_to_cpu ( fnode - > ea_secno ) )
2012-04-06 22:30:07 +04:00
if ( fnode_in_anode ( fnode ) ) hpfs_truncate_btree ( s , le32_to_cpu ( fnode - > ea_secno ) , 1 , ( le32_to_cpu ( fnode - > ea_size_l ) + 511 ) > > 9 ) ;
2011-05-08 22:44:26 +04:00
else hpfs_free_sectors ( s , le32_to_cpu ( fnode - > ea_secno ) + ( ( le32_to_cpu ( fnode - > ea_size_l ) + 511 ) > > 9 ) , len - ( ( le32_to_cpu ( fnode - > ea_size_l ) + 511 ) > > 9 ) ) ;
else fnode - > ea_secno = fnode - > ea_size_l = cpu_to_le32 ( 0 ) ;
2005-04-17 02:20:36 +04:00
}