patch-2.4.10 linux/fs/dquot.c
Next file: linux/fs/exec.c
Previous file: linux/fs/devices.c
Back to the patch index
Back to the overall index
- Lines: 123
- Date:
Tue Sep 11 08:50:55 2001
- Orig file:
v2.4.9/linux/fs/dquot.c
- Orig date:
Sun Aug 12 13:28:00 2001
diff -u --recursive --new-file v2.4.9/linux/fs/dquot.c linux/fs/dquot.c
@@ -325,7 +325,7 @@
memset(&dquot->dq_dqb, 0, sizeof(struct dqblk));
}
-static void invalidate_dquots(kdev_t dev, short type)
+static void invalidate_dquots(struct super_block *sb, short type)
{
struct dquot *dquot, *next;
int need_restart;
@@ -335,12 +335,10 @@
need_restart = 0;
while ((dquot = next) != NULL) {
next = dquot->dq_next;
- if (dquot->dq_dev != dev)
+ if (dquot->dq_sb != sb)
continue;
if (dquot->dq_type != type)
continue;
- if (!dquot->dq_sb) /* Already invalidated entry? */
- continue;
if (dquot->dq_flags & DQ_LOCKED) {
__wait_on_dquot(dquot);
@@ -349,12 +347,10 @@
/*
* Make sure it's still the same dquot.
*/
- if (dquot->dq_dev != dev)
+ if (dquot->dq_sb != sb)
continue;
if (dquot->dq_type != type)
continue;
- if (!dquot->dq_sb)
- continue;
}
/*
* Because inodes needn't to be the only holders of dquot
@@ -631,27 +627,11 @@
return dquot;
}
-/* Check whether this inode is quota file */
-static inline int is_quotafile(struct inode *inode)
-{
- int cnt;
- struct quota_mount_options *dqopt = sb_dqopt(inode->i_sb);
- struct file **files;
-
- if (!dqopt)
- return 0;
- files = dqopt->files;
- for (cnt = 0; cnt < MAXQUOTAS; cnt++)
- if (files[cnt] && files[cnt]->f_dentry->d_inode == inode)
- return 1;
- return 0;
-}
-
static int dqinit_needed(struct inode *inode, short type)
{
int cnt;
- if (is_quotafile(inode))
+ if (IS_NOQUOTA(inode))
return 0;
if (type != -1)
return inode->i_dquot[type] == NODQUOT;
@@ -664,7 +644,6 @@
static void add_dquot_ref(struct super_block *sb, short type)
{
struct list_head *p;
- struct inode *inode;
if (!sb->dq_op)
return; /* nothing to do */
@@ -673,13 +652,14 @@
file_list_lock();
for (p = sb->s_files.next; p != &sb->s_files; p = p->next) {
struct file *filp = list_entry(p, struct file, f_list);
- if (!filp->f_dentry)
- continue;
- inode = filp->f_dentry->d_inode;
+ struct inode *inode = filp->f_dentry->d_inode;
if (filp->f_mode & FMODE_WRITE && dqinit_needed(inode, type)) {
+ struct vfsmount *mnt = mntget(filp->f_vfsmnt);
+ struct dentry *dentry = dget(filp->f_dentry);
file_list_unlock();
sb->dq_op->initialize(inode, type);
- inode->i_flags |= S_QUOTA;
+ dput(dentry);
+ mntput(mnt);
/* As we may have blocked we had better restart... */
goto restart;
}
@@ -1021,8 +1001,7 @@
short cnt;
lock_kernel();
- /* We don't want to have quotas on quota files - nasty deadlocks possible */
- if (is_quotafile(inode)) {
+ if (IS_NOQUOTA(inode)) {
unlock_kernel();
return;
}
@@ -1409,7 +1388,7 @@
/* Note: these are blocking operations */
remove_dquot_ref(sb, cnt);
- invalidate_dquots(sb->s_dev, cnt);
+ invalidate_dquots(sb, cnt);
/* Wait for any pending IO - remove me as soon as invalidate is more polite */
down(&dqopt->dqio_sem);
@@ -1476,7 +1455,9 @@
error = -EINVAL;
if (inode->i_size == 0 || !check_quotafile_size(inode->i_size))
goto out_f;
- dquot_drop(inode); /* We don't want quota on quota files */
+ /* We don't want quota on quota files */
+ dquot_drop(inode);
+ inode->i_flags |= S_NOQUOTA;
set_enable_flags(dqopt, type);
dqopt->files[type] = f;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)