Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dir.c
Go to the documentation of this file.
1 /*
2  * linux/fs/fat/dir.c
3  *
4  * directory handling functions for fat-based filesystems
5  *
6  * Written 1992,1993 by Werner Almesberger
7  *
8  * Hidden files 1995 by Albert Cahalan <[email protected]> <[email protected]>
9  *
10  * VFAT extensions by Gordon Chaffee <[email protected]>
11  * Merged with msdos fs by Henrik Storner <[email protected]>
12  * Rewritten for constant inumbers. Plugged buffer overrun in readdir(). AV
13  * Short name translation 1999, 2001 by Wolfram Pienkoss <[email protected]>
14  */
15 
16 #include <linux/module.h>
17 #include <linux/slab.h>
18 #include <linux/time.h>
19 #include <linux/buffer_head.h>
20 #include <linux/compat.h>
21 #include <linux/uaccess.h>
22 #include <linux/kernel.h>
23 #include "fat.h"
24 
25 /*
26  * Maximum buffer size of short name.
27  * [(MSDOS_NAME + '.') * max one char + nul]
28  * For msdos style, ['.' (hidden) + MSDOS_NAME + '.' + nul]
29  */
30 #define FAT_MAX_SHORT_SIZE ((MSDOS_NAME + 1) * NLS_MAX_CHARSET_SIZE + 1)
31 /*
32  * Maximum buffer size of unicode chars from slots.
33  * [(max longname slots * 13 (size in a slot) + nul) * sizeof(wchar_t)]
34  */
35 #define FAT_MAX_UNI_CHARS ((MSDOS_SLOTS - 1) * 13 + 1)
36 #define FAT_MAX_UNI_SIZE (FAT_MAX_UNI_CHARS * sizeof(wchar_t))
37 
38 static inline unsigned char fat_tolower(unsigned char c)
39 {
40  return ((c >= 'A') && (c <= 'Z')) ? c+32 : c;
41 }
42 
43 static inline loff_t fat_make_i_pos(struct super_block *sb,
44  struct buffer_head *bh,
45  struct msdos_dir_entry *de)
46 {
47  return ((loff_t)bh->b_blocknr << MSDOS_SB(sb)->dir_per_block_bits)
48  | (de - (struct msdos_dir_entry *)bh->b_data);
49 }
50 
51 static inline void fat_dir_readahead(struct inode *dir, sector_t iblock,
52  sector_t phys)
53 {
54  struct super_block *sb = dir->i_sb;
55  struct msdos_sb_info *sbi = MSDOS_SB(sb);
56  struct buffer_head *bh;
57  int sec;
58 
59  /* This is not a first sector of cluster, or sec_per_clus == 1 */
60  if ((iblock & (sbi->sec_per_clus - 1)) || sbi->sec_per_clus == 1)
61  return;
62  /* root dir of FAT12/FAT16 */
63  if ((sbi->fat_bits != 32) && (dir->i_ino == MSDOS_ROOT_INO))
64  return;
65 
66  bh = sb_find_get_block(sb, phys);
67  if (bh == NULL || !buffer_uptodate(bh)) {
68  for (sec = 0; sec < sbi->sec_per_clus; sec++)
69  sb_breadahead(sb, phys + sec);
70  }
71  brelse(bh);
72 }
73 
74 /* Returns the inode number of the directory entry at offset pos. If bh is
75  non-NULL, it is brelse'd before. Pos is incremented. The buffer header is
76  returned in bh.
77  AV. Most often we do it item-by-item. Makes sense to optimize.
78  AV. OK, there we go: if both bh and de are non-NULL we assume that we just
79  AV. want the next entry (took one explicit de=NULL in vfat/namei.c).
80  AV. It's done in fat_get_entry() (inlined), here the slow case lives.
81  AV. Additionally, when we return -1 (i.e. reached the end of directory)
82  AV. we make bh NULL.
83  */
84 static int fat__get_entry(struct inode *dir, loff_t *pos,
85  struct buffer_head **bh, struct msdos_dir_entry **de)
86 {
87  struct super_block *sb = dir->i_sb;
88  sector_t phys, iblock;
89  unsigned long mapped_blocks;
90  int err, offset;
91 
92 next:
93  if (*bh)
94  brelse(*bh);
95 
96  *bh = NULL;
97  iblock = *pos >> sb->s_blocksize_bits;
98  err = fat_bmap(dir, iblock, &phys, &mapped_blocks, 0);
99  if (err || !phys)
100  return -1; /* beyond EOF or error */
101 
102  fat_dir_readahead(dir, iblock, phys);
103 
104  *bh = sb_bread(sb, phys);
105  if (*bh == NULL) {
107  "Directory bread(block %llu) failed", (llu)phys);
108  /* skip this block */
109  *pos = (iblock + 1) << sb->s_blocksize_bits;
110  goto next;
111  }
112 
113  offset = *pos & (sb->s_blocksize - 1);
114  *pos += sizeof(struct msdos_dir_entry);
115  *de = (struct msdos_dir_entry *)((*bh)->b_data + offset);
116 
117  return 0;
118 }
119 
120 static inline int fat_get_entry(struct inode *dir, loff_t *pos,
121  struct buffer_head **bh,
122  struct msdos_dir_entry **de)
123 {
124  /* Fast stuff first */
125  if (*bh && *de &&
126  (*de - (struct msdos_dir_entry *)(*bh)->b_data) <
127  MSDOS_SB(dir->i_sb)->dir_per_block - 1) {
128  *pos += sizeof(struct msdos_dir_entry);
129  (*de)++;
130  return 0;
131  }
132  return fat__get_entry(dir, pos, bh, de);
133 }
134 
135 /*
136  * Convert Unicode 16 to UTF-8, translated Unicode, or ASCII.
137  * If uni_xlate is enabled and we can't get a 1:1 conversion, use a
138  * colon as an escape character since it is normally invalid on the vfat
139  * filesystem. The following four characters are the hexadecimal digits
140  * of Unicode value. This lets us do a full dump and restore of Unicode
141  * filenames. We could get into some trouble with long Unicode names,
142  * but ignore that right now.
143  * Ahem... Stack smashing in ring 0 isn't fun. Fixed.
144  */
145 static int uni16_to_x8(struct super_block *sb, unsigned char *ascii,
146  const wchar_t *uni, int len, struct nls_table *nls)
147 {
148  int uni_xlate = MSDOS_SB(sb)->options.unicode_xlate;
149  const wchar_t *ip;
150  wchar_t ec;
151  unsigned char *op;
152  int charlen;
153 
154  ip = uni;
155  op = ascii;
156 
157  while (*ip && ((len - NLS_MAX_CHARSET_SIZE) > 0)) {
158  ec = *ip++;
159  charlen = nls->uni2char(ec, op, NLS_MAX_CHARSET_SIZE);
160  if (charlen > 0) {
161  op += charlen;
162  len -= charlen;
163  } else {
164  if (uni_xlate == 1) {
165  *op++ = ':';
166  op = hex_byte_pack(op, ec >> 8);
167  op = hex_byte_pack(op, ec);
168  len -= 5;
169  } else {
170  *op++ = '?';
171  len--;
172  }
173  }
174  }
175 
176  if (unlikely(*ip)) {
177  fat_msg(sb, KERN_WARNING,
178  "filename was truncated while converting.");
179  }
180 
181  *op = 0;
182  return op - ascii;
183 }
184 
185 static inline int fat_uni_to_x8(struct super_block *sb, const wchar_t *uni,
186  unsigned char *buf, int size)
187 {
188  struct msdos_sb_info *sbi = MSDOS_SB(sb);
189  if (sbi->options.utf8)
191  UTF16_HOST_ENDIAN, buf, size);
192  else
193  return uni16_to_x8(sb, buf, uni, size, sbi->nls_io);
194 }
195 
196 static inline int
197 fat_short2uni(struct nls_table *t, unsigned char *c, int clen, wchar_t *uni)
198 {
199  int charlen;
200 
201  charlen = t->char2uni(c, clen, uni);
202  if (charlen < 0) {
203  *uni = 0x003f; /* a question mark */
204  charlen = 1;
205  }
206  return charlen;
207 }
208 
209 static inline int
210 fat_short2lower_uni(struct nls_table *t, unsigned char *c,
211  int clen, wchar_t *uni)
212 {
213  int charlen;
214  wchar_t wc;
215 
216  charlen = t->char2uni(c, clen, &wc);
217  if (charlen < 0) {
218  *uni = 0x003f; /* a question mark */
219  charlen = 1;
220  } else if (charlen <= 1) {
221  unsigned char nc = t->charset2lower[*c];
222 
223  if (!nc)
224  nc = *c;
225 
226  charlen = t->char2uni(&nc, 1, uni);
227  if (charlen < 0) {
228  *uni = 0x003f; /* a question mark */
229  charlen = 1;
230  }
231  } else
232  *uni = wc;
233 
234  return charlen;
235 }
236 
237 static inline int
238 fat_shortname2uni(struct nls_table *nls, unsigned char *buf, int buf_size,
239  wchar_t *uni_buf, unsigned short opt, int lower)
240 {
241  int len = 0;
242 
243  if (opt & VFAT_SFN_DISPLAY_LOWER)
244  len = fat_short2lower_uni(nls, buf, buf_size, uni_buf);
245  else if (opt & VFAT_SFN_DISPLAY_WIN95)
246  len = fat_short2uni(nls, buf, buf_size, uni_buf);
247  else if (opt & VFAT_SFN_DISPLAY_WINNT) {
248  if (lower)
249  len = fat_short2lower_uni(nls, buf, buf_size, uni_buf);
250  else
251  len = fat_short2uni(nls, buf, buf_size, uni_buf);
252  } else
253  len = fat_short2uni(nls, buf, buf_size, uni_buf);
254 
255  return len;
256 }
257 
258 static inline int fat_name_match(struct msdos_sb_info *sbi,
259  const unsigned char *a, int a_len,
260  const unsigned char *b, int b_len)
261 {
262  if (a_len != b_len)
263  return 0;
264 
265  if (sbi->options.name_check != 's')
266  return !nls_strnicmp(sbi->nls_io, a, b, a_len);
267  else
268  return !memcmp(a, b, a_len);
269 }
270 
272 
283 static int fat_parse_long(struct inode *dir, loff_t *pos,
284  struct buffer_head **bh, struct msdos_dir_entry **de,
285  wchar_t **unicode, unsigned char *nr_slots)
286 {
287  struct msdos_dir_slot *ds;
288  unsigned char id, slot, slots, alias_checksum;
289 
290  if (!*unicode) {
291  *unicode = __getname();
292  if (!*unicode) {
293  brelse(*bh);
294  return -ENOMEM;
295  }
296  }
297 parse_long:
298  slots = 0;
299  ds = (struct msdos_dir_slot *)*de;
300  id = ds->id;
301  if (!(id & 0x40))
302  return PARSE_INVALID;
303  slots = id & ~0x40;
304  if (slots > 20 || !slots) /* ceil(256 * 2 / 26) */
305  return PARSE_INVALID;
306  *nr_slots = slots;
307  alias_checksum = ds->alias_checksum;
308 
309  slot = slots;
310  while (1) {
311  int offset;
312 
313  slot--;
314  offset = slot * 13;
315  fat16_towchar(*unicode + offset, ds->name0_4, 5);
316  fat16_towchar(*unicode + offset + 5, ds->name5_10, 6);
317  fat16_towchar(*unicode + offset + 11, ds->name11_12, 2);
318 
319  if (ds->id & 0x40)
320  (*unicode)[offset + 13] = 0;
321  if (fat_get_entry(dir, pos, bh, de) < 0)
322  return PARSE_EOF;
323  if (slot == 0)
324  break;
325  ds = (struct msdos_dir_slot *)*de;
326  if (ds->attr != ATTR_EXT)
327  return PARSE_NOT_LONGNAME;
328  if ((ds->id & ~0x40) != slot)
329  goto parse_long;
330  if (ds->alias_checksum != alias_checksum)
331  goto parse_long;
332  }
333  if ((*de)->name[0] == DELETED_FLAG)
334  return PARSE_INVALID;
335  if ((*de)->attr == ATTR_EXT)
336  goto parse_long;
337  if (IS_FREE((*de)->name) || ((*de)->attr & ATTR_VOLUME))
338  return PARSE_INVALID;
339  if (fat_checksum((*de)->name) != alias_checksum)
340  *nr_slots = 0;
341 
342  return 0;
343 }
344 
354 static int fat_parse_short(struct super_block *sb,
355  const struct msdos_dir_entry *de,
356  unsigned char *name, int dot_hidden)
357 {
358  const struct msdos_sb_info *sbi = MSDOS_SB(sb);
359  int isvfat = sbi->options.isvfat;
360  int nocase = sbi->options.nocase;
361  unsigned short opt_shortname = sbi->options.shortname;
362  struct nls_table *nls_disk = sbi->nls_disk;
363  wchar_t uni_name[14];
364  unsigned char c, work[MSDOS_NAME];
365  unsigned char *ptname = name;
366  int chi, chl, i, j, k;
367  int dotoffset = 0;
368  int name_len = 0, uni_len = 0;
369 
370  if (!isvfat && dot_hidden && (de->attr & ATTR_HIDDEN)) {
371  *ptname++ = '.';
372  dotoffset = 1;
373  }
374 
375  memcpy(work, de->name, sizeof(work));
376  /* see namei.c, msdos_format_name */
377  if (work[0] == 0x05)
378  work[0] = 0xE5;
379 
380  /* Filename */
381  for (i = 0, j = 0; i < 8;) {
382  c = work[i];
383  if (!c)
384  break;
385  chl = fat_shortname2uni(nls_disk, &work[i], 8 - i,
386  &uni_name[j++], opt_shortname,
387  de->lcase & CASE_LOWER_BASE);
388  if (chl <= 1) {
389  if (!isvfat)
390  ptname[i] = nocase ? c : fat_tolower(c);
391  i++;
392  if (c != ' ') {
393  name_len = i;
394  uni_len = j;
395  }
396  } else {
397  uni_len = j;
398  if (isvfat)
399  i += min(chl, 8-i);
400  else {
401  for (chi = 0; chi < chl && i < 8; chi++, i++)
402  ptname[i] = work[i];
403  }
404  if (chl)
405  name_len = i;
406  }
407  }
408 
409  i = name_len;
410  j = uni_len;
411  fat_short2uni(nls_disk, ".", 1, &uni_name[j++]);
412  if (!isvfat)
413  ptname[i] = '.';
414  i++;
415 
416  /* Extension */
417  for (k = 8; k < MSDOS_NAME;) {
418  c = work[k];
419  if (!c)
420  break;
421  chl = fat_shortname2uni(nls_disk, &work[k], MSDOS_NAME - k,
422  &uni_name[j++], opt_shortname,
423  de->lcase & CASE_LOWER_EXT);
424  if (chl <= 1) {
425  k++;
426  if (!isvfat)
427  ptname[i] = nocase ? c : fat_tolower(c);
428  i++;
429  if (c != ' ') {
430  name_len = i;
431  uni_len = j;
432  }
433  } else {
434  uni_len = j;
435  if (isvfat) {
436  int offset = min(chl, MSDOS_NAME-k);
437  k += offset;
438  i += offset;
439  } else {
440  for (chi = 0; chi < chl && k < MSDOS_NAME;
441  chi++, i++, k++) {
442  ptname[i] = work[k];
443  }
444  }
445  if (chl)
446  name_len = i;
447  }
448  }
449 
450  if (name_len > 0) {
451  name_len += dotoffset;
452 
453  if (sbi->options.isvfat) {
454  uni_name[uni_len] = 0x0000;
455  name_len = fat_uni_to_x8(sb, uni_name, name,
457  }
458  }
459 
460  return name_len;
461 }
462 
463 /*
464  * Return values: negative -> error, 0 -> not found, positive -> found,
465  * value is the total amount of slots, including the shortname entry.
466  */
467 int fat_search_long(struct inode *inode, const unsigned char *name,
468  int name_len, struct fat_slot_info *sinfo)
469 {
470  struct super_block *sb = inode->i_sb;
471  struct msdos_sb_info *sbi = MSDOS_SB(sb);
472  struct buffer_head *bh = NULL;
473  struct msdos_dir_entry *de;
474  unsigned char nr_slots;
475  wchar_t *unicode = NULL;
476  unsigned char bufname[FAT_MAX_SHORT_SIZE];
477  loff_t cpos = 0;
478  int err, len;
479 
480  err = -ENOENT;
481  while (1) {
482  if (fat_get_entry(inode, &cpos, &bh, &de) == -1)
483  goto end_of_dir;
484 parse_record:
485  nr_slots = 0;
486  if (de->name[0] == DELETED_FLAG)
487  continue;
488  if (de->attr != ATTR_EXT && (de->attr & ATTR_VOLUME))
489  continue;
490  if (de->attr != ATTR_EXT && IS_FREE(de->name))
491  continue;
492  if (de->attr == ATTR_EXT) {
493  int status = fat_parse_long(inode, &cpos, &bh, &de,
494  &unicode, &nr_slots);
495  if (status < 0) {
496  err = status;
497  goto end_of_dir;
498  } else if (status == PARSE_INVALID)
499  continue;
500  else if (status == PARSE_NOT_LONGNAME)
501  goto parse_record;
502  else if (status == PARSE_EOF)
503  goto end_of_dir;
504  }
505 
506  /* Never prepend '.' to hidden files here.
507  * That is done only for msdos mounts (and only when
508  * 'dotsOK=yes'); if we are executing here, it is in the
509  * context of a vfat mount.
510  */
511  len = fat_parse_short(sb, de, bufname, 0);
512  if (len == 0)
513  continue;
514 
515  /* Compare shortname */
516  if (fat_name_match(sbi, name, name_len, bufname, len))
517  goto found;
518 
519  if (nr_slots) {
520  void *longname = unicode + FAT_MAX_UNI_CHARS;
521  int size = PATH_MAX - FAT_MAX_UNI_SIZE;
522 
523  /* Compare longname */
524  len = fat_uni_to_x8(sb, unicode, longname, size);
525  if (fat_name_match(sbi, name, name_len, longname, len))
526  goto found;
527  }
528  }
529 
530 found:
531  nr_slots++; /* include the de */
532  sinfo->slot_off = cpos - nr_slots * sizeof(*de);
533  sinfo->nr_slots = nr_slots;
534  sinfo->de = de;
535  sinfo->bh = bh;
536  sinfo->i_pos = fat_make_i_pos(sb, sinfo->bh, sinfo->de);
537  err = 0;
538 end_of_dir:
539  if (unicode)
540  __putname(unicode);
541 
542  return err;
543 }
545 
547  void __user *dirent;
548  int result;
549  /* for dir ioctl */
550  const char *longname;
551  int long_len;
552  const char *shortname;
554 };
555 
556 static int __fat_readdir(struct inode *inode, struct file *filp, void *dirent,
557  filldir_t filldir, int short_only, int both)
558 {
559  struct super_block *sb = inode->i_sb;
560  struct msdos_sb_info *sbi = MSDOS_SB(sb);
561  struct buffer_head *bh;
562  struct msdos_dir_entry *de;
563  unsigned char nr_slots;
564  wchar_t *unicode = NULL;
565  unsigned char bufname[FAT_MAX_SHORT_SIZE];
566  int isvfat = sbi->options.isvfat;
567  const char *fill_name = NULL;
568  unsigned long inum;
569  unsigned long lpos, dummy, *furrfu = &lpos;
570  loff_t cpos;
571  int short_len = 0, fill_len = 0;
572  int ret = 0;
573 
574  mutex_lock(&sbi->s_lock);
575 
576  cpos = filp->f_pos;
577  /* Fake . and .. for the root directory. */
578  if (inode->i_ino == MSDOS_ROOT_INO) {
579  while (cpos < 2) {
580  if (filldir(dirent, "..", cpos+1, cpos,
581  MSDOS_ROOT_INO, DT_DIR) < 0)
582  goto out;
583  cpos++;
584  filp->f_pos++;
585  }
586  if (cpos == 2) {
587  dummy = 2;
588  furrfu = &dummy;
589  cpos = 0;
590  }
591  }
592  if (cpos & (sizeof(struct msdos_dir_entry) - 1)) {
593  ret = -ENOENT;
594  goto out;
595  }
596 
597  bh = NULL;
598 get_new:
599  if (fat_get_entry(inode, &cpos, &bh, &de) == -1)
600  goto end_of_dir;
601 parse_record:
602  nr_slots = 0;
603  /*
604  * Check for long filename entry, but if short_only, we don't
605  * need to parse long filename.
606  */
607  if (isvfat && !short_only) {
608  if (de->name[0] == DELETED_FLAG)
609  goto record_end;
610  if (de->attr != ATTR_EXT && (de->attr & ATTR_VOLUME))
611  goto record_end;
612  if (de->attr != ATTR_EXT && IS_FREE(de->name))
613  goto record_end;
614  } else {
615  if ((de->attr & ATTR_VOLUME) || IS_FREE(de->name))
616  goto record_end;
617  }
618 
619  if (isvfat && de->attr == ATTR_EXT) {
620  int status = fat_parse_long(inode, &cpos, &bh, &de,
621  &unicode, &nr_slots);
622  if (status < 0) {
623  filp->f_pos = cpos;
624  ret = status;
625  goto out;
626  } else if (status == PARSE_INVALID)
627  goto record_end;
628  else if (status == PARSE_NOT_LONGNAME)
629  goto parse_record;
630  else if (status == PARSE_EOF)
631  goto end_of_dir;
632 
633  if (nr_slots) {
634  void *longname = unicode + FAT_MAX_UNI_CHARS;
635  int size = PATH_MAX - FAT_MAX_UNI_SIZE;
636  int len = fat_uni_to_x8(sb, unicode, longname, size);
637 
638  fill_name = longname;
639  fill_len = len;
640  /* !both && !short_only, so we don't need shortname. */
641  if (!both)
642  goto start_filldir;
643  }
644  }
645 
646  short_len = fat_parse_short(sb, de, bufname, sbi->options.dotsOK);
647  if (short_len == 0)
648  goto record_end;
649 
650  if (nr_slots) {
651  /* hack for fat_ioctl_filldir() */
653 
654  p->longname = fill_name;
655  p->long_len = fill_len;
656  p->shortname = bufname;
657  p->short_len = short_len;
658  fill_name = NULL;
659  fill_len = 0;
660  } else {
661  fill_name = bufname;
662  fill_len = short_len;
663  }
664 
665 start_filldir:
666  lpos = cpos - (nr_slots + 1) * sizeof(struct msdos_dir_entry);
667  if (!memcmp(de->name, MSDOS_DOT, MSDOS_NAME))
668  inum = inode->i_ino;
669  else if (!memcmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) {
670  inum = parent_ino(filp->f_path.dentry);
671  } else {
672  loff_t i_pos = fat_make_i_pos(sb, bh, de);
673  struct inode *tmp = fat_iget(sb, i_pos);
674  if (tmp) {
675  inum = tmp->i_ino;
676  iput(tmp);
677  } else
678  inum = iunique(sb, MSDOS_ROOT_INO);
679  }
680 
681  if (filldir(dirent, fill_name, fill_len, *furrfu, inum,
682  (de->attr & ATTR_DIR) ? DT_DIR : DT_REG) < 0)
683  goto fill_failed;
684 
685 record_end:
686  furrfu = &lpos;
687  filp->f_pos = cpos;
688  goto get_new;
689 end_of_dir:
690  filp->f_pos = cpos;
691 fill_failed:
692  brelse(bh);
693  if (unicode)
694  __putname(unicode);
695 out:
696  mutex_unlock(&sbi->s_lock);
697  return ret;
698 }
699 
700 static int fat_readdir(struct file *filp, void *dirent, filldir_t filldir)
701 {
702  struct inode *inode = filp->f_path.dentry->d_inode;
703  return __fat_readdir(inode, filp, dirent, filldir, 0, 0);
704 }
705 
706 #define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type) \
707 static int func(void *__buf, const char *name, int name_len, \
708  loff_t offset, u64 ino, unsigned int d_type) \
709 { \
710  struct fat_ioctl_filldir_callback *buf = __buf; \
711  struct dirent_type __user *d1 = buf->dirent; \
712  struct dirent_type __user *d2 = d1 + 1; \
713  \
714  if (buf->result) \
715  return -EINVAL; \
716  buf->result++; \
717  \
718  if (name != NULL) { \
719  /* dirent has only short name */ \
720  if (name_len >= sizeof(d1->d_name)) \
721  name_len = sizeof(d1->d_name) - 1; \
722  \
723  if (put_user(0, d2->d_name) || \
724  put_user(0, &d2->d_reclen) || \
725  copy_to_user(d1->d_name, name, name_len) || \
726  put_user(0, d1->d_name + name_len) || \
727  put_user(name_len, &d1->d_reclen)) \
728  goto efault; \
729  } else { \
730  /* dirent has short and long name */ \
731  const char *longname = buf->longname; \
732  int long_len = buf->long_len; \
733  const char *shortname = buf->shortname; \
734  int short_len = buf->short_len; \
735  \
736  if (long_len >= sizeof(d1->d_name)) \
737  long_len = sizeof(d1->d_name) - 1; \
738  if (short_len >= sizeof(d1->d_name)) \
739  short_len = sizeof(d1->d_name) - 1; \
740  \
741  if (copy_to_user(d2->d_name, longname, long_len) || \
742  put_user(0, d2->d_name + long_len) || \
743  put_user(long_len, &d2->d_reclen) || \
744  put_user(ino, &d2->d_ino) || \
745  put_user(offset, &d2->d_off) || \
746  copy_to_user(d1->d_name, shortname, short_len) || \
747  put_user(0, d1->d_name + short_len) || \
748  put_user(short_len, &d1->d_reclen)) \
749  goto efault; \
750  } \
751  return 0; \
752 efault: \
753  buf->result = -EFAULT; \
754  return -EFAULT; \
755 }
756 
757 FAT_IOCTL_FILLDIR_FUNC(fat_ioctl_filldir, __fat_dirent)
758 
759 static int fat_ioctl_readdir(struct inode *inode, struct file *filp,
760  void __user *dirent, filldir_t filldir,
761  int short_only, int both)
762 {
763  struct fat_ioctl_filldir_callback buf;
764  int ret;
765 
766  buf.dirent = dirent;
767  buf.result = 0;
768  mutex_lock(&inode->i_mutex);
769  ret = -ENOENT;
770  if (!IS_DEADDIR(inode)) {
771  ret = __fat_readdir(inode, filp, &buf, filldir,
772  short_only, both);
773  }
774  mutex_unlock(&inode->i_mutex);
775  if (ret >= 0)
776  ret = buf.result;
777  return ret;
778 }
779 
780 static long fat_dir_ioctl(struct file *filp, unsigned int cmd,
781  unsigned long arg)
782 {
783  struct inode *inode = filp->f_path.dentry->d_inode;
784  struct __fat_dirent __user *d1 = (struct __fat_dirent __user *)arg;
785  int short_only, both;
786 
787  switch (cmd) {
789  short_only = 1;
790  both = 0;
791  break;
793  short_only = 0;
794  both = 1;
795  break;
796  default:
797  return fat_generic_ioctl(filp, cmd, arg);
798  }
799 
800  if (!access_ok(VERIFY_WRITE, d1, sizeof(struct __fat_dirent[2])))
801  return -EFAULT;
802  /*
803  * Yes, we don't need this put_user() absolutely. However old
804  * code didn't return the right value. So, app use this value,
805  * in order to check whether it is EOF.
806  */
807  if (put_user(0, &d1->d_reclen))
808  return -EFAULT;
809 
810  return fat_ioctl_readdir(inode, filp, d1, fat_ioctl_filldir,
811  short_only, both);
812 }
813 
814 #ifdef CONFIG_COMPAT
815 #define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct compat_dirent[2])
816 #define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct compat_dirent[2])
817 
818 FAT_IOCTL_FILLDIR_FUNC(fat_compat_ioctl_filldir, compat_dirent)
819 
820 static long fat_compat_dir_ioctl(struct file *filp, unsigned cmd,
821  unsigned long arg)
822 {
823  struct inode *inode = filp->f_path.dentry->d_inode;
824  struct compat_dirent __user *d1 = compat_ptr(arg);
825  int short_only, both;
826 
827  switch (cmd) {
829  short_only = 1;
830  both = 0;
831  break;
833  short_only = 0;
834  both = 1;
835  break;
836  default:
837  return fat_generic_ioctl(filp, cmd, (unsigned long)arg);
838  }
839 
840  if (!access_ok(VERIFY_WRITE, d1, sizeof(struct compat_dirent[2])))
841  return -EFAULT;
842  /*
843  * Yes, we don't need this put_user() absolutely. However old
844  * code didn't return the right value. So, app use this value,
845  * in order to check whether it is EOF.
846  */
847  if (put_user(0, &d1->d_reclen))
848  return -EFAULT;
849 
850  return fat_ioctl_readdir(inode, filp, d1, fat_compat_ioctl_filldir,
851  short_only, both);
852 }
853 #endif /* CONFIG_COMPAT */
854 
856  .llseek = generic_file_llseek,
857  .read = generic_read_dir,
858  .readdir = fat_readdir,
859  .unlocked_ioctl = fat_dir_ioctl,
860 #ifdef CONFIG_COMPAT
861  .compat_ioctl = fat_compat_dir_ioctl,
862 #endif
863  .fsync = fat_file_fsync,
864 };
865 
866 static int fat_get_short_entry(struct inode *dir, loff_t *pos,
867  struct buffer_head **bh,
868  struct msdos_dir_entry **de)
869 {
870  while (fat_get_entry(dir, pos, bh, de) >= 0) {
871  /* free entry or long name entry or volume label */
872  if (!IS_FREE((*de)->name) && !((*de)->attr & ATTR_VOLUME))
873  return 0;
874  }
875  return -ENOENT;
876 }
877 
878 /*
879  * The ".." entry can not provide the "struct fat_slot_info" information
880  * for inode, nor a usable i_pos. So, this function provides some information
881  * only.
882  *
883  * Since this function walks through the on-disk inodes within a directory,
884  * callers are responsible for taking any locks necessary to prevent the
885  * directory from changing.
886  */
887 int fat_get_dotdot_entry(struct inode *dir, struct buffer_head **bh,
888  struct msdos_dir_entry **de)
889 {
890  loff_t offset = 0;
891 
892  *de = NULL;
893  while (fat_get_short_entry(dir, &offset, bh, de) >= 0) {
894  if (!strncmp((*de)->name, MSDOS_DOTDOT, MSDOS_NAME))
895  return 0;
896  }
897  return -ENOENT;
898 }
900 
901 /* See if directory is empty */
902 int fat_dir_empty(struct inode *dir)
903 {
904  struct buffer_head *bh;
905  struct msdos_dir_entry *de;
906  loff_t cpos;
907  int result = 0;
908 
909  bh = NULL;
910  cpos = 0;
911  while (fat_get_short_entry(dir, &cpos, &bh, &de) >= 0) {
912  if (strncmp(de->name, MSDOS_DOT , MSDOS_NAME) &&
913  strncmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) {
914  result = -ENOTEMPTY;
915  break;
916  }
917  }
918  brelse(bh);
919  return result;
920 }
922 
923 /*
924  * fat_subdirs counts the number of sub-directories of dir. It can be run
925  * on directories being created.
926  */
927 int fat_subdirs(struct inode *dir)
928 {
929  struct buffer_head *bh;
930  struct msdos_dir_entry *de;
931  loff_t cpos;
932  int count = 0;
933 
934  bh = NULL;
935  cpos = 0;
936  while (fat_get_short_entry(dir, &cpos, &bh, &de) >= 0) {
937  if (de->attr & ATTR_DIR)
938  count++;
939  }
940  brelse(bh);
941  return count;
942 }
943 
944 /*
945  * Scans a directory for a given file (name points to its formatted name).
946  * Returns an error code or zero.
947  */
948 int fat_scan(struct inode *dir, const unsigned char *name,
949  struct fat_slot_info *sinfo)
950 {
951  struct super_block *sb = dir->i_sb;
952 
953  sinfo->slot_off = 0;
954  sinfo->bh = NULL;
955  while (fat_get_short_entry(dir, &sinfo->slot_off, &sinfo->bh,
956  &sinfo->de) >= 0) {
957  if (!strncmp(sinfo->de->name, name, MSDOS_NAME)) {
958  sinfo->slot_off -= sizeof(*sinfo->de);
959  sinfo->nr_slots = 1;
960  sinfo->i_pos = fat_make_i_pos(sb, sinfo->bh, sinfo->de);
961  return 0;
962  }
963  }
964  return -ENOENT;
965 }
967 
968 static int __fat_remove_entries(struct inode *dir, loff_t pos, int nr_slots)
969 {
970  struct super_block *sb = dir->i_sb;
971  struct buffer_head *bh;
972  struct msdos_dir_entry *de, *endp;
973  int err = 0, orig_slots;
974 
975  while (nr_slots) {
976  bh = NULL;
977  if (fat_get_entry(dir, &pos, &bh, &de) < 0) {
978  err = -EIO;
979  break;
980  }
981 
982  orig_slots = nr_slots;
983  endp = (struct msdos_dir_entry *)(bh->b_data + sb->s_blocksize);
984  while (nr_slots && de < endp) {
985  de->name[0] = DELETED_FLAG;
986  de++;
987  nr_slots--;
988  }
989  mark_buffer_dirty_inode(bh, dir);
990  if (IS_DIRSYNC(dir))
991  err = sync_dirty_buffer(bh);
992  brelse(bh);
993  if (err)
994  break;
995 
996  /* pos is *next* de's position, so this does `- sizeof(de)' */
997  pos += ((orig_slots - nr_slots) * sizeof(*de)) - sizeof(*de);
998  }
999 
1000  return err;
1001 }
1002 
1003 int fat_remove_entries(struct inode *dir, struct fat_slot_info *sinfo)
1004 {
1005  struct super_block *sb = dir->i_sb;
1006  struct msdos_dir_entry *de;
1007  struct buffer_head *bh;
1008  int err = 0, nr_slots;
1009 
1010  /*
1011  * First stage: Remove the shortname. By this, the directory
1012  * entry is removed.
1013  */
1014  nr_slots = sinfo->nr_slots;
1015  de = sinfo->de;
1016  sinfo->de = NULL;
1017  bh = sinfo->bh;
1018  sinfo->bh = NULL;
1019  while (nr_slots && de >= (struct msdos_dir_entry *)bh->b_data) {
1020  de->name[0] = DELETED_FLAG;
1021  de--;
1022  nr_slots--;
1023  }
1024  mark_buffer_dirty_inode(bh, dir);
1025  if (IS_DIRSYNC(dir))
1026  err = sync_dirty_buffer(bh);
1027  brelse(bh);
1028  if (err)
1029  return err;
1030  dir->i_version++;
1031 
1032  if (nr_slots) {
1033  /*
1034  * Second stage: remove the remaining longname slots.
1035  * (This directory entry is already removed, and so return
1036  * the success)
1037  */
1038  err = __fat_remove_entries(dir, sinfo->slot_off, nr_slots);
1039  if (err) {
1040  fat_msg(sb, KERN_WARNING,
1041  "Couldn't remove the long name slots");
1042  }
1043  }
1044 
1045  dir->i_mtime = dir->i_atime = CURRENT_TIME_SEC;
1046  if (IS_DIRSYNC(dir))
1047  (void)fat_sync_inode(dir);
1048  else
1049  mark_inode_dirty(dir);
1050 
1051  return 0;
1052 }
1054 
1055 static int fat_zeroed_cluster(struct inode *dir, sector_t blknr, int nr_used,
1056  struct buffer_head **bhs, int nr_bhs)
1057 {
1058  struct super_block *sb = dir->i_sb;
1059  sector_t last_blknr = blknr + MSDOS_SB(sb)->sec_per_clus;
1060  int err, i, n;
1061 
1062  /* Zeroing the unused blocks on this cluster */
1063  blknr += nr_used;
1064  n = nr_used;
1065  while (blknr < last_blknr) {
1066  bhs[n] = sb_getblk(sb, blknr);
1067  if (!bhs[n]) {
1068  err = -ENOMEM;
1069  goto error;
1070  }
1071  memset(bhs[n]->b_data, 0, sb->s_blocksize);
1072  set_buffer_uptodate(bhs[n]);
1073  mark_buffer_dirty_inode(bhs[n], dir);
1074 
1075  n++;
1076  blknr++;
1077  if (n == nr_bhs) {
1078  if (IS_DIRSYNC(dir)) {
1079  err = fat_sync_bhs(bhs, n);
1080  if (err)
1081  goto error;
1082  }
1083  for (i = 0; i < n; i++)
1084  brelse(bhs[i]);
1085  n = 0;
1086  }
1087  }
1088  if (IS_DIRSYNC(dir)) {
1089  err = fat_sync_bhs(bhs, n);
1090  if (err)
1091  goto error;
1092  }
1093  for (i = 0; i < n; i++)
1094  brelse(bhs[i]);
1095 
1096  return 0;
1097 
1098 error:
1099  for (i = 0; i < n; i++)
1100  bforget(bhs[i]);
1101  return err;
1102 }
1103 
1104 int fat_alloc_new_dir(struct inode *dir, struct timespec *ts)
1105 {
1106  struct super_block *sb = dir->i_sb;
1107  struct msdos_sb_info *sbi = MSDOS_SB(sb);
1108  struct buffer_head *bhs[MAX_BUF_PER_PAGE];
1109  struct msdos_dir_entry *de;
1110  sector_t blknr;
1111  __le16 date, time;
1112  u8 time_cs;
1113  int err, cluster;
1114 
1115  err = fat_alloc_clusters(dir, &cluster, 1);
1116  if (err)
1117  goto error;
1118 
1119  blknr = fat_clus_to_blknr(sbi, cluster);
1120  bhs[0] = sb_getblk(sb, blknr);
1121  if (!bhs[0]) {
1122  err = -ENOMEM;
1123  goto error_free;
1124  }
1125 
1126  fat_time_unix2fat(sbi, ts, &time, &date, &time_cs);
1127 
1128  de = (struct msdos_dir_entry *)bhs[0]->b_data;
1129  /* filling the new directory slots ("." and ".." entries) */
1130  memcpy(de[0].name, MSDOS_DOT, MSDOS_NAME);
1131  memcpy(de[1].name, MSDOS_DOTDOT, MSDOS_NAME);
1132  de->attr = de[1].attr = ATTR_DIR;
1133  de[0].lcase = de[1].lcase = 0;
1134  de[0].time = de[1].time = time;
1135  de[0].date = de[1].date = date;
1136  if (sbi->options.isvfat) {
1137  /* extra timestamps */
1138  de[0].ctime = de[1].ctime = time;
1139  de[0].ctime_cs = de[1].ctime_cs = time_cs;
1140  de[0].adate = de[0].cdate = de[1].adate = de[1].cdate = date;
1141  } else {
1142  de[0].ctime = de[1].ctime = 0;
1143  de[0].ctime_cs = de[1].ctime_cs = 0;
1144  de[0].adate = de[0].cdate = de[1].adate = de[1].cdate = 0;
1145  }
1146  fat_set_start(&de[0], cluster);
1147  fat_set_start(&de[1], MSDOS_I(dir)->i_logstart);
1148  de[0].size = de[1].size = 0;
1149  memset(de + 2, 0, sb->s_blocksize - 2 * sizeof(*de));
1150  set_buffer_uptodate(bhs[0]);
1151  mark_buffer_dirty_inode(bhs[0], dir);
1152 
1153  err = fat_zeroed_cluster(dir, blknr, 1, bhs, MAX_BUF_PER_PAGE);
1154  if (err)
1155  goto error_free;
1156 
1157  return cluster;
1158 
1159 error_free:
1160  fat_free_clusters(dir, cluster);
1161 error:
1162  return err;
1163 }
1165 
1166 static int fat_add_new_entries(struct inode *dir, void *slots, int nr_slots,
1167  int *nr_cluster, struct msdos_dir_entry **de,
1168  struct buffer_head **bh, loff_t *i_pos)
1169 {
1170  struct super_block *sb = dir->i_sb;
1171  struct msdos_sb_info *sbi = MSDOS_SB(sb);
1172  struct buffer_head *bhs[MAX_BUF_PER_PAGE];
1173  sector_t blknr, start_blknr, last_blknr;
1174  unsigned long size, copy;
1175  int err, i, n, offset, cluster[2];
1176 
1177  /*
1178  * The minimum cluster size is 512bytes, and maximum entry
1179  * size is 32*slots (672bytes). So, iff the cluster size is
1180  * 512bytes, we may need two clusters.
1181  */
1182  size = nr_slots * sizeof(struct msdos_dir_entry);
1183  *nr_cluster = (size + (sbi->cluster_size - 1)) >> sbi->cluster_bits;
1184  BUG_ON(*nr_cluster > 2);
1185 
1186  err = fat_alloc_clusters(dir, cluster, *nr_cluster);
1187  if (err)
1188  goto error;
1189 
1190  /*
1191  * First stage: Fill the directory entry. NOTE: This cluster
1192  * is not referenced from any inode yet, so updates order is
1193  * not important.
1194  */
1195  i = n = copy = 0;
1196  do {
1197  start_blknr = blknr = fat_clus_to_blknr(sbi, cluster[i]);
1198  last_blknr = start_blknr + sbi->sec_per_clus;
1199  while (blknr < last_blknr) {
1200  bhs[n] = sb_getblk(sb, blknr);
1201  if (!bhs[n]) {
1202  err = -ENOMEM;
1203  goto error_nomem;
1204  }
1205 
1206  /* fill the directory entry */
1207  copy = min(size, sb->s_blocksize);
1208  memcpy(bhs[n]->b_data, slots, copy);
1209  slots += copy;
1210  size -= copy;
1211  set_buffer_uptodate(bhs[n]);
1212  mark_buffer_dirty_inode(bhs[n], dir);
1213  if (!size)
1214  break;
1215  n++;
1216  blknr++;
1217  }
1218  } while (++i < *nr_cluster);
1219 
1220  memset(bhs[n]->b_data + copy, 0, sb->s_blocksize - copy);
1221  offset = copy - sizeof(struct msdos_dir_entry);
1222  get_bh(bhs[n]);
1223  *bh = bhs[n];
1224  *de = (struct msdos_dir_entry *)((*bh)->b_data + offset);
1225  *i_pos = fat_make_i_pos(sb, *bh, *de);
1226 
1227  /* Second stage: clear the rest of cluster, and write outs */
1228  err = fat_zeroed_cluster(dir, start_blknr, ++n, bhs, MAX_BUF_PER_PAGE);
1229  if (err)
1230  goto error_free;
1231 
1232  return cluster[0];
1233 
1234 error_free:
1235  brelse(*bh);
1236  *bh = NULL;
1237  n = 0;
1238 error_nomem:
1239  for (i = 0; i < n; i++)
1240  bforget(bhs[i]);
1241  fat_free_clusters(dir, cluster[0]);
1242 error:
1243  return err;
1244 }
1245 
1246 int fat_add_entries(struct inode *dir, void *slots, int nr_slots,
1247  struct fat_slot_info *sinfo)
1248 {
1249  struct super_block *sb = dir->i_sb;
1250  struct msdos_sb_info *sbi = MSDOS_SB(sb);
1251  struct buffer_head *bh, *prev, *bhs[3]; /* 32*slots (672bytes) */
1252  struct msdos_dir_entry *uninitialized_var(de);
1253  int err, free_slots, i, nr_bhs;
1254  loff_t pos, i_pos;
1255 
1256  sinfo->nr_slots = nr_slots;
1257 
1258  /* First stage: search free direcotry entries */
1259  free_slots = nr_bhs = 0;
1260  bh = prev = NULL;
1261  pos = 0;
1262  err = -ENOSPC;
1263  while (fat_get_entry(dir, &pos, &bh, &de) > -1) {
1264  /* check the maximum size of directory */
1265  if (pos >= FAT_MAX_DIR_SIZE)
1266  goto error;
1267 
1268  if (IS_FREE(de->name)) {
1269  if (prev != bh) {
1270  get_bh(bh);
1271  bhs[nr_bhs] = prev = bh;
1272  nr_bhs++;
1273  }
1274  free_slots++;
1275  if (free_slots == nr_slots)
1276  goto found;
1277  } else {
1278  for (i = 0; i < nr_bhs; i++)
1279  brelse(bhs[i]);
1280  prev = NULL;
1281  free_slots = nr_bhs = 0;
1282  }
1283  }
1284  if (dir->i_ino == MSDOS_ROOT_INO) {
1285  if (sbi->fat_bits != 32)
1286  goto error;
1287  } else if (MSDOS_I(dir)->i_start == 0) {
1288  fat_msg(sb, KERN_ERR, "Corrupted directory (i_pos %lld)",
1289  MSDOS_I(dir)->i_pos);
1290  err = -EIO;
1291  goto error;
1292  }
1293 
1294 found:
1295  err = 0;
1296  pos -= free_slots * sizeof(*de);
1297  nr_slots -= free_slots;
1298  if (free_slots) {
1299  /*
1300  * Second stage: filling the free entries with new entries.
1301  * NOTE: If this slots has shortname, first, we write
1302  * the long name slots, then write the short name.
1303  */
1304  int size = free_slots * sizeof(*de);
1305  int offset = pos & (sb->s_blocksize - 1);
1306  int long_bhs = nr_bhs - (nr_slots == 0);
1307 
1308  /* Fill the long name slots. */
1309  for (i = 0; i < long_bhs; i++) {
1310  int copy = min_t(int, sb->s_blocksize - offset, size);
1311  memcpy(bhs[i]->b_data + offset, slots, copy);
1312  mark_buffer_dirty_inode(bhs[i], dir);
1313  offset = 0;
1314  slots += copy;
1315  size -= copy;
1316  }
1317  if (long_bhs && IS_DIRSYNC(dir))
1318  err = fat_sync_bhs(bhs, long_bhs);
1319  if (!err && i < nr_bhs) {
1320  /* Fill the short name slot. */
1321  int copy = min_t(int, sb->s_blocksize - offset, size);
1322  memcpy(bhs[i]->b_data + offset, slots, copy);
1323  mark_buffer_dirty_inode(bhs[i], dir);
1324  if (IS_DIRSYNC(dir))
1325  err = sync_dirty_buffer(bhs[i]);
1326  }
1327  for (i = 0; i < nr_bhs; i++)
1328  brelse(bhs[i]);
1329  if (err)
1330  goto error_remove;
1331  }
1332 
1333  if (nr_slots) {
1334  int cluster, nr_cluster;
1335 
1336  /*
1337  * Third stage: allocate the cluster for new entries.
1338  * And initialize the cluster with new entries, then
1339  * add the cluster to dir.
1340  */
1341  cluster = fat_add_new_entries(dir, slots, nr_slots, &nr_cluster,
1342  &de, &bh, &i_pos);
1343  if (cluster < 0) {
1344  err = cluster;
1345  goto error_remove;
1346  }
1347  err = fat_chain_add(dir, cluster, nr_cluster);
1348  if (err) {
1349  fat_free_clusters(dir, cluster);
1350  goto error_remove;
1351  }
1352  if (dir->i_size & (sbi->cluster_size - 1)) {
1353  fat_fs_error(sb, "Odd directory size");
1354  dir->i_size = (dir->i_size + sbi->cluster_size - 1)
1355  & ~((loff_t)sbi->cluster_size - 1);
1356  }
1357  dir->i_size += nr_cluster << sbi->cluster_bits;
1358  MSDOS_I(dir)->mmu_private += nr_cluster << sbi->cluster_bits;
1359  }
1360  sinfo->slot_off = pos;
1361  sinfo->de = de;
1362  sinfo->bh = bh;
1363  sinfo->i_pos = fat_make_i_pos(sb, sinfo->bh, sinfo->de);
1364 
1365  return 0;
1366 
1367 error:
1368  brelse(bh);
1369  for (i = 0; i < nr_bhs; i++)
1370  brelse(bhs[i]);
1371  return err;
1372 
1373 error_remove:
1374  brelse(bh);
1375  if (free_slots)
1376  __fat_remove_entries(dir, pos, free_slots);
1377  return err;
1378 }