Blame view

fs/ntfs/quota.c 2.85 KB
a1d312de7   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
  /*
   * quota.c - NTFS kernel quota ($Quota) handling.  Part of the Linux-NTFS
   *	     project.
   *
   * Copyright (c) 2004 Anton Altaparmakov
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
13
14
15
16
17
18
19
   */
  
  #ifdef NTFS_RW
  
  #include "index.h"
  #include "quota.h"
  #include "debug.h"
  #include "ntfs.h"
  
  /**
   * ntfs_mark_quotas_out_of_date - mark the quotas out of date on an ntfs volume
   * @vol:	ntfs volume on which to mark the quotas out of date
   *
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
20
21
   * Mark the quotas out of date on the ntfs volume @vol and return 'true' on
   * success and 'false' on error.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
   */
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
23
  bool ntfs_mark_quotas_out_of_date(ntfs_volume *vol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
  {
  	ntfs_index_context *ictx;
  	QUOTA_CONTROL_ENTRY *qce;
  	const le32 qid = QUOTA_DEFAULTS_ID;
  	int err;
  
  	ntfs_debug("Entering.");
  	if (NVolQuotaOutOfDate(vol))
  		goto done;
  	if (!vol->quota_ino || !vol->quota_q_ino) {
  		ntfs_error(vol->sb, "Quota inodes are not open.");
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
35
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  	}
5955102c9   Al Viro   wrappers for ->i_...
37
  	inode_lock(vol->quota_q_ino);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  	ictx = ntfs_index_ctx_get(NTFS_I(vol->quota_q_ino));
  	if (!ictx) {
  		ntfs_error(vol->sb, "Failed to get index context.");
  		goto err_out;
  	}
  	err = ntfs_index_lookup(&qid, sizeof(qid), ictx);
  	if (err) {
  		if (err == -ENOENT)
  			ntfs_error(vol->sb, "Quota defaults entry is not "
  					"present.");
  		else
  			ntfs_error(vol->sb, "Lookup of quota defaults entry "
  					"failed.");
  		goto err_out;
  	}
  	if (ictx->data_len < offsetof(QUOTA_CONTROL_ENTRY, sid)) {
  		ntfs_error(vol->sb, "Quota defaults entry size is invalid.  "
  				"Run chkdsk.");
  		goto err_out;
  	}
  	qce = (QUOTA_CONTROL_ENTRY*)ictx->data;
  	if (le32_to_cpu(qce->version) != QUOTA_VERSION) {
  		ntfs_error(vol->sb, "Quota defaults entry version 0x%x is not "
  				"supported.", le32_to_cpu(qce->version));
  		goto err_out;
  	}
  	ntfs_debug("Quota defaults flags = 0x%x.", le32_to_cpu(qce->flags));
  	/* If quotas are already marked out of date, no need to do anything. */
  	if (qce->flags & QUOTA_FLAG_OUT_OF_DATE)
  		goto set_done;
  	/*
  	 * If quota tracking is neither requested, nor enabled and there are no
  	 * pending deletes, no need to mark the quotas out of date.
  	 */
  	if (!(qce->flags & (QUOTA_FLAG_TRACKING_ENABLED |
  			QUOTA_FLAG_TRACKING_REQUESTED |
  			QUOTA_FLAG_PENDING_DELETES)))
  		goto set_done;
  	/*
  	 * Set the QUOTA_FLAG_OUT_OF_DATE bit thus marking quotas out of date.
  	 * This is verified on WinXP to be sufficient to cause windows to
  	 * rescan the volume on boot and update all quota entries.
  	 */
  	qce->flags |= QUOTA_FLAG_OUT_OF_DATE;
  	/* Ensure the modified flags are written to disk. */
  	ntfs_index_entry_flush_dcache_page(ictx);
  	ntfs_index_entry_mark_dirty(ictx);
  set_done:
  	ntfs_index_ctx_put(ictx);
5955102c9   Al Viro   wrappers for ->i_...
87
  	inode_unlock(vol->quota_q_ino);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
94
  	/*
  	 * We set the flag so we do not try to mark the quotas out of date
  	 * again on remount.
  	 */
  	NVolSetQuotaOutOfDate(vol);
  done:
  	ntfs_debug("Done.");
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
95
  	return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
  err_out:
  	if (ictx)
  		ntfs_index_ctx_put(ictx);
5955102c9   Al Viro   wrappers for ->i_...
99
  	inode_unlock(vol->quota_q_ino);
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
100
  	return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  }
  
  #endif /* NTFS_RW */