ReactOS  0.4.14-dev-50-g13bb5e2
htree.c File Reference
#include "ext2fs.h"
Include dependency graph for htree.c:

Go to the source code of this file.

Macros

#define NAMEI_RA_CHUNKS   2
 
#define NAMEI_RA_BLOCKS   4
 
#define NAMEI_RA_SIZE   (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
 
#define NAMEI_RA_INDEX(c, b)   (((c) * NAMEI_RA_BLOCKS) + (b))
 

Functions

__u32 ext3_current_time (struct inode *in)
 
void ext3_warning (struct super_block *sb, const char *function, char *fmt,...)
 
struct buffer_headext3_bread (struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
 
struct buffer_headext3_append (struct ext2_icb *icb, struct inode *inode, ext3_lblk_t *block, int *err)
 
void ext3_inc_count (struct inode *inode)
 
void ext3_dec_count (struct inode *inode)
 
unsigned char ext3_type_by_mode (umode_t mode)
 
void ext3_set_de_type (struct super_block *sb, struct ext3_dir_entry_2 *de, umode_t mode)
 
int ext3_mark_inode_dirty (struct ext2_icb *icb, struct inode *in)
 
void ext3_update_dx_flag (struct inode *inode)
 
int add_dirent_to_buf (struct ext2_icb *icb, struct dentry *dentry, struct inode *inode, struct ext3_dir_entry_2 *de, struct buffer_head *bh)
 
int ext3_release_dir (struct inode *inode, struct file *filp)
 
int ext3_add_entry (struct ext2_icb *icb, struct dentry *dentry, struct inode *inode)
 
int ext3_delete_entry (struct ext2_icb *icb, struct inode *dir, struct ext3_dir_entry_2 *de_del, struct buffer_head *bh)
 
int ext3_is_dir_empty (struct ext2_icb *icb, struct inode *inode)
 
static int search_dirblock (struct buffer_head *bh, struct inode *dir, struct dentry *dentry, unsigned long offset, struct ext3_dir_entry_2 **res_dir)
 
struct buffer_headext3_find_entry (struct ext2_icb *icb, struct dentry *dentry, struct ext3_dir_entry_2 **res_dir)
 

Macro Definition Documentation

◆ NAMEI_RA_BLOCKS

#define NAMEI_RA_BLOCKS   4

Definition at line 2151 of file htree.c.

◆ NAMEI_RA_CHUNKS

#define NAMEI_RA_CHUNKS   2

Definition at line 2150 of file htree.c.

◆ NAMEI_RA_INDEX

#define NAMEI_RA_INDEX (   c,
  b 
)    (((c) * NAMEI_RA_BLOCKS) + (b))

Definition at line 2153 of file htree.c.

◆ NAMEI_RA_SIZE

#define NAMEI_RA_SIZE   (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)

Definition at line 2152 of file htree.c.

Function Documentation

◆ add_dirent_to_buf()

int add_dirent_to_buf ( struct ext2_icb icb,
struct dentry dentry,
struct inode inode,
struct ext3_dir_entry_2 de,
struct buffer_head bh 
)

Definition at line 386 of file htree.c.

