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