Blame view

fs/ntfs/quota.c 3.64 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  /*
   * quota.c - NTFS kernel quota ($Quota) handling.  Part of the Linux-NTFS
   *	     project.
   *
   * Copyright (c) 2004 Anton Altaparmakov
   *
   * This program/include file is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as published
   * by the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program/include file is distributed in the hope that it will be
   * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program (in the main directory of the Linux-NTFS
   * distribution in the file COPYING); if not, write to the Free Software
   * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #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: ...
34
35
   * 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
36
   */
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
37
  bool ntfs_mark_quotas_out_of_date(ntfs_volume *vol)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
43
44
45
46
47
48
  {
  	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: ...
49
  		return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  	}
1b1dcc1b5   Jes Sorensen   [PATCH] mutex sub...
51
  	mutex_lock(&vol->quota_q_ino->i_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  	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);
1b1dcc1b5   Jes Sorensen   [PATCH] mutex sub...
101
  	mutex_unlock(&vol->quota_q_ino->i_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
104
105
106
107
108
  	/*
  	 * 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: ...
109
  	return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
  err_out:
  	if (ictx)
  		ntfs_index_ctx_put(ictx);
1b1dcc1b5   Jes Sorensen   [PATCH] mutex sub...
113
  	mutex_unlock(&vol->quota_q_ino->i_mutex);
c49c31115   Richard Knutsson   [PATCH] fs/ntfs: ...
114
  	return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
117
  }
  
  #endif /* NTFS_RW */