389 {
390  struct inode *dir = dentry->d_parent->d_inode;
391  const char *name = dentry->d_name.name;
392  int namelen = dentry->d_name.len;
393  unsigned int offset = 0;
394  unsigned short reclen;
395  int nlen, rlen, err;
396  char *top;
397 
398  reclen = EXT3_DIR_REC_LEN(namelen);
399  if (!de) {
400  de = (struct ext3_dir_entry_2 *)bh->b_data;
401  top = bh->b_data + dir->i_sb->s_blocksize - reclen;
402  while ((char *) de <= top) {
403  if (!ext3_check_dir_entry("ext3_add_entry", dir, de,
404  bh, offset)) {
405  __brelse(bh);
406  return -EIO;
407  }
408  if (ext3_match(namelen, name, de)) {
409  __brelse(bh);
410  return -EEXIST;
411  }
412  nlen = EXT3_DIR_REC_LEN(de->name_len);
413  rlen = ext3_rec_len_from_disk(de->rec_len);
414  if ((de->inode? rlen - nlen: rlen) >= reclen)
415  break;
416  de = (struct ext3_dir_entry_2 *)((char *)de + rlen);
417  offset += rlen;
418  }
419  if ((char *) de > top)
420  return -ENOSPC;
421  }
422 
423  /* By now the buffer is marked for journaling */
424  nlen = EXT3_DIR_REC_LEN(de->name_len);
425  rlen = ext3_rec_len_from_disk(de->rec_len);
426  if (de->inode) {
427  struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen);
428  de1->rec_len = ext3_rec_len_to_disk(rlen - nlen);
429  de->rec_len = ext3_rec_len_to_disk(nlen);
430  de = de1;
431  }
433  if (inode) {
434  de->inode = cpu_to_le32(inode->i_ino);
435  ext3_set_de_type(dir->i_sb, de, inode->i_mode);
436  } else
437  de->inode = 0;
438  de->name_len = (__u8)namelen;
439  memcpy(de->name, name, namelen);
440 
441  /*
442  * XXX shouldn't update any times until successful
443  * completion of syscall, but too many callers depend
444  * on this.
445  *
446  * XXX similarly, too many callers depend on
447  * ext4_new_inode() setting the times, but error
448  * recovery deletes the inode, so the worst that can
449  * happen is that the times are slightly out of date
450  * and/or different from the directory change time.
451  */
452  dir->i_mtime = dir->i_ctime = ext3_current_time(dir);
454  dir->i_version++;
456  set_buffer_dirty(bh);
457  __brelse(bh);
458  return 0;
459 }
unsigned char __u8
Definition: compat.h:88
#define EXT3_DIR_REC_LEN(len)
Definition: ext3_fs.h:867
__u32 ext3_current_time(struct inode *in)
Definition: htree.c:204
int ext3_mark_inode_dirty(struct ext2_icb *icb, struct inode *in)
Definition: htree.c:360
Definition: ext3_fs.h:774
umode_t i_mode
Definition: fs.h:87
GLintptr offset
Definition: glext.h:5920
GLint namelen
Definition: glext.h:7232
#define EEXIST
Definition: acclib.h:88
Definition: fs.h:78
void ext3_set_de_type(struct super_block *sb, struct ext3_dir_entry_2 *de, umode_t mode)
Definition: htree.c:347
while(1)
Definition: macro.lex.yy.c:740
char name[EXT3_NAME_LEN]
Definition: ext3_fs.h:779
__u8 file_type
Definition: ext3_fs.h:778
Definition: arc.h:49
int ext3_check_dir_entry(const char *function, struct inode *dir, struct ext3_dir_entry_2 *de, struct buffer_head *bh, unsigned long offset)
Definition: generic.c:2142
Definition: fs.h:117
unsigned int dir
Definition: maze.c:112
struct dentry * d_parent
Definition: fs.h:124
__le32 inode
Definition: ext3_fs.h:775
#define EXT3_FT_UNKNOWN
Definition: ext3_fs.h:786
void __brelse(struct buffer_head *)
Definition: linux.c:800
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
void ext3_update_dx_flag(struct inode *inode)
Definition: htree.c:368
#define err(...)
__u32 i_ino
Definition: fs.h:79
char * b_data
Definition: module.h:725
static __le16 ext3_rec_len_to_disk(unsigned len)
Definition: ext3_fs.h:880
__u8 name_len
Definition: ext3_fs.h:777
Definition: arc.h:40
static unsigned ext3_rec_len_from_disk(__le16 dlen)
Definition: ext3_fs.h:871
Definition: name.c:36
__le16 rec_len
Definition: ext3_fs.h:776
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
#define cpu_to_le32
Definition: module.h:146
struct dentry::@676 d_name

Referenced by ext3_add_entry().

◆ ext3_add_entry()

int ext3_add_entry ( struct ext2_icb icb,
struct dentry dentry,
struct inode inode 
)

Definition at line 1946 of file htree.c.

