diff options
Diffstat (limited to 'fs/nfsd/nfs4recover.c')
-rw-r--r-- | fs/nfsd/nfs4recover.c | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 095f1740f3ae..57ed50fe7f85 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
@@ -119,25 +119,12 @@ out: | |||
119 | return status; | 119 | return status; |
120 | } | 120 | } |
121 | 121 | ||
122 | static int | 122 | static void |
123 | nfsd4_rec_fsync(struct dentry *dentry) | 123 | nfsd4_sync_rec_dir(void) |
124 | { | 124 | { |
125 | struct file *filp; | 125 | down(&rec_dir.dentry->d_inode->i_sem); |
126 | int status = nfs_ok; | 126 | nfsd_sync_dir(rec_dir.dentry); |
127 | 127 | up(&rec_dir.dentry->d_inode->i_sem); | |
128 | dprintk("NFSD: nfs4_fsync_rec_dir\n"); | ||
129 | filp = dentry_open(dget(dentry), mntget(rec_dir.mnt), O_RDWR); | ||
130 | if (IS_ERR(filp)) { | ||
131 | status = PTR_ERR(filp); | ||
132 | goto out; | ||
133 | } | ||
134 | if (filp->f_op && filp->f_op->fsync) | ||
135 | status = filp->f_op->fsync(filp, filp->f_dentry, 0); | ||
136 | fput(filp); | ||
137 | out: | ||
138 | if (status) | ||
139 | printk("nfsd4: unable to sync recovery directory\n"); | ||
140 | return status; | ||
141 | } | 128 | } |
142 | 129 | ||
143 | int | 130 | int |
@@ -176,7 +163,7 @@ out_unlock: | |||
176 | up(&rec_dir.dentry->d_inode->i_sem); | 163 | up(&rec_dir.dentry->d_inode->i_sem); |
177 | if (status == 0) { | 164 | if (status == 0) { |
178 | clp->cl_firststate = 1; | 165 | clp->cl_firststate = 1; |
179 | status = nfsd4_rec_fsync(rec_dir.dentry); | 166 | nfsd4_sync_rec_dir(); |
180 | } | 167 | } |
181 | nfs4_reset_user(uid, gid); | 168 | nfs4_reset_user(uid, gid); |
182 | dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status); | 169 | dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status); |
@@ -302,7 +289,9 @@ nfsd4_unlink_clid_dir(char *name, int namlen) | |||
302 | 289 | ||
303 | dprintk("NFSD: nfsd4_unlink_clid_dir. name %.*s\n", namlen, name); | 290 | dprintk("NFSD: nfsd4_unlink_clid_dir. name %.*s\n", namlen, name); |
304 | 291 | ||
292 | down(&rec_dir.dentry->d_inode->i_sem); | ||
305 | dentry = lookup_one_len(name, rec_dir.dentry, namlen); | 293 | dentry = lookup_one_len(name, rec_dir.dentry, namlen); |
294 | up(&rec_dir.dentry->d_inode->i_sem); | ||
306 | if (IS_ERR(dentry)) { | 295 | if (IS_ERR(dentry)) { |
307 | status = PTR_ERR(dentry); | 296 | status = PTR_ERR(dentry); |
308 | return status; | 297 | return status; |
@@ -327,11 +316,12 @@ nfsd4_remove_clid_dir(struct nfs4_client *clp) | |||
327 | if (!rec_dir_init || !clp->cl_firststate) | 316 | if (!rec_dir_init || !clp->cl_firststate) |
328 | return; | 317 | return; |
329 | 318 | ||
319 | clp->cl_firststate = 0; | ||
330 | nfs4_save_user(&uid, &gid); | 320 | nfs4_save_user(&uid, &gid); |
331 | status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1); | 321 | status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1); |
332 | nfs4_reset_user(uid, gid); | 322 | nfs4_reset_user(uid, gid); |
333 | if (status == 0) | 323 | if (status == 0) |
334 | status = nfsd4_rec_fsync(rec_dir.dentry); | 324 | nfsd4_sync_rec_dir(); |
335 | if (status) | 325 | if (status) |
336 | printk("NFSD: Failed to remove expired client state directory" | 326 | printk("NFSD: Failed to remove expired client state directory" |
337 | " %.*s\n", HEXDIR_LEN, clp->cl_recdir); | 327 | " %.*s\n", HEXDIR_LEN, clp->cl_recdir); |
@@ -362,7 +352,7 @@ nfsd4_recdir_purge_old(void) { | |||
362 | return; | 352 | return; |
363 | status = nfsd4_list_rec_dir(rec_dir.dentry, purge_old); | 353 | status = nfsd4_list_rec_dir(rec_dir.dentry, purge_old); |
364 | if (status == 0) | 354 | if (status == 0) |
365 | status = nfsd4_rec_fsync(rec_dir.dentry); | 355 | nfsd4_sync_rec_dir(); |
366 | if (status) | 356 | if (status) |
367 | printk("nfsd4: failed to purge old clients from recovery" | 357 | printk("nfsd4: failed to purge old clients from recovery" |
368 | " directory %s\n", rec_dir.dentry->d_name.name); | 358 | " directory %s\n", rec_dir.dentry->d_name.name); |