Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
xfs_dir2.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_types.h"
21 #include "xfs_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_mount.h"
27 #include "xfs_da_btree.h"
28 #include "xfs_bmap_btree.h"
29 #include "xfs_alloc_btree.h"
30 #include "xfs_dinode.h"
31 #include "xfs_inode.h"
32 #include "xfs_inode_item.h"
33 #include "xfs_bmap.h"
34 #include "xfs_dir2.h"
35 #include "xfs_dir2_format.h"
36 #include "xfs_dir2_priv.h"
37 #include "xfs_error.h"
38 #include "xfs_vnodeops.h"
39 #include "xfs_trace.h"
40 
41 struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2};
42 
43 /*
44  * ASCII case-insensitive (ie. A-Z) support for directories that was
45  * used in IRIX.
46  */
49  struct xfs_name *name)
50 {
52  int i;
53 
54  for (i = 0, hash = 0; i < name->len; i++)
55  hash = tolower(name->name[i]) ^ rol32(hash, 7);
56 
57  return hash;
58 }
59 
60 STATIC enum xfs_dacmp
62  struct xfs_da_args *args,
63  const unsigned char *name,
64  int len)
65 {
66  enum xfs_dacmp result;
67  int i;
68 
69  if (args->namelen != len)
70  return XFS_CMP_DIFFERENT;
71 
72  result = XFS_CMP_EXACT;
73  for (i = 0; i < len; i++) {
74  if (args->name[i] == name[i])
75  continue;
76  if (tolower(args->name[i]) != tolower(name[i]))
77  return XFS_CMP_DIFFERENT;
78  result = XFS_CMP_CASE;
79  }
80 
81  return result;
82 }
83 
84 static struct xfs_nameops xfs_ascii_ci_nameops = {
85  .hashname = xfs_ascii_ci_hashname,
86  .compname = xfs_ascii_ci_compname,
87 };
88 
89 void
91  xfs_mount_t *mp)
92 {
93  ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb));
94  ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <=
96  mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog);
97  mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog;
98  mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp));
99  mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp));
100  mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp));
101  mp->m_attr_node_ents =
102  (mp->m_sb.sb_blocksize - (uint)sizeof(xfs_da_node_hdr_t)) /
103  (uint)sizeof(xfs_da_node_entry_t);
104  mp->m_dir_node_ents =
105  (mp->m_dirblksize - (uint)sizeof(xfs_da_node_hdr_t)) /
106  (uint)sizeof(xfs_da_node_entry_t);
107  mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100;
108  if (xfs_sb_version_hasasciici(&mp->m_sb))
109  mp->m_dirnameops = &xfs_ascii_ci_nameops;
110  else
111  mp->m_dirnameops = &xfs_default_nameops;
112 }
113 
114 /*
115  * Return 1 if directory contains only "." and "..".
116  */
117 int
119  xfs_inode_t *dp)
120 {
121  xfs_dir2_sf_hdr_t *sfp;
122 
123  ASSERT(S_ISDIR(dp->i_d.di_mode));
124  if (dp->i_d.di_size == 0) /* might happen during shutdown. */
125  return 1;
126  if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp))
127  return 0;
128  sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
129  return !sfp->count;
130 }
131 
132 /*
133  * Validate a given inode number.
134  */
135 int
137  xfs_mount_t *mp,
138  xfs_ino_t ino)
139 {
140  xfs_agblock_t agblkno;
141  xfs_agino_t agino;
142  xfs_agnumber_t agno;
143  int ino_ok;
144  int ioff;
145 
146  agno = XFS_INO_TO_AGNO(mp, ino);
147  agblkno = XFS_INO_TO_AGBNO(mp, ino);
148  ioff = XFS_INO_TO_OFFSET(mp, ino);
149  agino = XFS_OFFBNO_TO_AGINO(mp, agblkno, ioff);
150  ino_ok =
151  agno < mp->m_sb.sb_agcount &&
152  agblkno < mp->m_sb.sb_agblocks &&
153  agblkno != 0 &&
154  ioff < (1 << mp->m_sb.sb_inopblog) &&
155  XFS_AGINO_TO_INO(mp, agno, agino) == ino;
158  xfs_warn(mp, "Invalid inode number 0x%Lx",
159  (unsigned long long) ino);
160  XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp);
161  return XFS_ERROR(EFSCORRUPTED);
162  }
163  return 0;
164 }
165 
166 /*
167  * Initialize a directory with its "." and ".." entries.
168  */
169 int
171  xfs_trans_t *tp,
172  xfs_inode_t *dp,
173  xfs_inode_t *pdp)
174 {
176  int error;
177 
178  memset((char *)&args, 0, sizeof(args));
179  args.dp = dp;
180  args.trans = tp;
181  ASSERT(S_ISDIR(dp->i_d.di_mode));
182  if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino)))
183  return error;
184  return xfs_dir2_sf_create(&args, pdp->i_ino);
185 }
186 
187 /*
188  Enter a name in a directory.
189  */
190 int
192  xfs_trans_t *tp,
193  xfs_inode_t *dp,
194  struct xfs_name *name,
195  xfs_ino_t inum, /* new entry inode number */
196  xfs_fsblock_t *first, /* bmap's firstblock */
197  xfs_bmap_free_t *flist, /* bmap's freeblock list */
198  xfs_extlen_t total) /* bmap's total block count */
199 {
201  int rval;
202  int v; /* type-checking value */
203 
204  ASSERT(S_ISDIR(dp->i_d.di_mode));
205  if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
206  return rval;
207  XFS_STATS_INC(xs_dir_create);
208 
209  memset(&args, 0, sizeof(xfs_da_args_t));
210  args.name = name->name;
211  args.namelen = name->len;
212  args.hashval = dp->i_mount->m_dirnameops->hashname(name);
213  args.inumber = inum;
214  args.dp = dp;
215  args.firstblock = first;
216  args.flist = flist;
217  args.total = total;
218  args.whichfork = XFS_DATA_FORK;
219  args.trans = tp;
221 
222  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
223  rval = xfs_dir2_sf_addname(&args);
224  else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
225  return rval;
226  else if (v)
227  rval = xfs_dir2_block_addname(&args);
228  else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
229  return rval;
230  else if (v)
231  rval = xfs_dir2_leaf_addname(&args);
232  else
233  rval = xfs_dir2_node_addname(&args);
234  return rval;
235 }
236 
237 /*
238  * If doing a CI lookup and case-insensitive match, dup actual name into
239  * args.value. Return EEXIST for success (ie. name found) or an error.
240  */
241 int
243  struct xfs_da_args *args,
244  const unsigned char *name,
245  int len)
246 {
247  if (args->cmpresult == XFS_CMP_DIFFERENT)
248  return ENOENT;
249  if (args->cmpresult != XFS_CMP_CASE ||
250  !(args->op_flags & XFS_DA_OP_CILOOKUP))
251  return EEXIST;
252 
253  args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL);
254  if (!args->value)
255  return ENOMEM;
256 
257  memcpy(args->value, name, len);
258  args->valuelen = len;
259  return EEXIST;
260 }
261 
262 /*
263  * Lookup a name in a directory, give back the inode number.
264  * If ci_name is not NULL, returns the actual name in ci_name if it differs
265  * to name, or ci_name->name is set to NULL for an exact match.
266  */
267 
268 int
270  xfs_trans_t *tp,
271  xfs_inode_t *dp,
272  struct xfs_name *name,
273  xfs_ino_t *inum, /* out: inode number */
274  struct xfs_name *ci_name) /* out: actual name if CI match */
275 {
277  int rval;
278  int v; /* type-checking value */
279 
280  ASSERT(S_ISDIR(dp->i_d.di_mode));
281  XFS_STATS_INC(xs_dir_lookup);
282 
283  memset(&args, 0, sizeof(xfs_da_args_t));
284  args.name = name->name;
285  args.namelen = name->len;
286  args.hashval = dp->i_mount->m_dirnameops->hashname(name);
287  args.dp = dp;
288  args.whichfork = XFS_DATA_FORK;
289  args.trans = tp;
291  if (ci_name)
293 
294  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
295  rval = xfs_dir2_sf_lookup(&args);
296  else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
297  return rval;
298  else if (v)
299  rval = xfs_dir2_block_lookup(&args);
300  else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
301  return rval;
302  else if (v)
303  rval = xfs_dir2_leaf_lookup(&args);
304  else
305  rval = xfs_dir2_node_lookup(&args);
306  if (rval == EEXIST)
307  rval = 0;
308  if (!rval) {
309  *inum = args.inumber;
310  if (ci_name) {
311  ci_name->name = args.value;
312  ci_name->len = args.valuelen;
313  }
314  }
315  return rval;
316 }
317 
318 /*
319  * Remove an entry from a directory.
320  */
321 int
323  xfs_trans_t *tp,
324  xfs_inode_t *dp,
325  struct xfs_name *name,
326  xfs_ino_t ino,
327  xfs_fsblock_t *first, /* bmap's firstblock */
328  xfs_bmap_free_t *flist, /* bmap's freeblock list */
329  xfs_extlen_t total) /* bmap's total block count */
330 {
332  int rval;
333  int v; /* type-checking value */
334 
335  ASSERT(S_ISDIR(dp->i_d.di_mode));
336  XFS_STATS_INC(xs_dir_remove);
337 
338  memset(&args, 0, sizeof(xfs_da_args_t));
339  args.name = name->name;
340  args.namelen = name->len;
341  args.hashval = dp->i_mount->m_dirnameops->hashname(name);
342  args.inumber = ino;
343  args.dp = dp;
344  args.firstblock = first;
345  args.flist = flist;
346  args.total = total;
347  args.whichfork = XFS_DATA_FORK;
348  args.trans = tp;
349 
350  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
351  rval = xfs_dir2_sf_removename(&args);
352  else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
353  return rval;
354  else if (v)
355  rval = xfs_dir2_block_removename(&args);
356  else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
357  return rval;
358  else if (v)
359  rval = xfs_dir2_leaf_removename(&args);
360  else
361  rval = xfs_dir2_node_removename(&args);
362  return rval;
363 }
364 
365 /*
366  * Read a directory.
367  */
368 int
370  xfs_inode_t *dp,
371  void *dirent,
372  size_t bufsize,
373  xfs_off_t *offset,
374  filldir_t filldir)
375 {
376  int rval; /* return value */
377  int v; /* type-checking value */
378 
379  trace_xfs_readdir(dp);
380 
381  if (XFS_FORCED_SHUTDOWN(dp->i_mount))
382  return XFS_ERROR(EIO);
383 
384  ASSERT(S_ISDIR(dp->i_d.di_mode));
385  XFS_STATS_INC(xs_dir_getdents);
386 
387  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
388  rval = xfs_dir2_sf_getdents(dp, dirent, offset, filldir);
389  else if ((rval = xfs_dir2_isblock(NULL, dp, &v)))
390  ;
391  else if (v)
392  rval = xfs_dir2_block_getdents(dp, dirent, offset, filldir);
393  else
394  rval = xfs_dir2_leaf_getdents(dp, dirent, bufsize, offset,
395  filldir);
396  return rval;
397 }
398 
399 /*
400  * Replace the inode number of a directory entry.
401  */
402 int
404  xfs_trans_t *tp,
405  xfs_inode_t *dp,
406  struct xfs_name *name, /* name of entry to replace */
407  xfs_ino_t inum, /* new inode number */
408  xfs_fsblock_t *first, /* bmap's firstblock */
409  xfs_bmap_free_t *flist, /* bmap's freeblock list */
410  xfs_extlen_t total) /* bmap's total block count */
411 {
413  int rval;
414  int v; /* type-checking value */
415 
416  ASSERT(S_ISDIR(dp->i_d.di_mode));
417 
418  if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
419  return rval;
420 
421  memset(&args, 0, sizeof(xfs_da_args_t));
422  args.name = name->name;
423  args.namelen = name->len;
424  args.hashval = dp->i_mount->m_dirnameops->hashname(name);
425  args.inumber = inum;
426  args.dp = dp;
427  args.firstblock = first;
428  args.flist = flist;
429  args.total = total;
430  args.whichfork = XFS_DATA_FORK;
431  args.trans = tp;
432 
433  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
434  rval = xfs_dir2_sf_replace(&args);
435  else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
436  return rval;
437  else if (v)
438  rval = xfs_dir2_block_replace(&args);
439  else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
440  return rval;
441  else if (v)
442  rval = xfs_dir2_leaf_replace(&args);
443  else
444  rval = xfs_dir2_node_replace(&args);
445  return rval;
446 }
447 
448 /*
449  * See if this entry can be added to the directory without allocating space.
450  * First checks that the caller couldn't reserve enough space (resblks = 0).
451  */
452 int
454  xfs_trans_t *tp,
455  xfs_inode_t *dp,
456  struct xfs_name *name, /* name of entry to add */
457  uint resblks)
458 {
460  int rval;
461  int v; /* type-checking value */
462 
463  if (resblks)
464  return 0;
465 
466  ASSERT(S_ISDIR(dp->i_d.di_mode));
467 
468  memset(&args, 0, sizeof(xfs_da_args_t));
469  args.name = name->name;
470  args.namelen = name->len;
471  args.hashval = dp->i_mount->m_dirnameops->hashname(name);
472  args.dp = dp;
473  args.whichfork = XFS_DATA_FORK;
474  args.trans = tp;
477 
478  if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
479  rval = xfs_dir2_sf_addname(&args);
480  else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
481  return rval;
482  else if (v)
483  rval = xfs_dir2_block_addname(&args);
484  else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
485  return rval;
486  else if (v)
487  rval = xfs_dir2_leaf_addname(&args);
488  else
489  rval = xfs_dir2_node_addname(&args);
490  return rval;
491 }
492 
493 /*
494  * Utility routines.
495  */
496 
497 /*
498  * Add a block to the directory.
499  *
500  * This routine is for data and free blocks, not leaf/node blocks which are
501  * handled by xfs_da_grow_inode.
502  */
503 int
505  struct xfs_da_args *args,
506  int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */
507  xfs_dir2_db_t *dbp) /* out: block number added */
508 {
509  struct xfs_inode *dp = args->dp;
510  struct xfs_mount *mp = dp->i_mount;
511  xfs_fileoff_t bno; /* directory offset of new block */
512  int count; /* count of filesystem blocks */
513  int error;
514 
515  trace_xfs_dir2_grow_inode(args, space);
516 
517  /*
518  * Set lowest possible block in the space requested.
519  */
520  bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE);
521  count = mp->m_dirblkfsbs;
522 
523  error = xfs_da_grow_inode_int(args, &bno, count);
524  if (error)
525  return error;
526 
527  *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno);
528 
529  /*
530  * Update file's size if this is the data space and it grew.
531  */
532  if (space == XFS_DIR2_DATA_SPACE) {
533  xfs_fsize_t size; /* directory file (data) size */
534 
535  size = XFS_FSB_TO_B(mp, bno + count);
536  if (size > dp->i_d.di_size) {
537  dp->i_d.di_size = size;
539  }
540  }
541  return 0;
542 }
543 
544 /*
545  * See if the directory is a single-block form directory.
546  */
547 int
549  xfs_trans_t *tp,
550  xfs_inode_t *dp,
551  int *vp) /* out: 1 is block, 0 is not block */
552 {
553  xfs_fileoff_t last; /* last file offset */
554  xfs_mount_t *mp;
555  int rval;
556 
557  mp = dp->i_mount;
558  if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK)))
559  return rval;
560  rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize;
561  ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize);
562  *vp = rval;
563  return 0;
564 }
565 
566 /*
567  * See if the directory is a single-leaf form directory.
568  */
569 int
571  xfs_trans_t *tp,
572  xfs_inode_t *dp,
573  int *vp) /* out: 1 is leaf, 0 is not leaf */
574 {
575  xfs_fileoff_t last; /* last file offset */
576  xfs_mount_t *mp;
577  int rval;
578 
579  mp = dp->i_mount;
580  if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK)))
581  return rval;
582  *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog);
583  return 0;
584 }
585 
586 /*
587  * Remove the given block from the directory.
588  * This routine is used for data and free blocks, leaf/node are done
589  * by xfs_da_shrink_inode.
590  */
591 int
593  xfs_da_args_t *args,
594  xfs_dir2_db_t db,
595  struct xfs_buf *bp)
596 {
597  xfs_fileoff_t bno; /* directory file offset */
598  xfs_dablk_t da; /* directory file offset */
599  int done; /* bunmap is finished */
600  xfs_inode_t *dp;
601  int error;
602  xfs_mount_t *mp;
603  xfs_trans_t *tp;
604 
605  trace_xfs_dir2_shrink_inode(args, db);
606 
607  dp = args->dp;
608  mp = dp->i_mount;
609  tp = args->trans;
610  da = xfs_dir2_db_to_da(mp, db);
611  /*
612  * Unmap the fsblock(s).
613  */
614  if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs,
615  XFS_BMAPI_METADATA, 0, args->firstblock, args->flist,
616  &done))) {
617  /*
618  * ENOSPC actually can happen if we're in a removename with
619  * no space reservation, and the resulting block removal
620  * would cause a bmap btree split or conversion from extents
621  * to btree. This can only happen for un-fragmented
622  * directory blocks, since you need to be punching out
623  * the middle of an extent.
624  * In this case we need to leave the block in the file,
625  * and not binval it.
626  * So the block has to be in a consistent empty state
627  * and appropriately logged.
628  * We don't free up the buffer, the caller can tell it
629  * hasn't happened since it got an error back.
630  */
631  return error;
632  }
633  ASSERT(done);
634  /*
635  * Invalidate the buffer from the transaction.
636  */
637  xfs_trans_binval(tp, bp);
638  /*
639  * If it's not a data block, we're done.
640  */
641  if (db >= XFS_DIR2_LEAF_FIRSTDB(mp))
642  return 0;
643  /*
644  * If the block isn't the last one in the directory, we're done.
645  */
646  if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(mp, db + 1, 0))
647  return 0;
648  bno = da;
649  if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) {
650  /*
651  * This can't really happen unless there's kernel corruption.
652  */
653  return error;
654  }
655  if (db == mp->m_dirdatablk)
656  ASSERT(bno == 0);
657  else
658  ASSERT(bno > 0);
659  /*
660  * Set the size to the new last block.
661  */
662  dp->i_d.di_size = XFS_FSB_TO_B(mp, bno);
664  return 0;
665 }