1947 {
1948  struct inode *dir = dentry->d_parent->d_inode;
1949  struct buffer_head *bh;
1950  struct ext3_dir_entry_2 *de;
1951  struct super_block *sb;
1952  int retval;
1953 #ifdef EXT2_HTREE_INDEX
1954  int dx_fallback=0;
1955 #endif
1956  unsigned blocksize;
1958 
1959  sb = dir->i_sb;
1960  blocksize = sb->s_blocksize;
1961  if (!dentry->d_name.len)
1962  return -EINVAL;
1963 
1964 #ifdef EXT2_HTREE_INDEX
1965  if (is_dx(dir)) {
1966  retval = ext3_dx_add_entry(icb, dentry, inode);
1967  if (!retval || (retval != ERR_BAD_DX_DIR))
1968  return retval;
1969  EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL;
1970  dx_fallback++;
1971  ext3_save_inode(icb, dir);
1972  }
1973 #endif
1974 
1975  blocks = (ext3_lblk_t)(dir->i_size >> sb->s_blocksize_bits);
1976  for (block = 0; block < blocks; block++) {
1977  bh = ext3_bread(icb, dir, block, &retval);
1978  if (!bh)
1979  return retval;
1980  retval = add_dirent_to_buf(icb, dentry, inode, NULL, bh);
1981  if (retval != -ENOSPC)
1982  return retval;
1983 
1984 #ifdef EXT2_HTREE_INDEX
1985  if (blocks == 1 && !dx_fallback &&
1987  return make_indexed_dir(icb, dentry, inode, bh);
1988 #endif
1989 
1990  brelse(bh);
1991  }
1992  bh = ext3_append(icb, dir, &block, &retval);
1993  if (!bh)
1994  return retval;
1995  de = (struct ext3_dir_entry_2 *) bh->b_data;
1996  de->inode = 0;
1997  de->rec_len = ext3_rec_len_to_disk(blocksize);
1998  return add_dirent_to_buf(icb, dentry, inode, de, bh);
1999 }
static unsigned int block
Definition: xmlmemory.c:118
#define EXT3_INDEX_FL
Definition: ext3_fs.h:220
superblock * sb
Definition: btrfs.c:4162
Definition: ext3_fs.h:774
Definition: arc.h:39
Definition: fs.h:64
struct buffer_head * ext3_bread(struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
Definition: htree.c:230
static void brelse(struct buffer_head *bh)
Definition: module.h:945
Definition: fs.h:78
struct buffer_head * ext3_append(struct ext2_icb *icb, struct inode *inode, ext3_lblk_t *block, int *err)
Definition: htree.c:279
int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry, struct inode *inode, struct ext3_dir_entry_2 *de, struct buffer_head *bh)
Definition: htree.c:386
Definition: arc.h:49
smooth NULL
Definition: ftsmooth.c:416
Definition: fs.h:117
unsigned int dir
Definition: maze.c:112
static int blocks
Definition: mkdosfs.c:527
struct dentry * d_parent
Definition: fs.h:124
#define EXT3_HAS_COMPAT_FEATURE(sb, mask)
Definition: ext3_fs.h:645
__le32 inode
Definition: ext3_fs.h:775
#define is_dx(dir)
Definition: ext3_fs.h:901
__u32 ext3_lblk_t
Definition: ext3_fs_i.h:30
char * b_data
Definition: module.h:725
static __le16 ext3_rec_len_to_disk(unsigned len)
Definition: ext3_fs.h:880
#define EXT3_FEATURE_COMPAT_DIR_INDEX
Definition: ext3_fs.h:669
__le16 rec_len
Definition: ext3_fs.h:776
struct dentry::@676 d_name

Referenced by Ext2AddEntry().

◆ ext3_append()

struct buffer_head* ext3_append ( struct ext2_icb icb,
struct inode inode,
ext3_lblk_t block,
int err 
)

Definition at line 279 of file htree.c.

281 {
282  PEXT2_MCB mcb = CONTAINING_RECORD(inode, EXT2_MCB, Inode);
283  PEXT2_FCB dcb = mcb->Fcb;
285 
286  ASSERT(dcb);
287  ASSERT(inode == dcb->Inode);
288 
289  /* allocate new block since there's no space for us */
290  *block = (ext3_lblk_t)(inode->i_size >> inode->i_sb->s_blocksize_bits);
291  dcb->Header.AllocationSize.QuadPart += dcb->Vcb->BlockSize;
292  status = Ext2ExpandFile(icb, dcb->Vcb, mcb, &(dcb->Header.AllocationSize));
293  if (NT_SUCCESS(status)) {
294 
295  /* update Dcb */
296  dcb->Header.ValidDataLength = dcb->Header.FileSize = dcb->Header.AllocationSize;
297  mcb->Inode.i_size = dcb->Header.AllocationSize.QuadPart;
298 
299  /* save parent directory's inode */
300  Ext2SaveInode(icb, dcb->Vcb, inode);
301  }
302 
303  return ext3_bread(icb, inode, *block, err);
304 }
static unsigned int block
Definition: xmlmemory.c:118
PEXT2_FCB Fcb
Definition: ext2fs.h:905
struct inode Inode
Definition: ext2fs.h:936
ULONG BlockSize
Definition: ext2fs.h:719
LONG NTSTATUS
Definition: precomp.h:26
struct buffer_head * ext3_bread(struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
Definition: htree.c:230
Definition: fs.h:78
struct inode * Inode
Definition: ext2fs.h:857
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
loff_t i_size
Definition: fs.h:80
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
__u32 ext3_lblk_t
Definition: ext3_fs_i.h:30
#define err(...)
PEXT2_VCB Vcb
Definition: ext2fs.h:860
NTSTATUS Ext2ExpandFile(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb, PEXT2_MCB Mcb, PLARGE_INTEGER Size)
Definition: fileinfo.c:1147
struct super_block * i_sb
Definition: fs.h:96
static SERVICE_STATUS status
Definition: service.c:31
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
Definition: generic.c:548
Definition: ps.c:97

Referenced by Ext2AddDotEntries(), and ext3_add_entry().

◆ ext3_bread()

struct buffer_head* ext3_bread ( struct ext2_icb icb,
struct inode inode,
unsigned long  block,
int err 
)

Definition at line 230 of file htree.c.

232 {
233  struct buffer_head * bh = NULL;
235  ULONG lbn = 0, num = 0;
236 
238 
239  /* for symlink file, read it's target instead */
240  if (NULL != Mcb && IsMcbSymLink(Mcb))
241  Mcb = Mcb->Target;
242  if (NULL == Mcb) {
243  *err = -EINVAL;
244  return NULL;
245  }
246 
247  /* mapping file offset to ext2 block */
248  if (INODE_HAS_EXTENT(&Mcb->Inode)) {
249  status = Ext2MapExtent(icb, inode->i_sb->s_priv,
250  Mcb, block, FALSE,
251  &lbn, &num);
252  } else {
253  status = Ext2MapIndirect(icb, inode->i_sb->s_priv,
254  Mcb, block, FALSE,
255  &lbn, &num);
256  }
257 
258  if (!NT_SUCCESS(status)) {
260  return bh;
261  }
262 
263  bh = sb_getblk(inode->i_sb, lbn);
264  if (!bh) {
265  *err = -ENOMEM;
266  return bh;
267  }
268  if (buffer_uptodate(bh))
269  return bh;
270 
271  *err = bh_submit_read(bh);
272  if (*err) {
273  __brelse(bh);
274  return NULL;
275  }
276  return bh;
277 }
static unsigned int block
Definition: xmlmemory.c:118
static struct buffer_head * sb_getblk(struct super_block *sb, sector_t block)
Definition: module.h:966
Definition: arc.h:39
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS Ext2MapExtent(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN BOOLEAN Alloc, OUT PULONG Block, OUT PULONG Number)
Definition: extents.c:25
Definition: arc.h:48
Definition: fs.h:78
smooth NULL
Definition: ftsmooth.c:416
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define IsMcbSymLink(Mcb)
Definition: ext2fs.h:953
GLuint GLuint num
Definition: glext.h:9618
#define INODE_HAS_EXTENT(i)
Definition: ext4_ext.h:228
void __brelse(struct buffer_head *)
Definition: linux.c:800
#define err(...)
int bh_submit_read(struct buffer_head *bh)
Definition: linux.c:884
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
Definition: fatprocs.h:334
int Ext2LinuxError(NTSTATUS Status)
Definition: misc.c:304
NTSTATUS Ext2MapIndirect(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Index, IN BOOLEAN bAlloc, OUT PULONG pBlock, OUT PULONG Number)
Definition: indirect.c:823
unsigned int ULONG
Definition: retypes.h:1
struct super_block * i_sb
Definition: fs.h:96
return STATUS_SUCCESS
Definition: btrfs.c:2966
Definition: ps.c:97

Referenced by ext3_add_entry(), ext3_append(), ext3_find_entry(), and ext3_is_dir_empty().

◆ ext3_current_time()

__u32 ext3_current_time ( struct inode in)

Definition at line 204 of file htree.c.

205 {
206  LARGE_INTEGER SysTime;
207  KeQuerySystemTime(&SysTime);
208 
209  return Ext2LinuxTime(SysTime);
210 }
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
ULONG Ext2LinuxTime(IN LARGE_INTEGER SysTime)
Definition: misc.c:51

Referenced by add_dirent_to_buf(), Ext2RemoveEntry(), and Ext2SetFileType().

◆ ext3_dec_count()

void ext3_dec_count ( struct inode inode)

Definition at line 312 of file htree.c.

313 {
314  inode->i_nlink--;
315 }
__u16 i_nlink
Definition: fs.h:91
Definition: fs.h:78

Referenced by Ext2RemoveEntry(), Ext2SetFileType(), and Ext2SetReparsePoint().

◆ ext3_delete_entry()

int ext3_delete_entry ( struct ext2_icb icb,
struct inode dir,
struct ext3_dir_entry_2 de_del,
struct buffer_head bh 
)

Definition at line 2005 of file htree.c.

2008 {
2009  struct ext3_dir_entry_2 *de, *pde = NULL;
2010  size_t i = 0;
2011 
2012  de = (struct ext3_dir_entry_2 *) bh->b_data;
2013  while (i < bh->b_size) {
2014  if (!ext3_check_dir_entry("ext3_delete_entry", dir, de, bh, i))
2015  return -EIO;
2016  if (de == de_del) {
2017  if (pde)
2021  else
2022  de->inode = 0;
2023  dir->i_version++;
2024  /* ext3_journal_dirty_metadata(handle, bh); */
2025  set_buffer_dirty(bh);
2026  return 0;
2027  }
2029  pde = de;
2030  de = ext3_next_entry(de);
2031  }
2032  return -ENOENT;
2033 }
Definition: ext3_fs.h:774
while(1)
Definition: macro.lex.yy.c:740
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
int ext3_check_dir_entry(const char *function, struct inode *dir, struct ext3_dir_entry_2 *de, struct buffer_head *bh, unsigned long offset)
Definition: generic.c:2142
unsigned int dir
Definition: maze.c:112
__le32 inode
Definition: ext3_fs.h:775
char * b_data
Definition: module.h:725
static __le16 ext3_rec_len_to_disk(unsigned len)
Definition: ext3_fs.h:880
struct ext3_dir_entry_2 * ext3_next_entry(struct ext3_dir_entry_2 *p)
Definition: generic.c:2177
Definition: arc.h:46
Definition: arc.h:40
static unsigned ext3_rec_len_from_disk(__le16 dlen)
Definition: ext3_fs.h:871
__le16 rec_len
Definition: ext3_fs.h:776

Referenced by Ext2RemoveEntry().

◆ ext3_find_entry()

struct buffer_head* ext3_find_entry ( struct ext2_icb icb,
struct dentry dentry,
struct ext3_dir_entry_2 **  res_dir 
)

Definition at line 2166 of file htree.c.

2169 {
2170  struct inode *dir = dentry->d_parent->d_inode;
2171  struct super_block *sb = dir->i_sb;
2172  struct buffer_head *bh_use[NAMEI_RA_SIZE];
2173  struct buffer_head *bh, *ret = NULL;
2175  int ra_max = 0; /* Number of bh's in the readahead
2176  buffer, bh_use[] */
2177  int ra_ptr = 0; /* Current index into readahead
2178  buffer */
2179  int num = 0;
2180  ext3_lblk_t nblocks;
2181  int i, err;
2182  int namelen = dentry->d_name.len;
2183 
2184  *res_dir = NULL;
2185  if (namelen > EXT3_NAME_LEN)
2186  return NULL;
2187 
2188 #ifdef EXT2_HTREE_INDEX
2189  if (icb->MajorFunction != IRP_MJ_CREATE && is_dx(dir)) {
2190  bh = ext3_dx_find_entry(icb, dentry, res_dir, &err);
2191  /*
2192  * On success, or if the error was file not found,
2193  * return. Otherwise, fall back to doing a search the
2194  * old fashioned way.
2195  */
2196  if (bh || (err != ERR_BAD_DX_DIR))
2197  return bh;
2198  dxtrace(printk("ext4_find_entry: dx failed, "
2199  "falling back\n"));
2200  }
2201 #endif
2202 
2203  nblocks = (ext3_lblk_t)(dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb));
2204  start = 0;
2205  block = start;
2206 restart:
2207  do {
2208  /*
2209  * We deal with the read-ahead logic here.
2210  */
2211  if (ra_ptr >= ra_max) {
2212  /* Refill the readahead buffer */
2213  ra_ptr = 0;
2214  b = block;
2215  for (ra_max = 0; ra_max < NAMEI_RA_SIZE; ra_max++) {
2216  /*
2217  * Terminate if we reach the end of the
2218  * directory and must wrap, or if our
2219  * search has finished at this block.
2220  */
2221  if (b >= nblocks || (num && block == start)) {
2222  bh_use[ra_max] = NULL;
2223  break;
2224  }
2225  num++;
2226  bh = ext3_bread(icb, dir, b++, &err);
2227  bh_use[ra_max] = bh;
2228  }
2229  }
2230  if ((bh = bh_use[ra_ptr++]) == NULL)
2231  goto next;
2232  wait_on_buffer(bh);
2233  if (!buffer_uptodate(bh)) {
2234  /* read error, skip block & hope for the best */
2235  ext3_error(sb, __FUNCTION__, "reading directory #%lu "
2236  "offset %lu", dir->i_ino,
2237  (unsigned long)block);
2238  brelse(bh);
2239  goto next;
2240  }
2241  i = search_dirblock(bh, dir, dentry,
2242  block << EXT3_BLOCK_SIZE_BITS(sb), res_dir);
2243  if (i == 1) {
2244  ret = bh;
2245  goto cleanup_and_exit;
2246  } else {
2247  brelse(bh);
2248  if (i < 0)
2249  goto cleanup_and_exit;
2250  }
2251 next:
2252  if (++block >= nblocks)
2253  block = 0;
2254  } while (block != start);
2255 
2256  /*
2257  * If the directory has grown while we were searching, then
2258  * search the last part of the directory before giving up.
2259  */
2260  block = nblocks;
2261  nblocks = (ext3_lblk_t)(dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb));
2262  if (block < nblocks) {
2263  start = 0;
2264  goto restart;
2265  }
2266 
2267 cleanup_and_exit:
2268  /* Clean up the read-ahead blocks */
2269  for (; ra_ptr < ra_max; ra_ptr++)
2270  brelse(bh_use[ra_ptr]);
2271  return ret;
2272 }
static unsigned int block
Definition: xmlmemory.c:118
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
struct buffer_head * ext3_dx_find_entry(struct ext2_icb *, struct dentry *dentry, struct ext3_dir_entry_2 **res_dir, int *err)
superblock * sb
Definition: btrfs.c:4162
Definition: fs.h:64
struct buffer_head * ext3_bread(struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
Definition: htree.c:230
#define NAMEI_RA_SIZE
Definition: htree.c:2152
GLint namelen
Definition: glext.h:7232
static void brelse(struct buffer_head *bh)
Definition: module.h:945
#define EXT3_NAME_LEN
Definition: ext3_fs.h:759
Definition: fs.h:78
static int search_dirblock(struct buffer_head *bh, struct inode *dir, struct dentry *dentry, unsigned long offset, struct ext3_dir_entry_2 **res_dir)
Definition: htree.c:2109
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static void wait_on_buffer(struct buffer_head *bh)
Definition: module.h:1011
smooth NULL
Definition: ftsmooth.c:416
Definition: fs.h:117
unsigned int dir
Definition: maze.c:112
struct dentry * d_parent
Definition: fs.h:124
#define b
Definition: ke_i.h:79
void restart(int argc, const char *argv[])
Definition: cmds.c:2115
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
asmlinkage int printk(const char *fmt,...)
Definition: output.c:76
GLuint GLuint num
Definition: glext.h:9618
int ret
#define is_dx(dir)
Definition: ext3_fs.h:901
__u32 ext3_lblk_t
Definition: ext3_fs_i.h:30
#define err(...)
static unsigned __int64 next
Definition: rand_nt.c:6
GLuint start
Definition: gl.h:1545
UCHAR MajorFunction
Definition: ext2fs.h:1047
#define EXT3_BLOCK_SIZE_BITS(s)
Definition: ext3_fs.h:87
#define __FUNCTION__
Definition: types.h:112
#define ext3_error
Definition: ext2fs.h:2475
struct dentry::@676 d_name

Referenced by Ext2RemoveEntry(), Ext2ScanDir(), and Ext2SetFileType().

◆ ext3_inc_count()

void ext3_inc_count ( struct inode inode)

Definition at line 307 of file htree.c.

308 {
309  inode->i_nlink++;
310 }
__u16 i_nlink
Definition: fs.h:91
Definition: fs.h:78

Referenced by Ext2AddEntry(), and Ext2SetFileType().

◆ ext3_is_dir_empty()

int ext3_is_dir_empty ( struct ext2_icb icb,
struct inode inode 
)

Definition at line 2038 of file htree.c.

2039 {
2040  unsigned int offset;
2041  struct buffer_head *bh;
2042  struct ext3_dir_entry_2 *de, *de1;
2043  struct super_block *sb;
2044  int err = 0;
2045 
2046  sb = inode->i_sb;
2047  if (inode->i_size < EXT3_DIR_REC_LEN(1) + EXT3_DIR_REC_LEN(2) ||
2048  !(bh = ext3_bread(icb, inode, 0, &err))) {
2049  if (err)
2051  "error %d reading directory #%lu offset 0",
2052  err, inode->i_ino);
2053  else
2055  "bad directory (dir #%lu) - no data block",
2056  inode->i_ino);
2057  return 1;
2058  }
2059  de = (struct ext3_dir_entry_2 *) bh->b_data;
2060  de1 = ext3_next_entry(de);
2061  if (le32_to_cpu(de->inode) != inode->i_ino ||
2062  !le32_to_cpu(de1->inode) ||
2063  strcmp(".", de->name) ||
2064  strcmp("..", de1->name)) {
2065  ext3_warning(inode->i_sb, "empty_dir",
2066  "bad directory (dir #%lu) - no `.' or `..'",
2067  inode->i_ino);
2068  brelse(bh);
2069  return 1;
2070  }
2073  de = ext3_next_entry(de1);
2074  while (offset < inode->i_size) {
2075  if (!bh ||
2076  (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) {
2077  err = 0;
2078  brelse(bh);
2079  bh = ext3_bread(icb, inode, offset >> EXT3_BLOCK_SIZE_BITS(sb), &err);
2080  if (!bh) {
2081  if (err)
2082  ext3_error(sb, __FUNCTION__, "error %d reading directory"
2083  " #%lu offset %u", err, inode->i_ino, offset);
2084  offset += sb->s_blocksize;
2085  continue;
2086  }
2087  de = (struct ext3_dir_entry_2 *) bh->b_data;
2088  }
2089  if (!ext3_check_dir_entry("empty_dir", inode, de, bh, offset)) {
2090  de = (struct ext3_dir_entry_2 *)(bh->b_data +
2091  sb->s_blocksize);
2092  offset = (offset | (sb->s_blocksize - 1)) + 1;
2093  continue;
2094  }
2095  if (le32_to_cpu(de->inode)) {
2096  brelse(bh);
2097  return 0;
2098  }
2100  de = ext3_next_entry(de);
2101  }
2102  brelse(bh);
2103  return 1;
2104 }
#define EXT3_DIR_REC_LEN(len)
Definition: ext3_fs.h:867
superblock * sb
Definition: btrfs.c:4162
Definition: ext3_fs.h:774
Definition: fs.h:64
struct buffer_head * ext3_bread(struct ext2_icb *icb, struct inode *inode, unsigned long block, int *err)
Definition: htree.c:230
GLintptr offset
Definition: glext.h:5920
static void brelse(struct buffer_head *bh)
Definition: module.h:945
Definition: fs.h:78
char name[EXT3_NAME_LEN]
Definition: ext3_fs.h:779
#define le32_to_cpu
Definition: module.h:147
int ext3_check_dir_entry(const char *function, struct inode *dir, struct ext3_dir_entry_2 *de, struct buffer_head *bh, unsigned long offset)
Definition: generic.c:2142
loff_t i_size
Definition: fs.h:80
__le32 inode
Definition: ext3_fs.h:775
#define err(...)
__u32 i_ino
Definition: fs.h:79
char * b_data
Definition: module.h:725
void ext3_warning(struct super_block *sb, const char *function, char *fmt,...)
Definition: htree.c:212
struct ext3_dir_entry_2 * ext3_next_entry(struct ext3_dir_entry_2 *p)
Definition: generic.c:2177
#define EXT3_BLOCK_SIZE_BITS(s)
Definition: ext3_fs.h:87
static unsigned ext3_rec_len_from_disk(__le16 dlen)
Definition: ext3_fs.h:871
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
struct super_block * i_sb
Definition: fs.h:96
__le16 rec_len
Definition: ext3_fs.h:776
#define __FUNCTION__
Definition: types.h:112
#define ext3_error
Definition: ext2fs.h:2475

