Skip to content

Commit 9c89fe0

Browse files
author
Jan Kara
committed
ocfs2: Handle error from dquot_initialize()
dquot_initialize() can now return error. Handle it where possible. Reviewed-by: Junxiao Bi <junxiao.bi@oracle.com> Signed-off-by: Jan Kara <jack@suse.com>
1 parent a7cdade commit 9c89fe0

File tree

3 files changed

+58
-20
lines changed

3 files changed

+58
-20
lines changed

fs/ocfs2/file.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,11 @@ static int ocfs2_file_open(struct inode *inode, struct file *file)
105105
file->f_path.dentry->d_name.len,
106106
file->f_path.dentry->d_name.name, mode);
107107

108-
if (file->f_mode & FMODE_WRITE)
109-
dquot_initialize(inode);
108+
if (file->f_mode & FMODE_WRITE) {
109+
status = dquot_initialize(inode);
110+
if (status)
111+
goto leave;
112+
}
110113

111114
spin_lock(&oi->ip_lock);
112115

@@ -1155,8 +1158,11 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr)
11551158
if (status)
11561159
return status;
11571160

1158-
if (is_quota_modification(inode, attr))
1159-
dquot_initialize(inode);
1161+
if (is_quota_modification(inode, attr)) {
1162+
status = dquot_initialize(inode);
1163+
if (status)
1164+
return status;
1165+
}
11601166
size_change = S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_SIZE;
11611167
if (size_change) {
11621168
status = ocfs2_rw_lock(inode, 1);

fs/ocfs2/namei.c

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,12 @@ static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
200200
static struct inode *ocfs2_get_init_inode(struct inode *dir, umode_t mode)
201201
{
202202
struct inode *inode;
203+
int status;
203204

204205
inode = new_inode(dir->i_sb);
205206
if (!inode) {
206207
mlog(ML_ERROR, "new_inode failed!\n");
207-
return NULL;
208+
return ERR_PTR(-ENOMEM);
208209
}
209210

210211
/* populate as many fields early on as possible - many of
@@ -213,7 +214,10 @@ static struct inode *ocfs2_get_init_inode(struct inode *dir, umode_t mode)
213214
if (S_ISDIR(mode))
214215
set_nlink(inode, 2);
215216
inode_init_owner(inode, dir, mode);
216-
dquot_initialize(inode);
217+
status = dquot_initialize(inode);
218+
if (status)
219+
return ERR_PTR(status);
220+
217221
return inode;
218222
}
219223

@@ -264,7 +268,11 @@ static int ocfs2_mknod(struct inode *dir,
264268
(unsigned long long)OCFS2_I(dir)->ip_blkno,
265269
(unsigned long)dev, mode);
266270

267-
dquot_initialize(dir);
271+
status = dquot_initialize(dir);
272+
if (status) {
273+
mlog_errno(status);
274+
return status;
275+
}
268276

269277
/* get our super block */
270278
osb = OCFS2_SB(dir->i_sb);
@@ -311,8 +319,9 @@ static int ocfs2_mknod(struct inode *dir,
311319
}
312320

313321
inode = ocfs2_get_init_inode(dir, mode);
314-
if (!inode) {
315-
status = -ENOMEM;
322+
if (IS_ERR(inode)) {
323+
status = PTR_ERR(inode);
324+
inode = NULL;
316325
mlog_errno(status);
317326
goto leave;
318327
}
@@ -708,7 +717,11 @@ static int ocfs2_link(struct dentry *old_dentry,
708717
if (S_ISDIR(inode->i_mode))
709718
return -EPERM;
710719

711-
dquot_initialize(dir);
720+
err = dquot_initialize(dir);
721+
if (err) {
722+
mlog_errno(err);
723+
return err;
724+
}
712725

713726
err = ocfs2_double_lock(osb, &old_dir_bh, old_dir,
714727
&parent_fe_bh, dir, 0);
@@ -896,7 +909,11 @@ static int ocfs2_unlink(struct inode *dir,
896909
(unsigned long long)OCFS2_I(dir)->ip_blkno,
897910
(unsigned long long)OCFS2_I(inode)->ip_blkno);
898911

899-
dquot_initialize(dir);
912+
status = dquot_initialize(dir);
913+
if (status) {
914+
mlog_errno(status);
915+
return status;
916+
}
900917

901918
BUG_ON(d_inode(dentry->d_parent) != dir);
902919

@@ -1230,8 +1247,16 @@ static int ocfs2_rename(struct inode *old_dir,
12301247
old_dentry->d_name.len, old_dentry->d_name.name,
12311248
new_dentry->d_name.len, new_dentry->d_name.name);
12321249

1233-
dquot_initialize(old_dir);
1234-
dquot_initialize(new_dir);
1250+
status = dquot_initialize(old_dir);
1251+
if (status) {
1252+
mlog_errno(status);
1253+
goto bail;
1254+
}
1255+
status = dquot_initialize(new_dir);
1256+
if (status) {
1257+
mlog_errno(status);
1258+
goto bail;
1259+
}
12351260

12361261
osb = OCFS2_SB(old_dir->i_sb);
12371262

@@ -1786,7 +1811,11 @@ static int ocfs2_symlink(struct inode *dir,
17861811
trace_ocfs2_symlink_begin(dir, dentry, symname,
17871812
dentry->d_name.len, dentry->d_name.name);
17881813

1789-
dquot_initialize(dir);
1814+
status = dquot_initialize(dir);
1815+
if (status) {
1816+
mlog_errno(status);
1817+
goto bail;
1818+
}
17901819

17911820
sb = dir->i_sb;
17921821
osb = OCFS2_SB(sb);
@@ -1831,8 +1860,9 @@ static int ocfs2_symlink(struct inode *dir,
18311860
}
18321861

18331862
inode = ocfs2_get_init_inode(dir, S_IFLNK | S_IRWXUGO);
1834-
if (!inode) {
1835-
status = -ENOMEM;
1863+
if (IS_ERR(inode)) {
1864+
status = PTR_ERR(inode);
1865+
inode = NULL;
18361866
mlog_errno(status);
18371867
goto bail;
18381868
}
@@ -2485,8 +2515,9 @@ int ocfs2_create_inode_in_orphan(struct inode *dir,
24852515
}
24862516

24872517
inode = ocfs2_get_init_inode(dir, mode);
2488-
if (!inode) {
2489-
status = -ENOMEM;
2518+
if (IS_ERR(inode)) {
2519+
status = PTR_ERR(inode);
2520+
inode = NULL;
24902521
mlog_errno(status);
24912522
goto leave;
24922523
}

fs/ocfs2/refcounttree.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4419,8 +4419,9 @@ static int ocfs2_vfs_reflink(struct dentry *old_dentry, struct inode *dir,
44194419
}
44204420

44214421
mutex_lock(&inode->i_mutex);
4422-
dquot_initialize(dir);
4423-
error = ocfs2_reflink(old_dentry, dir, new_dentry, preserve);
4422+
error = dquot_initialize(dir);
4423+
if (!error)
4424+
error = ocfs2_reflink(old_dentry, dir, new_dentry, preserve);
44244425
mutex_unlock(&inode->i_mutex);
44254426
if (!error)
44264427
fsnotify_create(dir, new_dentry);

0 commit comments

Comments
 (0)