]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add ceph_ll_sync_inode 20913/head
authorJeff Layton <jlayton@redhat.com>
Wed, 14 Mar 2018 16:25:36 +0000 (12:25 -0400)
committerJeff Layton <jlayton@redhat.com>
Thu, 15 Mar 2018 12:22:45 +0000 (08:22 -0400)
Ganesha's NFS SETATTR requests are expected to be synchronous, but
libcephfs can cache attribute changes if the client has the right caps.
An fsync after changing the attributes would flush the caps back to the
MDS, but we may not have an Fh in the context of a SETATTR request.

Add a way to sync a specific Inode, even when we don't have easy access
to a Fh.

Tracker: http://tracker.ceph.com/issues/23291
Signed-off-by: Jeff Layton <jlayton@redhat.com>
src/client/Client.cc
src/client/Client.h
src/include/cephfs/libcephfs.h
src/libcephfs.cc

index 6c464d5a3669740c0e9ba4d90206e444e381b241..99236928cd059e96425b677b3c01f56e952988e4 100644 (file)
@@ -12957,6 +12957,19 @@ int Client::ll_fsync(Fh *fh, bool syncdataonly)
   return r;
 }
 
+int Client::ll_sync_inode(Inode *in, bool syncdataonly)
+{
+  Mutex::Locker lock(client_lock);
+  ldout(cct, 3) << "ll_sync_inode " << *in << " " << dendl;
+  tout(cct) << "ll_sync_inode" << std::endl;
+  tout(cct) << (unsigned long)in << std::endl;
+
+  if (unmounting)
+    return -ENOTCONN;
+
+  return _fsync(in, syncdataonly);
+}
+
 #ifdef FALLOC_FL_PUNCH_HOLE
 
 int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length)
index ae5b188538391024000225c760281d32040e8d7f..e578add5d1f28edf0d6f36f44a8f62cd66619f8d 100644 (file)
@@ -1230,6 +1230,7 @@ public:
   loff_t ll_lseek(Fh *fh, loff_t offset, int whence);
   int ll_flush(Fh *fh);
   int ll_fsync(Fh *fh, bool syncdataonly);
+  int ll_sync_inode(Inode *in, bool syncdataonly);
   int ll_fallocate(Fh *fh, int mode, loff_t offset, loff_t length);
   int ll_release(Fh *fh);
   int ll_getlk(Fh *fh, struct flock *fl, uint64_t owner);
index 5cde6744fa0187f111e004a2a749c7410f0f6392..e23bcf24d1b9bbdcc4182215797c080b9123dcea 100644 (file)
@@ -1487,6 +1487,8 @@ int ceph_ll_read(struct ceph_mount_info *cmount, struct Fh* filehandle,
                 int64_t off, uint64_t len, char* buf);
 int ceph_ll_fsync(struct ceph_mount_info *cmount, struct Fh *fh,
                  int syncdataonly);
+int ceph_ll_sync_inode(struct ceph_mount_info *cmount, struct Inode *in,
+                 int syncdataonly);
 int ceph_ll_write(struct ceph_mount_info *cmount, struct Fh* filehandle,
                  int64_t off, uint64_t len, const char *data);
 int64_t ceph_ll_readv(struct ceph_mount_info *cmount, struct Fh *fh,
index 6bd5afd9efc6aa0b32d9af2d34da165f9a4803a6..a65e763da7e7e83a0f7242b6ec03a6bf0d012205 100644 (file)
@@ -1520,6 +1520,12 @@ extern "C" int ceph_ll_fsync(class ceph_mount_info *cmount,
   return (cmount->get_client()->ll_fsync(fh, syncdataonly));
 }
 
+extern "C" int ceph_ll_sync_inode(class ceph_mount_info *cmount,
+                            Inode *in, int syncdataonly)
+{
+  return (cmount->get_client()->ll_sync_inode(in, syncdataonly));
+}
+
 extern "C" off_t ceph_ll_lseek(class ceph_mount_info *cmount,
                                Fh *fh, off_t offset, int whence)
 {