Referenced by Ext2IsDirectoryEmpty().

◆ ext3_mark_inode_dirty()

int ext3_mark_inode_dirty ( struct ext2_icb icb,
struct inode in 
)

Definition at line 360 of file htree.c.

361 {
362  if (Ext2SaveInode(icb, in->i_sb->s_priv, in))
363  return 0;
364 
365  return -ENOMEM;
366 }
Definition: arc.h:48
GLuint in
Definition: glext.h:9616
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
Definition: generic.c:548

Referenced by add_dirent_to_buf(), Ext2AddDotEntries(), Ext2AddEntry(), Ext2RemoveEntry(), and Ext2SetFileType().

◆ ext3_release_dir()

int ext3_release_dir ( struct inode inode,
struct file filp 
)

Definition at line 1929 of file htree.c.

1930 {
1931  return 0;
1932 }

Referenced by Ext2Cleanup().

◆ ext3_set_de_type()

void ext3_set_de_type ( struct super_block sb,
struct ext3_dir_entry_2 de,
umode_t  mode 
)

Definition at line 347 of file htree.c.

350 {
353 }
superblock * sb
Definition: btrfs.c:4162
__u8 file_type
Definition: ext3_fs.h:778
#define EXT3_FEATURE_INCOMPAT_FILETYPE
Definition: ext3_fs.h:679
#define EXT3_HAS_INCOMPAT_FEATURE(sb, mask)
Definition: ext3_fs.h:649
GLenum mode
Definition: glext.h:6217
unsigned char ext3_type_by_mode(umode_t mode)
Definition: htree.c:317

