Skip to content

Commit 2f44434

Browse files
committed
Merge tag 'pull-minix' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull minixfs updates from Al Viro: "minixfs kmap_local_page() switchover and related fixes - very similar to sysv series" * tag 'pull-minix' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: minixfs: switch to kmap_local_page() minixfs: Use dir_put_page() in minix_unlink() and minix_rename() minixfs: change the signature of dir_get_page() minixfs: use offset_in_page()
2 parents 5b9b416 + 41e9a7f commit 2f44434

2 files changed

Lines changed: 38 additions & 57 deletions

File tree

fs/minix/dir.c

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ const struct file_operations minix_dir_operations = {
2626
.fsync = generic_file_fsync,
2727
};
2828

29-
static inline void dir_put_page(struct page *page)
30-
{
31-
kunmap(page);
32-
put_page(page);
33-
}
34-
3529
/*
3630
* Return the offset into page `page_nr' of the last valid
3731
* byte in that page, plus one.
@@ -70,13 +64,14 @@ static int minix_handle_dirsync(struct inode *dir)
7064
return err;
7165
}
7266

73-
static struct page * dir_get_page(struct inode *dir, unsigned long n)
67+
static void *dir_get_page(struct inode *dir, unsigned long n, struct page **p)
7468
{
7569
struct address_space *mapping = dir->i_mapping;
7670
struct page *page = read_mapping_page(mapping, n, NULL);
77-
if (!IS_ERR(page))
78-
kmap(page);
79-
return page;
71+
if (IS_ERR(page))
72+
return ERR_CAST(page);
73+
*p = page;
74+
return kmap_local_page(page);
8075
}
8176

8277
static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi)
@@ -104,11 +99,11 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
10499

105100
for ( ; n < npages; n++, offset = 0) {
106101
char *p, *kaddr, *limit;
107-
struct page *page = dir_get_page(inode, n);
102+
struct page *page;
108103

109-
if (IS_ERR(page))
104+
kaddr = dir_get_page(inode, n, &page);
105+
if (IS_ERR(kaddr))
110106
continue;
111-
kaddr = (char *)page_address(page);
112107
p = kaddr+offset;
113108
limit = kaddr + minix_last_byte(inode, n) - chunk_size;
114109
for ( ; p <= limit; p = minix_next_entry(p, sbi)) {
@@ -127,13 +122,13 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
127122
unsigned l = strnlen(name, sbi->s_namelen);
128123
if (!dir_emit(ctx, name, l,
129124
inumber, DT_UNKNOWN)) {
130-
dir_put_page(page);
125+
unmap_and_put_page(page, p);
131126
return 0;
132127
}
133128
}
134129
ctx->pos += chunk_size;
135130
}
136-
dir_put_page(page);
131+
unmap_and_put_page(page, kaddr);
137132
}
138133
return 0;
139134
}
@@ -173,11 +168,10 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
173168
for (n = 0; n < npages; n++) {
174169
char *kaddr, *limit;
175170

176-
page = dir_get_page(dir, n);
177-
if (IS_ERR(page))
171+
kaddr = dir_get_page(dir, n, &page);
172+
if (IS_ERR(kaddr))
178173
continue;
179174

180-
kaddr = (char*)page_address(page);
181175
limit = kaddr + minix_last_byte(dir, n) - sbi->s_dirsize;
182176
for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
183177
if (sbi->s_version == MINIX_V3) {
@@ -194,7 +188,7 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
194188
if (namecompare(namelen, sbi->s_namelen, name, namx))
195189
goto found;
196190
}
197-
dir_put_page(page);
191+
unmap_and_put_page(page, kaddr);
198192
}
199193
return NULL;
200194

@@ -229,12 +223,10 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
229223
for (n = 0; n <= npages; n++) {
230224
char *limit, *dir_end;
231225

232-
page = dir_get_page(dir, n);
233-
err = PTR_ERR(page);
234-
if (IS_ERR(page))
235-
goto out;
226+
kaddr = dir_get_page(dir, n, &page);
227+
if (IS_ERR(kaddr))
228+
return PTR_ERR(kaddr);
236229
lock_page(page);
237-
kaddr = (char*)page_address(page);
238230
dir_end = kaddr + minix_last_byte(dir, n);
239231
limit = kaddr + PAGE_SIZE - sbi->s_dirsize;
240232
for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
@@ -262,13 +254,13 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
262254
goto out_unlock;
263255
}
264256
unlock_page(page);
265-
dir_put_page(page);
257+
unmap_and_put_page(page, kaddr);
266258
}
267259
BUG();
268260
return -EINVAL;
269261

270262
got_it:
271-
pos = page_offset(page) + p - (char *)page_address(page);
263+
pos = page_offset(page) + offset_in_page(p);
272264
err = minix_prepare_chunk(page, pos, sbi->s_dirsize);
273265
if (err)
274266
goto out_unlock;
@@ -285,8 +277,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
285277
mark_inode_dirty(dir);
286278
err = minix_handle_dirsync(dir);
287279
out_put:
288-
dir_put_page(page);
289-
out:
280+
unmap_and_put_page(page, kaddr);
290281
return err;
291282
out_unlock:
292283
unlock_page(page);
@@ -296,8 +287,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
296287
int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
297288
{
298289
struct inode *inode = page->mapping->host;
299-
char *kaddr = page_address(page);
300-
loff_t pos = page_offset(page) + (char*)de - kaddr;
290+
loff_t pos = page_offset(page) + offset_in_page(de);
301291
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
302292
unsigned len = sbi->s_dirsize;
303293
int err;
@@ -333,7 +323,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
333323
goto fail;
334324
}
335325

336-
kaddr = kmap_atomic(page);
326+
kaddr = kmap_local_page(page);
337327
memset(kaddr, 0, PAGE_SIZE);
338328

339329
if (sbi->s_version == MINIX_V3) {
@@ -353,7 +343,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
353343
de->inode = dir->i_ino;
354344
strcpy(de->name, "..");
355345
}
356-
kunmap_atomic(kaddr);
346+
kunmap_local(kaddr);
357347

358348
dir_commit_chunk(page, 0, 2 * sbi->s_dirsize);
359349
err = minix_handle_dirsync(inode);
@@ -370,17 +360,16 @@ int minix_empty_dir(struct inode * inode)
370360
struct page *page = NULL;
371361
unsigned long i, npages = dir_pages(inode);
372362
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
373-
char *name;
363+
char *name, *kaddr;
374364
__u32 inumber;
375365

376366
for (i = 0; i < npages; i++) {
377-
char *p, *kaddr, *limit;
367+
char *p, *limit;
378368

379-
page = dir_get_page(inode, i);
380-
if (IS_ERR(page))
369+
kaddr = dir_get_page(inode, i, &page);
370+
if (IS_ERR(kaddr))
381371
continue;
382372

383-
kaddr = (char *)page_address(page);
384373
limit = kaddr + minix_last_byte(inode, i) - sbi->s_dirsize;
385374
for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
386375
if (sbi->s_version == MINIX_V3) {
@@ -406,12 +395,12 @@ int minix_empty_dir(struct inode * inode)
406395
goto not_empty;
407396
}
408397
}
409-
dir_put_page(page);
398+
unmap_and_put_page(page, kaddr);
410399
}
411400
return 1;
412401

413402
not_empty:
414-
dir_put_page(page);
403+
unmap_and_put_page(page, kaddr);
415404
return 0;
416405
}
417406

@@ -421,8 +410,7 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
421410
{
422411
struct inode *dir = page->mapping->host;
423412
struct minix_sb_info *sbi = minix_sb(dir->i_sb);
424-
loff_t pos = page_offset(page) +
425-
(char *)de-(char*)page_address(page);
413+
loff_t pos = page_offset(page) + offset_in_page(de);
426414
int err;
427415

428416
lock_page(page);
@@ -443,15 +431,12 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
443431

444432
struct minix_dir_entry * minix_dotdot (struct inode *dir, struct page **p)
445433
{
446-
struct page *page = dir_get_page(dir, 0);
447434
struct minix_sb_info *sbi = minix_sb(dir->i_sb);
448-
struct minix_dir_entry *de = NULL;
435+
struct minix_dir_entry *de = dir_get_page(dir, 0, p);
449436

450-
if (!IS_ERR(page)) {
451-
de = minix_next_entry(page_address(page), sbi);
452-
*p = page;
453-
}
454-
return de;
437+
if (!IS_ERR(de))
438+
return minix_next_entry(de, sbi);
439+
return NULL;
455440
}
456441

457442
ino_t minix_inode_by_name(struct dentry *dentry)
@@ -469,7 +454,7 @@ ino_t minix_inode_by_name(struct dentry *dentry)
469454
res = ((minix3_dirent *) de)->inode;
470455
else
471456
res = de->inode;
472-
dir_put_page(page);
457+
unmap_and_put_page(page, de);
473458
}
474459
return res;
475460
}

fs/minix/namei.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ static int minix_unlink(struct inode * dir, struct dentry *dentry)
149149
if (!de)
150150
return -ENOENT;
151151
err = minix_delete_entry(de, page);
152-
kunmap(page);
153-
put_page(page);
152+
unmap_and_put_page(page, de);
154153

155154
if (err)
156155
return err;
@@ -242,13 +241,10 @@ static int minix_rename(struct mnt_idmap *idmap,
242241
inode_dec_link_count(old_dir);
243242
}
244243
out_dir:
245-
if (dir_de) {
246-
kunmap(dir_page);
247-
put_page(dir_page);
248-
}
244+
if (dir_de)
245+
unmap_and_put_page(dir_page, dir_de);
249246
out_old:
250-
kunmap(old_page);
251-
put_page(old_page);
247+
unmap_and_put_page(old_page, old_de);
252248
out:
253249
return err;
254250
}

0 commit comments

Comments
 (0)