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)