Referenced by add_dirent_to_buf(), Ext2AddDotEntries(), and Ext2SetFileType().

◆ ext3_type_by_mode()

unsigned char ext3_type_by_mode ( umode_t  mode)

Definition at line 317 of file htree.c.

318 {
319  unsigned char type = 0;
320 
321  switch (mode & S_IFMT) {
322  case S_IFREG:
324  break;
325  case S_IFDIR:
326  type = EXT3_FT_DIR;
327  break;
328  case S_IFCHR:
330  break;
331  case S_IFBLK:
333  break;
334  case S_IFIFO:
335  type = EXT3_FT_FIFO;
336  break;
337  case S_IFSOCK:
338  type = EXT3_FT_SOCK;
339  break;
340  case S_IFLNK:
342  }
343 
344  return type;
345 };
#define EXT3_FT_BLKDEV
Definition: ext3_fs.h:790
#define EXT3_FT_SOCK
Definition: ext3_fs.h:792
#define EXT3_FT_FIFO
Definition: ext3_fs.h:791
#define EXT3_FT_DIR
Definition: ext3_fs.h:788
#define EXT3_FT_CHRDEV
Definition: ext3_fs.h:789
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define S_IFREG
Definition: ext2fs.h:356
#define S_IFLNK
Definition: ext2fs.h:355
#define S_IFMT
Definition: ext2fs.h:353
#define S_IFSOCK
Definition: ext2fs.h:354
#define S_IFDIR
Definition: acwin.h:115
#define EXT3_FT_SYMLINK
Definition: ext3_fs.h:793
GLenum mode
Definition: glext.h:6217
#define EXT3_FT_REG_FILE
Definition: ext3_fs.h:787
#define S_IFCHR
Definition: ext2fs.h:359
#define S_IFIFO
Definition: ext2fs.h:360
#define S_IFBLK
Definition: ext2fs.h:357

