VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
09c434b8a0047 fs/fat/namei_msdos.c (Thomas Gleixner    2019-05-19 13:08:20 +0100   1) // SPDX-License-Identifier: GPL-2.0-only
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   2) /*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   3)  *  linux/fs/msdos/namei.c
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   4)  *
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   5)  *  Written 1992,1993 by Werner Almesberger
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   6)  *  Hidden files 1995 by Albert Cahalan <albert@ccs.neu.edu> <adc@coe.neu.edu>
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   7)  *  Rewritten for constant inumbers 1999 by Al Viro
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   8)  */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700   9) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  10) #include <linux/module.h>
2489dbabea80e fs/fat/namei_msdos.c (Jeff Layton        2017-12-11 06:35:09 -0500  11) #include <linux/iversion.h>
9e975dae2970d fs/fat/namei_msdos.c (OGAWA Hirofumi     2008-11-06 12:53:46 -0800  12) #include "fat.h"
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  13) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  14) /* Characters that are undesirable in an MS-DOS file name */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  15) static unsigned char bad_chars[] = "*?<>|\"";
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  16) static unsigned char bad_if_strict[] = "+=,; ";
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  17) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  18) /***** Formats an MS-DOS file name. Rejects invalid names. */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  19) static int msdos_format_name(const unsigned char *name, int len,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  20) 			     unsigned char *res, struct fat_mount_options *opts)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  21) 	/*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  22) 	 * name is the proposed name, len is its length, res is
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  23) 	 * the resulting name, opts->name_check is either (r)elaxed,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  24) 	 * (n)ormal or (s)trict, opts->dotsOK allows dots at the
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  25) 	 * beginning of name (for hidden files)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  26) 	 */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  27) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  28) 	unsigned char *walk;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  29) 	unsigned char c;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  30) 	int space;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  31) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  32) 	if (name[0] == '.') {	/* dotfile because . and .. already done */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  33) 		if (opts->dotsOK) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  34) 			/* Get rid of dot - test for it elsewhere */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  35) 			name++;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  36) 			len--;
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  37) 		} else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  38) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  39) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  40) 	/*
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  41) 	 * disallow names that _really_ start with a dot
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  42) 	 */
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  43) 	space = 1;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  44) 	c = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  45) 	for (walk = res; len && walk - res < 8; walk++) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  46) 		c = *name++;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  47) 		len--;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  48) 		if (opts->name_check != 'r' && strchr(bad_chars, c))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  49) 			return -EINVAL;
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  50) 		if (opts->name_check == 's' && strchr(bad_if_strict, c))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  51) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  52) 		if (c >= 'A' && c <= 'Z' && opts->name_check == 's')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  53) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  54) 		if (c < ' ' || c == ':' || c == '\\')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  55) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  56) 	/*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  57) 	 * 0xE5 is legal as a first character, but we must substitute
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  58) 	 * 0x05 because 0xE5 marks deleted files.  Yes, DOS really
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  59) 	 * does this.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  60) 	 * It seems that Microsoft hacked DOS to support non-US
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  61) 	 * characters after the 0xE5 character was already in use to
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  62) 	 * mark deleted files.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  63) 	 */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  64) 		if ((res == walk) && (c == 0xE5))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  65) 			c = 0x05;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  66) 		if (c == '.')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  67) 			break;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  68) 		space = (c == ' ');
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  69) 		*walk = (!opts->nocase && c >= 'a' && c <= 'z') ? c - 32 : c;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  70) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  71) 	if (space)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  72) 		return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  73) 	if (opts->name_check == 's' && len && c != '.') {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  74) 		c = *name++;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  75) 		len--;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  76) 		if (c != '.')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  77) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  78) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  79) 	while (c != '.' && len--)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  80) 		c = *name++;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  81) 	if (c == '.') {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  82) 		while (walk - res < 8)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  83) 			*walk++ = ' ';
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  84) 		while (len > 0 && walk - res < MSDOS_NAME) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  85) 			c = *name++;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  86) 			len--;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  87) 			if (opts->name_check != 'r' && strchr(bad_chars, c))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  88) 				return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  89) 			if (opts->name_check == 's' &&
7557bc66be629 fs/msdos/namei.c     (Rene Scharfe       2008-07-25 01:46:45 -0700  90) 			    strchr(bad_if_strict, c))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  91) 				return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  92) 			if (c < ' ' || c == ':' || c == '\\')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  93) 				return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  94) 			if (c == '.') {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  95) 				if (opts->name_check == 's')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  96) 					return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  97) 				break;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  98) 			}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700  99) 			if (c >= 'A' && c <= 'Z' && opts->name_check == 's')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 100) 				return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 101) 			space = c == ' ';
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 102) 			if (!opts->nocase && c >= 'a' && c <= 'z')
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 103) 				*walk++ = c - 32;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 104) 			else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 105) 				*walk++ = c;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 106) 		}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 107) 		if (space)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 108) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 109) 		if (opts->name_check == 's' && len)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 110) 			return -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 111) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 112) 	while (walk - res < MSDOS_NAME)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 113) 		*walk++ = ' ';
094e320d761da fs/msdos/namei.c     (OGAWA Hirofumi     2006-03-31 02:30:53 -0800 114) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 115) 	return 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 116) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 117) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 118) /***** Locates a directory entry.  Uses unformatted name. */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 119) static int msdos_find(struct inode *dir, const unsigned char *name, int len,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 120) 		      struct fat_slot_info *sinfo)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 121) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 122) 	struct msdos_sb_info *sbi = MSDOS_SB(dir->i_sb);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 123) 	unsigned char msdos_name[MSDOS_NAME];
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 124) 	int err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 125) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 126) 	err = msdos_format_name(name, len, msdos_name, &sbi->options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 127) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 128) 		return -ENOENT;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 129) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 130) 	err = fat_scan(dir, msdos_name, sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 131) 	if (!err && sbi->options.dotsOK) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 132) 		if (name[0] == '.') {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 133) 			if (!(sinfo->de->attr & ATTR_HIDDEN))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 134) 				err = -ENOENT;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 135) 		} else {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 136) 			if (sinfo->de->attr & ATTR_HIDDEN)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 137) 				err = -ENOENT;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 138) 		}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 139) 		if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 140) 			brelse(sinfo->bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 141) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 142) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 143) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 144) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 145) /*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 146)  * Compute the hash for the msdos name corresponding to the dentry.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 147)  * Note: if the name is invalid, we leave the hash code unchanged so
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 148)  * that the existing dentry can be used. The msdos fs routines will
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 149)  * return ENOENT or EINVAL as appropriate.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 150)  */
da53be12bbb4f fs/fat/namei_msdos.c (Linus Torvalds     2013-05-21 15:22:44 -0700 151) static int msdos_hash(const struct dentry *dentry, struct qstr *qstr)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 152) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 153) 	struct fat_mount_options *options = &MSDOS_SB(dentry->d_sb)->options;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 154) 	unsigned char msdos_name[MSDOS_NAME];
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 155) 	int error;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 156) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 157) 	error = msdos_format_name(qstr->name, qstr->len, msdos_name, options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 158) 	if (!error)
8387ff2577eb9 fs/fat/namei_msdos.c (Linus Torvalds     2016-06-10 07:51:30 -0700 159) 		qstr->hash = full_name_hash(dentry, msdos_name, MSDOS_NAME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 160) 	return 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 161) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 162) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 163) /*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 164)  * Compare two msdos names. If either of the names are invalid,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 165)  * we fall back to doing the standard name comparison.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 166)  */
6fa67e7075593 fs/fat/namei_msdos.c (Al Viro            2016-07-31 16:37:25 -0400 167) static int msdos_cmp(const struct dentry *dentry,
621e155a35919 fs/fat/namei_msdos.c (Nicholas Piggin    2011-01-07 17:49:27 +1100 168) 		unsigned int len, const char *str, const struct qstr *name)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 169) {
d3fe19852e96a fs/fat/namei_msdos.c (Al Viro            2016-07-29 18:23:59 -0400 170) 	struct fat_mount_options *options = &MSDOS_SB(dentry->d_sb)->options;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 171) 	unsigned char a_msdos_name[MSDOS_NAME], b_msdos_name[MSDOS_NAME];
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 172) 	int error;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 173) 
621e155a35919 fs/fat/namei_msdos.c (Nicholas Piggin    2011-01-07 17:49:27 +1100 174) 	error = msdos_format_name(name->name, name->len, a_msdos_name, options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 175) 	if (error)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 176) 		goto old_compare;
621e155a35919 fs/fat/namei_msdos.c (Nicholas Piggin    2011-01-07 17:49:27 +1100 177) 	error = msdos_format_name(str, len, b_msdos_name, options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 178) 	if (error)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 179) 		goto old_compare;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 180) 	error = memcmp(a_msdos_name, b_msdos_name, MSDOS_NAME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 181) out:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 182) 	return error;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 183) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 184) old_compare:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 185) 	error = 1;
621e155a35919 fs/fat/namei_msdos.c (Nicholas Piggin    2011-01-07 17:49:27 +1100 186) 	if (name->len == len)
621e155a35919 fs/fat/namei_msdos.c (Nicholas Piggin    2011-01-07 17:49:27 +1100 187) 		error = memcmp(name->name, str, len);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 188) 	goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 189) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 190) 
ce6cdc474aa5b fs/fat/namei_msdos.c (Al Viro            2009-02-20 05:59:46 +0000 191) static const struct dentry_operations msdos_dentry_operations = {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 192) 	.d_hash		= msdos_hash,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 193) 	.d_compare	= msdos_cmp,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 194) };
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 195) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 196) /*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 197)  * AV. Wrappers for FAT sb operations. Is it wise?
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 198)  */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 199) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 200) /***** Get inode using directory and name */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 201) static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
00cd8dd3bf95f fs/fat/namei_msdos.c (Al Viro            2012-06-10 17:13:09 -0400 202) 				   unsigned int flags)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 203) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 204) 	struct super_block *sb = dir->i_sb;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 205) 	struct fat_slot_info sinfo;
45cfbe354785a fs/fat/namei_msdos.c (OGAWA Hirofumi     2008-11-06 12:53:53 -0800 206) 	struct inode *inode;
45cfbe354785a fs/fat/namei_msdos.c (OGAWA Hirofumi     2008-11-06 12:53:53 -0800 207) 	int err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 208) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 209) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
45cfbe354785a fs/fat/namei_msdos.c (OGAWA Hirofumi     2008-11-06 12:53:53 -0800 210) 	err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 211) 	switch (err) {
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 212) 	case -ENOENT:
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 213) 		inode = NULL;
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 214) 		break;
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 215) 	case 0:
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 216) 		inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 217) 		brelse(sinfo.bh);
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 218) 		break;
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 219) 	default:
a9049376ee05b fs/fat/namei_msdos.c (Al Viro            2011-07-08 21:20:11 -0400 220) 		inode = ERR_PTR(err);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 221) 	}
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 222) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 223) 	return d_splice_alias(inode, dentry);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 224) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 225) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 226) /***** Creates a directory entry (name is already formatted). */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 227) static int msdos_add_entry(struct inode *dir, const unsigned char *name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 228) 			   int is_dir, int is_hid, int cluster,
f423420c23899 fs/fat/namei_msdos.c (Arnd Bergmann      2018-08-21 21:59:48 -0700 229) 			   struct timespec64 *ts, struct fat_slot_info *sinfo)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 230) {
b271e067c896a fs/msdos/namei.c     (Joe Peterson       2008-07-25 01:46:47 -0700 231) 	struct msdos_sb_info *sbi = MSDOS_SB(dir->i_sb);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 232) 	struct msdos_dir_entry de;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 233) 	__le16 time, date;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 234) 	int err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 235) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 236) 	memcpy(de.name, name, MSDOS_NAME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 237) 	de.attr = is_dir ? ATTR_DIR : ATTR_ARCH;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 238) 	if (is_hid)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 239) 		de.attr |= ATTR_HIDDEN;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 240) 	de.lcase = 0;
7decd1cb0305b fs/fat/namei_msdos.c (OGAWA Hirofumi     2008-11-06 12:53:47 -0800 241) 	fat_time_unix2fat(sbi, ts, &time, &date, NULL);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 242) 	de.cdate = de.adate = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 243) 	de.ctime = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 244) 	de.ctime_cs = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 245) 	de.time = time;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 246) 	de.date = date;
a943ed71c9171 fs/fat/namei_msdos.c (Steven J. Magnani  2012-07-30 14:42:13 -0700 247) 	fat_set_start(&de, cluster);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 248) 	de.size = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 249) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 250) 	err = fat_add_entries(dir, &de, 1, sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 251) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 252) 		return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 253) 
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 254) 	fat_truncate_time(dir, ts, S_CTIME|S_MTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 255) 	if (IS_DIRSYNC(dir))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 256) 		(void)fat_sync_inode(dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 257) 	else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 258) 		mark_inode_dirty(dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 259) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 260) 	return 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 261) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 262) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 263) /***** Create a file */
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 264) static int msdos_create(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 265) 			struct dentry *dentry, umode_t mode, bool excl)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 266) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 267) 	struct super_block *sb = dir->i_sb;
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 268) 	struct inode *inode = NULL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 269) 	struct fat_slot_info sinfo;
95582b0083883 fs/fat/namei_msdos.c (Deepa Dinamani     2018-05-08 19:36:02 -0700 270) 	struct timespec64 ts;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 271) 	unsigned char msdos_name[MSDOS_NAME];
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 272) 	int err, is_hid;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 273) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 274) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 275) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 276) 	err = msdos_format_name(dentry->d_name.name, dentry->d_name.len,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 277) 				msdos_name, &MSDOS_SB(sb)->options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 278) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 279) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 280) 	is_hid = (dentry->d_name.name[0] == '.') && (msdos_name[0] != '.');
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 281) 	/* Have to do it due to foo vs. .foo conflicts */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 282) 	if (!fat_scan(dir, msdos_name, &sinfo)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 283) 		brelse(sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 284) 		err = -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 285) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 286) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 287) 
02027d42c3f74 fs/fat/namei_msdos.c (Deepa Dinamani     2016-09-14 07:48:05 -0700 288) 	ts = current_time(dir);
f423420c23899 fs/fat/namei_msdos.c (Arnd Bergmann      2018-08-21 21:59:48 -0700 289) 	err = msdos_add_entry(dir, msdos_name, 0, is_hid, 0, &ts, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 290) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 291) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 292) 	inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 293) 	brelse(sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 294) 	if (IS_ERR(inode)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 295) 		err = PTR_ERR(inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 296) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 297) 	}
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 298) 	fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 299) 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 300) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 301) 	d_instantiate(dentry, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 302) out:
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 303) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 304) 	if (!err)
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 305) 		err = fat_flush_inodes(sb, dir, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 306) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 307) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 308) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 309) /***** Remove a directory */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 310) static int msdos_rmdir(struct inode *dir, struct dentry *dentry)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 311) {
8f5934278d1d8 fs/msdos/namei.c     (Linus Torvalds     2008-05-19 19:53:01 -0700 312) 	struct super_block *sb = dir->i_sb;
2b0143b5c986b fs/fat/namei_msdos.c (David Howells      2015-03-17 22:25:59 +0000 313) 	struct inode *inode = d_inode(dentry);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 314) 	struct fat_slot_info sinfo;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 315) 	int err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 316) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 317) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 318) 	err = fat_dir_empty(inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 319) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 320) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 321) 	err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 322) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 323) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 324) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 325) 	err = fat_remove_entries(dir, &sinfo);	/* and releases bh */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 326) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 327) 		goto out;
9a53c3a783c2f fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:03 -0700 328) 	drop_nlink(dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 329) 
ce71ec3684036 fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:06 -0700 330) 	clear_nlink(inode);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 331) 	fat_truncate_time(inode, NULL, S_CTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 332) 	fat_detach(inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 333) out:
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 334) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 335) 	if (!err)
8f5934278d1d8 fs/msdos/namei.c     (Linus Torvalds     2008-05-19 19:53:01 -0700 336) 		err = fat_flush_inodes(sb, dir, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 337) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 338) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 339) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 340) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 341) /***** Make a directory */
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 342) static int msdos_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 343) 		       struct dentry *dentry, umode_t mode)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 344) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 345) 	struct super_block *sb = dir->i_sb;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 346) 	struct fat_slot_info sinfo;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 347) 	struct inode *inode;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 348) 	unsigned char msdos_name[MSDOS_NAME];
95582b0083883 fs/fat/namei_msdos.c (Deepa Dinamani     2018-05-08 19:36:02 -0700 349) 	struct timespec64 ts;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 350) 	int err, is_hid, cluster;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 351) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 352) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 353) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 354) 	err = msdos_format_name(dentry->d_name.name, dentry->d_name.len,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 355) 				msdos_name, &MSDOS_SB(sb)->options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 356) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 357) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 358) 	is_hid = (dentry->d_name.name[0] == '.') && (msdos_name[0] != '.');
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 359) 	/* foo vs .foo situation */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 360) 	if (!fat_scan(dir, msdos_name, &sinfo)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 361) 		brelse(sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 362) 		err = -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 363) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 364) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 365) 
02027d42c3f74 fs/fat/namei_msdos.c (Deepa Dinamani     2016-09-14 07:48:05 -0700 366) 	ts = current_time(dir);
f423420c23899 fs/fat/namei_msdos.c (Arnd Bergmann      2018-08-21 21:59:48 -0700 367) 	cluster = fat_alloc_new_dir(dir, &ts);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 368) 	if (cluster < 0) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 369) 		err = cluster;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 370) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 371) 	}
f423420c23899 fs/fat/namei_msdos.c (Arnd Bergmann      2018-08-21 21:59:48 -0700 372) 	err = msdos_add_entry(dir, msdos_name, 1, is_hid, cluster, &ts, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 373) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 374) 		goto out_free;
d8c76e6f45c11 fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:04 -0700 375) 	inc_nlink(dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 376) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 377) 	inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 378) 	brelse(sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 379) 	if (IS_ERR(inode)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 380) 		err = PTR_ERR(inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 381) 		/* the directory was completed, just return a error */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 382) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 383) 	}
bfe8684869601 fs/fat/namei_msdos.c (Miklos Szeredi     2011-10-28 14:13:29 +0200 384) 	set_nlink(inode, 2);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 385) 	fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 386) 	/* timestamp is already written, so mark_inode_dirty() is unneeded. */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 387) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 388) 	d_instantiate(dentry, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 389) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 390) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 391) 	fat_flush_inodes(sb, dir, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 392) 	return 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 393) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 394) out_free:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 395) 	fat_free_clusters(dir, cluster);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 396) out:
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 397) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 398) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 399) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 400) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 401) /***** Unlink a file */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 402) static int msdos_unlink(struct inode *dir, struct dentry *dentry)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 403) {
2b0143b5c986b fs/fat/namei_msdos.c (David Howells      2015-03-17 22:25:59 +0000 404) 	struct inode *inode = d_inode(dentry);
85cb9bf535a3f fs/fat/namei_msdos.c (Cruz Julian Bishop 2012-10-04 17:14:47 -0700 405) 	struct super_block *sb = inode->i_sb;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 406) 	struct fat_slot_info sinfo;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 407) 	int err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 408) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 409) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 410) 	err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 411) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 412) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 413) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 414) 	err = fat_remove_entries(dir, &sinfo);	/* and releases bh */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 415) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 416) 		goto out;
ce71ec3684036 fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:06 -0700 417) 	clear_nlink(inode);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 418) 	fat_truncate_time(inode, NULL, S_CTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 419) 	fat_detach(inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 420) out:
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 421) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 422) 	if (!err)
8f5934278d1d8 fs/msdos/namei.c     (Linus Torvalds     2008-05-19 19:53:01 -0700 423) 		err = fat_flush_inodes(sb, dir, inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 424) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 425) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 426) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 427) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 428) static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 429) 			   struct dentry *old_dentry,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 430) 			   struct inode *new_dir, unsigned char *new_name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 431) 			   struct dentry *new_dentry, int is_hid)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 432) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 433) 	struct buffer_head *dotdot_bh;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 434) 	struct msdos_dir_entry *dotdot_de;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 435) 	struct inode *old_inode, *new_inode;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 436) 	struct fat_slot_info old_sinfo, sinfo;
95582b0083883 fs/fat/namei_msdos.c (Deepa Dinamani     2018-05-08 19:36:02 -0700 437) 	struct timespec64 ts;
7669e8fb09da4 fs/fat/namei_msdos.c (Steven J. Magnani  2012-10-04 17:14:45 -0700 438) 	loff_t new_i_pos;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 439) 	int err, old_attrs, is_dir, update_dotdot, corrupt = 0;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 440) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 441) 	old_sinfo.bh = sinfo.bh = dotdot_bh = NULL;
2b0143b5c986b fs/fat/namei_msdos.c (David Howells      2015-03-17 22:25:59 +0000 442) 	old_inode = d_inode(old_dentry);
2b0143b5c986b fs/fat/namei_msdos.c (David Howells      2015-03-17 22:25:59 +0000 443) 	new_inode = d_inode(new_dentry);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 444) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 445) 	err = fat_scan(old_dir, old_name, &old_sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 446) 	if (err) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 447) 		err = -EIO;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 448) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 449) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 450) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 451) 	is_dir = S_ISDIR(old_inode->i_mode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 452) 	update_dotdot = (is_dir && old_dir != new_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 453) 	if (update_dotdot) {
7669e8fb09da4 fs/fat/namei_msdos.c (Steven J. Magnani  2012-10-04 17:14:45 -0700 454) 		if (fat_get_dotdot_entry(old_inode, &dotdot_bh, &dotdot_de)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 455) 			err = -EIO;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 456) 			goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 457) 		}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 458) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 459) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 460) 	old_attrs = MSDOS_I(old_inode)->i_attrs;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 461) 	err = fat_scan(new_dir, new_name, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 462) 	if (!err) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 463) 		if (!new_inode) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 464) 			/* "foo" -> ".foo" case. just change the ATTR_HIDDEN */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 465) 			if (sinfo.de != old_sinfo.de) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 466) 				err = -EINVAL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 467) 				goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 468) 			}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 469) 			if (is_hid)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 470) 				MSDOS_I(old_inode)->i_attrs |= ATTR_HIDDEN;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 471) 			else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 472) 				MSDOS_I(old_inode)->i_attrs &= ~ATTR_HIDDEN;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 473) 			if (IS_DIRSYNC(old_dir)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 474) 				err = fat_sync_inode(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 475) 				if (err) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 476) 					MSDOS_I(old_inode)->i_attrs = old_attrs;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 477) 					goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 478) 				}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 479) 			} else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 480) 				mark_inode_dirty(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 481) 
2489dbabea80e fs/fat/namei_msdos.c (Jeff Layton        2017-12-11 06:35:09 -0500 482) 			inode_inc_iversion(old_dir);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 483) 			fat_truncate_time(old_dir, NULL, S_CTIME|S_MTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 484) 			if (IS_DIRSYNC(old_dir))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 485) 				(void)fat_sync_inode(old_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 486) 			else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 487) 				mark_inode_dirty(old_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 488) 			goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 489) 		}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 490) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 491) 
02027d42c3f74 fs/fat/namei_msdos.c (Deepa Dinamani     2016-09-14 07:48:05 -0700 492) 	ts = current_time(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 493) 	if (new_inode) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 494) 		if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 495) 			goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 496) 		if (is_dir) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 497) 			err = fat_dir_empty(new_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 498) 			if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 499) 				goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 500) 		}
9131dd4256f95 fs/msdos/namei.c     (OGAWA Hirofumi     2005-10-30 15:03:50 -0800 501) 		new_i_pos = MSDOS_I(new_inode)->i_pos;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 502) 		fat_detach(new_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 503) 	} else {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 504) 		err = msdos_add_entry(new_dir, new_name, is_dir, is_hid, 0,
f423420c23899 fs/fat/namei_msdos.c (Arnd Bergmann      2018-08-21 21:59:48 -0700 505) 				      &ts, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 506) 		if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 507) 			goto out;
9131dd4256f95 fs/msdos/namei.c     (OGAWA Hirofumi     2005-10-30 15:03:50 -0800 508) 		new_i_pos = sinfo.i_pos;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 509) 	}
2489dbabea80e fs/fat/namei_msdos.c (Jeff Layton        2017-12-11 06:35:09 -0500 510) 	inode_inc_iversion(new_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 511) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 512) 	fat_detach(old_inode);
9131dd4256f95 fs/msdos/namei.c     (OGAWA Hirofumi     2005-10-30 15:03:50 -0800 513) 	fat_attach(old_inode, new_i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 514) 	if (is_hid)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 515) 		MSDOS_I(old_inode)->i_attrs |= ATTR_HIDDEN;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 516) 	else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 517) 		MSDOS_I(old_inode)->i_attrs &= ~ATTR_HIDDEN;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 518) 	if (IS_DIRSYNC(new_dir)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 519) 		err = fat_sync_inode(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 520) 		if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 521) 			goto error_inode;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 522) 	} else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 523) 		mark_inode_dirty(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 524) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 525) 	if (update_dotdot) {
a943ed71c9171 fs/fat/namei_msdos.c (Steven J. Magnani  2012-07-30 14:42:13 -0700 526) 		fat_set_start(dotdot_de, MSDOS_I(new_dir)->i_logstart);
b522412aeabad fs/fat/namei_msdos.c (Al Viro            2009-06-07 13:44:36 -0400 527) 		mark_buffer_dirty_inode(dotdot_bh, old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 528) 		if (IS_DIRSYNC(new_dir)) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 529) 			err = sync_dirty_buffer(dotdot_bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 530) 			if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 531) 				goto error_dotdot;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 532) 		}
9a53c3a783c2f fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:03 -0700 533) 		drop_nlink(old_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 534) 		if (!new_inode)
d8c76e6f45c11 fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:04 -0700 535) 			inc_nlink(new_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 536) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 537) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 538) 	err = fat_remove_entries(old_dir, &old_sinfo);	/* and releases bh */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 539) 	old_sinfo.bh = NULL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 540) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 541) 		goto error_dotdot;
2489dbabea80e fs/fat/namei_msdos.c (Jeff Layton        2017-12-11 06:35:09 -0500 542) 	inode_inc_iversion(old_dir);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 543) 	fat_truncate_time(old_dir, &ts, S_CTIME|S_MTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 544) 	if (IS_DIRSYNC(old_dir))
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 545) 		(void)fat_sync_inode(old_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 546) 	else
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 547) 		mark_inode_dirty(old_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 548) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 549) 	if (new_inode) {
9a53c3a783c2f fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:03 -0700 550) 		drop_nlink(new_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 551) 		if (is_dir)
9a53c3a783c2f fs/msdos/namei.c     (Dave Hansen        2006-09-30 23:29:03 -0700 552) 			drop_nlink(new_inode);
cd83f6b194e95 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:57 -0700 553) 		fat_truncate_time(new_inode, &ts, S_CTIME);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 554) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 555) out:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 556) 	brelse(sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 557) 	brelse(dotdot_bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 558) 	brelse(old_sinfo.bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 559) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 560) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 561) error_dotdot:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 562) 	/* data cluster is shared, serious corruption */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 563) 	corrupt = 1;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 564) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 565) 	if (update_dotdot) {
a943ed71c9171 fs/fat/namei_msdos.c (Steven J. Magnani  2012-07-30 14:42:13 -0700 566) 		fat_set_start(dotdot_de, MSDOS_I(old_dir)->i_logstart);
b522412aeabad fs/fat/namei_msdos.c (Al Viro            2009-06-07 13:44:36 -0400 567) 		mark_buffer_dirty_inode(dotdot_bh, old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 568) 		corrupt |= sync_dirty_buffer(dotdot_bh);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 569) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 570) error_inode:
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 571) 	fat_detach(old_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 572) 	fat_attach(old_inode, old_sinfo.i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 573) 	MSDOS_I(old_inode)->i_attrs = old_attrs;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 574) 	if (new_inode) {
9131dd4256f95 fs/msdos/namei.c     (OGAWA Hirofumi     2005-10-30 15:03:50 -0800 575) 		fat_attach(new_inode, new_i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 576) 		if (corrupt)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 577) 			corrupt |= fat_sync_inode(new_inode);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 578) 	} else {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 579) 		/*
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 580) 		 * If new entry was not sharing the data cluster, it
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 581) 		 * shouldn't be serious corruption.
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 582) 		 */
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 583) 		int err2 = fat_remove_entries(new_dir, &sinfo);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 584) 		if (corrupt)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 585) 			corrupt |= err2;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 586) 		sinfo.bh = NULL;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 587) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 588) 	if (corrupt < 0) {
85c7859190c41 fs/fat/namei_msdos.c (Denis Karpov       2009-06-04 02:34:22 +0900 589) 		fat_fs_error(new_dir->i_sb,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 590) 			     "%s: Filesystem corrupted (i_pos %lld)",
8e24eea728068 fs/msdos/namei.c     (Harvey Harrison    2008-04-30 00:55:09 -0700 591) 			     __func__, sinfo.i_pos);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 592) 	}
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 593) 	goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 594) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 595) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 596) /***** Rename, a wrapper for rename_same_dir & rename_diff_dir */
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 597) static int msdos_rename(struct user_namespace *mnt_userns,
549c7297717c3 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:43 +0100 598) 			struct inode *old_dir, struct dentry *old_dentry,
f03b8ad8d3863 fs/fat/namei_msdos.c (Miklos Szeredi     2016-09-27 11:03:57 +0200 599) 			struct inode *new_dir, struct dentry *new_dentry,
f03b8ad8d3863 fs/fat/namei_msdos.c (Miklos Szeredi     2016-09-27 11:03:57 +0200 600) 			unsigned int flags)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 601) {
8f5934278d1d8 fs/msdos/namei.c     (Linus Torvalds     2008-05-19 19:53:01 -0700 602) 	struct super_block *sb = old_dir->i_sb;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 603) 	unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME];
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 604) 	int err, is_hid;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 605) 
f03b8ad8d3863 fs/fat/namei_msdos.c (Miklos Szeredi     2016-09-27 11:03:57 +0200 606) 	if (flags & ~RENAME_NOREPLACE)
f03b8ad8d3863 fs/fat/namei_msdos.c (Miklos Szeredi     2016-09-27 11:03:57 +0200 607) 		return -EINVAL;
f03b8ad8d3863 fs/fat/namei_msdos.c (Miklos Szeredi     2016-09-27 11:03:57 +0200 608) 
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 609) 	mutex_lock(&MSDOS_SB(sb)->s_lock);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 610) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 611) 	err = msdos_format_name(old_dentry->d_name.name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 612) 				old_dentry->d_name.len, old_msdos_name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 613) 				&MSDOS_SB(old_dir->i_sb)->options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 614) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 615) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 616) 	err = msdos_format_name(new_dentry->d_name.name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 617) 				new_dentry->d_name.len, new_msdos_name,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 618) 				&MSDOS_SB(new_dir->i_sb)->options);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 619) 	if (err)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 620) 		goto out;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 621) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 622) 	is_hid =
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 623) 	     (new_dentry->d_name.name[0] == '.') && (new_msdos_name[0] != '.');
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 624) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 625) 	err = do_msdos_rename(old_dir, old_msdos_name, old_dentry,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 626) 			      new_dir, new_msdos_name, new_dentry, is_hid);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 627) out:
e40b34c792153 fs/fat/namei_msdos.c (Marco Stornelli    2012-10-06 12:40:03 +0200 628) 	mutex_unlock(&MSDOS_SB(sb)->s_lock);
ae78bf9c4f5fd fs/msdos/namei.c     (Chris Mason        2006-09-29 02:00:03 -0700 629) 	if (!err)
8f5934278d1d8 fs/msdos/namei.c     (Linus Torvalds     2008-05-19 19:53:01 -0700 630) 		err = fat_flush_inodes(sb, old_dir, new_dir);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 631) 	return err;
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 632) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 633) 
92e1d5be91a0e fs/msdos/namei.c     (Arjan van de Ven   2007-02-12 00:55:39 -0800 634) static const struct inode_operations msdos_dir_inode_operations = {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 635) 	.create		= msdos_create,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 636) 	.lookup		= msdos_lookup,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 637) 	.unlink		= msdos_unlink,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 638) 	.mkdir		= msdos_mkdir,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 639) 	.rmdir		= msdos_rmdir,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 640) 	.rename		= msdos_rename,
1278fdd34b122 fs/msdos/namei.c     (OGAWA Hirofumi     2008-04-28 02:16:25 -0700 641) 	.setattr	= fat_setattr,
da63fc7ce63b4 fs/msdos/namei.c     (OGAWA Hirofumi     2006-11-16 01:19:28 -0800 642) 	.getattr	= fat_getattr,
6bb885ecd7467 fs/fat/namei_msdos.c (Frank Sorenson     2018-10-30 15:06:53 -0700 643) 	.update_time	= fat_update_time,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 644) };
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 645) 
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 646) static void setup(struct super_block *sb)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 647) {
384f5c96ea05a fs/fat/namei_msdos.c (OGAWA Hirofumi     2011-04-12 21:08:37 +0900 648) 	MSDOS_SB(sb)->dir_ops = &msdos_dir_inode_operations;
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 649) 	sb->s_d_op = &msdos_dentry_operations;
1751e8a6cb935 fs/fat/namei_msdos.c (Linus Torvalds     2017-11-27 13:05:09 -0800 650) 	sb->s_flags |= SB_NOATIME;
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 651) }
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 652) 
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 653) static int msdos_fill_super(struct super_block *sb, void *data, int silent)
3d23985d6cfa7 fs/fat/namei_msdos.c (Al Viro            2010-12-18 10:44:00 -0500 654) {
384f5c96ea05a fs/fat/namei_msdos.c (OGAWA Hirofumi     2011-04-12 21:08:37 +0900 655) 	return fat_fill_super(sb, data, silent, 0, setup);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 656) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 657) 
152a083666710 fs/fat/namei_msdos.c (Al Viro            2010-07-25 00:46:55 +0400 658) static struct dentry *msdos_mount(struct file_system_type *fs_type,
454e2398be9b9 fs/msdos/namei.c     (David Howells      2006-06-23 02:02:57 -0700 659) 			int flags, const char *dev_name,
152a083666710 fs/fat/namei_msdos.c (Al Viro            2010-07-25 00:46:55 +0400 660) 			void *data)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 661) {
152a083666710 fs/fat/namei_msdos.c (Al Viro            2010-07-25 00:46:55 +0400 662) 	return mount_bdev(fs_type, flags, dev_name, data, msdos_fill_super);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 663) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 664) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 665) static struct file_system_type msdos_fs_type = {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 666) 	.owner		= THIS_MODULE,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 667) 	.name		= "msdos",
152a083666710 fs/fat/namei_msdos.c (Al Viro            2010-07-25 00:46:55 +0400 668) 	.mount		= msdos_mount,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 669) 	.kill_sb	= kill_block_super,
4b78993681083 fs/fat/namei_msdos.c (Christian Brauner  2021-01-21 14:19:56 +0100 670) 	.fs_flags	= FS_REQUIRES_DEV | FS_ALLOW_IDMAP,
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 671) };
7f78e03513940 fs/fat/namei_msdos.c (Eric W. Biederman  2013-03-02 19:39:14 -0800 672) MODULE_ALIAS_FS("msdos");
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 673) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 674) static int __init init_msdos_fs(void)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 675) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 676) 	return register_filesystem(&msdos_fs_type);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 677) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 678) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 679) static void __exit exit_msdos_fs(void)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 680) {
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 681) 	unregister_filesystem(&msdos_fs_type);
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 682) }
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 683) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 684) MODULE_LICENSE("GPL");
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 685) MODULE_AUTHOR("Werner Almesberger");
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 686) MODULE_DESCRIPTION("MS-DOS filesystem support");
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 687) 
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 688) module_init(init_msdos_fs)
^1da177e4c3f4 fs/msdos/namei.c     (Linus Torvalds     2005-04-16 15:20:36 -0700 689) module_exit(exit_msdos_fs)