Referenced by ext3_set_de_type().

◆ ext3_update_dx_flag()

void ext3_update_dx_flag ( struct inode inode)

Definition at line 368 of file htree.c.

369 {
372  EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL;
373 }
#define EXT3_INDEX_FL
Definition: ext3_fs.h:220
Definition: fs.h:78
#define EXT3_HAS_COMPAT_FEATURE(sb, mask)
Definition: ext3_fs.h:645
#define EXT3_FEATURE_COMPAT_DIR_INDEX
Definition: ext3_fs.h:669
struct super_block * i_sb
Definition: fs.h:96

Referenced by add_dirent_to_buf(), and Ext2RemoveEntry().

◆ ext3_warning()

void ext3_warning ( struct super_block sb,
const char function,
char fmt,
  ... 
)

Definition at line 212 of file htree.c.

214 {
215 #if DX_DEBUG
216  va_list args;
217 
218  va_start(args, fmt);
219  printk("EXT3-fs warning (device %s): %s: ",
220  sb->s_id, function);
221  printk(fmt, args);
222  printk("\n");
223  va_end(args);
224 #endif
225 }
superblock * sb
Definition: btrfs.c:4162
Definition: match.c:390
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
asmlinkage int printk(const char *fmt,...)
Definition: output.c:76
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define args
Definition: format.c:66
Definition: dsound.c:943

Referenced by Ext2RemoveEntry(), and ext3_is_dir_empty().

◆ search_dirblock()

static int search_dirblock ( struct buffer_head bh,
struct inode dir,
struct dentry dentry,
unsigned long  offset,
struct ext3_dir_entry_2 **  res_dir 
)
inlinestatic

Definition at line 2109 of file htree.c.

2114 {
2115  struct ext3_dir_entry_2 * de;
2116  char * dlimit;
2117  int de_len;
2118  const char *name = dentry->d_name.name;
2119  int namelen = dentry->d_name.len;
2120 
2121  de = (struct ext3_dir_entry_2 *) bh->b_data;
2122  dlimit = bh->b_data + dir->i_sb->s_blocksize;
2123  while ((char *) de < dlimit) {
2124  /* this code is executed quadratically often */
2125  /* do minimal checking `by hand' */
2126 
2127  if ((char *) de + namelen <= dlimit &&
2128  ext3_match (namelen, name, de)) {
2129  /* found a match - just to be sure, do a full check */
2130  if (!ext3_check_dir_entry("ext3_find_entry",
2131  dir, de, bh, offset))
2132  return -1;
2133  *res_dir = de;
2134  return 1;
2135  }
2136  /* prevent looping on a bad block */
2137  de_len = ext3_rec_len_from_disk(de->rec_len);
2138 
2139  if (de_len <= 0)
2140  return -1;
2141  offset += de_len;
2142  de = (struct ext3_dir_entry_2 *) ((char *) de + de_len);
2143  }
2144  return 0;
2145 }
Definition: ext3_fs.h:774
GLintptr offset
Definition: glext.h:5920
GLint namelen
Definition: glext.h:7232
while(1)
Definition: macro.lex.yy.c:740
int ext3_check_dir_entry(const char *function, struct inode *dir, struct ext3_dir_entry_2 *de, struct buffer_head *bh, unsigned long offset)
Definition: generic.c:2142
Definition: fs.h:117
unsigned int dir
Definition: maze.c:112
char * b_data
Definition: module.h:725
static unsigned ext3_rec_len_from_disk(__le16 dlen)
Definition: ext3_fs.h:871
Definition: name.c:36
__le16 rec_len
Definition: ext3_fs.h:776
struct dentry::@676 d_name

Referenced by ext3_find_entry().